|
|
|
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
zend_free_op free_op1; |
|
|
|
zval *value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); |
|
|
|
zval *result = EX_VAR(opline->result.var); |
|
|
|
ZVAL_COPY(result, value); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
|
|
|
(void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, |
|
|
|
(void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, |
|
|
|
(void*)&&ZEND_NULL_LABEL, |
|
|
|
(void*)&&ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_LABEL, |
|
|
|
(void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, |
|
|
|
(void*)&&ZEND_NULL_LABEL, |
|
|
|
(void*)&&ZEND_NULL_LABEL, |
|
|
|
|
|
|
VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) |
|
|
|
ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); |
|
|
|
HYBRID_BREAK(); |
|
|
|
HYBRID_CASE(ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED): |
|
|
|
VM_TRACE(ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) |
|
|
|
ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); |
|
|
|
HYBRID_BREAK(); |
|
|
|
HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CV): |
|
|
|
VM_TRACE(ZEND_ADD_SPEC_TMPVAR_CV) |
|
|
|
ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); |
|
|
|
|
|
|
ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, |
|
|
|
ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER, |
|
|
|
ZEND_JMP_FORWARD_SPEC_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
|
|
|
2705, |
|
|
|
2706 | SPEC_RULE_OP1, |
|
|
|
2711, |
|
|
|
4616, |
|
|
|
4617, |
|
|
|
2712, |
|
|
|
4616, |
|
|
|
4617, |
|
|
|
2713 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, |
|
|
|
2838 | SPEC_RULE_OP1 | SPEC_RULE_OP2, |
|
|
|
2863, |
|
|
|
2864, |
|
|
|
2865, |
|
|
|
2866 | SPEC_RULE_OP1, |
|
|
|
2871, |
|
|
|
4616, |
|
|
|
4616, |
|
|
|
4617, |
|
|
|
4617, |
|
|
|
2872, |
|
|
|
2873, |
|
|
|
2874, |
|
|
|
|
|
|
3648 | SPEC_RULE_OP1 | SPEC_RULE_OP2, |
|
|
|
3673 | SPEC_RULE_OP1 | SPEC_RULE_OP2, |
|
|
|
3698 | SPEC_RULE_OP1 | SPEC_RULE_OP2, |
|
|
|
4616 |
|
|
|
3723, |
|
|
|
4617 |
|
|
|
}; |
|
|
|
#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 = 3724 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3725 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
if (op->op1_type < op->op2_type) { |
|
|
|
zend_swap_operands(op); |
|
|
|
} |
|
|
|
} 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 = 3749 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3750 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
if (op->op1_type < op->op2_type) { |
|
|
|
zend_swap_operands(op); |
|
|
|
} |
|
|
|
} 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 = 3774 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
if (op->op1_type < op->op2_type) { |
|
|
|
zend_swap_operands(op); |
|
|
|
} |
|
|
|
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 3799 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
spec = 3800 | 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 = 3824 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
spec = 3825 | 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 = 3849 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
spec = 3850 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_MUL: |
|
|
|
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 3874 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3875 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
} 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 = 3899 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3900 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
} 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 = 3924 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_IS_EQUAL: |
|
|
|
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 3949 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 3950 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
} 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 = 4024 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 4025 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_IS_NOT_EQUAL: |
|
|
|
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 4099 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 4100 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
} 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 = 4174 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
spec = 4175 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_IS_SMALLER: |
|
|
|
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { |
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 4249 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
spec = 4250 | 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 = 4324 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
spec = 4325 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_IS_SMALLER_OR_EQUAL: |
|
|
|
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { |
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 4399 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
spec = 4400 | 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 = 4474 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
spec = 4475 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_QM_ASSIGN: |
|
|
|
if (op1_info == MAY_BE_DOUBLE) { |
|
|
|
spec = 4567 | SPEC_RULE_OP1; |
|
|
|
spec = 4568 | SPEC_RULE_OP1; |
|
|
|
} else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { |
|
|
|
spec = 4572 | SPEC_RULE_OP1; |
|
|
|
spec = 4573 | SPEC_RULE_OP1; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_PRE_INC: |
|
|
|
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4549 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4550 | SPEC_RULE_RETVAL; |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4551 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4552 | SPEC_RULE_RETVAL; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
spec = 4553 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4554 | SPEC_RULE_RETVAL; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_PRE_DEC: |
|
|
|
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4555 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4556 | SPEC_RULE_RETVAL; |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4557 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4558 | SPEC_RULE_RETVAL; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
spec = 4559 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4560 | SPEC_RULE_RETVAL; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_POST_INC: |
|
|
|
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4561; |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4562; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4563; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
spec = 4564; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_POST_DEC: |
|
|
|
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4564; |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4565; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
} else if (op1_info == MAY_BE_LONG) { |
|
|
|
spec = 4566; |
|
|
|
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { |
|
|
|
spec = 4567; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_JMP: |
|
|
|
if (OP_JMP_ADDR(op, op->op1) > op) { |
|
|
|
spec = 3723; |
|
|
|
spec = 3724; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_SEND_VAL: |
|
|
|
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { |
|
|
|
spec = 4612; |
|
|
|
spec = 4613; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_SEND_VAR_EX: |
|
|
|
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { |
|
|
|
spec = 4607 | SPEC_RULE_OP1; |
|
|
|
spec = 4608 | SPEC_RULE_OP1; |
|
|
|
} |
|
|
|
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 = 4614 | SPEC_RULE_RETVAL; |
|
|
|
spec = 4615 | 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))) { |
|
|
|
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { |
|
|
|
break; |
|
|
|
} |
|
|
|
spec = 4577 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
spec = 4578 | SPEC_RULE_OP1 | SPEC_RULE_OP2; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_SEND_VAL_EX: |
|
|
|
if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { |
|
|
|
spec = 4613; |
|
|
|
spec = 4614; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_SEND_VAR: |
|
|
|
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { |
|
|
|
spec = 4602 | SPEC_RULE_OP1; |
|
|
|
spec = 4603 | SPEC_RULE_OP1; |
|
|
|
} |
|
|
|
break; |
|
|
|
case ZEND_BW_OR: |