diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 18950feaf9173..0d2a8ef322278 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4753,7 +4753,7 @@ ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, return 1; } } - return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE)) || opline->op2_type == IS_UNUSED || + return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_TRUE|MAY_BE_FALSE|MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE)) || opline->op2_type == IS_UNUSED || (t2 & (MAY_BE_UNDEF|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); case ZEND_ASSIGN_OBJ: if (t1 & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_OBJECT))) { @@ -4869,7 +4869,7 @@ ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, return 0; case ZEND_FETCH_DIM_W: case ZEND_FETCH_LIST_W: - if (t1 & (MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { + if (t1 & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) { return 1; } if (t2 & (MAY_BE_RESOURCE|MAY_BE_ARRAY|MAY_BE_OBJECT)) { diff --git a/Zend/tests/falsetoarray.phpt b/Zend/tests/falsetoarray.phpt new file mode 100644 index 0000000000000..a7e6f1ffe465e --- /dev/null +++ b/Zend/tests/falsetoarray.phpt @@ -0,0 +1,194 @@ +--TEST-- +Autovivification of false to array +--FILE-- +def = false; + $this->def[] = 42; + print "[008]\n"; + $this->untyped[] = 42; + print "[009]\n"; + self::$st[] = 42; + print "[010]\n"; + static::$st2[] = 42; + print "[011]\n"; + $this::$st3[] = 42; + print "[012]\n"; + $this->pu[] = 42; + print "[013]\n"; + $this->pr[] = 42; + } +} +new Cfalse(false, false); + +echo "\nDestructuring\n"; + +print "[014]\n"; +$add = false; +foreach ([42] as $add[]); + +print "[015]\n"; +$arr = false; +[$arr[]] = [42]; + +print "[016]\n"; +$arr = [ 0 => [ 0 => false ] ]; +$arr[0][0][0][] = 42; + +print "[017]\n"; +$false = false; +$r42 = 42; +$false[] &= $r42; + +$false = false; +$false2 = false; +$false3 = false; +function &g(){ + print "[018]\n"; + global $false; + $false[] = 42; + + $var1 = false; + $GLOBALS["false2"] =& $var1; + + print "[019]\n"; + $GLOBALS["false3"][] = 42; + + print "[020]\n"; + static $f2 = false; + return $f2; +} + +$false = &g(); +$false[] = 42; +print "[021]\n"; +$false2[] = 42; + +print "[022]\n"; +$a = false; +unset($a[0][0]); + +print "[023]\n"; +$a = false; +unset($a[0]); + +?> +--EXPECTF-- +[001] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[002] + +Deprecated: Automatic conversion of false to array is deprecated in %s + +Function +[003] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[004] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[005] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[006] + +Deprecated: Automatic conversion of false to array is deprecated in %s + +Properties +[007] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[008] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[009] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[010] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[011] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[012] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[013] + +Deprecated: Automatic conversion of false to array is deprecated in %s + +Destructuring +[014] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[015] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[016] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[017] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[018] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[019] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[020] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[021] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[022] + +Deprecated: Automatic conversion of false to array is deprecated in %s +[023] + +Deprecated: Automatic conversion of false to array is deprecated in %s diff --git a/Zend/tests/indexing_001.phpt b/Zend/tests/indexing_001.phpt index 00f98237b595d..66b20da03a03e 100644 --- a/Zend/tests/indexing_001.phpt +++ b/Zend/tests/indexing_001.phpt @@ -52,7 +52,7 @@ foreach ($testvalues as $testvalue) { } ?> ---EXPECT-- +--EXPECTF-- *** Indexing - Testing value assignment with key *** array(1) { ["foo"]=> @@ -67,6 +67,8 @@ Cannot use a scalar value as an array int(1) Cannot use a scalar value as an array bool(true) + +Deprecated: Automatic conversion of false to array is deprecated in %s array(1) { ["foo"]=> array(1) { @@ -102,6 +104,8 @@ Cannot use a scalar value as an array int(1) Cannot use a scalar value as an array bool(true) + +Deprecated: Automatic conversion of false to array is deprecated in %s array(1) { ["foo"]=> &array(1) { @@ -132,6 +136,8 @@ Cannot use a scalar value as an array int(1) Cannot use a scalar value as an array bool(true) + +Deprecated: Automatic conversion of false to array is deprecated in %s array(1) { [0]=> array(1) { @@ -163,6 +169,8 @@ Cannot use a scalar value as an array int(1) Cannot use a scalar value as an array bool(true) + +Deprecated: Automatic conversion of false to array is deprecated in %s array(1) { [0]=> &array(1) { diff --git a/Zend/tests/unset_non_array.phpt b/Zend/tests/unset_non_array.phpt index e58e9e3b0b1a8..cef7f9a765805 100644 --- a/Zend/tests/unset_non_array.phpt +++ b/Zend/tests/unset_non_array.phpt @@ -95,6 +95,8 @@ try { ?> --EXPECTF-- Warning: Undefined variable $x in %s on line %d + +Deprecated: Automatic conversion of false to array is deprecated in %s Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable @@ -102,6 +104,8 @@ Cannot unset string offsets Cannot use object of type stdClass as array Warning: Undefined variable $x in %s on line %d + +Deprecated: Automatic conversion of false to array is deprecated in %s Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8477927b9eeeb..8c86b2e8c1f23 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1583,6 +1583,11 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_functi } } +ZEND_API ZEND_COLD void ZEND_FASTCALL zend_false_to_array_deprecated(void) +{ + zend_error(E_DEPRECATED, "Automatic conversion of false to array is deprecated"); +} + static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC) { zend_uchar c; @@ -2330,6 +2335,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_W && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } if (type != BP_VAR_UNSET) { array_init(container); goto fetch_from_array; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a519b3ec91601..bd5e58531ca0e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -58,6 +58,7 @@ extern ZEND_API const zend_internal_function zend_pass_function; ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc); +ZEND_API ZEND_COLD void ZEND_FASTCALL zend_false_to_array_deprecated(void); ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4a2e9a03531a3..1ed423bb374f5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1210,6 +1210,9 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); ZEND_VM_C_GOTO(assign_dim_op_new_array); } else { @@ -2590,6 +2593,10 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -6453,6 +6460,8 @@ ZEND_VM_C_LABEL(num_index_dim): zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4b7839af13293..1af7e517d04e5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22411,6 +22411,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_H if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -23356,6 +23359,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -23469,6 +23476,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -23582,6 +23593,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -23694,6 +23709,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -24531,6 +24550,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDL zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); @@ -24943,6 +24964,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -25893,6 +25917,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -26006,6 +26034,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -26119,6 +26151,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -26231,6 +26267,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -26665,6 +26705,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HAND zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); @@ -27113,6 +27155,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -27262,6 +27307,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -27375,6 +27424,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -27488,6 +27541,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -27600,6 +27657,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -28833,6 +28894,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HAND if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -29778,6 +29842,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -29891,6 +29959,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -30004,6 +30076,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -30116,6 +30192,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -30623,6 +30703,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER( zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); @@ -39413,6 +39495,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HA if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -40621,6 +40706,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -40734,6 +40823,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -40847,6 +40940,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -40959,6 +41056,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -41714,6 +41815,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLE zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); @@ -43021,6 +43124,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_H if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -44228,6 +44334,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -44341,6 +44451,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -44454,6 +44568,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -44566,6 +44684,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -45140,6 +45262,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDL zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); @@ -45767,6 +45891,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_H if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -46042,6 +46169,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -46155,6 +46286,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -46268,6 +46403,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -46380,6 +46519,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -48013,6 +48156,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDL if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } + if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { @@ -49216,6 +49362,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -49329,6 +49479,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -49442,6 +49596,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -49554,6 +49712,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + } + if (Z_ISREF_P(orig_object_ptr) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr)) && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) { @@ -50201,6 +50363,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(Z zend_throw_error(NULL, "Cannot unset string offsets"); } else if (UNEXPECTED(Z_TYPE_P(container) > IS_FALSE)) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_FALSE)) { + zend_false_to_array_deprecated(); } } while (0); diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 9e80979786a80..94595b66f7057 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -5743,9 +5743,9 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t } |3: | SEPARATE_ARRAY op1_addr, op1_info, 1, ZREG_TMP1, ZREG_TMP2 - } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE, ZREG_TMP1 + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL, ZREG_TMP1 | bgt >7 } | // ZVAL_ARR(container, zend_new_array(8)); @@ -5762,7 +5762,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t | mov FCARG1x, REG0 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |6: if (opline->op2_type == IS_UNUSED) { uint32_t var_info = MAY_BE_NULL; @@ -5816,17 +5816,17 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t } if (((op1_info & MAY_BE_ARRAY) && - (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE))) || - (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)))) { - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL))) || + (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY)))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } - if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) && + if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) && (op1_info & MAY_BE_ARRAY)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE, ZREG_TMP1 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL, ZREG_TMP1 | bgt >2 } | // ZVAL_ARR(container, zend_new_array(8)); @@ -5846,7 +5846,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t |2: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { | SET_EX_OPLINE opline, REG0 if (Z_REG(op1_addr) != ZREG_FCARG1x || Z_OFFSET(op1_addr) != 0) { | LOAD_ZVAL_ADDR FCARG1x, op1_addr @@ -5877,8 +5877,8 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline, ZREG_TMP1, ZREG_TMP2 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { | b >9 // END } |.code @@ -5939,17 +5939,17 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 |3: | SEPARATE_ARRAY op1_addr, op1_info, 1, ZREG_TMP1, ZREG_TMP2 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { if (op1_info & MAY_BE_ARRAY) { |.cold_code |7: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE, ZREG_TMP1 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL, ZREG_TMP1 | bgt >7 } if (op1_info & MAY_BE_UNDEF) { - if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & MAY_BE_NULL) { | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1, ZREG_TMP1 } | SET_EX_OPLINE opline, REG0 @@ -5976,7 +5976,7 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 } } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { uint32_t var_info; uint32_t var_def_info = zend_array_element_type(op1_def_info, opline->op1_type, 1, 0); @@ -6067,10 +6067,10 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline, ZREG_TMP1, ZREG_TMP2 } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { binary_op_type binary_op; - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } @@ -6099,12 +6099,12 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 zend_jit_check_exception(Dst); } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { | b >9 // END |.code |9: } - } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |9: | FREE_OP (opline+1)->op1_type, (opline+1)->op1, op1_data_info, 0, opline, ZREG_TMP1, ZREG_TMP2 @@ -11107,13 +11107,13 @@ static int zend_jit_fetch_dim(dasm_State **Dst, |3: | SEPARATE_ARRAY op1_addr, op1_info, 1, ZREG_TMP1, ZREG_TMP2 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { if (op1_info & MAY_BE_ARRAY) { |.cold_code |7: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE, ZREG_TMP1 + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL, ZREG_TMP1 | bgt >7 } if (Z_REG(op1_addr) != ZREG_FP) { @@ -11121,7 +11121,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } if ((op1_info & MAY_BE_UNDEF) && opline->opcode == ZEND_FETCH_DIM_RW) { - if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & MAY_BE_NULL) { | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1, ZREG_TMP1 } | SET_EX_OPLINE opline, REG0 @@ -11145,7 +11145,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |6: if (opline->op2_type == IS_UNUSED) { | // var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); @@ -11199,8 +11199,8 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } @@ -11233,7 +11233,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, ZEND_UNREACHABLE(); } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { | b >8 // END |.code } diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 3919259c38f37..59966ca09226d 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -1073,6 +1073,26 @@ static zend_always_inline void ZEND_FASTCALL zend_jit_fetch_dim_obj_helper(zval } } ZVAL_UNDEF(result); + } else if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + zend_array *arr = zend_new_array(0); + ZVAL_ARR(object_ptr, arr); + zval *var; + if (dim) { + if (type == BP_VAR_W) { + var = zend_jit_fetch_dim_w_helper(arr, dim); + } else { + ZEND_ASSERT(type == BP_VAR_RW); + var = zend_jit_fetch_dim_rw_helper(arr, dim); + } + } else { + var = zend_hash_next_index_insert_new(arr, &EG(uninitialized_zval)); + } + if (var) { + ZVAL_INDIRECT(result, var); + } else { + ZVAL_UNDEF(result); + } } else { if (type == BP_VAR_UNSET) { zend_throw_error(NULL, "Cannot unset offset in a non-array variable"); @@ -1120,6 +1140,24 @@ static void ZEND_FASTCALL zend_jit_assign_dim_helper(zval *object_ptr, zval *dim } else { zend_assign_to_string_offset(object_ptr, dim, value, result); } + } else if (Z_TYPE_P(object_ptr) == IS_FALSE) { + zend_false_to_array_deprecated(); + zend_array *arr = zend_new_array(0); + ZVAL_ARR(object_ptr, arr); + zval *var = dim + ? zend_jit_fetch_dim_w_helper(arr, dim) + : zend_hash_next_index_insert_new(arr, &EG(uninitialized_zval)); + if (!var) { + if (result) { + ZVAL_UNDEF(result); + } + return; + } + + ZVAL_COPY_DEREF(var, value); + if (result) { + ZVAL_COPY(result, var); + } } else { zend_throw_error(NULL, "Cannot use a scalar value as an array"); if (result) { @@ -1145,34 +1183,31 @@ static void ZEND_FASTCALL zend_jit_assign_dim_op_helper(zval *container, zval *d if (z == &rv) { zval_ptr_dtor(&rv); } -//??? if (retval) { -//??? ZVAL_COPY(retval, &res); -//??? } zval_ptr_dtor(&res); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); -//??? if (retval) { -//??? ZVAL_NULL(retval); -//??? } } - } else { - if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) { - if (!dim) { - zend_throw_error(NULL, "[] operator not supported for strings"); - } else { - if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) { - zend_check_string_offset(dim/*, BP_VAR_RW*/); - } - zend_wrong_string_offset(); - } -//??? } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { -//??? ZEND_VM_C_GOTO(assign_dim_op_convert_to_array); + } else if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) { + if (!dim) { + zend_throw_error(NULL, "[] operator not supported for strings"); } else { - zend_throw_error(NULL, "Cannot use a scalar value as an array"); -//??? if (retval) { -//??? ZVAL_NULL(retval); -//??? } + if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) { + zend_check_string_offset(dim/*, BP_VAR_RW*/); + } + zend_wrong_string_offset(); + } + } else if (Z_TYPE_P(container) == IS_FALSE) { + zend_false_to_array_deprecated(); + zend_array *arr = zend_new_array(0); + ZVAL_ARR(container, arr); + zval *var = dim + ? zend_jit_fetch_dim_rw_helper(arr, dim) + : zend_hash_next_index_insert_new(arr, &EG(uninitialized_zval)); + if (var) { + binary_op(var, var, value); } + } else { + zend_throw_error(NULL, "Cannot use a scalar value as an array"); } } @@ -1891,6 +1926,9 @@ static zval * ZEND_FASTCALL zend_jit_prepare_assign_dim_ref(zval *ref) { && !zend_verify_ref_array_assignable(Z_REF_P(ref))) { return NULL; } + if (Z_TYPE_P(val) == IS_FALSE) { + zend_false_to_array_deprecated(); + } ZVAL_ARR(val, zend_new_array(8)); } return val; diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 6ff14e79b2efc..3be1e771ae2f0 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -5198,7 +5198,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, op1_addr, op2_info, RES_REG_ADDR(), (opline->opcode == ZEND_FETCH_DIM_RW || opline->op2_type == IS_UNUSED - || (op1_info & (MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) + || (op1_info & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) || (op2_info & (MAY_BE_UNDEF|MAY_BE_RESOURCE|MAY_BE_ARRAY|MAY_BE_OBJECT)) || (opline->op1_type == IS_VAR && (op1_info & MAY_BE_UNDEF) @@ -5207,7 +5207,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (ssa_op->result_def > 0 && (opline->opcode == ZEND_FETCH_DIM_W || opline->opcode == ZEND_FETCH_LIST_W) - && !(op1_info & (MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) + && !(op1_info & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_RESOURCE|MAY_BE_ARRAY|MAY_BE_OBJECT))) { ssa->var_info[ssa_op->result_def].indirect_reference = 1; } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 771126f644215..924fe241efdff 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -6224,9 +6224,9 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t } |3: | SEPARATE_ARRAY op1_addr, op1_info, 1 - } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL | jg >7 } | // ZVAL_ARR(container, zend_new_array(8)); @@ -6242,7 +6242,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t | mov FCARG1a, r0 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |6: if (opline->op2_type == IS_UNUSED) { uint32_t var_info = MAY_BE_NULL; @@ -6296,17 +6296,17 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t } if (((op1_info & MAY_BE_ARRAY) && - (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE))) || - (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)))) { - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL))) || + (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY)))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } - if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) && + if ((op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) && (op1_info & MAY_BE_ARRAY)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL | jg >2 } | // ZVAL_ARR(container, zend_new_array(8)); @@ -6325,7 +6325,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t |2: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { | SET_EX_OPLINE opline, r0 if (Z_REG(op1_addr) != ZREG_FCARG1a || Z_OFFSET(op1_addr) != 0) { | LOAD_ZVAL_ADDR FCARG1a, op1_addr @@ -6374,8 +6374,8 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { | jmp >9 // END } |.code @@ -6435,17 +6435,17 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 |3: | SEPARATE_ARRAY op1_addr, op1_info, 1 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { if (op1_info & MAY_BE_ARRAY) { |.cold_code |7: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL | jg >7 } if (op1_info & MAY_BE_UNDEF) { - if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & MAY_BE_NULL) { | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 } | SET_EX_OPLINE opline, r0 @@ -6471,7 +6471,7 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 } } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { uint32_t var_info; uint32_t var_def_info = zend_array_element_type(op1_def_info, opline->op1_type, 1, 0); @@ -6570,10 +6570,10 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { binary_op_type binary_op; - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } @@ -6611,12 +6611,12 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3 zend_jit_check_exception(Dst); } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { | jmp >9 // END |.code |9: } - } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + } else if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |9: | FREE_OP (opline+1)->op1_type, (opline+1)->op1, op1_data_info, 0, opline @@ -11761,13 +11761,13 @@ static int zend_jit_fetch_dim(dasm_State **Dst, |3: | SEPARATE_ARRAY op1_addr, op1_info, 1 } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL)) { if (op1_info & MAY_BE_ARRAY) { |.cold_code |7: } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - | CMP_ZVAL_TYPE op1_addr, IS_FALSE + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + | CMP_ZVAL_TYPE op1_addr, IS_NULL | jg >7 } if (Z_REG(op1_addr) != ZREG_FP) { @@ -11775,7 +11775,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } if ((op1_info & MAY_BE_UNDEF) && opline->opcode == ZEND_FETCH_DIM_RW) { - if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) { + if (op1_info & MAY_BE_NULL) { | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1 } | SET_EX_OPLINE opline, r0 @@ -11798,7 +11798,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } } - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |6: if (opline->op2_type == IS_UNUSED) { | // var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); @@ -11853,8 +11853,8 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } } - if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY))) { - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_ARRAY))) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { |.cold_code |7: } @@ -11895,7 +11895,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst, | add r4, 12 |.endif - if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY)) { + if (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_ARRAY)) { | jmp >8 // END |.code } diff --git a/ext/opcache/tests/jit/assign_dim_002.phpt b/ext/opcache/tests/jit/assign_dim_002.phpt index feb80b7c4003b..a072ec26fda13 100644 --- a/ext/opcache/tests/jit/assign_dim_002.phpt +++ b/ext/opcache/tests/jit/assign_dim_002.phpt @@ -81,6 +81,45 @@ function foo5() { } var_dump(foo5()); +function false_to_array($a) { + var_dump($a[2] = 1); + return $a; +} +function false_to_array_append($a) { + var_dump($a[] = 1); + return $a; +} +function false_to_array_invalid_index($a) { + var_dump($a[[]] = 1); + return $a; +} +function false_to_array_nested($a) { + var_dump($a[2][3] = 1); + return $a; +} +function false_to_array_nested_append($a) { + var_dump($a[][] = 1); + return $a; +} +function false_to_array_nested_invalid_index($a) { + var_dump($a[[]][0] = 1); + return $a; +} +var_dump(false_to_array(false)); +var_dump(false_to_array_append(false)); +try { + var_dump(false_to_array_invalid_index(false)); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +var_dump(false_to_array_nested(false)); +var_dump(false_to_array_nested_append(false)); +try { + var_dump(false_to_array_nested_invalid_index(false)); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + ?> --EXPECTF-- array(1) { @@ -136,3 +175,43 @@ array(1) { } Cannot use a scalar value as an array int(1) + +Deprecated: Automatic conversion of false to array is deprecated in %s +int(1) +array(1) { + [2]=> + int(1) +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +int(1) +array(1) { + [0]=> + int(1) +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +Illegal offset type + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +int(1) +array(1) { + [2]=> + array(1) { + [3]=> + int(1) + } +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +int(1) +array(1) { + [0]=> + array(1) { + [0]=> + int(1) + } +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +Illegal offset type diff --git a/ext/opcache/tests/jit/assign_dim_op_001.phpt b/ext/opcache/tests/jit/assign_dim_op_001.phpt index 0f481ba4834cb..86fdd94181b53 100644 --- a/ext/opcache/tests/jit/assign_dim_op_001.phpt +++ b/ext/opcache/tests/jit/assign_dim_op_001.phpt @@ -9,13 +9,91 @@ opcache.jit_buffer_size=1M opcache --FILE-- getMessage(), "\n"; +} +var_dump(false_to_array_nested(false)); +var_dump(false_to_array_nested_append(false)); +try { + var_dump(false_to_array_nested_invalid_index(false)); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + ?> ---EXPECT-- +--EXPECTF-- array(1) { ["ab"]=> int(2) } + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d + +Warning: Undefined array key 2 in %s on line %d + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +Illegal offset type + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d + +Warning: Undefined array key 2 in %s on line %d + +Warning: Undefined array key 3 in %s on line %d +array(1) { + [2]=> + array(1) { + [3]=> + int(1) + } +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +array(1) { + [0]=> + array(1) { + [0]=> + int(1) + } +} + +Deprecated: Automatic conversion of false to array is deprecated in %s on line %d +Illegal offset type