Skip to content

Commit 2f27cc2

Browse files
committed
Fix accidental separation on non-mutating method call
1 parent 3feaa68 commit 2f27cc2

File tree

4 files changed

+81
-28
lines changed

4 files changed

+81
-28
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Non-mutating methods do not cause separation
3+
--FILE--
4+
<?php
5+
6+
struct Test {
7+
public function test() {
8+
var_dump(__METHOD__);
9+
}
10+
}
11+
12+
$a = new Test();
13+
$b = $a;
14+
15+
$a->test();
16+
$b->test();
17+
18+
var_dump($a, $b);
19+
20+
?>
21+
--EXPECT--
22+
string(10) "Test::test"
23+
string(10) "Test::test"
24+
object(Test)#1 (0) {
25+
}
26+
object(Test)#1 (0) {
27+
}

Zend/tests/structs/pre_post_inc_dec.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct Box {
88
public $value,
99
) {}
1010

11-
public function preDec() {
11+
public mutating function preDec() {
1212
--$this->value;
1313
}
1414
}
@@ -28,7 +28,7 @@ $postInc = $original;
2828
var_dump($postInc->value++);
2929

3030
$preDecMethod = $original;
31-
var_dump($preDecMethod->preDec());
31+
var_dump($preDecMethod->preDec!());
3232

3333
var_dump($preDec);
3434
var_dump($preInc);

Zend/zend_vm_def.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3539,7 +3539,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
35393539
} else {
35403540
do {
35413541
if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
3542-
if (OP1_TYPE & (IS_CV|IS_VAR)) {
3542+
if (OP1_TYPE & (IS_CV|IS_VAR) && UNEXPECTED(opline->extended_value & ZEND_INIT_METHOD_CALL_MUTATING)) {
35433543
SEPARATE_DATA_OBJ(object);
35443544
}
35453545
obj = Z_OBJ_P(object);
@@ -3549,7 +3549,9 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
35493549

35503550
object = &ref->val;
35513551
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
3552-
SEPARATE_DATA_OBJ(object);
3552+
if (UNEXPECTED(opline->extended_value & ZEND_INIT_METHOD_CALL_MUTATING)) {
3553+
SEPARATE_DATA_OBJ(object);
3554+
}
35533555
obj = Z_OBJ_P(object);
35543556
if ((OP1_TYPE & IS_VAR) && !needs_addref) {
35553557
if (UNEXPECTED(GC_DELREF(ref) == 0)) {

Zend/zend_vm_execute.h

Lines changed: 48 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)