Revert "Fetch for read in nested property assignments"

This reverts commit bb43a3822e.

After thinking about this a bit more, this is now going to be
a complete solution for the "readonly properties" case, for example:

    unset($foo->readOnly->bar);

should also be legal and

    $foo->readOnly['bar'] = 42;

should also be legal if $foo->readOnly is not an array but an
ArrayAccess object.

I think it may be better to distinguish better on the BP_VAR flag
level. Reverting for now.
This commit is contained in:
Nikita Popov 2020-03-18 14:52:22 +01:00
parent a5f136b855
commit df79277de3
15 changed files with 3176 additions and 3192 deletions

View file

@ -44,8 +44,8 @@ PHP 8.0 UPGRADE NOTES
. Removed ability to use array_key_exists() with objects. Use one of isset()
or property_exists() instead.
. Made the behavior of array_key_exists() regarding the type of the key
parameter consistent with isset() and normal array access. All key types
now use the usual coercions and array/object keys throw a TypeError.
parameter consistent with isset() and normal array access. All key types now use
the usual coercions and array/object keys throw a TypeError.
. Any array that has a number n as its first numeric key will use n+1 for
its next implicit key. Even if n is negative.
RFC: https://wiki.php.net/rfc/negative_array_index
@ -305,19 +305,6 @@ PHP 8.0 UPGRADE NOTES
of the return value is not stable and may change between PHP versions.
. Reflection export() methods have been removed.
- SimpleXML:
. It is no longer possible to perform deep initialization of SimpleXMLElement
objects:
$x = simplexml_load_string("<root></root>");
$x->a->b->c = 'Test';
// Error: Attempt to assign property 'c' of non-object
The addChild() and addAttribute() APIs should be used instead. It is still
possible to modify already existing nodes by direct property assignment,
only the creation of multiple levels of nodes in one assignment is no longer
supported.
- Socket:
. The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
flags for socket_addrinfo_lookup() have been removed.

View file

@ -15,6 +15,14 @@ try {
echo $e->getMessage(), "\n";
}
$arr[][] = 2;
try {
$arr[][]->bar = 2;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECTF--
Warning: Undefined variable: arr in %s on line %d
@ -54,16 +62,5 @@ Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to get property 'foo' of non-object in %s on line %d
Warning: Undefined variable: arr in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Attempt to assign property 'foo' of non-object
Attempt to assign property 'bar' of non-object

View file

@ -9,7 +9,7 @@ $foo[0]->bar = "xyz";
echo "Done\n";
?>
--EXPECTF--
Fatal error: Uncaught Error: Attempt to assign property 'bar' of non-object in %s:%d
Fatal error: Uncaught Error: Cannot use string offset as an object in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d

View file

@ -8,9 +8,7 @@ $foo[3]->bar[1] = "bang";
echo "ok\n";
?>
--EXPECTF--
Warning: Uninitialized string offset: 3 in %s on line %d
Fatal error: Uncaught Error: Attempt to modify property 'bar' of non-object in %s:%d
Fatal error: Uncaught Error: Cannot use string offset as an object in %sbug41919.php:%d
Stack trace:
#0 {main}
thrown in %sbug41919.php on line %d

View file

@ -6,7 +6,7 @@ $s = "abd";
$s[0]->a += 1;
?>
--EXPECTF--
Fatal error: Uncaught Error: Attempt to assign property 'a' of non-object in %s:%d
Fatal error: Uncaught Error: Cannot use string offset as an object in %sbug47704.php:%d
Stack trace:
#0 {main}
thrown in %sbug47704.php on line %d

View file

@ -51,25 +51,19 @@ Warning: Undefined variable: x in %s on line %d
Attempt to assign property 'a' of non-object
Warning: Undefined variable: x in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to assign property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: x in %s on line %d
Attempt to increment/decrement property 'a' of non-object
Warning: Undefined variable: x in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to increment/decrement property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: x in %s on line %d
Attempt to assign property 'a' of non-object
Warning: Undefined variable: x in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to assign property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: x in %s on line %d

View file

@ -53,29 +53,15 @@ Attempt to modify property 'a' of non-object
Warning: Undefined variable: null in %s on line %d
NULL
Warning: Undefined variable: null in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to assign property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: null in %s on line %d
NULL
Warning: Undefined variable: null in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Warning: Trying to access array offset on value of type null in %s on line %d
Attempt to assign property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: null in %s on line %d
NULL
Warning: Undefined variable: null in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to modify property 'b' of non-object
Attempt to modify property 'a' of non-object
Warning: Undefined variable: null in %s on line %d
NULL

View file

@ -34,6 +34,4 @@ Warning: Undefined variable: u3 in %s on line %d
Attempt to increment/decrement property 'a' of non-object
Warning: Undefined variable: u4 in %s on line %d
Warning: Trying to get property 'a' of non-object in %s on line %d
Attempt to assign property 'a' of non-object
Attempt to modify property 'a' of non-object

View file

@ -2703,13 +2703,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
}
CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
} else {
/* In $a->b->c = $d, fetch $a->b for read and only ->c for write.
* We will never modify $a->b itself, only the object it holds. */
if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_FUNC_ARG) {
opline = zend_delayed_compile_var(&obj_node, obj_ast, BP_VAR_R, 0);
} else {
opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0);
}
opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0);
zend_separate_if_call_and_write(&obj_node, obj_ast, type);
}
zend_compile_expr(&prop_node, prop_ast);

View file

@ -989,7 +989,7 @@ ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
HANDLE_EXCEPTION();
}
ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
{
USE_OPLINE
zval *object;
@ -1002,7 +1002,7 @@ ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV,
zend_string *name, *tmp_name;
SAVE_OPLINE();
object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
do {
@ -1080,7 +1080,7 @@ ZEND_VM_C_LABEL(assign_op_object):
FREE_OP_DATA();
FREE_OP2();
FREE_OP1();
FREE_OP1_VAR_PTR();
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -1248,7 +1248,7 @@ ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zval *object;
@ -1260,7 +1260,7 @@ ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
zend_string *name, *tmp_name;
SAVE_OPLINE();
object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
do {
@ -1312,7 +1312,7 @@ ZEND_VM_C_LABEL(pre_incdec_object):
} while (0);
FREE_OP2();
FREE_OP1();
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1333,7 +1333,7 @@ ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC
zend_string *name, *tmp_name;
SAVE_OPLINE();
object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
do {
@ -1384,7 +1384,7 @@ ZEND_VM_C_LABEL(post_incdec_object):
} while (0);
FREE_OP2();
FREE_OP1();
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -2113,14 +2113,14 @@ ZEND_VM_C_LABEL(fetch_obj_r_finish):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_WRITE|CACHE_SLOT)
ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_WRITE|CACHE_SLOT)
{
USE_OPLINE
zval *property, *container, *result;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
result = EX_VAR(opline->result.var);
zend_fetch_property_address(
@ -2128,24 +2128,24 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FE
((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
if (OP1_TYPE == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zval *property, *container, *result;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
result = EX_VAR(opline->result.var);
zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
if (OP1_TYPE == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@ -2262,7 +2262,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_finish):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT)
ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT)
{
#if !ZEND_VM_SPEC
USE_OPLINE
@ -2270,7 +2270,7 @@ ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMPVAR|UNUSED|THIS
if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
if (OP1_TYPE == IS_CONST) {
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
}
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W);
@ -2331,7 +2331,7 @@ ZEND_VM_HANDLER(155, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(24, ZEND_ASSIGN_OBJ, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
ZEND_VM_HANDLER(24, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
{
USE_OPLINE
zval *object, *property, *value, tmp;
@ -2339,7 +2339,7 @@ ZEND_VM_HANDLER(24, ZEND_ASSIGN_OBJ, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC
zend_string *name, *tmp_name;
SAVE_OPLINE();
object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
@ -2470,7 +2470,7 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj):
FREE_OP_DATA();
ZEND_VM_C_LABEL(exit_assign_obj):
FREE_OP2();
FREE_OP1();
FREE_OP1_VAR_PTR();
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -2676,14 +2676,14 @@ ZEND_VM_HANDLER(30, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV))
ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV))
{
USE_OPLINE
zval *property, *container, *value_ptr;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
@ -2706,7 +2706,7 @@ ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV,
zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
FREE_OP1();
FREE_OP1_VAR_PTR();
FREE_OP2();
FREE_OP_DATA_VAR_PTR();
ZEND_VM_NEXT_OPCODE_EX(1, 2);

File diff suppressed because it is too large Load diff

View file

@ -436,38 +436,22 @@
_(857, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP) \
_(858, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR) \
_(860, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV) \
_(886, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_CONST) \
_(887, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_TMP) \
_(888, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_VAR) \
_(890, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_CV) \
_(891, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CONST) \
_(892, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_TMP) \
_(893, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(895, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(896, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CONST) \
_(897, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_TMP) \
_(898, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(900, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(906, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_CONST) \
_(907, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_TMP) \
_(908, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_VAR) \
_(910, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_CV) \
_(911, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_CONST) \
_(912, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_TMP) \
_(913, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_VAR) \
_(915, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CONST_OP_DATA_CV) \
_(916, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CONST) \
_(917, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_TMP) \
_(918, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(920, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(921, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CONST) \
_(922, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_TMP) \
_(923, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(925, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(931, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_CONST) \
_(932, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_TMP) \
_(933, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_VAR) \
_(935, ZEND_ASSIGN_OBJ_SPEC_TMPVAR_CV_OP_DATA_CV) \
_(911, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST) \
_(912, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP) \
_(913, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR) \
_(915, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV) \
_(916, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
_(917, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
_(918, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
_(920, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \
_(921, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
_(922, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
_(923, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
_(925, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \
_(931, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST) \
_(932, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP) \
_(933, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR) \
_(935, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV) \
_(936, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST) \
_(937, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP) \
_(938, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR) \
@ -522,14 +506,10 @@
_(1038, ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR) \
_(1039, ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED) \
_(1040, ZEND_ASSIGN_DIM_OP_SPEC_CV_CV) \
_(1046, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_CONST) \
_(1047, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_TMPVAR) \
_(1048, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_TMPVAR) \
_(1050, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_CV) \
_(1051, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_CONST) \
_(1052, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_TMPVAR) \
_(1053, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_TMPVAR) \
_(1055, ZEND_ASSIGN_OBJ_OP_SPEC_TMPVAR_CV) \
_(1051, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST) \
_(1052, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR) \
_(1053, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR) \
_(1055, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV) \
_(1056, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST) \
_(1057, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR) \
_(1058, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR) \
@ -547,22 +527,14 @@
_(1093, ZEND_QM_ASSIGN_SPEC_TMP) \
_(1094, ZEND_QM_ASSIGN_SPEC_VAR) \
_(1096, ZEND_QM_ASSIGN_SPEC_CV) \
_(1124, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \
_(1126, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \
_(1129, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(1131, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(1134, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(1136, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(1144, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CV_OP_DATA_VAR) \
_(1146, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CV_OP_DATA_CV) \
_(1149, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \
_(1151, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \
_(1154, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(1156, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(1159, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_VAR) \
_(1161, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_TMPVAR_OP_DATA_CV) \
_(1169, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CV_OP_DATA_VAR) \
_(1171, ZEND_ASSIGN_OBJ_REF_SPEC_TMPVAR_CV_OP_DATA_CV) \
_(1149, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR) \
_(1151, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV) \
_(1154, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
_(1156, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \
_(1159, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
_(1161, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \
_(1169, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR) \
_(1171, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV) \
_(1174, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR) \
_(1176, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV) \
_(1179, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \
@ -817,14 +789,10 @@
_(1578, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
_(1579, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
_(1580, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
_(1586, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_CONST) \
_(1587, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_TMPVAR) \
_(1588, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_TMPVAR) \
_(1590, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_CV) \
_(1591, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_CONST) \
_(1592, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_TMPVAR) \
_(1593, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_TMPVAR) \
_(1595, ZEND_FETCH_OBJ_W_SPEC_TMPVAR_CV) \
_(1591, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
_(1592, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
_(1593, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
_(1595, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
_(1596, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
_(1597, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
_(1598, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
@ -847,14 +815,10 @@
_(1633, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
_(1634, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
_(1635, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
_(1641, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_CONST) \
_(1642, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_TMPVAR) \
_(1643, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_TMPVAR) \
_(1645, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_CV) \
_(1646, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_CONST) \
_(1647, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_TMPVAR) \
_(1648, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_TMPVAR) \
_(1650, ZEND_FETCH_OBJ_RW_SPEC_TMPVAR_CV) \
_(1646, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
_(1647, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
_(1648, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
_(1650, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
_(1651, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
_(1652, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
_(1653, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
@ -931,14 +895,14 @@
_(1747, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
_(1748, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
_(1750, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
_(1751, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_CONST) \
_(1752, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_TMPVAR) \
_(1753, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_TMPVAR) \
_(1755, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_CV) \
_(1756, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_CONST) \
_(1757, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_TMPVAR) \
_(1758, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_TMPVAR) \
_(1760, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMPVAR_CV) \
_(1751, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
_(1752, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
_(1753, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
_(1755, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
_(1756, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
_(1757, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
_(1758, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
_(1760, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
_(1761, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
_(1762, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
_(1763, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
@ -1115,14 +1079,10 @@
_(2018, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
_(2019, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
_(2020, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
_(2026, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_CONST) \
_(2027, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_TMPVAR) \
_(2028, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_TMPVAR) \
_(2030, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_CV) \
_(2031, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_CONST) \
_(2032, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_TMPVAR) \
_(2033, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_TMPVAR) \
_(2035, ZEND_PRE_INC_OBJ_SPEC_TMPVAR_CV) \
_(2031, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
_(2032, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
_(2033, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
_(2035, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
_(2036, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
_(2037, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
_(2038, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \

View file

@ -245,15 +245,15 @@ static uint32_t zend_vm_opcodes_flags[195] = {
0x00000b0b,
0x00000301,
0x00006701,
0x00040755,
0x00040751,
0x00040000,
0x04000701,
0x04006701,
0x04000755,
0x04000751,
0x04000000,
0x0b000101,
0x00000003,
0x0b040755,
0x0b040751,
0x0b040000,
0x00000001,
0x00000001,
@ -306,16 +306,16 @@ static uint32_t zend_vm_opcodes_flags[195] = {
0x00040757,
0x00010107,
0x00006701,
0x00640755,
0x00640751,
0x00010107,
0x00006701,
0x00040755,
0x00040751,
0x00010107,
0x00000707,
0x00040757,
0x00010107,
0x00006703,
0x00240757,
0x00240753,
0x00010107,
0x00000701,
0x00040751,
@ -353,7 +353,7 @@ static uint32_t zend_vm_opcodes_flags[195] = {
0x00000000,
0x00000000,
0x00000000,
0x00040755,
0x00040751,
0x00040751,
0x00040751,
0x00040751,

View file

@ -12,9 +12,15 @@ $xml = simplexml_load_string("<root></root>");
var_dump(isset($xml->bla->posts));
$xml->bla->posts[0]->name = "FooBar";
echo $xml->asXML();
$xml = simplexml_load_string("<root></root>");
$xml->bla->posts[]->name = "FooBar";
echo $xml->asXML();
?>
--EXPECTF--
Fatal error: Uncaught Error: Attempt to assign property 'name' of non-object in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d
--EXPECT--
<?xml version="1.0"?>
<root><bla><posts><name>FooBar</name></posts></bla></root>
bool(false)
<?xml version="1.0"?>
<root><bla><posts><name>FooBar</name></posts></bla></root>
<?xml version="1.0"?>
<root><bla><posts><name>FooBar</name></posts></bla></root>

View file

@ -13,5 +13,6 @@ $xml->movie[]->characters->character[0]->name = 'Miss Coder';
echo($xml->asXml());
?>
--EXPECTF--
Fatal error: Cannot use [] for reading in %s on line %d
--EXPECT--
<?xml version="1.0" standalone="yes"?>
<collection><movie><characters><character><name>Miss Coder</name></character></characters></movie></collection>