Skip to content

Commit 9fd6273

Browse files
committed
Merge branch 'PHP-8.4'
* PHP-8.4: Fix skipped lazy init on primed SIMPLE_WRITE
2 parents e58521c + 9acfe6e commit 9fd6273

File tree

3 files changed

+364
-333
lines changed

3 files changed

+364
-333
lines changed

Zend/tests/lazy_objects/gh17998.phpt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
GH-17998: Skipped lazy init on primed SIMPLE_WRITE
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public $prop {
8+
set => $value;
9+
}
10+
}
11+
12+
$nonLazy = new C;
13+
14+
$lazy = (new ReflectionClass(C::class))->newLazyProxy(function () {
15+
echo "init\n";
16+
return new C;
17+
});
18+
19+
function foo(C $c) {
20+
$c->prop = 1;
21+
var_dump($c->prop);
22+
}
23+
24+
foo($nonLazy);
25+
foo($lazy);
26+
27+
?>
28+
--EXPECT--
29+
int(1)
30+
init
31+
int(1)

Zend/zend_vm_def.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2457,12 +2457,14 @@ ZEND_VM_C_LABEL(assign_object):
24572457
void **cache_slot = CACHE_ADDR(opline->extended_value);
24582458
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
24592459
zval *property_val;
2460+
zend_property_info *prop_info;
24602461

24612462
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
2463+
prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
2464+
2465+
ZEND_VM_C_LABEL(assign_obj_simple):
24622466
property_val = OBJ_PROP(zobj, prop_offset);
24632467
if (Z_TYPE_P(property_val) != IS_UNDEF) {
2464-
zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
2465-
24662468
if (prop_info != NULL) {
24672469
value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
24682470
ZEND_VM_C_GOTO(free_and_exit_assign_obj);
@@ -2534,14 +2536,12 @@ ZEND_VM_C_LABEL(fast_assign_obj):
25342536
} else {
25352537
ZEND_ASSERT(IS_HOOKED_PROPERTY_OFFSET(prop_offset));
25362538
if (ZEND_IS_PROPERTY_HOOK_SIMPLE_WRITE(prop_offset)) {
2537-
zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
2538-
property_val = OBJ_PROP(zobj, prop_info->offset);
2539-
if (ZEND_TYPE_IS_SET(prop_info->type)) {
2540-
value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
2541-
ZEND_VM_C_GOTO(free_and_exit_assign_obj);
2542-
} else {
2543-
ZEND_VM_C_GOTO(fast_assign_obj);
2539+
prop_info = CACHED_PTR_EX(cache_slot + 2);
2540+
prop_offset = prop_info->offset;
2541+
if (!ZEND_TYPE_IS_SET(prop_info->type)) {
2542+
prop_info = NULL;
25442543
}
2544+
ZEND_VM_C_GOTO(assign_obj_simple);
25452545
}
25462546
/* Fall through to write_property for hooks. */
25472547
}

0 commit comments

Comments
 (0)