]> granicus.if.org Git - php/commitdiff
Fixed assignment of "new" by reference
authorDmitry Stogov <dmitry@zend.com>
Wed, 19 Mar 2014 19:51:28 +0000 (23:51 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 19 Mar 2014 19:51:28 +0000 (23:51 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 8076ba6caa71337e2ca5cd2cd406f4aeb924d13a..d98087ac5ec15d8cd00d1f7c29360268ac76a4e7 100644 (file)
@@ -1841,7 +1841,9 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
        zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
 
        if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-//???          Z_DELREF_P(variable_ptr);
+               if (!OP2_FREE) {
+                       Z_DELREF_P(variable_ptr);
+               }
        }
 
        if (RETURN_VALUE_USED(opline)) {
index c635d8a06d7cd86106c6b5edbe9eb410121b7c82..f8429bccfe109a76ab51a922ea0635b0f31a4aee 100644 (file)
@@ -19821,7 +19821,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
        zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
 
        if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-//???          Z_DELREF_P(variable_ptr);
+               if (!(free_op2.var != NULL)) {
+                       Z_DELREF_P(variable_ptr);
+               }
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -23265,7 +23267,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
        zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
 
        if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-//???          Z_DELREF_P(variable_ptr);
+               if (!0) {
+                       Z_DELREF_P(variable_ptr);
+               }
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -36856,7 +36860,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
        zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
 
        if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-//???          Z_DELREF_P(variable_ptr);
+               if (!(free_op2.var != NULL)) {
+                       Z_DELREF_P(variable_ptr);
+               }
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -40040,7 +40046,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
        zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC);
 
        if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-//???          Z_DELREF_P(variable_ptr);
+               if (!0) {
+                       Z_DELREF_P(variable_ptr);
+               }
        }
 
        if (RETURN_VALUE_USED(opline)) {