]> granicus.if.org Git - php/commitdiff
Missing handling of IS_REF in ext/standard/tests/strings/bug47842.php
authorXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 11:36:38 +0000 (19:36 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 11:36:38 +0000 (19:36 +0800)
Zend/zend_operators.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 1803d5075d9c3ca363b597cb87e9671caaa20fca..e81b997af735f84744a298dfe5fc618e5c4ce75d 100644 (file)
@@ -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;
index 43ca503504e16ecbba118af428e9b40065d1fe4b..2f8a5bde7e1a06d05b72ac153a09c97204895038 100644 (file)
@@ -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();
index b2bacddfce50b244a954a17d613a6af7fd25126c..4ef089571a1e99630bf37d27bab18eaf95f9e776 100644 (file)
@@ -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();