@@ -2939,6 +2939,9 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
29392939 clone -> hooks = clone_hooks ;
29402940 }
29412941
2942+ if (ZEND_TYPE_HAS_LIST (sub ) || ZEND_TYPE_HAS_NAMED_WITH_ARGS (sub )) {
2943+ zend_type_release (sub , /* persistent */ false);
2944+ }
29422945 info = clone ;
29432946 }
29442947 }
@@ -6107,6 +6110,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61076110 zval * zv ;
61086111 zend_string * synthesized_lc_parent = NULL ;
61096112 zend_class_entry * cache_key_proto = NULL ;
6113+ zend_class_name * detached_interface_names = NULL ;
6114+ uint32_t detached_interface_count = 0 ;
61106115 ALLOCA_FLAG (use_heap )
61116116
61126117 SET_ALLOCA_FLAG (use_heap );
@@ -6142,10 +6147,12 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61426147 zend_string_addref (ce -> interface_names [k ].name );
61436148 zend_string_addref (ce -> interface_names [k ].lc_name );
61446149 }
6150+ detached_interface_names = ce -> interface_names ;
6151+ detached_interface_count = ce -> num_interfaces ;
61456152 }
61466153 if (ce -> num_traits ) {
61476154 zend_class_name * src = ce -> trait_names ;
6148- ce -> trait_names = emalloc ( sizeof (zend_class_name ) * ce -> num_traits );
6155+ ce -> trait_names = zend_arena_alloc ( & CG ( arena ), sizeof (zend_class_name ) * ce -> num_traits );
61496156 memcpy (ce -> trait_names , src , sizeof (zend_class_name ) * ce -> num_traits );
61506157 for (uint32_t k = 0 ; k < ce -> num_traits ; k ++ ) {
61516158 zend_string_addref (ce -> trait_names [k ].name );
@@ -6230,9 +6237,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62306237 ? ce -> generic_types -> trait_uses : NULL ;
62316238 bool ce_is_mono_for_trait = zend_class_is_monomorph (ce );
62326239 bool * trait_skip_mono = NULL ;
6233- ALLOCA_FLAG (trait_skip_use_heap )
62346240 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 );
6241+ trait_skip_mono = emalloc (sizeof (bool ) * ce -> num_traits );
62366242 zend_mark_duplicate_lc_names (ce -> trait_names , ce -> num_traits , trait_skip_mono );
62376243 }
62386244
@@ -6257,14 +6263,14 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62576263 ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION );
62586264 if (UNEXPECTED (base_trait == NULL )) {
62596265 free_alloca (traits_and_interfaces , use_heap );
6260- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6266+ if (trait_skip_mono ) efree (trait_skip_mono );
62616267 return NULL ;
62626268 }
62636269 if (UNEXPECTED (!(base_trait -> ce_flags & ZEND_ACC_TRAIT ))) {
62646270 zend_throw_error (NULL , "%s cannot use %s - it is not a trait" ,
62656271 ZSTR_VAL (ce -> name ), ZSTR_VAL (base_trait -> name ));
62666272 free_alloca (traits_and_interfaces , use_heap );
6267- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6273+ if (trait_skip_mono ) efree (trait_skip_mono );
62686274 return NULL ;
62696275 }
62706276 if (base_trait -> generic_parameters ) {
@@ -6273,15 +6279,15 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62736279 if (EG (exception )) {
62746280 check_unrecoverable_load_failure (ce );
62756281 free_alloca (traits_and_interfaces , use_heap );
6276- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6282+ if (trait_skip_mono ) efree (trait_skip_mono );
62776283 return NULL ;
62786284 }
62796285 zend_class_entry * mono = zend_synthesize_monomorph (
62806286 base_trait , nwa -> args , nwa -> count );
62816287 if (!mono ) {
62826288 check_unrecoverable_load_failure (ce );
62836289 free_alloca (traits_and_interfaces , use_heap );
6284- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6290+ if (trait_skip_mono ) efree (trait_skip_mono );
62856291 return NULL ;
62866292 }
62876293 zend_string_release (ce -> trait_names [i ].name );
@@ -6295,20 +6301,20 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62956301 ce -> trait_names [i ].lc_name , ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION );
62966302 if (UNEXPECTED (trait == NULL )) {
62976303 free_alloca (traits_and_interfaces , use_heap );
6298- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6304+ if (trait_skip_mono ) efree (trait_skip_mono );
62996305 return NULL ;
63006306 }
63016307 if (UNEXPECTED (!(trait -> ce_flags & ZEND_ACC_TRAIT ))) {
63026308 zend_throw_error (NULL , "%s cannot use %s - it is not a trait" , ZSTR_VAL (ce -> name ), ZSTR_VAL (trait -> name ));
63036309 free_alloca (traits_and_interfaces , use_heap );
6304- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6310+ if (trait_skip_mono ) efree (trait_skip_mono );
63056311 return NULL ;
63066312 }
63076313 if (UNEXPECTED (trait -> ce_flags & ZEND_ACC_DEPRECATED )) {
63086314 zend_use_of_deprecated_trait (trait , ce -> name );
63096315 if (UNEXPECTED (EG (exception ))) {
63106316 free_alloca (traits_and_interfaces , use_heap );
6311- if (trait_skip_mono ) free_alloca (trait_skip_mono , trait_skip_use_heap );
6317+ if (trait_skip_mono ) efree (trait_skip_mono );
63126318 return NULL ;
63136319 }
63146320 }
@@ -6339,7 +6345,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
63396345 }
63406346 }
63416347 if (trait_skip_mono ) {
6342- free_alloca (trait_skip_mono , trait_skip_use_heap );
6348+ efree (trait_skip_mono );
63436349 }
63446350 }
63456351
@@ -6559,6 +6565,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
65596565 sizeof (zend_class_entry * ) * ce -> num_interfaces );
65606566
65616567 zend_do_implement_interfaces (ce , interfaces );
6568+ if (detached_interface_names ) {
6569+ for (uint32_t k = 0 ; k < detached_interface_count ; k ++ ) {
6570+ zend_string_release_ex (detached_interface_names [k ].name , 0 );
6571+ zend_string_release_ex (detached_interface_names [k ].lc_name , 0 );
6572+ }
6573+ efree (detached_interface_names );
6574+ }
65626575 } else if (parent && parent -> num_interfaces ) {
65636576 zend_do_inherit_interfaces (ce , parent );
65646577 }
@@ -7925,17 +7938,12 @@ ZEND_API zend_function *zend_synthesize_function_monomorph(
79257938 zend_type_arg_table * mono_targs = NULL ;
79267939 {
79277940 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 ;
7941+ mono_targs = zend_type_arg_table_alloc (tcount );
79317942 mono_targs -> persisted = true;
79327943 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 );
79367944 if (i < arity && ZEND_TYPE_IS_SET (args [i ])) {
79377945 zend_type owned = args [i ];
7938- zend_type_copy_ctor (& owned , /* use_arena */ true , /* persistent */ false);
7946+ zend_type_copy_ctor (& owned , /* use_arena */ false , /* persistent */ false);
79397947 mono_targs -> entries [i ].owned_type = owned ;
79407948 zend_string * cname = zend_type_arg_canonical_name (args [i ]);
79417949 mono_targs -> entries [i ].name = cname ;
@@ -8079,14 +8087,9 @@ ZEND_API zend_function *zend_synthesize_specialized_monomorph_into(
80798087
80808088 zend_arg_info * new_arg_info = zend_monomorph_build_arg_info (src , args , arity , /* use_arena */ false);
80818089
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;
8090+ zend_type_arg_table * mono_targs = zend_type_arg_table_alloc (total );
8091+ mono_targs -> persisted = true;
80868092 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 );
80908093 if (i < arity && ZEND_TYPE_IS_SET (args [i ])) {
80918094 zend_type owned = args [i ];
80928095 zend_type_copy_ctor (& owned , /* use_arena */ false, /* persistent */ false);
0 commit comments