}
} else {
while (opline >= CG(active_op_array)->opcodes) {
- if (opline->opcode == ZEND_FETCH_LIST &&
+ if ((opline->opcode == ZEND_FETCH_LIST_R ||
+ opline->opcode == ZEND_FETCH_LIST_W) &&
opline->op1_type == IS_VAR &&
opline->op1.var == op1->u.op.var) {
zend_emit_op(NULL, ZEND_FREE, op1, NULL);
opline->opcode == ZEND_ROPE_ADD ||
opline->opcode == ZEND_ROPE_END ||
opline->opcode == ZEND_END_SILENCE ||
- opline->opcode == ZEND_FETCH_LIST ||
+ opline->opcode == ZEND_FETCH_LIST_R ||
+ opline->opcode == ZEND_FETCH_LIST_W ||
opline->opcode == ZEND_VERIFY_RETURN_TYPE ||
opline->opcode == ZEND_BIND_LEXICAL) {
/* these opcodes are handled separately */
void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type);
void zend_compile_assign(znode *result, zend_ast *ast);
-static void zend_compile_list_assign(znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style);
static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */
{
znode dummy_node;
- if (var_ast->kind == ZEND_AST_ARRAY) {
- zend_compile_list_assign(&dummy_node, var_ast, value_node, var_ast->attr);
- } else {
- zend_ast *assign_ast = zend_ast_create(ZEND_AST_ASSIGN, var_ast,
- zend_ast_create_znode(value_node));
- zend_compile_assign(&dummy_node, assign_ast);
- }
+ zend_ast *assign_ast = zend_ast_create(ZEND_AST_ASSIGN, var_ast,
+ zend_ast_create_znode(value_node));
+ zend_compile_assign(&dummy_node, assign_ast);
zend_do_free(&dummy_node);
}
/* }}} */
}
/* }}} */
+static inline void zend_emit_assign_ref_znode(zend_ast *var_ast, znode *value_node);
+
+/* Propagate refs used on leaf elements to the surrounding list() structures. */
+static zend_bool zend_propagate_list_refs(zend_ast *ast) { /* {{{ */
+ zend_ast_list *list = zend_ast_get_list(ast);
+ zend_bool has_refs = 0;
+ uint32_t i;
+
+ for (i = 0; i < list->children; ++i) {
+ zend_ast *elem_ast = list->child[i];
+
+ if (elem_ast) {
+ zend_ast *var_ast = elem_ast->child[0];
+ if (var_ast->kind == ZEND_AST_ARRAY) {
+ elem_ast->attr = zend_propagate_list_refs(var_ast);
+ }
+ has_refs |= elem_ast->attr;
+ }
+ }
+
+ return has_refs;
+}
+/* }}} */
+
static void zend_compile_list_assign(
znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style) /* {{{ */
{
}
}
- if (elem_ast->attr) {
- zend_error(E_COMPILE_ERROR, "[] and list() assignments cannot be by reference");
- }
-
var_ast = elem_ast->child[0];
key_ast = elem_ast->child[1];
has_elems = 1;
zend_verify_list_assign_target(var_ast, old_style);
- zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);
- zend_emit_assign_znode(var_ast, &fetch_result);
+ zend_emit_op(&fetch_result,
+ elem_ast->attr ? ZEND_FETCH_LIST_W : ZEND_FETCH_LIST_R, expr_node, &dim_node);
+
+ if (var_ast->kind == ZEND_AST_ARRAY) {
+ if (elem_ast->attr) {
+ zend_emit_op(&fetch_result, ZEND_MAKE_REF, &fetch_result, NULL);
+ }
+ zend_compile_list_assign(NULL, var_ast, &fetch_result, var_ast->attr);
+ } else if (elem_ast->attr) {
+ zend_emit_assign_ref_znode(var_ast, &fetch_result);
+ } else {
+ zend_emit_assign_znode(var_ast, &fetch_result);
+ }
}
if (has_elems == 0) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
}
- *result = *expr_node;
+ if (result) {
+ *result = *expr_node;
+ } else {
+ zend_do_free(expr_node);
+ }
}
/* }}} */
zend_emit_op_data(&expr_node);
return;
case ZEND_AST_ARRAY:
- if (zend_list_has_assign_to_self(var_ast, expr_ast)) {
- /* list($a, $b) = $a should evaluate the right $a first */
- znode cv_node;
+ if (zend_propagate_list_refs(var_ast)) {
+ if (!zend_is_variable(expr_ast)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Cannot assign reference to non referencable value");
+ }
- if (zend_try_compile_cv(&cv_node, expr_ast) == FAILURE) {
- zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
- } else {
- zend_emit_op(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
+ /* MAKE_REF is usually not necessary for CVs. However, if there are
+ * self-assignments, this forces the RHS to evaluate first. */
+ if (expr_node.op_type != IS_CV
+ || zend_list_has_assign_to_self(var_ast, expr_ast)) {
+ zend_emit_op(&expr_node, ZEND_MAKE_REF, &expr_node, NULL);
}
} else {
- zend_compile_expr(&expr_node, expr_ast);
+ if (zend_list_has_assign_to_self(var_ast, expr_ast)) {
+ /* list($a, $b) = $a should evaluate the right $a first */
+ znode cv_node;
+
+ if (zend_try_compile_cv(&cv_node, expr_ast) == FAILURE) {
+ zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
+ } else {
+ zend_emit_op(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
+ }
+ } else {
+ zend_compile_expr(&expr_node, expr_ast);
+ }
}
zend_compile_list_assign(result, var_ast, &expr_node, var_ast->attr);
value_ast = value_ast->child[0];
}
+ if (value_ast->kind == ZEND_AST_ARRAY && zend_propagate_list_refs(value_ast)) {
+ by_ref = 1;
+ }
+
if (by_ref && is_variable) {
zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
} else {
if (is_this_fetch(value_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this");
} else if (value_ast->kind == ZEND_AST_VAR &&
- zend_try_compile_cv(&value_node, value_ast) == SUCCESS) {
+ zend_try_compile_cv(&value_node, value_ast) == SUCCESS) {
SET_NODE(opline->op2, &value_node);
} else {
opline->op2_type = IS_VAR;
opline->op2.var = get_temporary_variable(CG(active_op_array));
GET_NODE(&value_node, opline->op2);
- if (by_ref) {
+ if (value_ast->kind == ZEND_AST_ARRAY) {
+ zend_compile_list_assign(NULL, value_ast, &value_node, value_ast->attr);
+ } else if (by_ref) {
zend_emit_assign_ref_znode(value_ast, &value_node);
} else {
zend_emit_assign_znode(value_ast, &value_node);
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
SAVE_OPLINE();
container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, RT_CONSTANT(opline, opline->op2) EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ if (IS_CV == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
SAVE_OPLINE();
container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_CV == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
+
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
SAVE_OPLINE();
container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *retval, *container, *dim;
+
+ SAVE_OPLINE();
+ retval = EX_VAR(opline->result.var);
+ container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+
+ if (IS_CV == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(retval, container, dim EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_LIST_w(retval, container, dim EXECUTE_DATA_CC);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
(void*)&&ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CV_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST):
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_CONST):
- ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_CONST):
+ ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST):
ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR):
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_TMPVAR):
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR):
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR):
ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV):
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_CV):
- ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_CV):
+ ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CV):
ZEND_FAST_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST):
ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_TMPVAR_CONST):
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST):
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST):
ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR):
ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR):
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR):
ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV):
ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_TMPVAR_CV):
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV):
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CV):
ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST):
ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_CONST):
+ ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR):
ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR):
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV):
ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_CV):
+ ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST):
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_CONST):
- ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CV_CONST):
+ ZEND_FETCH_LIST_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_CV_CONST):
+ ZEND_FETCH_LIST_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR):
ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_TMPVAR):
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR):
+ ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR):
+ ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV):
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_CV):
- ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CV_CV):
+ ZEND_FETCH_LIST_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_CV_CV):
+ ZEND_FETCH_LIST_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST):
ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CV_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CV_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_CV_CONST_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_CV_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921,
+ 4946,
2332,
2333,
2334,
3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921,
+ 4946,
3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921
+ 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 4946
};
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
zend_opcode_handler_funcs = labels;
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3956 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3956 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4031 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4031 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_MUL:
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4106 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4106 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4381 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4431 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4531 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_IS_SMALLER_OR_EQUAL:
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4581 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4606 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4656 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 4681 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_QM_ASSIGN:
if (op1_info == MAY_BE_DOUBLE) {
- spec = 4821 | SPEC_RULE_OP1;
+ spec = 4846 | SPEC_RULE_OP1;
} else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) {
- spec = 4826 | SPEC_RULE_OP1;
+ spec = 4851 | SPEC_RULE_OP1;
}
break;
case ZEND_PRE_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4731 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4756 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4741 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4766 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4751 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4776 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
}
break;
case ZEND_PRE_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4761 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4786 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4771 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4796 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4781 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 4806 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
}
break;
case ZEND_POST_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4791 | SPEC_RULE_OP1;
+ spec = 4816 | SPEC_RULE_OP1;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4796 | SPEC_RULE_OP1;
+ spec = 4821 | SPEC_RULE_OP1;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4801 | SPEC_RULE_OP1;
+ spec = 4826 | SPEC_RULE_OP1;
}
break;
case ZEND_POST_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4806 | SPEC_RULE_OP1;
+ spec = 4831 | SPEC_RULE_OP1;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4811 | SPEC_RULE_OP1;
+ spec = 4836 | SPEC_RULE_OP1;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4816 | SPEC_RULE_OP1;
+ spec = 4841 | SPEC_RULE_OP1;
}
break;
case ZEND_SEND_VAR_EX:
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 4861 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG;
+ spec = 4886 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG;
}
break;
case ZEND_FE_FETCH_R:
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
- spec = 4871 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL;
+ spec = 4896 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL;
}
break;
case ZEND_FETCH_DIM_R:
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
- spec = 4831 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 4856 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_SEND_VAR:
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 4856 | SPEC_RULE_OP1;
+ spec = 4881 | SPEC_RULE_OP1;
}
break;
default: