diff options
author | Dmitry Stogov <dmitry@zend.com> | 2016-05-31 04:06:00 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2016-05-31 04:06:00 +0300 |
commit | b111da96d9814b3a12e00b28fb3b99fc6010c20a (patch) | |
tree | 452ddf3b793bc54d9b5b5216aff653c937ac2f5a | |
parent | f216176bc952bab346ed075b758c7e5eaaacaee0 (diff) | |
download | php-git-b111da96d9814b3a12e00b28fb3b99fc6010c20a.tar.gz |
Split ZEND_SEND_VAR_NO_REF into ZEND_SEND_VAR_NO_REF and ZEND_SEND_VAR_NO_REF_EX (similar to ZEND_SEND_VAL) and remove ZEND_ARG_* flags.
-rw-r--r-- | Zend/zend_compile.c | 44 | ||||
-rw-r--r-- | Zend/zend_compile.h | 5 | ||||
-rw-r--r-- | Zend/zend_execute.c | 1 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 62 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 476 | ||||
-rw-r--r-- | Zend/zend_vm_gen.php | 3 | ||||
-rw-r--r-- | Zend/zend_vm_opcodes.c | 8 | ||||
-rw-r--r-- | Zend/zend_vm_opcodes.h | 2 | ||||
-rw-r--r-- | ext/opcache/Optimizer/optimize_func_calls.c | 13 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_call_graph.c | 1 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_dfg.c | 1 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_dump.c | 13 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_inference.c | 2 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_optimizer.c | 15 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_ssa.c | 1 |
15 files changed, 376 insertions, 271 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c6da34732a..4bb712678f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3083,7 +3083,6 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ znode arg_node; zend_op *opline; zend_uchar opcode; - zend_ulong flags = 0; if (arg->kind == ZEND_AST_UNPACK) { uses_arg_unpack = 1; @@ -3109,13 +3108,16 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ /* Function call was converted into builtin instruction */ opcode = ZEND_SEND_VAL; } else { - opcode = ZEND_SEND_VAR_NO_REF; - flags |= ZEND_ARG_SEND_FUNCTION; - if (fbc && ARG_SHOULD_BE_SENT_BY_REF(fbc, arg_num)) { - flags |= ZEND_ARG_SEND_BY_REF; - if (ARG_MAY_BE_SENT_BY_REF(fbc, arg_num)) { - flags |= ZEND_ARG_SEND_SILENT; + if (fbc) { + if (ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) { + opcode = ZEND_SEND_VAR_NO_REF; + } else if (ARG_MAY_BE_SENT_BY_REF(fbc, arg_num)) { + opcode = ZEND_SEND_VAL; + } else { + opcode = ZEND_SEND_VAR; } + } else { + opcode = ZEND_SEND_VAR_NO_REF_EX; } } } else if (fbc) { @@ -3135,9 +3137,17 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ zend_compile_expr(&arg_node, arg); ZEND_ASSERT(arg_node.op_type != IS_CV); if (arg_node.op_type == IS_VAR) { - opcode = ZEND_SEND_VAR_NO_REF; - if (fbc && ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) { - flags |= ZEND_ARG_SEND_BY_REF; + /* pass ++$a or something similar */ + if (fbc) { + if (ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) { + opcode = ZEND_SEND_VAR_NO_REF; + } else if (ARG_MAY_BE_SENT_BY_REF(fbc, arg_num)) { + opcode = ZEND_SEND_VAL; + } else { + opcode = ZEND_SEND_VAR; + } + } else { + opcode = ZEND_SEND_VAR_NO_REF_EX; } } else { if (fbc) { @@ -3154,20 +3164,6 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ opline = zend_emit_op(NULL, opcode, &arg_node, NULL); opline->op2.opline_num = arg_num; opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_ARG(NULL, arg_num); - - if (opcode == ZEND_SEND_VAR_NO_REF) { - if (fbc) { - flags |= ZEND_ARG_COMPILE_TIME_BOUND; - } - if ((flags & ZEND_ARG_COMPILE_TIME_BOUND) && !(flags & ZEND_ARG_SEND_BY_REF)) { - opline->opcode = ZEND_SEND_VAR; - opline->extended_value = ZEND_ARG_COMPILE_TIME_BOUND; - } else { - opline->extended_value = flags; - } - } else if (fbc) { - opline->extended_value = ZEND_ARG_COMPILE_TIME_BOUND; - } } return arg_count; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 5ab0d0375b..fda7fe6014 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -895,11 +895,6 @@ ZEND_API void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FREE_ON_RETURN (1<<0) -#define ZEND_ARG_SEND_BY_REF (1<<0) -#define ZEND_ARG_COMPILE_TIME_BOUND (1<<1) -#define ZEND_ARG_SEND_FUNCTION (1<<2) -#define ZEND_ARG_SEND_SILENT (1<<3) - #define ZEND_SEND_BY_VAL 0 #define ZEND_SEND_BY_REF 1 #define ZEND_SEND_PREFER_REF 2 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 893f113976..8d97845bad 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2468,6 +2468,7 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o case ZEND_SEND_VAR_EX: case ZEND_SEND_REF: case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_USER: if (level == 0) { ZEND_CALL_NUM_ARGS(call) = opline->op2.num; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 82ba60a03b..e7fe591a9d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4212,7 +4212,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV, JMP_ADDR) } } -ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, NUM) +ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMPVAR, NUM) { USE_OPLINE zval *value, *arg; @@ -4299,25 +4299,15 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, NUM) ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM, SEND) +ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM) { USE_OPLINE zend_free_op free_op1; zval *varptr, *arg; - if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) { - if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { - ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR); - } - } - varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); - if (EXPECTED(Z_ISREF_P(varptr) || - ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? - ((opline->extended_value & ZEND_ARG_SEND_SILENT) != 0) : - ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num - )))) { + if (EXPECTED(Z_ISREF_P(varptr))) { arg = ZEND_CALL_VAR(EX(call), opline->result.var); ZVAL_COPY_VALUE(arg, varptr); @@ -4333,6 +4323,52 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM, SEND) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +ZEND_VM_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG)) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varptr, *arg; + uint32_t arg_num = opline->op2.num; + + if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) { + if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR); + } + + varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); + + if (EXPECTED(Z_ISREF_P(varptr) || + QUICK_ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } else { + if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR); + } + + varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); + + if (EXPECTED(Z_ISREF_P(varptr) || + ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } + + SAVE_OPLINE(); + zend_error(E_NOTICE, "Only variables should be passed by reference"); + + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3351a078b2..7bd732acc2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -12312,23 +12312,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP HANDLE_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zval *value, *arg; - zend_free_op free_op1; - - value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); - arg = ZEND_CALL_VAR(EX(call), opline->result.var); - ZVAL_COPY_VALUE(arg, value); - if (IS_TMP_VAR == IS_CONST) { - if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) { - Z_ADDREF_P(arg); - } - } - ZEND_VM_NEXT_OPCODE(); -} - static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15625,19 +15608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL zend_free_op free_op1; zval *varptr, *arg; - if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) { - if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { - ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - } - varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if (EXPECTED(Z_ISREF_P(varptr) || - ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? - ((opline->extended_value & ZEND_ARG_SEND_SILENT) != 0) : - ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num - )))) { + if (EXPECTED(Z_ISREF_P(varptr))) { arg = ZEND_CALL_VAR(EX(call), opline->result.var); ZVAL_COPY_VALUE(arg, varptr); @@ -15653,6 +15626,98 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varptr, *arg; + uint32_t arg_num = opline->op2.num; + + if (EXPECTED(0)) { + if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + if (EXPECTED(Z_ISREF_P(varptr) || + QUICK_ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } else { + if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + if (EXPECTED(Z_ISREF_P(varptr) || + ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } + + SAVE_OPLINE(); + zend_error(E_NOTICE, "Only variables should be passed by reference"); + + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varptr, *arg; + uint32_t arg_num = opline->op2.num; + + if (EXPECTED(1)) { + if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + if (EXPECTED(Z_ISREF_P(varptr) || + QUICK_ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } else { + if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) { + ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + if (EXPECTED(Z_ISREF_P(varptr) || + ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) { + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE(); + } + } + + SAVE_OPLINE(); + zend_error(E_NOTICE, "Only variables should be passed by reference"); + + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -54083,6 +54148,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zval *value, *arg; + zend_free_op free_op1; + + value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, value); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) { + Z_ADDREF_P(arg); + } + } + ZEND_VM_NEXT_OPCODE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -61650,6 +61732,16 @@ void zend_init_opcodes_handlers(void) ZEND_CASE_SPEC_CV_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_CASE_SPEC_CV_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HANDLER, + ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, ZEND_BOOL_SPEC_TMPVAR_HANDLER, ZEND_BOOL_SPEC_TMPVAR_HANDLER, @@ -61785,8 +61877,8 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_SEND_VAL_SPEC_CONST_HANDLER, - ZEND_SEND_VAL_SPEC_TMP_HANDLER, - ZEND_NULL_HANDLER, + ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER, + ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -64715,142 +64807,142 @@ void zend_init_opcodes_handlers(void) 1423 | SPEC_RULE_OP1, 1428 | SPEC_RULE_OP1, 1433 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4471, - 4471, - 4471, - 1458 | SPEC_RULE_OP1, - 1463 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1488 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1513 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1538 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1563, - 1564 | SPEC_RULE_OP1, - 1569 | SPEC_RULE_OP2, - 1574 | SPEC_RULE_RETVAL, - 1576 | SPEC_RULE_OP2, - 1581 | SPEC_RULE_OP1, - 1586, - 1587 | SPEC_RULE_OP2, - 1592 | SPEC_RULE_OP1, - 1597 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1607 | SPEC_RULE_OP1, - 1612 | SPEC_RULE_OP1, - 1617 | SPEC_RULE_OP2, + 4481, + 1458 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 4481, + 1468 | SPEC_RULE_OP1, + 1473 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1498 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1523 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1573, + 1574 | SPEC_RULE_OP1, + 1579 | SPEC_RULE_OP2, + 1584 | SPEC_RULE_RETVAL, + 1586 | SPEC_RULE_OP2, + 1591 | SPEC_RULE_OP1, + 1596, + 1597 | SPEC_RULE_OP2, + 1602 | SPEC_RULE_OP1, + 1607 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1617 | SPEC_RULE_OP1, 1622 | SPEC_RULE_OP1, - 1627 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1652 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1677 | SPEC_RULE_OP1, - 1682 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1707 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1732 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1757 | SPEC_RULE_OP1, - 1762 | SPEC_RULE_OP1, + 1627 | SPEC_RULE_OP2, + 1632 | SPEC_RULE_OP1, + 1637 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1662 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1687 | SPEC_RULE_OP1, + 1692 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1717 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1742 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1767 | SPEC_RULE_OP1, - 1772 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1797 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1822 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1847 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1872 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1897 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1922 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1947 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1972 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1997 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2022 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2047 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2072 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2097 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2122 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2147 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2172 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2197 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2222 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2247 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4471, - 2272, - 2273, - 2274, - 2275, - 2276, - 2277 | SPEC_RULE_OP1, - 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2307 | SPEC_RULE_OP1, - 2312 | SPEC_RULE_OP2, + 1772 | SPEC_RULE_OP1, + 1777 | SPEC_RULE_OP1, + 1782 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1807 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1832 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1857 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1882 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1907 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1932 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1957 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1982 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2007 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2032 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2057 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2082 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2107 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2132 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2157 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2182 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2207 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2232 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4481, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287 | SPEC_RULE_OP1, + 2292 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2317 | SPEC_RULE_OP1, - 2322 | SPEC_RULE_OP1, - 2327 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2352 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2377 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2402 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2427 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2437 | SPEC_RULE_OP1, - 2442 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2467, - 2468 | SPEC_RULE_OP1, - 2473 | SPEC_RULE_OP1, + 2322 | SPEC_RULE_OP2, + 2327 | SPEC_RULE_OP1, + 2332 | SPEC_RULE_OP1, + 2337 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2362 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2437 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2447 | SPEC_RULE_OP1, + 2452 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2477, 2478 | SPEC_RULE_OP1, 2483 | SPEC_RULE_OP1, - 2488 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2513 | SPEC_RULE_OP1, - 2518 | SPEC_RULE_OP1, + 2488 | SPEC_RULE_OP1, + 2493 | SPEC_RULE_OP1, + 2498 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2523 | SPEC_RULE_OP1, - 2528 | SPEC_RULE_OP2, - 2533 | SPEC_RULE_RETVAL, - 2535 | SPEC_RULE_RETVAL, - 2537 | SPEC_RULE_RETVAL, - 2539 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2564 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2589 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2614 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2639 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2764, - 2765 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2790, - 2791 | SPEC_RULE_OP2, - 2796, - 2797 | SPEC_RULE_OP1, - 2802 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2827 | SPEC_RULE_OP2, - 2832 | SPEC_RULE_OP2, - 2837, - 2838 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2963 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2988, - 2989, - 2990, - 2991 | SPEC_RULE_OP1, - 2996 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3021, - 3022, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3048, - 3049, - 3050, - 3051 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3076 | SPEC_RULE_OP1, - 3081, - 3082, - 3083, - 3084, - 3085 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3110 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 3185 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3210 | SPEC_RULE_OP1, - 3215 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3240, - 3241 | SPEC_RULE_OP2, - 3246 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3271 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3296 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3321 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3346 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3371 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3396 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3421 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3446 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3471 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3496 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4471 + 2528 | SPEC_RULE_OP1, + 2533 | SPEC_RULE_OP1, + 2538 | SPEC_RULE_OP2, + 2543 | SPEC_RULE_RETVAL, + 2545 | SPEC_RULE_RETVAL, + 2547 | SPEC_RULE_RETVAL, + 2549 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2574 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2774, + 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2800, + 2801 | SPEC_RULE_OP2, + 2806, + 2807 | SPEC_RULE_OP1, + 2812 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2837 | SPEC_RULE_OP2, + 2842 | SPEC_RULE_OP2, + 2847, + 2848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2973 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2998, + 2999, + 3000, + 3001 | SPEC_RULE_OP1, + 3006 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3031, + 3032, + 3033 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3058, + 3059, + 3060, + 3061 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3086 | SPEC_RULE_OP1, + 3091, + 3092, + 3093, + 3094, + 3095 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3120 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3195 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3220 | SPEC_RULE_OP1, + 3225 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3250, + 3251 | SPEC_RULE_OP2, + 3256 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3281 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3506 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4481 }; zend_opcode_handlers = labels; zend_handlers_count = sizeof(labels) / sizeof(void*); @@ -64957,7 +65049,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3521 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64965,7 +65057,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3546 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64973,7 +65065,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3571 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64984,17 +65076,17 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3596 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3606 | 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 = 3621 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3631 | 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 = 3646 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -65002,7 +65094,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3671 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65010,7 +65102,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3696 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65018,7 +65110,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3721 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65029,7 +65121,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3746 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65037,7 +65129,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3821 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65048,7 +65140,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3896 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65056,7 +65148,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3971 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -65067,12 +65159,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4046 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4056 | 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 = 4121 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -65080,60 +65172,60 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4196 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4206 | 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 = 4271 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if ((op1_info == MAY_BE_DOUBLE)) { - spec = 4436 | SPEC_RULE_OP1; + spec = 4446 | 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 = 4441 | SPEC_RULE_OP1; + spec = 4451 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4346 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; - } else if ((op1_info == MAY_BE_LONG)) { spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; - } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { + } else if ((op1_info == MAY_BE_LONG)) { spec = 4366 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { + spec = 4376 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4376 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; - } else if ((op1_info == MAY_BE_LONG)) { spec = 4386 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; - } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { + } else if ((op1_info == MAY_BE_LONG)) { spec = 4396 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { + spec = 4406 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4406 | SPEC_RULE_OP1; + spec = 4416 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4411 | SPEC_RULE_OP1; + spec = 4421 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4416 | SPEC_RULE_OP1; + spec = 4426 | SPEC_RULE_OP1; } break; case ZEND_POST_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4421 | SPEC_RULE_OP1; + spec = 4431 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4426 | SPEC_RULE_OP1; + spec = 4436 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4431 | SPEC_RULE_OP1; + spec = 4441 | SPEC_RULE_OP1; } 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 = 4446 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; default: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 03d9817c6b..e1041d24c1 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -86,7 +86,7 @@ $vm_op_flags = array( // unused 0x09000000, // unused 0x0a000000, "ZEND_VM_EXT_SRC" => 0x0b000000, - "ZEND_VM_EXT_SEND" => 0x0c000000, + // unused 0x0c000000, "ZEND_VM_NO_CONST_CONST" => 0x40000000, "ZEND_VM_COMMUTATIVE" => 0x80000000, ); @@ -128,7 +128,6 @@ $vm_ext_decode = array( "ARG_NUM" => ZEND_VM_EXT_ARG_NUM, "REF" => ZEND_VM_EXT_REF, "SRC" => ZEND_VM_EXT_SRC, - "SEND" => ZEND_VM_EXT_SEND, ); $vm_kind_name = array( diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 5463f9c498..100106cdc5 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -72,7 +72,7 @@ static const char *zend_vm_opcodes_names[184] = { "ZEND_JMPNZ_EX", "ZEND_CASE", NULL, - NULL, + "ZEND_SEND_VAR_NO_REF_EX", NULL, "ZEND_BOOL", "ZEND_FAST_CONCAT", @@ -259,7 +259,7 @@ static uint32_t zend_vm_opcodes_flags[184] = { 0x00002007, 0x00000707, 0x00000000, - 0x00000000, + 0x00001001, 0x00000000, 0x00000007, 0x00000707, @@ -274,7 +274,7 @@ static uint32_t zend_vm_opcodes_flags[184] = { 0x00000003, 0x00000010, 0x00000310, - 0x00001003, + 0x00001007, 0x00001001, 0x00001001, 0x01000073, @@ -315,7 +315,7 @@ static uint32_t zend_vm_opcodes_flags[184] = { 0x00000000, 0x00000000, 0x01000000, - 0x0c001001, + 0x00001001, 0x03000103, 0x00000003, 0x05000700, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 4f5a0d615a..1eb54f0f00 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -55,7 +55,6 @@ #define ZEND_VM_EXT_TYPE 0x07000000 #define ZEND_VM_EXT_EVAL 0x08000000 #define ZEND_VM_EXT_SRC 0x0b000000 -#define ZEND_VM_EXT_SEND 0x0c000000 #define ZEND_VM_NO_CONST_CONST 0x40000000 #define ZEND_VM_COMMUTATIVE 0x80000000 #define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff) @@ -117,6 +116,7 @@ END_EXTERN_C() #define ZEND_JMPZ_EX 46 #define ZEND_JMPNZ_EX 47 #define ZEND_CASE 48 +#define ZEND_SEND_VAR_NO_REF_EX 50 #define ZEND_BOOL 52 #define ZEND_FAST_CONCAT 53 #define ZEND_ROPE_INIT 54 diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/ext/opcache/Optimizer/optimize_func_calls.c index b37e0fee57..75120d2501 100644 --- a/ext/opcache/Optimizer/optimize_func_calls.c +++ b/ext/opcache/Optimizer/optimize_func_calls.c @@ -145,19 +145,20 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx) } } break; - case ZEND_SEND_VAR_NO_REF: - if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) && call_stack[call - 1].func) { - if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) { - opline->extended_value |= ZEND_ARG_COMPILE_TIME_BOUND | ZEND_ARG_SEND_BY_REF; + case ZEND_SEND_VAR_NO_REF_EX: + if (call_stack[call - 1].func) { + if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) { + opline->opcode = ZEND_SEND_VAR_NO_REF; + } else if (ARG_MAY_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) { + opline->opcode = ZEND_SEND_VAL; } else { opline->opcode = ZEND_SEND_VAR; - opline->extended_value = 0; } } break; #if 0 case ZEND_SEND_REF: - if (opline->extended_value != ZEND_ARG_COMPILE_TIME_BOUND && call_stack[call - 1].func) { + if (call_stack[call - 1].func) { /* We won't handle run-time pass by reference */ call_stack[call - 1].opline = NULL; } diff --git a/ext/opcache/Optimizer/zend_call_graph.c b/ext/opcache/Optimizer/zend_call_graph.c index c7bc7b2e3e..53eb0a84ea 100644 --- a/ext/opcache/Optimizer/zend_call_graph.c +++ b/ext/opcache/Optimizer/zend_call_graph.c @@ -104,6 +104,7 @@ static void zend_collect_args_info(zend_call_info *call_info) case ZEND_SEND_VAR_EX: case ZEND_SEND_REF: case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: num = opline->op2.num; if (num > 0) { num--; diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index d5be92d317..97fc846d3c 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -93,6 +93,7 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg case ZEND_SEND_VAR_EX: case ZEND_SEND_REF: case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: case ZEND_FE_RESET_RW: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index c306c7ac1e..7c225bbbe8 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -504,19 +504,6 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * } else if (opline->extended_value == ZEND_RETURNS_FUNCTION) { fprintf(stderr, " (function)"); } - } else if (ZEND_VM_EXT_SEND == (flags & ZEND_VM_EXT_MASK)) { - if (opline->extended_value & ZEND_ARG_SEND_BY_REF) { - fprintf(stderr, " (ref)"); - } - if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { - fprintf(stderr, " (compile-time)"); - } - if (opline->extended_value & ZEND_ARG_SEND_FUNCTION) { - fprintf(stderr, " (function)"); - } - if (opline->extended_value & ZEND_ARG_SEND_SILENT) { - fprintf(stderr, " (silent)"); - } } else { if (ZEND_VM_EXT_VAR_FETCH & flags) { switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 168609f9a0..8ea4347d50 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2841,6 +2841,7 @@ static void zend_update_type_info(const zend_op_array *op_array, break; case ZEND_SEND_VAR_EX: case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_REF: // TODO: ??? if (ssa_ops[i].op1_def >= 0) { @@ -3197,6 +3198,7 @@ static void zend_update_type_info(const zend_op_array *op_array, break; case ZEND_SEND_VAR_EX: case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_REF: case ZEND_ASSIGN_REF: tmp |= MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1e4e092512..dd1a9200aa 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -419,17 +419,10 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array, opline->opcode = ZEND_SEND_VAL_EX; break; case ZEND_SEND_VAR_NO_REF: - if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { - if (opline->extended_value & ZEND_ARG_SEND_BY_REF) { - zval_dtor(val); - return 0; - } - opline->extended_value = 0; - opline->opcode = ZEND_SEND_VAL_EX; - } else { - opline->extended_value = 0; - opline->opcode = ZEND_SEND_VAL; - } + zval_dtor(val); + return 0; + case ZEND_SEND_VAR_NO_REF_EX: + opline->opcode = ZEND_SEND_VAL; break; case ZEND_SEND_USER: opline->opcode = ZEND_SEND_VAL_EX; diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 498d2f1da9..fc55acf527 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -625,6 +625,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, } break; case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_VAR_EX: case ZEND_SEND_REF: case ZEND_SEND_UNPACK: |