@@ -4298,36 +4298,75 @@ static void preload_remove_empty_includes(void)
42984298
42994299static void preload_register_trait_methods (zend_class_entry * ce ) {
43004300 zend_op_array * op_array ;
4301+ zend_property_info * info ;
4302+
43014303 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
43024304 if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
43034305 ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
43044306 zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
43054307 }
43064308 } ZEND_HASH_FOREACH_END ();
4309+
4310+ if (ce -> num_hooked_props > 0 ) {
4311+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4312+ if (info -> hooks ) {
4313+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4314+ if (info -> hooks [i ]) {
4315+ op_array = & info -> hooks [i ]-> op_array ;
4316+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4317+ ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
4318+ zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
4319+ }
4320+ }
4321+ }
4322+ }
4323+ } ZEND_HASH_FOREACH_END ();
4324+ }
4325+ }
4326+
4327+ static void preload_fix_trait_op_array (zend_op_array * op_array )
4328+ {
4329+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4330+ return ;
4331+ }
4332+
4333+ zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4334+ ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4335+
4336+ zend_string * function_name = op_array -> function_name ;
4337+ zend_class_entry * scope = op_array -> scope ;
4338+ uint32_t fn_flags = op_array -> fn_flags ;
4339+ zend_function * prototype = op_array -> prototype ;
4340+ HashTable * ht = op_array -> static_variables ;
4341+ * op_array = * orig_op_array ;
4342+ op_array -> function_name = function_name ;
4343+ op_array -> scope = scope ;
4344+ op_array -> fn_flags = fn_flags ;
4345+ op_array -> prototype = prototype ;
4346+ op_array -> static_variables = ht ;
43074347}
43084348
43094349static void preload_fix_trait_methods (zend_class_entry * ce )
43104350{
43114351 zend_op_array * op_array ;
43124352
43134353 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
4314- if (op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) {
4315- zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4316- ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4317-
4318- zend_string * function_name = op_array -> function_name ;
4319- zend_class_entry * scope = op_array -> scope ;
4320- uint32_t fn_flags = op_array -> fn_flags ;
4321- zend_function * prototype = op_array -> prototype ;
4322- HashTable * ht = op_array -> static_variables ;
4323- * op_array = * orig_op_array ;
4324- op_array -> function_name = function_name ;
4325- op_array -> scope = scope ;
4326- op_array -> fn_flags = fn_flags ;
4327- op_array -> prototype = prototype ;
4328- op_array -> static_variables = ht ;
4329- }
4354+ preload_fix_trait_op_array (op_array );
43304355 } ZEND_HASH_FOREACH_END ();
4356+
4357+ if (ce -> num_hooked_props > 0 ) {
4358+ zend_property_info * info ;
4359+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4360+ if (info -> hooks ) {
4361+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4362+ if (info -> hooks [i ]) {
4363+ op_array = & info -> hooks [i ]-> op_array ;
4364+ preload_fix_trait_op_array (op_array );
4365+ }
4366+ }
4367+ }
4368+ } ZEND_HASH_FOREACH_END ();
4369+ }
43314370}
43324371
43334372static void preload_optimize (zend_persistent_script * script )
0 commit comments