]> granicus.if.org Git - php/commitdiff
ifixed foreach() by reference
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:38:58 +0000 (15:38 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:38:58 +0000 (15:38 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 4b3fd98e92dd70a3a07addb0d03c444ba273df10..9f7dedf09672cfb744f98618086fce436cde97da 100644 (file)
@@ -4200,6 +4200,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                                        SEPARATE_ZVAL(array_ptr);
                                        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                                ZVAL_NEW_REF(array_ptr, array_ptr);
+                                               array_ptr = Z_REFVAL_P(array_ptr);                                              
                                        }
                                }
                        }
@@ -4448,12 +4449,9 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
        }
 
        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
-               SEPARATE_ZVAL_IF_NOT_REF(value);
-               ZVAL_NEW_REF(value, value);
-               Z_ADDREF_P(value);
-       } else {
-               ZVAL_COPY(EX_VAR(opline->result.var), value);
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(value);
        }
+       ZVAL_COPY(EX_VAR(opline->result.var), value);
 
        CHECK_EXCEPTION();
        ZEND_VM_INC_OPCODE();
index d6e73260afbab094478da6fe43055c366a127841..499126023ef9e4382cac6e097f5aaa0da7c9d53d 100644 (file)
@@ -2991,6 +2991,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                                        SEPARATE_ZVAL(array_ptr);
                                        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                                ZVAL_NEW_REF(array_ptr, array_ptr);
+                                               array_ptr = Z_REFVAL_P(array_ptr);
                                        }
                                }
                        }
@@ -8045,6 +8046,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        SEPARATE_ZVAL(array_ptr);
                                        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                                ZVAL_NEW_REF(array_ptr, array_ptr);
+                                               array_ptr = Z_REFVAL_P(array_ptr);
                                        }
                                }
                        }
@@ -13151,6 +13153,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        SEPARATE_ZVAL(array_ptr);
                                        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                                ZVAL_NEW_REF(array_ptr, array_ptr);
+                                               array_ptr = Z_REFVAL_P(array_ptr);
                                        }
                                }
                        }
@@ -13399,12 +13402,9 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        }
 
        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
-               SEPARATE_ZVAL_IF_NOT_REF(value);
-               ZVAL_NEW_REF(value, value);
-               Z_ADDREF_P(value);
-       } else {
-               ZVAL_COPY(EX_VAR(opline->result.var), value);
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(value);
        }
+       ZVAL_COPY(EX_VAR(opline->result.var), value);
 
        CHECK_EXCEPTION();
        ZEND_VM_INC_OPCODE();
@@ -30045,6 +30045,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                                        SEPARATE_ZVAL(array_ptr);
                                        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                                ZVAL_NEW_REF(array_ptr, array_ptr);
+                                               array_ptr = Z_REFVAL_P(array_ptr);
                                        }
                                }
                        }