From: Dmitry Stogov Date: Wed, 26 Feb 2014 11:38:58 +0000 (+0400) Subject: ifixed foreach() by reference X-Git-Tag: POST_PHPNG_MERGE~412^2~514 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6829be6c26565755cfe447a8f257bbde9891fefe;p=php ifixed foreach() by reference --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4b3fd98e92..9f7dedf096 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d6e73260af..499126023e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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); } } }