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.

This commit is contained in:
Dmitry Stogov 2016-05-31 04:06:00 +03:00
parent f216176bc9
commit b111da96d9
15 changed files with 378 additions and 273 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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;
} else if ((op1_info == MAY_BE_LONG)) {
spec = 4411 | SPEC_RULE_OP1;
} else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
spec = 4416 | SPEC_RULE_OP1;
} else if ((op1_info == MAY_BE_LONG)) {
spec = 4421 | SPEC_RULE_OP1;
} else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
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;
} else if ((op1_info == MAY_BE_LONG)) {
spec = 4426 | SPEC_RULE_OP1;
} else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
spec = 4431 | SPEC_RULE_OP1;
} else if ((op1_info == MAY_BE_LONG)) {
spec = 4436 | SPEC_RULE_OP1;
} else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
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:

View File

@ -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(

View File

@ -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,

View File

@ -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

View File

@ -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;
}

View File

@ -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--;

View File

@ -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:

View File

@ -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) {

View File

@ -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;

View File

@ -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;

View File

@ -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: