]> granicus.if.org Git - php/commitdiff
Unified behavior of modification of returned by reference value in finnally code.
authorDmitry Stogov <dmitry@zend.com>
Wed, 13 Jul 2016 17:35:53 +0000 (20:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 13 Jul 2016 17:35:53 +0000 (20:35 +0300)
Zend/tests/bug72215_3.phpt
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 38c017b61cd0e875b7b6c5caaa323dcaa553a8b4..6f10fd7dee7133b36f46d6361200fb5fec115491 100644 (file)
@@ -4,7 +4,7 @@ Bug #72215.3 (Wrong return value if var modified in finally)
 <?php
 function &test() {
     try {
-           return $a;
+        return $a;
     } finally {
         $a = 2;
     }
@@ -12,5 +12,4 @@ function &test() {
 var_dump(test());
 ?>
 --EXPECT--
-NULL
-
+int(2)
index d8e033fec052656ccffeb8187c8027f41aa84bf5..ce3fbeb98c1966f1277b018747eb2dff8d9590e6 100644 (file)
@@ -8103,7 +8103,10 @@ ZEND_VM_HANDLER(51, ZEND_MAKE_REF, VAR|CV, UNUSED)
 
        if (OP1_TYPE == IS_CV) {
                if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       ZVAL_NEW_EMPTY_REF(op1);
+                       Z_SET_REFCOUNT_P(op1, 2);
+                       ZVAL_NULL(Z_REFVAL_P(op1));
+                       ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
                } else {
                        ZVAL_MAKE_REF(op1);
                        ZVAL_COPY(EX_VAR(opline->result.var), op1);
index 703049942bbd4e8b9315e3df2e7c4476a6f8a85b..ef73b195a070784d48a0034a4675b51e8c8e9152 100644 (file)
@@ -21820,7 +21820,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDL
 
        if (IS_VAR == IS_CV) {
                if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       ZVAL_NEW_EMPTY_REF(op1);
+                       Z_SET_REFCOUNT_P(op1, 2);
+                       ZVAL_NULL(Z_REFVAL_P(op1));
+                       ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
                } else {
                        ZVAL_MAKE_REF(op1);
                        ZVAL_COPY(EX_VAR(opline->result.var), op1);
@@ -42815,7 +42818,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLE
 
        if (IS_CV == IS_CV) {
                if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       ZVAL_NEW_EMPTY_REF(op1);
+                       Z_SET_REFCOUNT_P(op1, 2);
+                       ZVAL_NULL(Z_REFVAL_P(op1));
+                       ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
                } else {
                        ZVAL_MAKE_REF(op1);
                        ZVAL_COPY(EX_VAR(opline->result.var), op1);