From 6829be6c26565755cfe447a8f257bbde9891fefe Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 26 Feb 2014 15:38:58 +0400 Subject: [PATCH] ifixed foreach() by reference --- Zend/zend_vm_def.h | 8 +++----- Zend/zend_vm_execute.h | 11 ++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) 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); } } } -- 2.50.1