diff options
Diffstat (limited to 'php/ext/google/protobuf/protobuf.c')
-rw-r--r-- | php/ext/google/protobuf/protobuf.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c index 43b4e584..b67089e0 100644 --- a/php/ext/google/protobuf/protobuf.c +++ b/php/ext/google/protobuf/protobuf.c @@ -46,6 +46,9 @@ static HashTable* upb_def_to_php_obj_map; // Global map from message/enum's php class entry to corresponding wrapper // Descriptor/EnumDescriptor instances. static HashTable* ce_to_php_obj_map; +// Global map from message/enum's proto fully-qualified name to corresponding +// wrapper Descriptor/EnumDescriptor instances. +static HashTable* proto_to_php_obj_map; static HashTable* reserved_names; // ----------------------------------------------------------------------------- @@ -81,6 +84,22 @@ static void add_to_list(HashTable* t, void* value) { (void**)&pDest); } +static void add_to_strtable(HashTable* t, const char* key, int key_size, + void* value) { + zval* pDest = NULL; + php_proto_zend_hash_update_mem(t, key, key_size, &value, sizeof(void*), + (void**)&pDest); +} + +static void* get_from_strtable(const HashTable* t, const char* key, int key_size) { + void** value; + if (php_proto_zend_hash_find_mem(t, key, key_size, (void**)&value) == + FAILURE) { + return NULL; + } + return *value; +} + void add_def_obj(const void* def, PHP_PROTO_HASHTABLE_VALUE value) { #if PHP_MAJOR_VERSION < 7 Z_ADDREF_P(value); @@ -111,6 +130,20 @@ bool class_added(const void* ce) { return exist_in_table(ce_to_php_obj_map, ce); } +void add_proto_obj(const char* proto, PHP_PROTO_HASHTABLE_VALUE value) { +#if PHP_MAJOR_VERSION < 7 + Z_ADDREF_P(value); +#else + ++GC_REFCOUNT(value); +#endif + add_to_strtable(proto_to_php_obj_map, proto, strlen(proto), value); +} + +PHP_PROTO_HASHTABLE_VALUE get_proto_obj(const char* proto) { + return (PHP_PROTO_HASHTABLE_VALUE)get_from_strtable(proto_to_php_obj_map, + proto, strlen(proto)); +} + // ----------------------------------------------------------------------------- // Reserved Name. // ----------------------------------------------------------------------------- @@ -196,6 +229,9 @@ static PHP_RINIT_FUNCTION(protobuf) { ALLOC_HASHTABLE(ce_to_php_obj_map); zend_hash_init(ce_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0); + ALLOC_HASHTABLE(proto_to_php_obj_map); + zend_hash_init(proto_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0); + ALLOC_HASHTABLE(reserved_names); zend_hash_init(reserved_names, 16, NULL, NULL, 0); for (i = 0; i < kReservedNamesSize; i++) { @@ -217,6 +253,9 @@ static PHP_RSHUTDOWN_FUNCTION(protobuf) { zend_hash_destroy(ce_to_php_obj_map); FREE_HASHTABLE(ce_to_php_obj_map); + zend_hash_destroy(proto_to_php_obj_map); + FREE_HASHTABLE(proto_to_php_obj_map); + zend_hash_destroy(reserved_names); FREE_HASHTABLE(reserved_names); @@ -261,6 +300,37 @@ static PHP_MINIT_FUNCTION(protobuf) { repeated_field_iter_init(TSRMLS_C); util_init(TSRMLS_C); + any_init(TSRMLS_C); + api_init(TSRMLS_C); + bool_value_init(TSRMLS_C); + bytes_value_init(TSRMLS_C); + double_value_init(TSRMLS_C); + duration_init(TSRMLS_C); + enum_init(TSRMLS_C); + enum_value_init(TSRMLS_C); + field_cardinality_init(TSRMLS_C); + field_init(TSRMLS_C); + field_kind_init(TSRMLS_C); + field_mask_init(TSRMLS_C); + float_value_init(TSRMLS_C); + empty_init(TSRMLS_C); + int32_value_init(TSRMLS_C); + int64_value_init(TSRMLS_C); + list_value_init(TSRMLS_C); + method_init(TSRMLS_C); + mixin_init(TSRMLS_C); + null_value_init(TSRMLS_C); + option_init(TSRMLS_C); + source_context_init(TSRMLS_C); + string_value_init(TSRMLS_C); + struct_init(TSRMLS_C); + syntax_init(TSRMLS_C); + timestamp_init(TSRMLS_C); + type_init(TSRMLS_C); + u_int32_value_init(TSRMLS_C); + u_int64_value_init(TSRMLS_C); + value_init(TSRMLS_C); + return 0; } |