From 91e2a9139694d24c341cdc648dae8148912412de Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sun, 23 Feb 2014 19:36:38 +0800 Subject: [PATCH] Missing handling of IS_REF in ext/standard/tests/strings/bug47842.php --- Zend/zend_operators.c | 1 + Zend/zend_vm_def.h | 5 +++++ Zend/zend_vm_execute.h | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 1803d5075d..e81b997af7 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -663,6 +663,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */ break; } default: + //??? op is set to be IS_STRING below. zval_dtor(op); ZVAL_BOOL(op, 0); break; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 43ca503504..2f8a5bde7e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -954,6 +954,11 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY) if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) { Z_SET_REFCOUNT_P(z, 1); } + + if (UNEXPECTED(Z_ISREF_P(z))) { + z = Z_REFVAL_P(z); + } + zend_print_variable(z); FREE_OP1(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b2bacddfce..4ef089571a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2342,6 +2342,11 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) { Z_SET_REFCOUNT_P(z, 1); } + + if (UNEXPECTED(Z_ISREF_P(z))) { + z = Z_REFVAL_P(z); + } + zend_print_variable(z); CHECK_EXCEPTION(); @@ -7351,6 +7356,11 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) { Z_SET_REFCOUNT_P(z, 1); } + + if (UNEXPECTED(Z_ISREF_P(z))) { + z = Z_REFVAL_P(z); + } + zend_print_variable(z); zval_dtor(free_op1.var); @@ -12279,6 +12289,11 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) { Z_SET_REFCOUNT_P(z, 1); } + + if (UNEXPECTED(Z_ISREF_P(z))) { + z = Z_REFVAL_P(z); + } + zend_print_variable(z); zval_ptr_dtor_nogc(free_op1.var); @@ -28963,6 +28978,11 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (IS_CV == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) { Z_SET_REFCOUNT_P(z, 1); } + + if (UNEXPECTED(Z_ISREF_P(z))) { + z = Z_REFVAL_P(z); + } + zend_print_variable(z); CHECK_EXCEPTION(); -- 2.50.1