@@ -6107,6 +6107,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61076107 zval * zv ;
61086108 zend_string * synthesized_lc_parent = NULL ;
61096109 zend_class_entry * cache_key_proto = NULL ;
6110+ zend_class_name * detached_interface_names = NULL ;
6111+ uint32_t detached_interface_count = 0 ;
61106112 ALLOCA_FLAG (use_heap )
61116113
61126114 SET_ALLOCA_FLAG (use_heap );
@@ -6142,6 +6144,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61426144 zend_string_addref (ce -> interface_names [k ].name );
61436145 zend_string_addref (ce -> interface_names [k ].lc_name );
61446146 }
6147+ detached_interface_names = ce -> interface_names ;
6148+ detached_interface_count = ce -> num_interfaces ;
61456149 }
61466150 if (ce -> num_traits ) {
61476151 zend_class_name * src = ce -> trait_names ;
@@ -6230,9 +6234,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62306234 ? ce -> generic_types -> trait_uses : NULL ;
62316235 bool ce_is_mono_for_trait = zend_class_is_monomorph (ce );
62326236 bool * trait_skip_mono = NULL ;
6233- ALLOCA_FLAG (trait_skip_use_heap )
62346237 if (trait_uses_table_for_synth && ce -> num_traits > 1 ) {
6235- trait_skip_mono = do_alloca (sizeof (bool ) * ce -> num_traits , trait_skip_use_heap );
6238+ trait_skip_mono = emalloc (sizeof (bool ) * ce -> num_traits );
62366239 zend_mark_duplicate_lc_names (ce -> trait_names , ce -> num_traits , trait_skip_mono );
62376240 }
62386241
@@ -6257,14 +6260,14 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62576260 ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION );
62586261 if (UNEXPECTED (base_trait == NULL )) {
62596262 free_alloca (traits_and_interfaces , use_heap );
6260- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6263+ if (trait_skip_mono ) efree (trait_skip_mono );
62616264 return NULL ;
62626265 }
62636266 if (UNEXPECTED (!(base_trait -> ce_flags & ZEND_ACC_TRAIT ))) {
62646267 zend_throw_error (NULL , "%s cannot use %s - it is not a trait" ,
62656268 ZSTR_VAL (ce -> name ), ZSTR_VAL (base_trait -> name ));
62666269 free_alloca (traits_and_interfaces , use_heap );
6267- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6270+ if (trait_skip_mono ) efree (trait_skip_mono );
62686271 return NULL ;
62696272 }
62706273 if (base_trait -> generic_parameters ) {
@@ -6273,15 +6276,15 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62736276 if (EG (exception )) {
62746277 check_unrecoverable_load_failure (ce );
62756278 free_alloca (traits_and_interfaces , use_heap );
6276- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6279+ if (trait_skip_mono ) efree (trait_skip_mono );
62776280 return NULL ;
62786281 }
62796282 zend_class_entry * mono = zend_synthesize_monomorph (
62806283 base_trait , nwa -> args , nwa -> count );
62816284 if (!mono ) {
62826285 check_unrecoverable_load_failure (ce );
62836286 free_alloca (traits_and_interfaces , use_heap );
6284- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6287+ if (trait_skip_mono ) efree (trait_skip_mono );
62856288 return NULL ;
62866289 }
62876290 zend_string_release (ce -> trait_names [i ].name );
@@ -6295,20 +6298,20 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62956298 ce -> trait_names [i ].lc_name , ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION );
62966299 if (UNEXPECTED (trait == NULL )) {
62976300 free_alloca (traits_and_interfaces , use_heap );
6298- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6301+ if (trait_skip_mono ) efree (trait_skip_mono );
62996302 return NULL ;
63006303 }
63016304 if (UNEXPECTED (!(trait -> ce_flags & ZEND_ACC_TRAIT ))) {
63026305 zend_throw_error (NULL , "%s cannot use %s - it is not a trait" , ZSTR_VAL (ce -> name ), ZSTR_VAL (trait -> name ));
63036306 free_alloca (traits_and_interfaces , use_heap );
6304- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6307+ if (trait_skip_mono ) efree (trait_skip_mono );
63056308 return NULL ;
63066309 }
63076310 if (UNEXPECTED (trait -> ce_flags & ZEND_ACC_DEPRECATED )) {
63086311 zend_use_of_deprecated_trait (trait , ce -> name );
63096312 if (UNEXPECTED (EG (exception ))) {
63106313 free_alloca (traits_and_interfaces , use_heap );
6311- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6314+ if (trait_skip_mono ) efree (trait_skip_mono );
63126315 return NULL ;
63136316 }
63146317 }
@@ -6339,7 +6342,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
63396342 }
63406343 }
63416344 if (trait_skip_mono ) {
6342- free_alloca (trait_skip_mono , trait_skip_use_heap );
6345+ efree (trait_skip_mono );
63436346 }
63446347 }
63456348
@@ -6559,6 +6562,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
65596562 sizeof (zend_class_entry * ) * ce -> num_interfaces );
65606563
65616564 zend_do_implement_interfaces (ce , interfaces );
6565+ if (detached_interface_names ) {
6566+ for (uint32_t k = 0 ; k < detached_interface_count ; k ++ ) {
6567+ zend_string_release_ex (detached_interface_names [k ].name , 0 );
6568+ zend_string_release_ex (detached_interface_names [k ].lc_name , 0 );
6569+ }
6570+ efree (detached_interface_names );
6571+ }
65626572 } else if (parent && parent -> num_interfaces ) {
65636573 zend_do_inherit_interfaces (ce , parent );
65646574 }
0 commit comments