@@ -974,6 +974,28 @@ zend_function *zend_optimizer_get_called_func(
974
974
}
975
975
}
976
976
break ;
977
+ case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL : {
978
+ zend_class_entry * scope = op_array -> scope ;
979
+ ZEND_ASSERT (scope != NULL );
980
+ if ((scope -> ce_flags & ZEND_ACC_LINKED ) && scope -> parent ) {
981
+ zend_class_entry * parent_scope = scope -> parent ;
982
+ zend_string * prop_name = Z_STR_P (CRT_CONSTANT (opline -> op1 ));
983
+ zend_property_hook_kind hook_kind = opline -> op2 .num ;
984
+ zend_property_info * prop_info = zend_get_property_info (parent_scope , prop_name , /* silent */ true);
985
+
986
+ if (prop_info
987
+ && prop_info != ZEND_WRONG_PROPERTY_INFO
988
+ && !(prop_info -> flags & ZEND_ACC_PRIVATE )
989
+ && prop_info -> hooks ) {
990
+ zend_function * fbc = prop_info -> hooks [hook_kind ];
991
+ if (fbc ) {
992
+ * is_prototype = false;
993
+ return fbc ;
994
+ }
995
+ }
996
+ }
997
+ break ;
998
+ }
977
999
case ZEND_NEW :
978
1000
{
979
1001
zend_class_entry * ce = zend_optimizer_get_class_entry_from_op1 (
@@ -1531,6 +1553,19 @@ void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void
1531
1553
zend_foreach_op_array_helper (op_array , func , context );
1532
1554
}
1533
1555
} ZEND_HASH_FOREACH_END ();
1556
+
1557
+ zend_property_info * property ;
1558
+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , property ) {
1559
+ zend_function * * hooks = property -> hooks ;
1560
+ if (property -> ce == ce && property -> hooks ) {
1561
+ for (uint32_t i = 0 ; i < ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
1562
+ zend_function * hook = hooks [i ];
1563
+ if (hook && hook -> common .scope == ce ) {
1564
+ zend_foreach_op_array_helper (& hooks [i ]-> op_array , func , context );
1565
+ }
1566
+ }
1567
+ }
1568
+ } ZEND_HASH_FOREACH_END ();
1534
1569
} ZEND_HASH_FOREACH_END ();
1535
1570
}
1536
1571
0 commit comments