@@ -333,6 +333,23 @@ ZEND_API void destroy_zend_class(zval *zv)
333
333
return ;
334
334
}
335
335
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
+
336
353
switch (ce -> type ) {
337
354
case ZEND_USER_CLASS :
338
355
if (!(ce -> ce_flags & ZEND_ACC_CACHED )) {
@@ -347,22 +364,6 @@ ZEND_API void destroy_zend_class(zval *zv)
347
364
zend_string_release_ex (ce -> doc_comment , 0 );
348
365
}
349
366
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
-
366
367
if (ce -> num_interfaces > 0 && !(ce -> ce_flags & ZEND_ACC_RESOLVED_INTERFACES )) {
367
368
uint32_t i ;
368
369
@@ -536,20 +537,6 @@ ZEND_API void destroy_zend_class(zval *zv)
536
537
if (ce -> properties_info_table ) {
537
538
free (ce -> properties_info_table );
538
539
}
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
- }
553
540
free (ce );
554
541
break ;
555
542
}
0 commit comments