From: Dmitry Stogov Date: Wed, 26 Dec 2018 21:20:20 +0000 (+0300) Subject: Fixed ext/spl/tests/bug61347.phpt failure introduced by ZEND_ARRAY_KEY_EXISTS opcode X-Git-Tag: php-7.4.0alpha1~1335 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70fcbe3524653e23893d616d2102af681f6aa20a;p=php Fixed ext/spl/tests/bug61347.phpt failure introduced by ZEND_ARRAY_KEY_EXISTS opcode --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bd8b51300f..d02c75f52e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d47413364a..e10c490e84 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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);