@@ -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,10 +6144,12 @@ 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 ;
6148- ce -> trait_names = emalloc ( sizeof (zend_class_name ) * ce -> num_traits );
6152+ ce -> trait_names = zend_arena_alloc ( & CG ( arena ), sizeof (zend_class_name ) * ce -> num_traits );
61496153 memcpy (ce -> trait_names , src , sizeof (zend_class_name ) * ce -> num_traits );
61506154 for (uint32_t k = 0 ; k < ce -> num_traits ; k ++ ) {
61516155 zend_string_addref (ce -> trait_names [k ].name );
@@ -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 }
@@ -7925,17 +7935,12 @@ ZEND_API zend_function *zend_synthesize_function_monomorph(
79257935 zend_type_arg_table * mono_targs = NULL ;
79267936 {
79277937 uint32_t tcount = params -> count ;
7928- mono_targs = zend_arena_alloc (& CG (arena ), ZEND_TYPE_ARG_TABLE_SIZE (tcount ));
7929- mono_targs -> count = tcount ;
7930- mono_targs -> generation = 0 ;
7938+ mono_targs = zend_type_arg_table_alloc (tcount );
79317939 mono_targs -> persisted = true;
79327940 for (uint32_t i = 0 ; i < tcount ; i ++ ) {
7933- mono_targs -> entries [i ].name = NULL ;
7934- mono_targs -> entries [i ].type_ref = NULL ;
7935- mono_targs -> entries [i ].owned_type = (zend_type ) ZEND_TYPE_INIT_NONE (0 );
79367941 if (i < arity && ZEND_TYPE_IS_SET (args [i ])) {
79377942 zend_type owned = args [i ];
7938- zend_type_copy_ctor (& owned , /* use_arena */ true , /* persistent */ false);
7943+ zend_type_copy_ctor (& owned , /* use_arena */ false , /* persistent */ false);
79397944 mono_targs -> entries [i ].owned_type = owned ;
79407945 zend_string * cname = zend_type_arg_canonical_name (args [i ]);
79417946 mono_targs -> entries [i ].name = cname ;
@@ -8079,14 +8084,9 @@ ZEND_API zend_function *zend_synthesize_specialized_monomorph_into(
80798084
80808085 zend_arg_info * new_arg_info = zend_monomorph_build_arg_info (src , args , arity , /* use_arena */ false);
80818086
8082- zend_type_arg_table * mono_targs = emalloc (ZEND_TYPE_ARG_TABLE_SIZE (total ));
8083- mono_targs -> count = total ;
8084- mono_targs -> generation = 0 ;
8085- mono_targs -> persisted = false;
8087+ zend_type_arg_table * mono_targs = zend_type_arg_table_alloc (total );
8088+ mono_targs -> persisted = true;
80868089 for (uint32_t i = 0 ; i < total ; i ++ ) {
8087- mono_targs -> entries [i ].name = NULL ;
8088- mono_targs -> entries [i ].type_ref = NULL ;
8089- mono_targs -> entries [i ].owned_type = (zend_type ) ZEND_TYPE_INIT_NONE (0 );
80908090 if (i < arity && ZEND_TYPE_IS_SET (args [i ])) {
80918091 zend_type owned = args [i ];
80928092 zend_type_copy_ctor (& owned , /* use_arena */ false, /* persistent */ false);
0 commit comments