@@ -333,6 +333,23 @@ ZEND_API void destroy_zend_class(zval *zv)
333333 return ;
334334 }
335335
336+ bool persistent = ce -> type == ZEND_INTERNAL_CLASS ;
337+ /* Common to internal and user classes */
338+ if (ce -> attributes ) {
339+ zend_hash_release (ce -> attributes );
340+ }
341+ if (ce -> bound_types ) {
342+ zend_hash_release (ce -> bound_types );
343+ }
344+ if (ce -> num_generic_parameters > 0 ) {
345+ for (uint32_t generic_param_index = 0 ; generic_param_index < ce -> num_generic_parameters ; generic_param_index ++ ) {
346+ const zend_generic_parameter generic_param = ce -> generic_parameters [generic_param_index ];
347+ zend_string_release (generic_param .name );
348+ zend_type_release (generic_param .constraint , persistent );
349+ }
350+ pefree (ce -> generic_parameters , persistent );
351+ }
352+
336353 switch (ce -> type ) {
337354 case ZEND_USER_CLASS :
338355 if (!(ce -> ce_flags & ZEND_ACC_CACHED )) {
@@ -347,22 +364,6 @@ ZEND_API void destroy_zend_class(zval *zv)
347364 zend_string_release_ex (ce -> doc_comment , 0 );
348365 }
349366
350- if (ce -> attributes ) {
351- zend_hash_release (ce -> attributes );
352- }
353-
354- if (ce -> bound_types ) {
355- zend_hash_release (ce -> bound_types );
356- }
357- if (ce -> num_generic_parameters > 0 ) {
358- for (uint32_t generic_param_index = 0 ; generic_param_index < ce -> num_generic_parameters ; generic_param_index ++ ) {
359- const zend_generic_parameter generic_param = ce -> generic_parameters [generic_param_index ];
360- zend_string_release_ex (generic_param .name , false);
361- zend_type_release (generic_param .constraint , false);
362- }
363- efree (ce -> generic_parameters );
364- }
365-
366367 if (ce -> num_interfaces > 0 && !(ce -> ce_flags & ZEND_ACC_RESOLVED_INTERFACES )) {
367368 uint32_t i ;
368369
@@ -536,20 +537,6 @@ ZEND_API void destroy_zend_class(zval *zv)
536537 if (ce -> properties_info_table ) {
537538 free (ce -> properties_info_table );
538539 }
539- if (ce -> attributes ) {
540- zend_hash_release (ce -> attributes );
541- }
542- if (ce -> bound_types ) {
543- zend_hash_release (ce -> bound_types );
544- }
545- if (ce -> num_generic_parameters > 0 ) {
546- for (uint32_t generic_param_index = 0 ; generic_param_index < ce -> num_generic_parameters ; generic_param_index ++ ) {
547- const zend_generic_parameter generic_param = ce -> generic_parameters [generic_param_index ];
548- zend_string_release (generic_param .name );
549- zend_type_release (generic_param .constraint , true);
550- }
551- free (ce -> generic_parameters );
552- }
553540 free (ce );
554541 break ;
555542 }
0 commit comments