@@ -1409,12 +1409,24 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
14091409 UNEXPECTED ((* zend_get_property_guard (zobj , name )) & IN_GET ) ||
14101410 UNEXPECTED (prop_info && (Z_PROP_FLAG_P (retval ) & IS_PROP_UNINIT ))) {
14111411 if (UNEXPECTED (zend_lazy_object_must_init (zobj ) && (Z_PROP_FLAG_P (retval ) & IS_PROP_LAZY ))) {
1412- zobj = zend_lazy_object_init (zobj );
1413- if (!zobj ) {
1412+ bool guarded = zobj -> ce -> __get
1413+ && (* zend_get_property_guard (zobj , name ) & IN_GET );
1414+ zend_object * instance = zend_lazy_object_init (zobj );
1415+ if (!instance ) {
14141416 return & EG (error_zval );
14151417 }
14161418
1417- return zend_std_get_property_ptr_ptr (zobj , name , type , cache_slot );
1419+ if (guarded && (instance -> ce -> ce_flags & ZEND_ACC_USE_GUARDS )) {
1420+ uint32_t * guard = zend_get_property_guard (instance , name );
1421+ if (!(* guard & IN_GET )) {
1422+ (* guard ) |= IN_GET ;
1423+ retval = zend_std_get_property_ptr_ptr (instance , name , type , cache_slot );
1424+ (* guard ) &= ~IN_GET ;
1425+ return retval ;
1426+ }
1427+ }
1428+
1429+ return zend_std_get_property_ptr_ptr (instance , name , type , cache_slot );
14181430 }
14191431 if (UNEXPECTED (type == BP_VAR_RW )) {
14201432 if (prop_info ) {
@@ -1457,6 +1469,25 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
14571469 }
14581470 if (EXPECTED (!zobj -> ce -> __get ) ||
14591471 UNEXPECTED ((* zend_get_property_guard (zobj , name )) & IN_GET )) {
1472+ if (UNEXPECTED (zend_lazy_object_must_init (zobj ))) {
1473+ bool guarded = (zobj -> ce -> __get != NULL );
1474+ zend_object * instance = zend_lazy_object_init (zobj );
1475+ if (!instance ) {
1476+ return & EG (error_zval );
1477+ }
1478+
1479+ if (guarded && (instance -> ce -> ce_flags & ZEND_ACC_USE_GUARDS )) {
1480+ uint32_t * guard = zend_get_property_guard (instance , name );
1481+ if (!(* guard & IN_GET )) {
1482+ (* guard ) |= IN_GET ;
1483+ retval = zend_std_get_property_ptr_ptr (instance , name , type , cache_slot );
1484+ (* guard ) &= ~IN_GET ;
1485+ return retval ;
1486+ }
1487+ }
1488+
1489+ return zend_std_get_property_ptr_ptr (instance , name , type , cache_slot );
1490+ }
14601491 if (UNEXPECTED (zobj -> ce -> ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES )) {
14611492 zend_forbidden_dynamic_property (zobj -> ce , name );
14621493 return & EG (error_zval );
@@ -1466,14 +1497,6 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
14661497 return & EG (error_zval );
14671498 }
14681499 }
1469- if (UNEXPECTED (zend_lazy_object_must_init (zobj ))) {
1470- zobj = zend_lazy_object_init (zobj );
1471- if (!zobj ) {
1472- return & EG (error_zval );
1473- }
1474-
1475- return zend_std_get_property_ptr_ptr (zobj , name , type , cache_slot );
1476- }
14771500 if (UNEXPECTED (!zobj -> properties )) {
14781501 rebuild_object_properties_internal (zobj );
14791502 }
0 commit comments