Fixed ext/spl/tests/bug61347.phpt failure introduced by ZEND_ARRAY_KEY_EXISTS opcode
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Dec 2018 21:20:20 +0000 (00:20 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Dec 2018 21:20:20 +0000 (00:20 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index bd8b51300f757cf26f159f2268cb325732f8ae34..d02c75f52e53a698e7c146b260f0da8999f5fe2a 100644 (file)
@@ -6388,7 +6388,7 @@ ZEND_VM_C_LABEL(try_again_subject):
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                ZEND_VM_C_GOTO(try_again_subject);
@@ -6426,6 +6426,10 @@ ZEND_VM_C_LABEL(try_again_key):
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        FREE_OP2();
        FREE_OP1();
        ZEND_VM_SMART_BRANCH(result, 1);
index d47413364a8f48ce2a262ce4efba8f000ebb646a..e10c490e8493fb0a9838ebfd1ed6f5b8e4de075d 100644 (file)
@@ -5754,7 +5754,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -5792,6 +5792,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
 
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
@@ -7774,7 +7778,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -7812,6 +7816,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        zval_ptr_dtor_nogc(free_op2);
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -10905,7 +10913,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -10943,6 +10951,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
 
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
@@ -14530,7 +14542,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -14568,6 +14580,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
@@ -16053,7 +16069,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -16091,6 +16107,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        zval_ptr_dtor_nogc(free_op2);
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -17976,7 +17996,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -18014,6 +18034,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
@@ -41614,7 +41638,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -41652,6 +41676,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
 
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
@@ -45209,7 +45237,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -45247,6 +45275,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
        zval_ptr_dtor_nogc(free_op2);
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -51069,7 +51101,7 @@ try_again_subject:
        if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
                ht = Z_ARRVAL_P(subject);
        } else if (UNEXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
-               ht = Z_OBJPROP_P(subject);
+               ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
        } else if (Z_ISREF_P(subject)) {
                subject = Z_REFVAL_P(subject);
                goto try_again_subject;
@@ -51107,6 +51139,10 @@ try_again_key:
                result = 0;
        }
 
+       if (Z_TYPE_P(subject) != IS_ARRAY) {
+               zend_release_properties(ht);
+       }
+
 
        ZEND_VM_SMART_BRANCH(result, 1);
        ZVAL_BOOL(EX_VAR(opline->result.var), result);