@@ -49,8 +49,8 @@ static upb_inttable upb_def_to_enumdesc_map_persistent;
4949// Global map from message/enum's php class entry to corresponding wrapper
5050// Descriptor/EnumDescriptor instances.
5151static HashTable * ce_to_php_obj_map ;
52- static upb_inttable ce_to_desc_map_persistent ;
53- static upb_inttable ce_to_enumdesc_map_persistent ;
52+ static upb_strtable ce_to_desc_map_persistent ;
53+ static upb_strtable ce_to_enumdesc_map_persistent ;
5454// Global map from message/enum's proto fully-qualified name to corresponding
5555// wrapper Descriptor/EnumDescriptor instances.
5656static upb_strtable proto_to_desc_map_persistent ;
@@ -138,33 +138,55 @@ PHP_PROTO_HASHTABLE_VALUE get_ce_obj(const void* ce) {
138138}
139139
140140void add_ce_desc (const zend_class_entry * ce , DescriptorInternal * desc ) {
141- upb_inttable_insertptr (& ce_to_desc_map_persistent ,
142- ce , upb_value_ptr (desc ));
141+ #if PHP_MAJOR_VERSION < 7
142+ const char * klass = ce -> name ;
143+ #else
144+ const char * klass = ZSTR_VAL (ce -> name );
145+ #endif
146+ upb_strtable_insert (& ce_to_desc_map_persistent , klass ,
147+ upb_value_ptr (desc ));
143148}
144149
145150DescriptorInternal * get_ce_desc (const zend_class_entry * ce ) {
151+ #if PHP_MAJOR_VERSION < 7
152+ const char * klass = ce -> name ;
153+ #else
154+ const char * klass = ZSTR_VAL (ce -> name );
155+ #endif
156+
146157 upb_value v ;
147158#ifndef NDEBUG
148159 v .ctype = UPB_CTYPE_PTR ;
149160#endif
150- if (!upb_inttable_lookupptr (& ce_to_desc_map_persistent , ce , & v )) {
161+
162+ if (!upb_strtable_lookup (& ce_to_desc_map_persistent , klass , & v )) {
151163 return NULL ;
152164 } else {
153165 return upb_value_getptr (v );
154166 }
155167}
156168
157169void add_ce_enumdesc (const zend_class_entry * ce , EnumDescriptorInternal * desc ) {
158- upb_inttable_insertptr (& ce_to_enumdesc_map_persistent ,
159- ce , upb_value_ptr (desc ));
170+ #if PHP_MAJOR_VERSION < 7
171+ const char * klass = ce -> name ;
172+ #else
173+ const char * klass = ZSTR_VAL (ce -> name );
174+ #endif
175+ upb_strtable_insert (& ce_to_enumdesc_map_persistent , klass ,
176+ upb_value_ptr (desc ));
160177}
161178
162179EnumDescriptorInternal * get_ce_enumdesc (const zend_class_entry * ce ) {
180+ #if PHP_MAJOR_VERSION < 7
181+ const char * klass = ce -> name ;
182+ #else
183+ const char * klass = ZSTR_VAL (ce -> name );
184+ #endif
163185 upb_value v ;
164186#ifndef NDEBUG
165187 v .ctype = UPB_CTYPE_PTR ;
166188#endif
167- if (!upb_inttable_lookupptr (& ce_to_enumdesc_map_persistent , ce , & v )) {
189+ if (!upb_strtable_lookup (& ce_to_enumdesc_map_persistent , klass , & v )) {
168190 return NULL ;
169191 } else {
170192 return upb_value_getptr (v );
@@ -330,8 +352,8 @@ static void php_proto_hashtable_descriptor_release(zval* value) {
330352static void initialize_persistent_descriptor_pool (TSRMLS_D ) {
331353 upb_inttable_init (& upb_def_to_desc_map_persistent , UPB_CTYPE_PTR );
332354 upb_inttable_init (& upb_def_to_enumdesc_map_persistent , UPB_CTYPE_PTR );
333- upb_inttable_init (& ce_to_desc_map_persistent , UPB_CTYPE_PTR );
334- upb_inttable_init (& ce_to_enumdesc_map_persistent , UPB_CTYPE_PTR );
355+ upb_strtable_init (& ce_to_desc_map_persistent , UPB_CTYPE_PTR );
356+ upb_strtable_init (& ce_to_enumdesc_map_persistent , UPB_CTYPE_PTR );
335357 upb_strtable_init (& proto_to_desc_map_persistent , UPB_CTYPE_PTR );
336358 upb_strtable_init (& class_to_desc_map_persistent , UPB_CTYPE_PTR );
337359
@@ -360,7 +382,29 @@ static PHP_RINIT_FUNCTION(protobuf) {
360382 generated_pool_php = NULL ;
361383 internal_generated_pool_php = NULL ;
362384
363- if (!PROTOBUF_G (keep_descriptor_pool_after_request )) {
385+ if (PROTOBUF_G (keep_descriptor_pool_after_request )) {
386+ // Needs to clean up obsolete class entry
387+ upb_strtable_iter i ;
388+ upb_value v ;
389+
390+ DescriptorInternal * desc ;
391+ for (upb_strtable_begin (& i , & ce_to_desc_map_persistent );
392+ !upb_strtable_done (& i );
393+ upb_strtable_next (& i )) {
394+ v = upb_strtable_iter_value (& i );
395+ desc = upb_value_getptr (v );
396+ desc -> klass = NULL ;
397+ }
398+
399+ EnumDescriptorInternal * enumdesc ;
400+ for (upb_strtable_begin (& i , & ce_to_enumdesc_map_persistent );
401+ !upb_strtable_done (& i );
402+ upb_strtable_next (& i )) {
403+ v = upb_strtable_iter_value (& i );
404+ enumdesc = upb_value_getptr (v );
405+ enumdesc -> klass = NULL ;
406+ }
407+ } else {
364408 initialize_persistent_descriptor_pool (TSRMLS_C );
365409 }
366410
@@ -410,8 +454,8 @@ static void cleanup_persistent_descriptor_pool(TSRMLS_D) {
410454
411455 upb_inttable_uninit (& upb_def_to_desc_map_persistent );
412456 upb_inttable_uninit (& upb_def_to_enumdesc_map_persistent );
413- upb_inttable_uninit (& ce_to_desc_map_persistent );
414- upb_inttable_uninit (& ce_to_enumdesc_map_persistent );
457+ upb_strtable_uninit (& ce_to_desc_map_persistent );
458+ upb_strtable_uninit (& ce_to_enumdesc_map_persistent );
415459 upb_strtable_uninit (& proto_to_desc_map_persistent );
416460 upb_strtable_uninit (& class_to_desc_map_persistent );
417461}
0 commit comments