]> granicus.if.org Git - php/commitdiff
Fixed bug #55305 (ref lost: 1st ref instantiated in class def, 2nd ref made w/o insta...
authorDmitry Stogov <dmitry@php.net>
Mon, 1 Aug 2011 15:23:16 +0000 (15:23 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 1 Aug 2011 15:23:16 +0000 (15:23 +0000)
Zend/tests/bug55305.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug55305.phpt b/Zend/tests/bug55305.phpt
new file mode 100644 (file)
index 0000000..7f0749a
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Bug #55305 (ref lost: 1st ref instantiated in class def, 2nd ref made w/o instantiating)
+--FILE--
+<?php
+class Foo {
+  var $foo = "test";
+}
+
+$f = new Foo();
+$f->bar =& $f->foo;
+var_dump($f->foo);
+var_dump($f->bar);
+?>
+--EXPECT--
+string(4) "test"
+string(4) "test"
index cdc6456282b78f5f20150b80d56d9ebff4149f0a..3901b3804f76fa1ea01285400ab693660904c15c 100644 (file)
@@ -1417,6 +1417,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
index 039d199d47416dd73bd6792e8442d24dfe09d246..5b336256f7e0c4e17303a4c091cbb52f5941a4bb 100644 (file)
@@ -12736,6 +12736,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -14875,6 +14877,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -16935,6 +16939,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -19999,6 +20005,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -21596,6 +21604,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -22835,6 +22845,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_H
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -23983,6 +23995,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -25399,6 +25413,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HA
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -28303,6 +28319,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -30225,6 +30243,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -32159,6 +32179,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();
@@ -34960,6 +34982,8 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
                Z_DELREF_PP(retval_ptr);
                SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
                Z_ADDREF_PP(retval_ptr);
+               EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
+               EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
        }
 
        CHECK_EXCEPTION();