@@ -4202,36 +4202,75 @@ static void preload_remove_empty_includes(void)
42024202
42034203static void preload_register_trait_methods (zend_class_entry * ce ) {
42044204 zend_op_array * op_array ;
4205+ zend_property_info * info ;
4206+
42054207 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
42064208 if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
42074209 ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
42084210 zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
42094211 }
42104212 } ZEND_HASH_FOREACH_END ();
4213+
4214+ if (ce -> num_hooked_props > 0 ) {
4215+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4216+ if (info -> hooks ) {
4217+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4218+ if (info -> hooks [i ]) {
4219+ op_array = & info -> hooks [i ]-> op_array ;
4220+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4221+ ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
4222+ zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
4223+ }
4224+ }
4225+ }
4226+ }
4227+ } ZEND_HASH_FOREACH_END ();
4228+ }
4229+ }
4230+
4231+ static void preload_fix_trait_op_array (zend_op_array * op_array )
4232+ {
4233+ if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4234+ return ;
4235+ }
4236+
4237+ zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4238+ ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4239+
4240+ zend_string * function_name = op_array -> function_name ;
4241+ zend_class_entry * scope = op_array -> scope ;
4242+ uint32_t fn_flags = op_array -> fn_flags ;
4243+ zend_function * prototype = op_array -> prototype ;
4244+ HashTable * ht = op_array -> static_variables ;
4245+ * op_array = * orig_op_array ;
4246+ op_array -> function_name = function_name ;
4247+ op_array -> scope = scope ;
4248+ op_array -> fn_flags = fn_flags ;
4249+ op_array -> prototype = prototype ;
4250+ op_array -> static_variables = ht ;
42114251}
42124252
42134253static void preload_fix_trait_methods (zend_class_entry * ce )
42144254{
42154255 zend_op_array * op_array ;
42164256
42174257 ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
4218- if (op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) {
4219- zend_op_array * orig_op_array = zend_shared_alloc_get_xlat_entry (op_array -> refcount );
4220- ZEND_ASSERT (orig_op_array && "Must be in xlat table" );
4221-
4222- zend_string * function_name = op_array -> function_name ;
4223- zend_class_entry * scope = op_array -> scope ;
4224- uint32_t fn_flags = op_array -> fn_flags ;
4225- zend_function * prototype = op_array -> prototype ;
4226- HashTable * ht = op_array -> static_variables ;
4227- * op_array = * orig_op_array ;
4228- op_array -> function_name = function_name ;
4229- op_array -> scope = scope ;
4230- op_array -> fn_flags = fn_flags ;
4231- op_array -> prototype = prototype ;
4232- op_array -> static_variables = ht ;
4233- }
4258+ preload_fix_trait_op_array (op_array );
42344259 } ZEND_HASH_FOREACH_END ();
4260+
4261+ if (ce -> num_hooked_props > 0 ) {
4262+ zend_property_info * info ;
4263+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4264+ if (info -> hooks ) {
4265+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4266+ if (info -> hooks [i ]) {
4267+ op_array = & info -> hooks [i ]-> op_array ;
4268+ preload_fix_trait_op_array (op_array );
4269+ }
4270+ }
4271+ }
4272+ } ZEND_HASH_FOREACH_END ();
4273+ }
42354274}
42364275
42374276static void preload_optimize (zend_persistent_script * script )
0 commit comments