Fixed incorrect behavior of observer API.

ZEND_HANDLE_EXCEPTION might call zend_observer_fcall_end() even if exception is cought by function. The fix moved zend_observer_fcall_end() into a right place and remove OBSERVER sepecialization for ZEND_HANDLE_EXCEPTION handler.
This commit is contained in:
Dmitry Stogov 2020-10-07 17:06:53 +03:00
parent edf0c6a6ae
commit fd81e708bc
3 changed files with 689 additions and 746 deletions

View file

@ -7688,6 +7688,9 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
} }
/* Uncaught exception */ /* Uncaught exception */
if (zend_observer_fcall_op_array_extension != -1) {
zend_observer_fcall_end(execute_data, EX(return_value));
}
cleanup_live_vars(execute_data, op_num, 0); cleanup_live_vars(execute_data, op_num, 0);
if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) { if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C); zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
@ -7702,7 +7705,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
} }
} }
ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY, SPEC(OBSERVER)) ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
{ {
const zend_op *throw_op = EG(opline_before_exception); const zend_op *throw_op = EG(opline_before_exception);
uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes; uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
@ -7731,7 +7734,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY, SPEC(OBSERVER))
} }
} }
ZEND_OBSERVER_FCALL_END(execute_data, EX(return_value));
cleanup_unfinished_calls(execute_data, throw_op_num); cleanup_unfinished_calls(execute_data, throw_op_num);
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {

View file

@ -2894,6 +2894,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try
} }
/* Uncaught exception */ /* Uncaught exception */
if (zend_observer_fcall_op_array_extension != -1) {
zend_observer_fcall_end(execute_data, EX(return_value));
}
cleanup_live_vars(execute_data, op_num, 0); cleanup_live_vars(execute_data, op_num, 0);
if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) { if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C); zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
@ -2962,61 +2965,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
} }
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
const zend_op *throw_op = EG(opline_before_exception);
uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
int i, current_try_catch_offset = -1;
if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
&& throw_op->extended_value & ZEND_FREE_ON_RETURN) {
/* exceptions thrown because of loop var destruction on return/break/...
* are logically thrown at the end of the foreach loop, so adjust the
* throw_op_num.
*/
const zend_live_range *range = find_live_range(
&EX(func)->op_array, throw_op_num, throw_op->op1.var);
throw_op_num = range->end;
}
/* Find the innermost try/catch/finally the exception was thrown in */
for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
zend_try_catch_element *try_catch = &EX(func)->op_array.try_catch_array[i];
if (try_catch->try_op > throw_op_num) {
/* further blocks will not be relevant... */
break;
}
if (throw_op_num < try_catch->catch_op || throw_op_num < try_catch->finally_end) {
current_try_catch_offset = i;
}
}
zend_observer_fcall_end(execute_data, EX(return_value));
cleanup_unfinished_calls(execute_data, throw_op_num);
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
switch (throw_op->opcode) {
case ZEND_ADD_ARRAY_ELEMENT:
case ZEND_ADD_ARRAY_UNPACK:
case ZEND_ROPE_INIT:
case ZEND_ROPE_ADD:
break; /* exception while building structures, live range handling will free those */
case ZEND_FETCH_CLASS:
case ZEND_DECLARE_ANON_CLASS:
break; /* return value is zend_class_entry pointer */
default:
/* smart branch opcodes may not initialize result */
if (!zend_is_smart_branch(throw_op)) {
zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
}
}
}
ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{ {
USE_OPLINE USE_OPLINE
@ -53089,7 +53037,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_LABEL, (void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_LABEL,
(void*)&&ZEND_HANDLE_EXCEPTION_SPEC_LABEL, (void*)&&ZEND_HANDLE_EXCEPTION_SPEC_LABEL,
(void*)&&ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_LABEL,
(void*)&&ZEND_USER_OPCODE_SPEC_LABEL, (void*)&&ZEND_USER_OPCODE_SPEC_LABEL,
(void*)&&ZEND_ASSERT_CHECK_SPEC_LABEL, (void*)&&ZEND_ASSERT_CHECK_SPEC_LABEL,
(void*)&&ZEND_JMP_SET_SPEC_CONST_LABEL, (void*)&&ZEND_JMP_SET_SPEC_CONST_LABEL,
@ -54545,10 +54492,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC) VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC)
ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK(); HYBRID_BREAK();
HYBRID_CASE(ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER):
VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER)
ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_USER_OPCODE_SPEC): HYBRID_CASE(ZEND_USER_OPCODE_SPEC):
VM_TRACE(ZEND_USER_OPCODE_SPEC) VM_TRACE(ZEND_USER_OPCODE_SPEC)
ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@ -61101,7 +61044,6 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER, ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER,
ZEND_HANDLE_EXCEPTION_SPEC_HANDLER, ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER,
ZEND_USER_OPCODE_SPEC_HANDLER, ZEND_USER_OPCODE_SPEC_HANDLER,
ZEND_ASSERT_CHECK_SPEC_HANDLER, ZEND_ASSERT_CHECK_SPEC_HANDLER,
ZEND_JMP_SET_SPEC_CONST_HANDLER, ZEND_JMP_SET_SPEC_CONST_HANDLER,
@ -62382,30 +62324,31 @@ void zend_vm_init(void)
2294, 2294,
2295, 2295,
2296 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2296 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2321 | SPEC_RULE_OBSERVER, 2321,
2322,
2323, 2323,
2324, 2324 | SPEC_RULE_OP1,
2325 | SPEC_RULE_OP1, 2329,
2330, 2330 | SPEC_RULE_ISSET,
2331 | SPEC_RULE_ISSET, 2332 | SPEC_RULE_OP2,
2333 | SPEC_RULE_OP2, 2337,
2338, 2338 | SPEC_RULE_OP1,
2339 | SPEC_RULE_OP1, 2343 | SPEC_RULE_OBSERVER,
2344 | SPEC_RULE_OBSERVER, 2345,
2346, 2346 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2347 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2371 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
2372 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, 2381,
2382, 2382,
2383, 2383,
2384, 2384,
2385, 2385 | SPEC_RULE_OP1,
2386 | SPEC_RULE_OP1, 2390,
2391, 2391,
2392, 2392 | SPEC_RULE_OP1,
2393 | SPEC_RULE_OP1, 2397 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2398 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2422,
2423, 2423 | SPEC_RULE_OP1,
2424 | SPEC_RULE_OP1, 2428,
2429, 2429,
2430, 2430,
2431, 2431,
@ -62413,27 +62356,26 @@ void zend_vm_init(void)
2433, 2433,
2434, 2434,
2435, 2435,
2436, 2436 | SPEC_RULE_OP1,
2437 | SPEC_RULE_OP1, 2441,
2442, 2442,
2443, 2443,
2444, 2444 | SPEC_RULE_OP2,
2445 | SPEC_RULE_OP2, 2449,
2450, 2450 | SPEC_RULE_OP1,
2451 | SPEC_RULE_OP1, 2455 | SPEC_RULE_OP1,
2456 | SPEC_RULE_OP1, 2460 | SPEC_RULE_OP1,
2461 | SPEC_RULE_OP1, 2465 | SPEC_RULE_OP1,
2466 | SPEC_RULE_OP1, 2470 | SPEC_RULE_OP1,
2471 | SPEC_RULE_OP1, 2475,
2476, 2476 | SPEC_RULE_OP1,
2477 | SPEC_RULE_OP1, 2481 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2482 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2506 | SPEC_RULE_OP1,
2507 | SPEC_RULE_OP1, 2511 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
2512 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2536 | SPEC_RULE_OP1,
2537 | SPEC_RULE_OP1, 2541 | SPEC_RULE_OP1,
2542 | SPEC_RULE_OP1, 2546,
2547, 3450
3451
}; };
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
zend_opcode_handler_funcs = labels; zend_opcode_handler_funcs = labels;
@ -62606,7 +62548,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2550 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2549 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) { if (op->op1_type < op->op2_type) {
zend_swap_operands(op); zend_swap_operands(op);
} }
@ -62614,7 +62556,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2575 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2574 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) { if (op->op1_type < op->op2_type) {
zend_swap_operands(op); zend_swap_operands(op);
} }
@ -62622,7 +62564,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2600 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) { if (op->op1_type < op->op2_type) {
zend_swap_operands(op); zend_swap_operands(op);
} }
@ -62633,17 +62575,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2625 | SPEC_RULE_OP1 | SPEC_RULE_OP2; spec = 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2650 | SPEC_RULE_OP1 | SPEC_RULE_OP2; spec = 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2675 | SPEC_RULE_OP1 | SPEC_RULE_OP2; spec = 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} }
break; break;
case ZEND_MUL: case ZEND_MUL:
@ -62654,17 +62596,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2700 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2725 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2724 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2750 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 2749 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} }
break; break;
case ZEND_IS_IDENTICAL: case ZEND_IS_IDENTICAL:
@ -62675,14 +62617,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2774 | 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) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2849 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) { } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
spec = 3075 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 3074 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} }
break; break;
case ZEND_IS_NOT_IDENTICAL: case ZEND_IS_NOT_IDENTICAL:
@ -62693,14 +62635,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2924 | 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) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2999 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) { } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
spec = 3080 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; spec = 3079 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} }
break; break;
case ZEND_IS_EQUAL: case ZEND_IS_EQUAL:
@ -62711,12 +62653,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2774 | 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) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2849 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} }
break; break;
case ZEND_IS_NOT_EQUAL: case ZEND_IS_NOT_EQUAL:
@ -62727,12 +62669,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2924 | 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) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; spec = 2999 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} }
break; break;
case ZEND_IS_SMALLER: case ZEND_IS_SMALLER:
@ -62740,12 +62682,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3085 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; spec = 3084 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3160 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; spec = 3159 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} }
break; break;
case ZEND_IS_SMALLER_OR_EQUAL: case ZEND_IS_SMALLER_OR_EQUAL:
@ -62753,74 +62695,74 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3235 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; spec = 3234 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3310 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; spec = 3309 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} }
break; break;
case ZEND_QM_ASSIGN: case ZEND_QM_ASSIGN:
if (op1_info == MAY_BE_LONG) { if (op1_info == MAY_BE_LONG) {
spec = 3397 | SPEC_RULE_OP1; spec = 3396 | SPEC_RULE_OP1;
} else if (op1_info == MAY_BE_DOUBLE) { } else if (op1_info == MAY_BE_DOUBLE) {
spec = 3402 | SPEC_RULE_OP1; spec = 3401 | 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))))) { } 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 = 3407 | SPEC_RULE_OP1; spec = 3406 | SPEC_RULE_OP1;
} }
break; break;
case ZEND_PRE_INC: case ZEND_PRE_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 3385 | SPEC_RULE_RETVAL; spec = 3384 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG) {
spec = 3387 | SPEC_RULE_RETVAL; spec = 3386 | SPEC_RULE_RETVAL;
} }
break; break;
case ZEND_PRE_DEC: case ZEND_PRE_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 3389 | SPEC_RULE_RETVAL; spec = 3388 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG) {
spec = 3391 | SPEC_RULE_RETVAL; spec = 3390 | SPEC_RULE_RETVAL;
} }
break; break;
case ZEND_POST_INC: case ZEND_POST_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 3393; spec = 3392;
} else if (op1_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG) {
spec = 3394; spec = 3393;
} }
break; break;
case ZEND_POST_DEC: case ZEND_POST_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 3395; spec = 3394;
} else if (op1_info == MAY_BE_LONG) { } else if (op1_info == MAY_BE_LONG) {
spec = 3396; spec = 3395;
} }
break; break;
case ZEND_JMP: case ZEND_JMP:
if (OP_JMP_ADDR(op, op->op1) > op) { if (OP_JMP_ADDR(op, op->op1) > op) {
spec = 2549; spec = 2548;
} }
break; break;
case ZEND_RECV: case ZEND_RECV:
if (op->op2.num == MAY_BE_ANY) { if (op->op2.num == MAY_BE_ANY) {
spec = 2548; spec = 2547;
} }
break; break;
case ZEND_SEND_VAL: case ZEND_SEND_VAL:
if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
spec = 3447; spec = 3446;
} }
break; break;
case ZEND_SEND_VAR_EX: case ZEND_SEND_VAR_EX:
if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
spec = 3442 | SPEC_RULE_OP1; spec = 3441 | SPEC_RULE_OP1;
} }
break; break;
case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_R:
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
spec = 3449 | SPEC_RULE_RETVAL; spec = 3448 | SPEC_RULE_RETVAL;
} }
break; break;
case ZEND_FETCH_DIM_R: case ZEND_FETCH_DIM_R:
@ -62828,17 +62770,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break; break;
} }
spec = 3412 | SPEC_RULE_OP1 | SPEC_RULE_OP2; spec = 3411 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} }
break; break;
case ZEND_SEND_VAL_EX: case ZEND_SEND_VAL_EX:
if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
spec = 3448; spec = 3447;
} }
break; break;
case ZEND_SEND_VAR: case ZEND_SEND_VAR:
if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
spec = 3437 | SPEC_RULE_OP1; spec = 3436 | SPEC_RULE_OP1;
} }
break; break;
case ZEND_BW_OR: case ZEND_BW_OR:

File diff suppressed because it is too large Load diff