@@ -4227,36 +4227,75 @@ static void preload_remove_empty_includes(void)
42274227
42284228static void preload_register_trait_methods (zend_class_entry * ce ) {
42294229 zend_op_array * op_array ;
4230+ zend_property_info * info ;
4231+
42304232 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
42314233 if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
42324234 ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
42334235 zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
42344236 }
42354237 } ZEND_HASH_FOREACH_END ();
4238+
4239+ if (ce -> num_hooked_props > 0 ) {
4240+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4241+ if (info -> hooks ) {
4242+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4243+ if (info -> hooks [i ]) {
4244+ op_array = & info -> hooks [i ]-> op_array ;
4245+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4246+ ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
4247+ zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
4248+ }
4249+ }
4250+ }
4251+ }
4252+ } ZEND_HASH_FOREACH_END ();
4253+ }
4254+ }
4255+
4256+ static void preload_fix_trait_op_array (zend_op_array * op_array )
4257+ {
4258+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4259+ return ;
4260+ }
4261+
4262+ zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4263+ ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4264+
4265+ zend_string * function_name = op_array -> function_name ;
4266+ zend_class_entry * scope = op_array -> scope ;
4267+ uint32_t fn_flags = op_array -> fn_flags ;
4268+ zend_function * prototype = op_array -> prototype ;
4269+ HashTable * ht = op_array -> static_variables ;
4270+ * op_array = * orig_op_array ;
4271+ op_array -> function_name = function_name ;
4272+ op_array -> scope = scope ;
4273+ op_array -> fn_flags = fn_flags ;
4274+ op_array -> prototype = prototype ;
4275+ op_array -> static_variables = ht ;
42364276}
42374277
42384278static void preload_fix_trait_methods (zend_class_entry * ce )
42394279{
42404280 zend_op_array * op_array ;
42414281
42424282 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
4243- if (op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) {
4244- zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4245- ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4246-
4247- zend_string * function_name = op_array -> function_name ;
4248- zend_class_entry * scope = op_array -> scope ;
4249- uint32_t fn_flags = op_array -> fn_flags ;
4250- zend_function * prototype = op_array -> prototype ;
4251- HashTable * ht = op_array -> static_variables ;
4252- * op_array = * orig_op_array ;
4253- op_array -> function_name = function_name ;
4254- op_array -> scope = scope ;
4255- op_array -> fn_flags = fn_flags ;
4256- op_array -> prototype = prototype ;
4257- op_array -> static_variables = ht ;
4258- }
4283+ preload_fix_trait_op_array (op_array );
42594284 } ZEND_HASH_FOREACH_END ();
4285+
4286+ if (ce -> num_hooked_props > 0 ) {
4287+ zend_property_info * info ;
4288+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4289+ if (info -> hooks ) {
4290+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4291+ if (info -> hooks [i ]) {
4292+ op_array = & info -> hooks [i ]-> op_array ;
4293+ preload_fix_trait_op_array (op_array );
4294+ }
4295+ }
4296+ }
4297+ } ZEND_HASH_FOREACH_END ();
4298+ }
42604299}
42614300
42624301static void preload_optimize (zend_persistent_script * script )
0 commit comments