@@ -4202,36 +4202,75 @@ static void preload_remove_empty_includes(void)
4202
4202
4203
4203
static void preload_register_trait_methods (zend_class_entry * ce ) {
4204
4204
zend_op_array * op_array ;
4205
+ zend_property_info * info ;
4206
+
4205
4207
ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , op_array ) {
4206
4208
if (!(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
4207
4209
ZEND_ASSERT (op_array -> refcount && "Must have refcount pointer" );
4208
4210
zend_shared_alloc_register_xlat_entry (op_array -> refcount , op_array );
4209
4211
}
4210
4212
} 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 ;
4211
4251
}
4212
4252
4213
4253
static void preload_fix_trait_methods (zend_class_entry * ce )
4214
4254
{
4215
4255
zend_op_array * op_array ;
4216
4256
4217
4257
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 );
4234
4259
} 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
+ }
4235
4274
}
4236
4275
4237
4276
static void preload_optimize (zend_persistent_script * script )
0 commit comments