diff options
Diffstat (limited to 'php/ext/google/protobuf/protobuf.c')
-rw-r--r-- | php/ext/google/protobuf/protobuf.c | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c index ea85b999..6a848b27 100644 --- a/php/ext/google/protobuf/protobuf.c +++ b/php/ext/google/protobuf/protobuf.c @@ -55,39 +55,60 @@ static void add_to_table(HashTable* t, const void* def, void* value) { uint nIndex = (ulong)def & t->nTableMask; zval* pDest = NULL; - zend_hash_index_update(t, (zend_ulong)def, &value, sizeof(zval*), (void**)&pDest); + php_proto_zend_hash_index_update(t, (zend_ulong)def, &value, sizeof(zval*), + (void**)&pDest); } static void* get_from_table(const HashTable* t, const void* def) { void** value; - if (zend_hash_index_find(t, (zend_ulong)def, (void**)&value) == FAILURE) { + if (php_proto_zend_hash_index_find(t, (zend_ulong)def, (void**)&value) == + FAILURE) { zend_error(E_ERROR, "PHP object not found for given definition.\n"); return NULL; } return *value; } +static bool exist_in_table(const HashTable* t, const void* def) { + void** value; + return (php_proto_zend_hash_index_find(t, (zend_ulong)def, (void**)&value) == + SUCCESS); +} + static void add_to_list(HashTable* t, void* value) { zval* pDest = NULL; - zend_hash_next_index_insert(t, &value, sizeof(void*), (void**)&pDest); + php_proto_zend_hash_next_index_insert(t, &value, sizeof(void*), + (void**)&pDest); } -void add_def_obj(const void* def, zval* value) { +void add_def_obj(const void* def, PHP_PROTO_HASHTABLE_VALUE value) { +#if PHP_MAJOR_VERSION < 7 Z_ADDREF_P(value); +#else + ++GC_REFCOUNT(value); +#endif add_to_table(upb_def_to_php_obj_map, def, value); } -zval* get_def_obj(const void* def) { - return (zval*)get_from_table(upb_def_to_php_obj_map, def); +PHP_PROTO_HASHTABLE_VALUE get_def_obj(const void* def) { + return (PHP_PROTO_HASHTABLE_VALUE)get_from_table(upb_def_to_php_obj_map, def); } -void add_ce_obj(const void* ce, zval* value) { +void add_ce_obj(const void* ce, PHP_PROTO_HASHTABLE_VALUE value) { +#if PHP_MAJOR_VERSION < 7 Z_ADDREF_P(value); +#else + ++GC_REFCOUNT(value); +#endif add_to_table(ce_to_php_obj_map, ce, value); } -zval* get_ce_obj(const void* ce) { - return (zval*)get_from_table(ce_to_php_obj_map, ce); +PHP_PROTO_HASHTABLE_VALUE get_ce_obj(const void* ce) { + return (PHP_PROTO_HASHTABLE_VALUE)get_from_table(ce_to_php_obj_map, ce); +} + +bool class_added(const void* ce) { + return exist_in_table(ce_to_php_obj_map, ce); } // ----------------------------------------------------------------------------- @@ -125,12 +146,23 @@ static PHP_GINIT_FUNCTION(protobuf) { static PHP_GSHUTDOWN_FUNCTION(protobuf) { } +#if PHP_MAJOR_VERSION >= 7 +static void php_proto_hashtable_descriptor_release(zval* value) { + void* ptr = Z_PTR_P(value); + zend_object* object = *(zend_object**)ptr; + if(--GC_REFCOUNT(object) == 0) { + zend_objects_store_del(object); + } + efree(ptr); +} +#endif + static PHP_RINIT_FUNCTION(protobuf) { ALLOC_HASHTABLE(upb_def_to_php_obj_map); - zend_hash_init(upb_def_to_php_obj_map, 16, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(upb_def_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0); ALLOC_HASHTABLE(ce_to_php_obj_map); - zend_hash_init(ce_to_php_obj_map, 16, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(ce_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0); generated_pool = NULL; generated_pool_php = NULL; @@ -145,10 +177,12 @@ static PHP_RSHUTDOWN_FUNCTION(protobuf) { zend_hash_destroy(ce_to_php_obj_map); FREE_HASHTABLE(ce_to_php_obj_map); +#if PHP_MAJOR_VERSION < 7 if (generated_pool_php != NULL) { zval_dtor(generated_pool_php); FREE_ZVAL(generated_pool_php); } +#endif return 0; } @@ -170,6 +204,7 @@ static PHP_MINIT_FUNCTION(protobuf) { static PHP_MSHUTDOWN_FUNCTION(protobuf) { PEFREE(message_handlers); PEFREE(repeated_field_handlers); + PEFREE(repeated_field_iter_handlers); PEFREE(map_field_handlers); return 0; |