From 8f285af2c3f7b9f8684911f91234dcaf71df5d60 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 23 Apr 2021 10:32:07 +0200 Subject: [PATCH 01/22] Delay notice emission until end of opcode This is a prototype for fixing a long-standing source of interrupt vulnerabilities: A notice is emitted during execution of an opcode, resulting in an error handling being run. The error handler modifies some data structure the opcode is working on, resulting in UAF or other memory corruption. The idea here is to instead collect notices and only process them after the opcode. This is implemented similarly to exception handling, by switching to a ZEND_HANDLE_DELAYED_ERROR opcode, which will then switch back to the normal opcode stream. Unfortunately, what this prototype implements is not sufficient. Opcodes that acquire direct (INDIRECT) references to zvals require that no interrupts occur between the producing and the consuming opcode. Chains of W/RW opcodes should be executed without interrupt. Currently, the notice is only delayed until after the first opcode, which still results in an illegal interrupt (bug78598.phpt shows a UAF with this change). I'm not sure how to best handle that issue. --- Zend/zend.c | 34 ++ Zend/zend.h | 4 + Zend/zend_execute.c | 8 +- Zend/zend_execute.h | 1 + Zend/zend_execute_API.c | 3 + Zend/zend_globals.h | 2 + Zend/zend_vm_def.h | 25 + Zend/zend_vm_execute.h | 242 +++++--- Zend/zend_vm_handlers.h | 935 +++++++++++++++-------------- Zend/zend_vm_opcodes.c | 6 +- Zend/zend_vm_opcodes.h | 3 +- ext/opcache/jit/zend_jit_helpers.c | 7 +- 12 files changed, 705 insertions(+), 565 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index f16b1a30dbbc..b29833195c4a 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -684,6 +684,18 @@ static void zend_init_exception_op(void) /* {{{ */ } /* }}} */ +static void zend_init_delayed_error_op(void) /* {{{ */ +{ + memset(EG(delayed_error_op), 0, sizeof(EG(delayed_error_op))); + EG(delayed_error_op)[0].opcode = ZEND_HANDLE_DELAYED_ERROR; + ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)); + EG(delayed_error_op)[1].opcode = ZEND_HANDLE_DELAYED_ERROR; + ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)+1); + EG(delayed_error_op)[2].opcode = ZEND_HANDLE_DELAYED_ERROR; + ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)+2); +} +/* }}} */ + static void zend_init_call_trampoline_op(void) /* {{{ */ { memset(&EG(call_trampoline_op), 0, sizeof(EG(call_trampoline_op))); @@ -805,6 +817,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{ zend_copy_constants(executor_globals->zend_constants, GLOBAL_CONSTANTS_TABLE); zend_init_rsrc_plist(); zend_init_exception_op(); + zend_init_delayed_error_op(); zend_init_call_trampoline_op(); memset(&executor_globals->trampoline, 0, sizeof(zend_op_array)); executor_globals->capture_warnings_during_sccp = 0; @@ -1063,6 +1076,7 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */ #ifndef ZTS zend_init_rsrc_plist(); zend_init_exception_op(); + zend_init_delayed_error_op(); zend_init_call_trampoline_op(); #endif @@ -1807,6 +1821,26 @@ ZEND_API void zend_free_recorded_errors(void) memset(&EG(errors), 0, sizeof(EG(errors))); } +ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) { + ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Cannot delay fatal error"); + zend_error_info *info = emalloc(sizeof(zend_error_info)); + info->type = type; + get_filename_lineno(type, &info->filename, &info->lineno); + zend_string_addref(info->filename); + + va_list args; + va_start(args, format); + info->message = zend_vstrpprintf(0, format, args); + va_end(args); + + zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); + + if (EG(current_execute_data)->opline != EG(delayed_error_op)) { + EG(opline_before_exception) = EG(current_execute_data)->opline; + EG(current_execute_data)->opline = EG(delayed_error_op); + } +} + ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */ { va_list va; diff --git a/Zend/zend.h b/Zend/zend.h index 0d5303192b57..8ffb507d6e8b 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -386,6 +386,9 @@ extern ZEND_API void (*zend_post_shutdown_cb)(void); extern ZEND_API void (*zend_accel_schedule_restart_hook)(int reason); +/* Callback for loading of not preloaded part of the script */ +extern ZEND_API zend_result (*zend_preload_autoload)(zend_string *filename); + ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn_unchecked(int type, const char *format, ...); @@ -396,6 +399,7 @@ ZEND_API ZEND_COLD void zend_error_at(int type, zend_string *filename, uint32_t ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, zend_string *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message); ZEND_API ZEND_COLD void zend_error_zstr_at(int type, zend_string *filename, uint32_t lineno, zend_string *message); +ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4253037fda52..ad5a45d2b4d2 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2525,6 +2525,11 @@ ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht return zend_hash_index_add_new(ht, lval, &EG(uninitialized_zval)); } +ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lval) +{ + zend_error_delayed(E_WARNING, "Undefined array key " ZEND_LONG_FMT, lval); +} + ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset) { zval *retval; @@ -2823,7 +2828,8 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht retval = &EG(uninitialized_zval); break; case BP_VAR_RW: - retval = zend_undefined_offset_write(ht, hval); + zend_undefined_offset_delayed(hval); + retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval)); break; } } else { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ba48b19bcfe1..21ccf60bd706 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -95,6 +95,7 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_const ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void); +ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lval); ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 71e0c56a51c8..7028c81eb6f7 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -198,6 +198,9 @@ void init_executor(void) /* {{{ */ zend_max_execution_timer_init(); zend_fiber_init(); + + zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + zend_weakrefs_init(); zend_hash_init(&EG(callable_convert_cache), 8, NULL, ZVAL_PTR_DTOR, 0); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 8257df32e831..48d1e727eebb 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -264,6 +264,7 @@ struct _zend_executor_globals { zend_object *exception; const zend_op *opline_before_exception; zend_op exception_op[3]; + zend_op delayed_error_op[3]; struct _zend_module_entry *current_module; @@ -321,6 +322,7 @@ struct _zend_executor_globals { pid_t pid; struct sigaction oldact; #endif + HashTable delayed_errors; zend_strtod_state strtod_state; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1de7a7cd4195..7f9aec6da888 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8276,6 +8276,31 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num); } +ZEND_VM_HANDLER(212, ZEND_HANDLE_DELAYED_ERROR, ANY, ANY) +{ + const zend_op *next_op = EG(opline_before_exception) + 1; + if (next_op->opcode == ZEND_OP_DATA) { + next_op++; + } + + /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ + HashTable ht; + memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); + zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + + zend_error_info *info; + ZEND_HASH_FOREACH_PTR(&ht, info) { + zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + } ZEND_HASH_FOREACH_END(); + zend_hash_destroy(&ht); + + ZEND_VM_SET_NEXT_OPCODE(next_op); + ZEND_VM_CONTINUE(); +} + ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 5b52f1941845..a3a9c9f6ba1b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3455,6 +3455,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX current_try_catch_offset, throw_op_num)); } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + const zend_op *next_op = EG(opline_before_exception) + 1; + if (next_op->opcode == ZEND_OP_DATA) { + next_op++; + } + + /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ + HashTable ht; + memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); + zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + + zend_error_info *info; + ZEND_HASH_FOREACH_PTR(&ht, info) { + zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + } ZEND_HASH_FOREACH_END(); + zend_hash_destroy(&ht); + + ZEND_VM_SET_NEXT_OPCODE(next_op); + ZEND_VM_CONTINUE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -56129,6 +56154,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX current_try_catch_offset, throw_op_num)); } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_DELAYED_ERROR_SPEC_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + const zend_op *next_op = EG(opline_before_exception) + 1; + if (next_op->opcode == ZEND_OP_DATA) { + next_op++; + } + + /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ + HashTable ht; + memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); + zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + + zend_error_info *info; + ZEND_HASH_FOREACH_PTR(&ht, info) { + zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + } ZEND_HASH_FOREACH_END(); + zend_hash_destroy(&ht); + + ZEND_VM_SET_NEXT_OPCODE(next_op); + ZEND_VM_CONTINUE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_USER_OPCODE_SPEC_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -109243,6 +109293,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_LABEL, (void*)&&ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_TYPE_ASSERT_SPEC_CONST_LABEL, + (void*)&&ZEND_HANDLE_DELAYED_ERROR_SPEC_LABEL, (void*)&&ZEND_INIT_FCALL_OFFSET_SPEC_CONST_LABEL, (void*)&&ZEND_RECV_NOTYPE_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -110557,6 +110608,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); VM_TRACE_OP_END(ZEND_HANDLE_EXCEPTION_SPEC) HYBRID_BREAK(); + HYBRID_CASE(ZEND_HANDLE_DELAYED_ERROR_SPEC): + VM_TRACE(ZEND_HANDLE_DELAYED_ERROR_SPEC) + ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + VM_TRACE_OP_END(ZEND_HANDLE_DELAYED_ERROR_SPEC) + HYBRID_BREAK(); HYBRID_CASE(ZEND_USER_OPCODE_SPEC): VM_TRACE(ZEND_USER_OPCODE_SPEC) ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -118181,6 +118237,7 @@ void zend_vm_init(void) ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_HANDLER, ZEND_TYPE_ASSERT_SPEC_CONST_HANDLER, + ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_HANDLER, ZEND_RECV_NOTYPE_SPEC_HANDLER, ZEND_NULL_HANDLER, @@ -121659,6 +121716,7 @@ void zend_vm_init(void) ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_TAILCALL_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_TAILCALL_HANDLER, ZEND_TYPE_ASSERT_SPEC_CONST_TAILCALL_HANDLER, + ZEND_HANDLE_DELAYED_ERROR_SPEC_TAILCALL_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_TAILCALL_HANDLER, ZEND_RECV_NOTYPE_SPEC_TAILCALL_HANDLER, ZEND_NULL_TAILCALL_HANDLER, @@ -122627,7 +122685,7 @@ void zend_vm_init(void) 1255, 1256 | SPEC_RULE_OP1, 1261 | SPEC_RULE_OP1, - 3474, + 3475, 1266 | SPEC_RULE_OP1, 1271 | SPEC_RULE_OP1, 1276 | SPEC_RULE_OP2, @@ -122661,7 +122719,7 @@ void zend_vm_init(void) 1559 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1584 | SPEC_RULE_OP1, 1589, - 3474, + 3475, 1590 | SPEC_RULE_OP1, 1595 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1620 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -122794,50 +122852,50 @@ void zend_vm_init(void) 2556, 2557, 2558, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, - 3474, + 2559, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, + 3475, }; #if 0 #elif (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) @@ -123030,7 +123088,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) { break; } - spec = 2567 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2568 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123038,7 +123096,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) { break; } - spec = 2592 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2593 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123046,7 +123104,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) { break; } - spec = 2617 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2618 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123057,17 +123115,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) { break; } - spec = 2642 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2643 | 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 = 2667 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2668 | 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 = 2692 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2693 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -123078,17 +123136,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) { break; } - spec = 2717 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2718 | 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 = 2742 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2743 | 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 = 2767 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2768 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_IDENTICAL: @@ -123099,16 +123157,16 @@ 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) { break; } - spec = 2792 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2793 | 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 = 2867 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2868 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0)) { - spec = 3092 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3093 | 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))) { - spec = 3098 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3099 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_IDENTICAL: @@ -123119,16 +123177,16 @@ 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) { break; } - spec = 2942 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2943 | 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 = 3017 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3018 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0)) { - spec = 3095 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3096 | 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))) { - spec = 3103 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3104 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -123139,12 +123197,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) { break; } - spec = 2792 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2793 | 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 = 2867 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2868 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -123155,12 +123213,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) { break; } - spec = 2942 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2943 | 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 = 3017 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3018 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -123168,12 +123226,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) { break; } - spec = 3108 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3109 | 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 = 3183 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3184 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -123181,79 +123239,79 @@ 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) { break; } - spec = 3258 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3259 | 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 = 3333 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3334 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_LONG) { - spec = 3420 | SPEC_RULE_OP1; + spec = 3421 | SPEC_RULE_OP1; } else if (op1_info == MAY_BE_DOUBLE) { - spec = 3425 | SPEC_RULE_OP1; + spec = 3426 | 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 = 3430 | SPEC_RULE_OP1; + spec = 3431 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3408 | SPEC_RULE_RETVAL; + spec = 3409 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3410 | SPEC_RULE_RETVAL; + spec = 3411 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3412 | SPEC_RULE_RETVAL; + spec = 3413 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3414 | SPEC_RULE_RETVAL; + spec = 3415 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3416; - } else if (op1_info == MAY_BE_LONG) { spec = 3417; + } else if (op1_info == MAY_BE_LONG) { + spec = 3418; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3418; - } else if (op1_info == MAY_BE_LONG) { spec = 3419; + } else if (op1_info == MAY_BE_LONG) { + spec = 3420; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 2566; + spec = 2567; } break; case ZEND_INIT_FCALL: if (Z_EXTRA_P(RT_CONSTANT(op, op->op2)) != 0) { - spec = 2559; + spec = 2560; } break; case ZEND_RECV: if (op->op2.num == MAY_BE_ANY) { - spec = 2560; + spec = 2561; } break; case ZEND_SEND_VAL: if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3470; + spec = 3471; } break; 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) { - spec = 3465 | SPEC_RULE_OP1; + spec = 3466 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 3472 | SPEC_RULE_RETVAL; + spec = 3473 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -123261,22 +123319,22 @@ 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) { break; } - spec = 3435 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3436 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; 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))) { - spec = 3471; + spec = 3472; } break; case ZEND_SEND_VAR: if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3460 | SPEC_RULE_OP1; + spec = 3461 | SPEC_RULE_OP1; } break; case ZEND_COUNT: if ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 2561 | SPEC_RULE_OP1; + spec = 2562 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 6f1595195450..a6a3402f2fcb 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1087,507 +1087,508 @@ _(2556, ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED) \ _(2557, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST) \ _(2558, ZEND_TYPE_ASSERT_SPEC_CONST) \ - _(2559, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ - _(2560, ZEND_RECV_NOTYPE_SPEC) \ - _(2562, ZEND_COUNT_ARRAY_SPEC_TMP_UNUSED) \ - _(2565, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ - _(2566, ZEND_JMP_FORWARD_SPEC) \ - _(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2559, ZEND_HANDLE_DELAYED_ERROR_SPEC) \ + _(2560, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ + _(2561, ZEND_RECV_NOTYPE_SPEC) \ + _(2563, ZEND_COUNT_ARRAY_SPEC_TMP_UNUSED) \ + _(2566, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ + _(2567, ZEND_JMP_FORWARD_SPEC) \ + _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2576, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2577, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2578, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2575, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2577, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2578, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2579, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2581, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2587, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2588, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2580, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2582, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2588, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2589, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2591, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2590, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2592, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ _(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2601, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2602, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2603, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2600, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2602, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2603, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ _(2604, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2606, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2612, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2613, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2605, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2607, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2613, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ _(2614, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2616, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2615, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2617, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2626, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2627, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2628, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2625, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2627, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2628, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2629, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2631, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2637, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2638, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2630, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2632, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2638, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2639, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2641, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2643, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2640, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2642, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2644, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2646, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2645, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2651, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2652, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2653, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2650, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2652, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2653, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2654, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2656, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2662, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2663, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2655, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2657, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2663, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2664, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2666, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2668, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2665, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2667, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2669, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2671, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2670, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2672, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ _(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2676, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2677, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2678, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2675, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2677, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2678, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ _(2679, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2681, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2687, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2688, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2680, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2682, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2688, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ _(2689, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2691, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2693, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2690, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2692, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2694, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2696, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2695, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2697, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2701, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2702, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2703, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2700, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2702, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2703, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2704, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2706, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2712, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2713, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2705, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2707, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2713, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2714, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2716, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2715, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2717, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2726, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2727, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2728, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2725, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2727, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2728, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2729, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2731, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2737, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2738, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2730, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2732, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2738, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2739, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2741, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2740, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2742, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ _(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2751, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2752, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2753, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2750, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2752, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2753, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ _(2754, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2756, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2762, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2763, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2755, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2757, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2763, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ _(2764, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2766, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2765, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2767, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2776, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2777, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2778, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2775, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2777, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2778, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2779, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2781, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2787, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2788, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2780, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2782, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2788, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2789, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2791, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2822, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2823, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2824, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2825, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2826, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2852, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2864, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2897, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2898, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2899, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2900, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2901, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2927, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2939, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2972, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2973, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2974, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2975, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2976, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3002, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3014, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3047, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3048, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3049, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3050, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3051, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3077, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3089, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3092, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3093, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3094, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3095, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3096, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3097, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3098, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3102, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3103, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3107, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3111, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3112, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3113, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3114, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3115, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3116, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3120, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3121, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3122, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3135, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3136, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3137, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3168, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3169, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3172, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3173, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3174, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3175, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3176, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3180, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3181, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3182, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3186, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3210, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3211, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3243, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3244, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3247, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3248, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3249, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3250, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3251, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3255, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3256, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3257, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3261, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3318, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3319, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3322, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3323, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3324, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3325, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3326, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3330, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3331, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3332, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3336, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3393, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3394, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3397, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3398, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3399, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3400, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3401, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3405, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3406, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3407, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3408, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3409, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3410, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3411, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ - _(3412, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3413, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3414, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3415, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ - _(3416, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3417, ZEND_POST_INC_LONG_SPEC_CV) \ - _(3418, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3419, ZEND_POST_DEC_LONG_SPEC_CV) \ - _(3420, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ - _(3421, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(2790, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2792, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2816, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2822, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2823, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2824, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2825, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2826, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2831, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2861, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2867, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2891, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2897, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2898, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2899, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2900, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2901, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2906, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2936, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2942, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2966, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2972, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2973, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2974, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2975, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2976, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2981, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3011, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3017, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3041, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3047, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3048, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3049, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3050, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3051, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3056, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3086, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3092, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3093, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3094, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3095, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3096, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3097, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3098, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3099, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3103, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3104, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3108, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3112, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3113, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3114, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3115, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3116, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3117, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3121, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3122, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3123, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3132, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3136, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3137, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3169, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3172, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3173, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3174, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3175, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3176, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3177, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3181, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3182, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3183, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3207, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3211, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3244, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3247, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3248, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3249, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3250, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3251, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3252, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3256, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3257, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3258, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3282, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3319, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3322, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3323, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3324, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3325, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3326, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3327, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3331, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3332, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3333, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3357, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3394, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3397, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3398, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3399, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3400, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3401, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3402, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3406, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3407, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3408, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3409, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3410, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3411, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3412, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ + _(3413, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3414, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3415, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3416, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ + _(3417, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3418, ZEND_POST_INC_LONG_SPEC_CV) \ + _(3419, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3420, ZEND_POST_DEC_LONG_SPEC_CV) \ + _(3421, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ _(3422, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3424, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3425, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(3426, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3423, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3425, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3426, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ _(3427, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3429, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3430, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(3431, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3428, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3430, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3431, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ _(3432, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3434, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3433, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3435, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ _(3437, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3439, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3440, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3441, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3438, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3440, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3441, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ _(3442, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3444, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3445, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3446, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3443, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3445, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3446, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ _(3447, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3449, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3455, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(3456, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3448, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3450, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3456, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ _(3457, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3459, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3462, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(3464, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(3467, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ - _(3469, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ - _(3470, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ - _(3471, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ - _(3472, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(3473, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(3473+1, ZEND_NULL) + _(3458, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3460, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3463, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(3465, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(3468, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ + _(3470, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ + _(3471, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ + _(3472, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ + _(3473, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(3474, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(3474+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 0ece3e6f0c66..380b165dc8bb 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -21,7 +21,7 @@ #include #include -static const char *zend_vm_opcodes_names[212] = { +static const char *zend_vm_opcodes_names[213] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -234,9 +234,10 @@ static const char *zend_vm_opcodes_names[212] = { "ZEND_INIT_PARENT_PROPERTY_HOOK_CALL", "ZEND_DECLARE_ATTRIBUTED_CONST", "ZEND_TYPE_ASSERT", + "ZEND_HANDLE_DELAYED_ERROR", }; -static uint32_t zend_vm_opcodes_flags[212] = { +static uint32_t zend_vm_opcodes_flags[213] = { 0x00000000, 0x00000b0b, 0x00000b0b, @@ -449,6 +450,7 @@ static uint32_t zend_vm_opcodes_flags[212] = { 0x01001103, 0x00000303, 0x01000003, + 0x00000000, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 92b46e6628f3..4c3fac87fb4c 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -331,7 +331,8 @@ END_EXTERN_C() #define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL 209 #define ZEND_DECLARE_ATTRIBUTED_CONST 210 #define ZEND_TYPE_ASSERT 211 +#define ZEND_HANDLE_DELAYED_ERROR 212 -#define ZEND_VM_LAST_OPCODE 211 +#define ZEND_VM_LAST_OPCODE 212 #endif diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 64a48068f378..fcc9138423c2 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -349,7 +349,8 @@ static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_rw(HashTable *ht, zend_lon zval *retval = zend_hash_index_find(ht, idx); if (!retval) { - retval = zend_undefined_offset_write(ht, idx); + zend_undefined_offset_delayed(idx); + retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval)); } return retval; } @@ -1009,7 +1010,9 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di return retval; num_undef: - return zend_undefined_offset_write(ht, hval); + zend_undefined_offset_delayed(hval); + retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval)); + return retval; } static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim) From b0fa748e9065cc5adbedb1e751692242da1d27c9 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 29 Aug 2023 12:04:00 +0200 Subject: [PATCH 02/22] Add support for INDIRECT delaying --- Zend/tests/bug52041.phpt | 2 + Zend/tests/bug78598.phpt | 2 + Zend/tests/delayed_error_001.phpt | 43 +++++++++++ Zend/tests/undef_index_to_exception.phpt | 10 ++- Zend/zend.c | 6 +- Zend/zend_execute.c | 17 +++++ Zend/zend_execute.h | 2 + Zend/zend_globals.h | 1 + Zend/zend_vm_def.h | 75 ++++++++++++++++---- Zend/zend_vm_execute.h | 75 ++++++++++++++++---- ext/opcache/tests/jit/assign_dim_op_001.phpt | 1 + ext/opcache/tests/jit/fetch_dim_rw_001.phpt | 1 + ext/opcache/tests/jit/fetch_dim_rw_002.phpt | 1 + ext/opcache/tests/jit/shift_right_004.phpt | 1 + 14 files changed, 206 insertions(+), 31 deletions(-) create mode 100644 Zend/tests/delayed_error_001.phpt diff --git a/Zend/tests/bug52041.phpt b/Zend/tests/bug52041.phpt index 7debab3f8beb..83fbf2f26fd9 100644 --- a/Zend/tests/bug52041.phpt +++ b/Zend/tests/bug52041.phpt @@ -1,5 +1,7 @@ --TEST-- Bug #52041 (Memory leak when writing on uninitialized variable returned from function) +--INI-- +opcache.jit=0 --FILE-- +--EXPECTF-- +Warning: Undefined variable $array in %s on line %d + +Warning: Undefined array key 0 in %s on line %d + +Warning: Undefined array key 1 in %s on line %d + +Warning: Undefined array key 2 in %s on line %d + +Warning: Undefined array key 3 in %s on line %d + +Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d + +Warning: Undefined array key 3 in %s on line %d + +Warning: Undefined array key 4 in %s on line %d + +Warning: Undefined array key 5 in %s on line %d + +Warning: Undefined array key 6 in %s on line %d + +Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d + +Warning: Undefined array key 7 in %s on line %d + +Warning: Undefined array key 8 in %s on line %d + +Warning: Undefined array key 9 in %s on line %d + +Warning: Undefined array key 10 in %s on line %d diff --git a/Zend/tests/undef_index_to_exception.phpt b/Zend/tests/undef_index_to_exception.phpt index bbe13c0e71d0..bfa66bff8e4e 100644 --- a/Zend/tests/undef_index_to_exception.phpt +++ b/Zend/tests/undef_index_to_exception.phpt @@ -1,5 +1,7 @@ --TEST-- Converting undefined index/offset notice to exception +--INI-- +opcache.jit=0 --FILE-- --EXPECT-- Undefined array key 0 -array(0) { +array(1) { + [0]=> + string(3) "xyz" } Undefined array key "key" -array(0) { +array(1) { + [0]=> + string(3) "xyz" } Undefined global variable $test Undefined variable $test diff --git a/Zend/zend.c b/Zend/zend.c index b29833195c4a..43b37ba4edab 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1821,7 +1821,8 @@ ZEND_API void zend_free_recorded_errors(void) memset(&EG(errors), 0, sizeof(EG(errors))); } -ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) { +ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) +{ ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Cannot delay fatal error"); zend_error_info *info = emalloc(sizeof(zend_error_info)); info->type = type; @@ -1838,6 +1839,9 @@ ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) { if (EG(current_execute_data)->opline != EG(delayed_error_op)) { EG(opline_before_exception) = EG(current_execute_data)->opline; EG(current_execute_data)->opline = EG(delayed_error_op); + /* Reset to ZEND_HANDLE_DELAYED_ERROR */ + EG(delayed_error_op)[0] = EG(delayed_error_op)[2]; + EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ad5a45d2b4d2..7b5fe38844bd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2530,6 +2530,23 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lv zend_error_delayed(E_WARNING, "Undefined array key " ZEND_LONG_FMT, lval); } +ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void) +{ + /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ + HashTable ht; + memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); + zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + + zend_error_info *info; + ZEND_HASH_FOREACH_PTR(&ht, info) { + zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + } ZEND_HASH_FOREACH_END(); + zend_hash_destroy(&ht); +} + ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset) { zval *retval; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 21ccf60bd706..4f65be61d69f 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -100,6 +100,8 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lv ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); +ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void); + ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg); ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error( const zend_function *zf, const zend_arg_info *arg_info, uint32_t arg_num, const zval *value); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 48d1e727eebb..3ffd8921331a 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -265,6 +265,7 @@ struct _zend_executor_globals { const zend_op *opline_before_exception; zend_op exception_op[3]; zend_op delayed_error_op[3]; + zval delayed_error_consts[3]; struct _zend_module_entry *current_module; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7f9aec6da888..a0f511717093 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8220,6 +8220,10 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) { const zend_op *throw_op = EG(opline_before_exception); + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0); @@ -8278,26 +8282,69 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) ZEND_VM_HANDLER(212, ZEND_HANDLE_DELAYED_ERROR, ANY, ANY) { - const zend_op *next_op = EG(opline_before_exception) + 1; + const zend_op *prev_op = EG(opline_before_exception); + bool delay = false; + switch (prev_op->opcode) { + case ZEND_FETCH_W: + case ZEND_FETCH_RW: + case ZEND_FETCH_FUNC_ARG: + case ZEND_FETCH_UNSET: + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_DIM_RW: + case ZEND_FETCH_DIM_UNSET: + case ZEND_FETCH_LIST_W: + case ZEND_FETCH_OBJ_W: + case ZEND_FETCH_OBJ_RW: + case ZEND_FETCH_OBJ_UNSET: + delay = true; + break; + } + + // FIXME: Is this guaranteed to be there? + const zend_op *next_op = prev_op + 1; if (next_op->opcode == ZEND_OP_DATA) { next_op++; } - /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ - HashTable ht; - memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); - zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + if (delay) { + zend_op *delayed_op = &EG(delayed_error_op)[0]; + *delayed_op = *next_op; + if (delayed_op->op1_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[0], RT_CONSTANT(next_op, next_op->op1)); + delayed_op->op1.num = (char *)&EG(delayed_error_consts)[0] - (char *)delayed_op; + } + if (delayed_op->op2_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[1], RT_CONSTANT(next_op, next_op->op2)); + delayed_op->op2.num = (char *)&EG(delayed_error_consts)[1] - (char *)delayed_op; + } + // FIXME: Is this guaranteed to be there? + if (next_op[1].opcode == ZEND_OP_DATA) { + const zend_op *next_opdata = &next_op[1]; + zend_op *delayed_opdata = &EG(delayed_error_op)[1]; + *delayed_opdata = *next_opdata; + if (delayed_opdata->op1_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[2], RT_CONSTANT(next_opdata, next_opdata->op1)); + delayed_opdata->op1.num = (char *)&EG(delayed_error_consts)[2] - (char *)delayed_opdata; + } + } else { + /* Reset to ZEND_HANDLE_DELAYED_ERROR */ + EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; + } + EG(opline_before_exception) = next_op; + + ZEND_VM_SET_NEXT_OPCODE(delayed_op); + } else { + EX(opline) = prev_op; + zend_handle_delayed_errors(); + + if (EG(exception)) { + HANDLE_EXCEPTION(); + } - zend_error_info *info; - ZEND_HASH_FOREACH_PTR(&ht, info) { - zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); - zend_string_release(info->filename); - zend_string_release(info->message); - efree(info); - } ZEND_HASH_FOREACH_END(); - zend_hash_destroy(&ht); + EG(opline_before_exception) = NULL; + ZEND_VM_SET_NEXT_OPCODE(next_op); + } - ZEND_VM_SET_NEXT_OPCODE(next_op); ZEND_VM_CONTINUE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a3a9c9f6ba1b..7f87b4fe832c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3399,6 +3399,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT { const zend_op *throw_op = EG(opline_before_exception); + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); @@ -3457,26 +3461,69 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { - const zend_op *next_op = EG(opline_before_exception) + 1; + const zend_op *prev_op = EG(opline_before_exception); + bool delay = false; + switch (prev_op->opcode) { + case ZEND_FETCH_W: + case ZEND_FETCH_RW: + case ZEND_FETCH_FUNC_ARG: + case ZEND_FETCH_UNSET: + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_DIM_RW: + case ZEND_FETCH_DIM_UNSET: + case ZEND_FETCH_LIST_W: + case ZEND_FETCH_OBJ_W: + case ZEND_FETCH_OBJ_RW: + case ZEND_FETCH_OBJ_UNSET: + delay = true; + break; + } + + // FIXME: Is this guaranteed to be there? + const zend_op *next_op = prev_op + 1; if (next_op->opcode == ZEND_OP_DATA) { next_op++; } - /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ - HashTable ht; - memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); - zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + if (delay) { + zend_op *delayed_op = &EG(delayed_error_op)[0]; + *delayed_op = *next_op; + if (delayed_op->op1_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[0], RT_CONSTANT(next_op, next_op->op1)); + delayed_op->op1.num = (char *)&EG(delayed_error_consts)[0] - (char *)delayed_op; + } + if (delayed_op->op2_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[1], RT_CONSTANT(next_op, next_op->op2)); + delayed_op->op2.num = (char *)&EG(delayed_error_consts)[1] - (char *)delayed_op; + } + // FIXME: Is this guaranteed to be there? + if (next_op[1].opcode == ZEND_OP_DATA) { + const zend_op *next_opdata = &next_op[1]; + zend_op *delayed_opdata = &EG(delayed_error_op)[1]; + *delayed_opdata = *next_opdata; + if (delayed_opdata->op1_type == IS_CONST) { + ZVAL_COPY_VALUE(&EG(delayed_error_consts)[2], RT_CONSTANT(next_opdata, next_opdata->op1)); + delayed_opdata->op1.num = (char *)&EG(delayed_error_consts)[2] - (char *)delayed_opdata; + } + } else { + /* Reset to ZEND_HANDLE_DELAYED_ERROR */ + EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; + } + EG(opline_before_exception) = next_op; - zend_error_info *info; - ZEND_HASH_FOREACH_PTR(&ht, info) { - zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); - zend_string_release(info->filename); - zend_string_release(info->message); - efree(info); - } ZEND_HASH_FOREACH_END(); - zend_hash_destroy(&ht); + ZEND_VM_SET_NEXT_OPCODE(delayed_op); + } else { + EX(opline) = prev_op; + zend_handle_delayed_errors(); + + if (EG(exception)) { + HANDLE_EXCEPTION(); + } + + EG(opline_before_exception) = NULL; + ZEND_VM_SET_NEXT_OPCODE(next_op); + } - ZEND_VM_SET_NEXT_OPCODE(next_op); ZEND_VM_CONTINUE(); } diff --git a/ext/opcache/tests/jit/assign_dim_op_001.phpt b/ext/opcache/tests/jit/assign_dim_op_001.phpt index c5b057e92603..08b77a21b921 100644 --- a/ext/opcache/tests/jit/assign_dim_op_001.phpt +++ b/ext/opcache/tests/jit/assign_dim_op_001.phpt @@ -4,6 +4,7 @@ JIT ASSIGN_DIM_OP: 001 opcache.enable=1 opcache.enable_cli=1 opcache.file_update_protection=0 +opcache.jit=0 --EXTENSIONS-- opcache --FILE-- diff --git a/ext/opcache/tests/jit/fetch_dim_rw_001.phpt b/ext/opcache/tests/jit/fetch_dim_rw_001.phpt index 9362c4407b26..ed2967fa4b42 100644 --- a/ext/opcache/tests/jit/fetch_dim_rw_001.phpt +++ b/ext/opcache/tests/jit/fetch_dim_rw_001.phpt @@ -4,6 +4,7 @@ JIT FETCH_DIM_RW: 001 opcache.enable=1 opcache.enable_cli=1 opcache.file_update_protection=0 +opcache.jit=0 ;opcache.jit_debug=257 --EXTENSIONS-- opcache diff --git a/ext/opcache/tests/jit/fetch_dim_rw_002.phpt b/ext/opcache/tests/jit/fetch_dim_rw_002.phpt index 068b90e6a2fc..32ca0a55a9a8 100644 --- a/ext/opcache/tests/jit/fetch_dim_rw_002.phpt +++ b/ext/opcache/tests/jit/fetch_dim_rw_002.phpt @@ -4,6 +4,7 @@ JIT FETCH_DIM_RW: 002 opcache.enable=1 opcache.enable_cli=1 opcache.file_update_protection=0 +opcache.jit=0 --FILE-- Date: Wed, 6 May 2026 15:22:17 +0200 Subject: [PATCH 03/22] Delay notice until interrupt handler --- Zend/zend.c | 23 +- Zend/zend_execute.c | 3 + Zend/zend_globals.h | 3 - Zend/zend_vm_def.h | 77 +--- Zend/zend_vm_execute.h | 307 +++++-------- Zend/zend_vm_handlers.h | 935 ++++++++++++++++++++-------------------- Zend/zend_vm_opcodes.c | 6 +- Zend/zend_vm_opcodes.h | 3 +- 8 files changed, 594 insertions(+), 763 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 43b37ba4edab..028881878549 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -684,18 +684,6 @@ static void zend_init_exception_op(void) /* {{{ */ } /* }}} */ -static void zend_init_delayed_error_op(void) /* {{{ */ -{ - memset(EG(delayed_error_op), 0, sizeof(EG(delayed_error_op))); - EG(delayed_error_op)[0].opcode = ZEND_HANDLE_DELAYED_ERROR; - ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)); - EG(delayed_error_op)[1].opcode = ZEND_HANDLE_DELAYED_ERROR; - ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)+1); - EG(delayed_error_op)[2].opcode = ZEND_HANDLE_DELAYED_ERROR; - ZEND_VM_SET_OPCODE_HANDLER(EG(delayed_error_op)+2); -} -/* }}} */ - static void zend_init_call_trampoline_op(void) /* {{{ */ { memset(&EG(call_trampoline_op), 0, sizeof(EG(call_trampoline_op))); @@ -817,7 +805,6 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{ zend_copy_constants(executor_globals->zend_constants, GLOBAL_CONSTANTS_TABLE); zend_init_rsrc_plist(); zend_init_exception_op(); - zend_init_delayed_error_op(); zend_init_call_trampoline_op(); memset(&executor_globals->trampoline, 0, sizeof(zend_op_array)); executor_globals->capture_warnings_during_sccp = 0; @@ -1076,7 +1063,6 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */ #ifndef ZTS zend_init_rsrc_plist(); zend_init_exception_op(); - zend_init_delayed_error_op(); zend_init_call_trampoline_op(); #endif @@ -1835,14 +1821,7 @@ ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) va_end(args); zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); - - if (EG(current_execute_data)->opline != EG(delayed_error_op)) { - EG(opline_before_exception) = EG(current_execute_data)->opline; - EG(current_execute_data)->opline = EG(delayed_error_op); - /* Reset to ZEND_HANDLE_DELAYED_ERROR */ - EG(delayed_error_op)[0] = EG(delayed_error_op)[2]; - EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; - } + zend_atomic_bool_store_ex(&EG(vm_interrupt), true); } ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7b5fe38844bd..1864f5eb2c5a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4337,6 +4337,9 @@ ZEND_API void ZEND_FASTCALL zend_free_compiled_variables(zend_execute_data *exec ZEND_API ZEND_COLD void ZEND_FASTCALL zend_fcall_interrupt(zend_execute_data *call) { zend_atomic_bool_store_ex(&EG(vm_interrupt), false); + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); } else if (zend_interrupt_function) { diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 3ffd8921331a..a66b227dfd34 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -264,9 +264,6 @@ struct _zend_executor_globals { zend_object *exception; const zend_op *opline_before_exception; zend_op exception_op[3]; - zend_op delayed_error_op[3]; - zval delayed_error_consts[3]; - struct _zend_module_entry *current_module; bool active; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a0f511717093..dc2a3c43c3b5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8280,74 +8280,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num); } -ZEND_VM_HANDLER(212, ZEND_HANDLE_DELAYED_ERROR, ANY, ANY) -{ - const zend_op *prev_op = EG(opline_before_exception); - bool delay = false; - switch (prev_op->opcode) { - case ZEND_FETCH_W: - case ZEND_FETCH_RW: - case ZEND_FETCH_FUNC_ARG: - case ZEND_FETCH_UNSET: - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_DIM_RW: - case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST_W: - case ZEND_FETCH_OBJ_W: - case ZEND_FETCH_OBJ_RW: - case ZEND_FETCH_OBJ_UNSET: - delay = true; - break; - } - - // FIXME: Is this guaranteed to be there? - const zend_op *next_op = prev_op + 1; - if (next_op->opcode == ZEND_OP_DATA) { - next_op++; - } - - if (delay) { - zend_op *delayed_op = &EG(delayed_error_op)[0]; - *delayed_op = *next_op; - if (delayed_op->op1_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[0], RT_CONSTANT(next_op, next_op->op1)); - delayed_op->op1.num = (char *)&EG(delayed_error_consts)[0] - (char *)delayed_op; - } - if (delayed_op->op2_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[1], RT_CONSTANT(next_op, next_op->op2)); - delayed_op->op2.num = (char *)&EG(delayed_error_consts)[1] - (char *)delayed_op; - } - // FIXME: Is this guaranteed to be there? - if (next_op[1].opcode == ZEND_OP_DATA) { - const zend_op *next_opdata = &next_op[1]; - zend_op *delayed_opdata = &EG(delayed_error_op)[1]; - *delayed_opdata = *next_opdata; - if (delayed_opdata->op1_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[2], RT_CONSTANT(next_opdata, next_opdata->op1)); - delayed_opdata->op1.num = (char *)&EG(delayed_error_consts)[2] - (char *)delayed_opdata; - } - } else { - /* Reset to ZEND_HANDLE_DELAYED_ERROR */ - EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; - } - EG(opline_before_exception) = next_op; - - ZEND_VM_SET_NEXT_OPCODE(delayed_op); - } else { - EX(opline) = prev_op; - zend_handle_delayed_errors(); - - if (EG(exception)) { - HANDLE_EXCEPTION(); - } - - EG(opline_before_exception) = NULL; - ZEND_VM_SET_NEXT_OPCODE(next_op); - } - - ZEND_VM_CONTINUE(); -} - ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) { USE_OPLINE @@ -10702,9 +10634,16 @@ ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY) #else SAVE_OPLINE(); #endif + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); - } else if (zend_interrupt_function) { + } + if (zend_interrupt_function) { zend_interrupt_function(execute_data); if (EG(exception)) { /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7f87b4fe832c..fb5539443734 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3459,74 +3459,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX current_try_catch_offset, throw_op_num)); } -static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - const zend_op *prev_op = EG(opline_before_exception); - bool delay = false; - switch (prev_op->opcode) { - case ZEND_FETCH_W: - case ZEND_FETCH_RW: - case ZEND_FETCH_FUNC_ARG: - case ZEND_FETCH_UNSET: - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_DIM_RW: - case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST_W: - case ZEND_FETCH_OBJ_W: - case ZEND_FETCH_OBJ_RW: - case ZEND_FETCH_OBJ_UNSET: - delay = true; - break; - } - - // FIXME: Is this guaranteed to be there? - const zend_op *next_op = prev_op + 1; - if (next_op->opcode == ZEND_OP_DATA) { - next_op++; - } - - if (delay) { - zend_op *delayed_op = &EG(delayed_error_op)[0]; - *delayed_op = *next_op; - if (delayed_op->op1_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[0], RT_CONSTANT(next_op, next_op->op1)); - delayed_op->op1.num = (char *)&EG(delayed_error_consts)[0] - (char *)delayed_op; - } - if (delayed_op->op2_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[1], RT_CONSTANT(next_op, next_op->op2)); - delayed_op->op2.num = (char *)&EG(delayed_error_consts)[1] - (char *)delayed_op; - } - // FIXME: Is this guaranteed to be there? - if (next_op[1].opcode == ZEND_OP_DATA) { - const zend_op *next_opdata = &next_op[1]; - zend_op *delayed_opdata = &EG(delayed_error_op)[1]; - *delayed_opdata = *next_opdata; - if (delayed_opdata->op1_type == IS_CONST) { - ZVAL_COPY_VALUE(&EG(delayed_error_consts)[2], RT_CONSTANT(next_opdata, next_opdata->op1)); - delayed_opdata->op1.num = (char *)&EG(delayed_error_consts)[2] - (char *)delayed_opdata; - } - } else { - /* Reset to ZEND_HANDLE_DELAYED_ERROR */ - EG(delayed_error_op)[1] = EG(delayed_error_op)[2]; - } - EG(opline_before_exception) = next_op; - - ZEND_VM_SET_NEXT_OPCODE(delayed_op); - } else { - EX(opline) = prev_op; - zend_handle_delayed_errors(); - - if (EG(exception)) { - HANDLE_EXCEPTION(); - } - - EG(opline_before_exception) = NULL; - ZEND_VM_SET_NEXT_OPCODE(next_op); - } - - ZEND_VM_CONTINUE(); -} - static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -4110,9 +4042,16 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV #else SAVE_OPLINE(); #endif + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); - } else if (zend_interrupt_function) { + } + if (zend_interrupt_function) { zend_interrupt_function(execute_data); if (EG(exception)) { /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ @@ -56145,6 +56084,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S { const zend_op *throw_op = EG(opline_before_exception); + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); @@ -56201,31 +56144,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX current_try_catch_offset, throw_op_num)); } -static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_DELAYED_ERROR_SPEC_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - const zend_op *next_op = EG(opline_before_exception) + 1; - if (next_op->opcode == ZEND_OP_DATA) { - next_op++; - } - - /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ - HashTable ht; - memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); - zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); - - zend_error_info *info; - ZEND_HASH_FOREACH_PTR(&ht, info) { - zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); - zend_string_release(info->filename); - zend_string_release(info->message); - efree(info); - } ZEND_HASH_FOREACH_END(); - zend_hash_destroy(&ht); - - ZEND_VM_SET_NEXT_OPCODE(next_op); - ZEND_VM_CONTINUE(); -} - static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_USER_OPCODE_SPEC_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -56809,9 +56727,16 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend #else SAVE_OPLINE(); #endif + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); - } else if (zend_interrupt_function) { + } + if (zend_interrupt_function) { zend_interrupt_function(execute_data); if (EG(exception)) { /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ @@ -109340,7 +109265,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_LABEL, (void*)&&ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_TYPE_ASSERT_SPEC_CONST_LABEL, - (void*)&&ZEND_HANDLE_DELAYED_ERROR_SPEC_LABEL, (void*)&&ZEND_INIT_FCALL_OFFSET_SPEC_CONST_LABEL, (void*)&&ZEND_RECV_NOTYPE_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -110655,11 +110579,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); VM_TRACE_OP_END(ZEND_HANDLE_EXCEPTION_SPEC) HYBRID_BREAK(); - HYBRID_CASE(ZEND_HANDLE_DELAYED_ERROR_SPEC): - VM_TRACE(ZEND_HANDLE_DELAYED_ERROR_SPEC) - ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - VM_TRACE_OP_END(ZEND_HANDLE_DELAYED_ERROR_SPEC) - HYBRID_BREAK(); HYBRID_CASE(ZEND_USER_OPCODE_SPEC): VM_TRACE(ZEND_USER_OPCODE_SPEC) ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -118284,7 +118203,6 @@ void zend_vm_init(void) ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_HANDLER, ZEND_TYPE_ASSERT_SPEC_CONST_HANDLER, - ZEND_HANDLE_DELAYED_ERROR_SPEC_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_HANDLER, ZEND_RECV_NOTYPE_SPEC_HANDLER, ZEND_NULL_HANDLER, @@ -121763,7 +121681,6 @@ void zend_vm_init(void) ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_TAILCALL_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_TAILCALL_HANDLER, ZEND_TYPE_ASSERT_SPEC_CONST_TAILCALL_HANDLER, - ZEND_HANDLE_DELAYED_ERROR_SPEC_TAILCALL_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_TAILCALL_HANDLER, ZEND_RECV_NOTYPE_SPEC_TAILCALL_HANDLER, ZEND_NULL_TAILCALL_HANDLER, @@ -122732,7 +122649,7 @@ void zend_vm_init(void) 1255, 1256 | SPEC_RULE_OP1, 1261 | SPEC_RULE_OP1, - 3475, + 3474, 1266 | SPEC_RULE_OP1, 1271 | SPEC_RULE_OP1, 1276 | SPEC_RULE_OP2, @@ -122766,7 +122683,7 @@ void zend_vm_init(void) 1559 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1584 | SPEC_RULE_OP1, 1589, - 3475, + 3474, 1590 | SPEC_RULE_OP1, 1595 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1620 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -122899,50 +122816,50 @@ void zend_vm_init(void) 2556, 2557, 2558, - 2559, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, - 3475, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, + 3474, }; #if 0 #elif (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) @@ -123135,7 +123052,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) { break; } - spec = 2568 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2567 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123143,7 +123060,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) { break; } - spec = 2593 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2592 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123151,7 +123068,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) { break; } - spec = 2618 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2617 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -123162,17 +123079,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) { break; } - spec = 2643 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2642 | 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 = 2668 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2667 | 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 = 2693 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2692 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -123183,17 +123100,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) { break; } - spec = 2718 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2717 | 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 = 2743 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2742 | 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 = 2768 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2767 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_IDENTICAL: @@ -123204,16 +123121,16 @@ 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) { break; } - spec = 2793 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2792 | 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 = 2868 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2867 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0)) { - spec = 3093 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3092 | 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))) { - spec = 3099 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3098 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_IDENTICAL: @@ -123224,16 +123141,16 @@ 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) { break; } - spec = 2943 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2942 | 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 = 3018 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3017 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0)) { - spec = 3096 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3095 | 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))) { - spec = 3104 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3103 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -123244,12 +123161,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) { break; } - spec = 2793 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2792 | 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 = 2868 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2867 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -123260,12 +123177,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) { break; } - spec = 2943 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2942 | 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 = 3018 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3017 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -123273,12 +123190,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) { break; } - spec = 3109 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3108 | 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 = 3184 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3183 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -123286,79 +123203,79 @@ 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) { break; } - spec = 3259 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3258 | 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 = 3334 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3333 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_LONG) { - spec = 3421 | SPEC_RULE_OP1; + spec = 3420 | SPEC_RULE_OP1; } else if (op1_info == MAY_BE_DOUBLE) { - spec = 3426 | SPEC_RULE_OP1; + spec = 3425 | 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 = 3431 | SPEC_RULE_OP1; + spec = 3430 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3409 | SPEC_RULE_RETVAL; + spec = 3408 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3411 | SPEC_RULE_RETVAL; + spec = 3410 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3413 | SPEC_RULE_RETVAL; + spec = 3412 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3415 | SPEC_RULE_RETVAL; + spec = 3414 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3417; + spec = 3416; } else if (op1_info == MAY_BE_LONG) { - spec = 3418; + spec = 3417; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3419; + spec = 3418; } else if (op1_info == MAY_BE_LONG) { - spec = 3420; + spec = 3419; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 2567; + spec = 2566; } break; case ZEND_INIT_FCALL: if (Z_EXTRA_P(RT_CONSTANT(op, op->op2)) != 0) { - spec = 2560; + spec = 2559; } break; case ZEND_RECV: if (op->op2.num == MAY_BE_ANY) { - spec = 2561; + spec = 2560; } break; case ZEND_SEND_VAL: if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3471; + spec = 3470; } break; 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) { - spec = 3466 | SPEC_RULE_OP1; + spec = 3465 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 3473 | SPEC_RULE_RETVAL; + spec = 3472 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -123366,22 +123283,22 @@ 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) { break; } - spec = 3436 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3435 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; 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))) { - spec = 3472; + spec = 3471; } break; case ZEND_SEND_VAR: if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3461 | SPEC_RULE_OP1; + spec = 3460 | SPEC_RULE_OP1; } break; case ZEND_COUNT: if ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 2562 | SPEC_RULE_OP1; + spec = 2561 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index a6a3402f2fcb..6f1595195450 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1087,508 +1087,507 @@ _(2556, ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED) \ _(2557, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST) \ _(2558, ZEND_TYPE_ASSERT_SPEC_CONST) \ - _(2559, ZEND_HANDLE_DELAYED_ERROR_SPEC) \ - _(2560, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ - _(2561, ZEND_RECV_NOTYPE_SPEC) \ - _(2563, ZEND_COUNT_ARRAY_SPEC_TMP_UNUSED) \ - _(2566, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ - _(2567, ZEND_JMP_FORWARD_SPEC) \ - _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2559, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ + _(2560, ZEND_RECV_NOTYPE_SPEC) \ + _(2562, ZEND_COUNT_ARRAY_SPEC_TMP_UNUSED) \ + _(2565, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ + _(2566, ZEND_JMP_FORWARD_SPEC) \ + _(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2575, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2577, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2578, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2576, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2577, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2578, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2579, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2580, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2582, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2588, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2581, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2587, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2588, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2589, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2590, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2592, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2591, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2600, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2602, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2603, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2601, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2602, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2603, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2604, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2605, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2607, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2613, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2606, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2612, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2613, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2614, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2615, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2617, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2616, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2625, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2627, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2628, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2626, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2627, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2628, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2629, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2630, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2632, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2638, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2631, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2637, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2638, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2639, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2640, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2642, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2641, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2643, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ _(2644, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2645, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2646, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2650, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2652, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2653, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2651, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2652, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2653, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2654, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2655, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2657, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2663, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2656, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2662, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2663, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2664, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2665, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2667, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2666, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2668, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ _(2669, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2670, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2672, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2671, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2675, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2677, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2678, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2676, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2677, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2678, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2679, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2680, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2682, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2688, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2681, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2687, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2688, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2689, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2690, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2692, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2691, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2693, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ _(2694, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2695, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2697, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2696, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2700, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2702, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2703, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2701, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2702, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2703, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2704, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2705, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2707, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2713, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2706, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2712, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2713, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2714, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2715, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2717, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2716, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2725, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2727, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2728, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2726, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2727, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2728, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2729, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2730, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2732, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2738, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2731, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2737, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2738, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2739, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2740, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2742, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2741, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2750, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2752, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2753, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2751, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2752, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2753, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2754, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2755, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2757, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2763, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2756, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2762, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2763, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2764, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2765, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2767, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2766, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2775, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2777, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2778, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2776, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2777, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2778, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2779, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2780, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2782, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2788, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2781, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2787, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2788, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2789, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2790, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2792, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2816, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2822, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2823, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2824, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2825, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2826, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2831, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2861, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2867, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2891, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2897, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2898, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2899, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2900, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2901, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2906, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2936, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2942, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2966, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2972, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2973, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2974, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2975, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2976, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2981, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3011, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3017, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3041, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3047, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3048, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3049, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3050, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3051, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3056, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3086, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3092, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3093, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3094, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3095, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3096, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3097, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3098, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3099, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3103, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3104, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3108, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3112, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3113, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3114, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3115, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3116, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3117, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3121, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3122, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3123, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3132, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3136, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3137, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3169, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3172, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3173, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3174, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3175, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3176, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3177, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3181, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3182, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3183, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3207, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3211, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3244, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3247, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3248, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3249, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3250, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3251, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3252, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3256, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3257, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3258, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3282, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3319, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3322, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3323, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3324, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3325, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3326, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3327, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3331, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3332, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3333, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3357, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3394, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3397, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3398, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3399, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3400, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3401, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3402, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3406, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3407, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3408, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3409, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3410, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3411, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3412, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ - _(3413, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3414, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3415, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3416, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ - _(3417, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3418, ZEND_POST_INC_LONG_SPEC_CV) \ - _(3419, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3420, ZEND_POST_DEC_LONG_SPEC_CV) \ - _(3421, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ + _(2791, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2822, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2823, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2824, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2825, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2826, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2852, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2864, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2897, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2898, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2899, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2900, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2901, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2927, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2939, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2972, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2973, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2974, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2975, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2976, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3002, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3014, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3047, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3048, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3049, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3050, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3051, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3077, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3089, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3092, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3093, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3094, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3095, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3096, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3097, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3098, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3102, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3103, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3107, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3111, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3112, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3113, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3114, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3115, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3116, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3120, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3121, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3122, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3135, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3136, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3137, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3168, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3169, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3172, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3173, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3174, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3175, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3176, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3180, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3181, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3182, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3186, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3210, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3211, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3243, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3244, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3247, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3248, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3249, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3250, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3251, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3255, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3256, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3257, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3261, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3318, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3319, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3322, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3323, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3324, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3325, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3326, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3330, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3331, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3332, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3336, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3393, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3394, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3397, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3398, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3399, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3400, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3401, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3405, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3406, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3407, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3408, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3409, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3410, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3411, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ + _(3412, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3413, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3414, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3415, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ + _(3416, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3417, ZEND_POST_INC_LONG_SPEC_CV) \ + _(3418, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3419, ZEND_POST_DEC_LONG_SPEC_CV) \ + _(3420, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ + _(3421, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ _(3422, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3423, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3425, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3426, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(3424, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3425, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(3426, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ _(3427, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3428, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3430, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3431, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(3429, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3430, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(3431, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ _(3432, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3433, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3435, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3434, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ _(3437, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3438, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3440, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3441, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3439, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3440, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3441, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3442, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3443, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3445, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3446, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3444, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3445, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3446, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3447, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3448, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3450, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3456, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(3449, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3455, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(3456, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ _(3457, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3458, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3460, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3463, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(3465, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(3468, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ - _(3470, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ - _(3471, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ - _(3472, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ - _(3473, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(3474, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(3474+1, ZEND_NULL) + _(3459, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3462, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(3464, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(3467, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ + _(3469, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ + _(3470, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ + _(3471, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ + _(3472, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(3473, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(3473+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 380b165dc8bb..0ece3e6f0c66 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -21,7 +21,7 @@ #include #include -static const char *zend_vm_opcodes_names[213] = { +static const char *zend_vm_opcodes_names[212] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -234,10 +234,9 @@ static const char *zend_vm_opcodes_names[213] = { "ZEND_INIT_PARENT_PROPERTY_HOOK_CALL", "ZEND_DECLARE_ATTRIBUTED_CONST", "ZEND_TYPE_ASSERT", - "ZEND_HANDLE_DELAYED_ERROR", }; -static uint32_t zend_vm_opcodes_flags[213] = { +static uint32_t zend_vm_opcodes_flags[212] = { 0x00000000, 0x00000b0b, 0x00000b0b, @@ -450,7 +449,6 @@ static uint32_t zend_vm_opcodes_flags[213] = { 0x01001103, 0x00000303, 0x01000003, - 0x00000000, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 4c3fac87fb4c..92b46e6628f3 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -331,8 +331,7 @@ END_EXTERN_C() #define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL 209 #define ZEND_DECLARE_ATTRIBUTED_CONST 210 #define ZEND_TYPE_ASSERT 211 -#define ZEND_HANDLE_DELAYED_ERROR 212 -#define ZEND_VM_LAST_OPCODE 212 +#define ZEND_VM_LAST_OPCODE 211 #endif From dee6e1a9d7f7ca79544c8ee0367e766f3735bf29 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 6 May 2026 15:38:14 +0200 Subject: [PATCH 04/22] Add interrupt check in ZEND_RETURN --- Zend/zend_vm_def.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index dc2a3c43c3b5..0ad60217e7f0 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4614,6 +4614,9 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|CV, ANY, SPEC(OBSERVER)) ZEND_OBSERVER_SAVE_OPLINE(); ZEND_OBSERVER_FCALL_END(execute_data, return_value); ZEND_OBSERVER_FREE_RETVAL(); + + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); } From 3cf4c71544a2cbaeeb6130258b850bf466d8e91b Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 6 May 2026 15:55:17 +0200 Subject: [PATCH 05/22] Delay all errors --- Zend/zend.c | 30 +++++++++++++----------------- Zend/zend.h | 1 - Zend/zend_errors.h | 3 +++ Zend/zend_execute.c | 10 ++-------- Zend/zend_execute.h | 1 - Zend/zend_vm_execute.h | 27 +++++++++++++++++++++++++++ ext/opcache/jit/zend_jit_helpers.c | 6 ++---- 7 files changed, 47 insertions(+), 31 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 028881878549..485e6b94b098 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1496,6 +1496,19 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( } } + /* Delay non-bailing errors while executing in the VM */ + if ((!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) + && !(orig_type & E_NO_DELAY) && EG(current_execute_data)) { + zend_error_info *info = emalloc(sizeof(zend_error_info)); + info->type = type; + info->lineno = error_lineno; + info->filename = zend_string_copy(error_filename); + info->message = zend_string_copy(message); + zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); + zend_atomic_bool_store_ex(&EG(vm_interrupt), true); + return; + } + // Always clear the last backtrace. zval_ptr_dtor(&EG(last_fatal_error_backtrace)); ZVAL_UNDEF(&EG(last_fatal_error_backtrace)); @@ -1807,23 +1820,6 @@ ZEND_API void zend_free_recorded_errors(void) memset(&EG(errors), 0, sizeof(EG(errors))); } -ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) -{ - ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Cannot delay fatal error"); - zend_error_info *info = emalloc(sizeof(zend_error_info)); - info->type = type; - get_filename_lineno(type, &info->filename, &info->lineno); - zend_string_addref(info->filename); - - va_list args; - va_start(args, format); - info->message = zend_vstrpprintf(0, format, args); - va_end(args); - - zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); - zend_atomic_bool_store_ex(&EG(vm_interrupt), true); -} - ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */ { va_list va; diff --git a/Zend/zend.h b/Zend/zend.h index 8ffb507d6e8b..f8a9c8897718 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -399,7 +399,6 @@ ZEND_API ZEND_COLD void zend_error_at(int type, zend_string *filename, uint32_t ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, zend_string *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message); ZEND_API ZEND_COLD void zend_error_zstr_at(int type, zend_string *filename, uint32_t lineno, zend_string *message); -ZEND_API ZEND_COLD void zend_error_delayed(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2); diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h index 831e4a9b912a..5dc28ae541f7 100644 --- a/Zend/zend_errors.h +++ b/Zend/zend_errors.h @@ -39,6 +39,9 @@ /* Indicates that this usually fatal error should not result in a bailout */ #define E_DONT_BAIL (1<<15L) +/* Indicates that this error should not be delayed */ +#define E_NO_DELAY (1<<16L) + #define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_DEPRECATED | E_USER_DEPRECATED) #define E_CORE (E_CORE_ERROR | E_CORE_WARNING) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 1864f5eb2c5a..672cb89d02c0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2525,11 +2525,6 @@ ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht return zend_hash_index_add_new(ht, lval, &EG(uninitialized_zval)); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lval) -{ - zend_error_delayed(E_WARNING, "Undefined array key " ZEND_LONG_FMT, lval); -} - ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void) { /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ @@ -2539,7 +2534,7 @@ ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void) zend_error_info *info; ZEND_HASH_FOREACH_PTR(&ht, info) { - zend_error_zstr_at(info->type, info->filename, info->lineno, info->message); + zend_error_zstr_at(info->type | E_NO_DELAY, info->filename, info->lineno, info->message); zend_string_release(info->filename); zend_string_release(info->message); efree(info); @@ -2845,8 +2840,7 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht retval = &EG(uninitialized_zval); break; case BP_VAR_RW: - zend_undefined_offset_delayed(hval); - retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval)); + retval = zend_undefined_offset_write(ht, hval); break; } } else { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 4f65be61d69f..f058d4bc4554 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -95,7 +95,6 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_const ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lval); ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fb5539443734..1ac2bc47675c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4823,6 +4823,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -4901,6 +4903,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_ SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; + + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -17196,6 +17201,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -39861,6 +39868,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -57508,6 +57517,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -57586,6 +57597,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETUR SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; + + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -69779,6 +69793,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -92344,6 +92360,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN + ZEND_VM_INTERRUPT_CHECK(); + ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -110814,6 +110832,8 @@ ZEND_API void execute_ex(zend_execute_data *ex) + ZEND_VM_INTERRUPT_CHECK(); + goto zend_leave_helper_SPEC_LABEL; } @@ -110894,6 +110914,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; + + ZEND_VM_INTERRUPT_CHECK(); + goto zend_leave_helper_SPEC_LABEL; } @@ -112528,6 +112551,8 @@ ZEND_API void execute_ex(zend_execute_data *ex) + ZEND_VM_INTERRUPT_CHECK(); + goto zend_leave_helper_SPEC_LABEL; } @@ -114402,6 +114427,8 @@ ZEND_API void execute_ex(zend_execute_data *ex) + ZEND_VM_INTERRUPT_CHECK(); + goto zend_leave_helper_SPEC_LABEL; } diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index fcc9138423c2..43dd8f6ff263 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -349,8 +349,7 @@ static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_rw(HashTable *ht, zend_lon zval *retval = zend_hash_index_find(ht, idx); if (!retval) { - zend_undefined_offset_delayed(idx); - retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval)); + retval = zend_undefined_offset_write(ht, idx); } return retval; } @@ -1010,8 +1009,7 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di return retval; num_undef: - zend_undefined_offset_delayed(hval); - retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval)); + retval = zend_undefined_offset_write(ht, hval); return retval; } From e8b3d4f3d60f6e086b7cb0f8fb73a65b3e5db246 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 6 May 2026 17:45:29 +0200 Subject: [PATCH 06/22] set_error_handler(): $promote_to_exception --- Zend/zend.c | 12 +++++ Zend/zend_builtin_functions.c | 9 +++- Zend/zend_builtin_functions.stub.php | 2 +- Zend/zend_builtin_functions_arginfo.h | 3 +- Zend/zend_errors.h | 3 ++ Zend/zend_exceptions.c | 4 ++ Zend/zend_exceptions.h | 1 + Zend/zend_exceptions.stub.php | 4 ++ Zend/zend_exceptions_arginfo.h | 12 ++++- Zend/zend_vm_def.h | 35 ++++++++++++++ Zend/zend_vm_execute.h | 70 +++++++++++++++++++++++++++ 11 files changed, 150 insertions(+), 5 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 485e6b94b098..c48f1854d18d 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1499,6 +1499,18 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( /* Delay non-bailing errors while executing in the VM */ if ((!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) && !(orig_type & E_NO_DELAY) && EG(current_execute_data)) { + if ((EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) + && (EG(user_error_handler_error_reporting) & type)) { + zend_object *obj = zend_throw_error_exception( + zend_ce_promoted_error_exception, message, /* code */ 0, type); + zval tmp; + ZVAL_STR_COPY(&tmp, error_filename); + zend_update_property_ex(zend_ce_exception, obj, ZSTR_KNOWN(ZEND_STR_FILE), &tmp); + zval_ptr_dtor(&tmp); + ZVAL_LONG(&tmp, error_lineno); + zend_update_property_ex(zend_ce_exception, obj, ZSTR_KNOWN(ZEND_STR_LINE), &tmp); + return; + } zend_error_info *info = emalloc(sizeof(zend_error_info)); info->type = type; info->lineno = error_lineno; diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index c19bf2779fbf..62369fdb1efe 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1283,11 +1283,13 @@ ZEND_FUNCTION(set_error_handler) zend_fcall_info fci; zend_fcall_info_cache fcc; zend_long error_type = E_ALL; + bool promote_to_exception = false; - ZEND_PARSE_PARAMETERS_START(1, 2) + ZEND_PARSE_PARAMETERS_START(1, 3) Z_PARAM_FUNC_OR_NULL(fci, fcc) Z_PARAM_OPTIONAL Z_PARAM_LONG(error_type) + Z_PARAM_BOOL(promote_to_exception) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) { @@ -1303,7 +1305,10 @@ ZEND_FUNCTION(set_error_handler) } ZVAL_COPY(&EG(user_error_handler), &(fci.function_name)); - EG(user_error_handler_error_reporting) = (int)error_type; + EG(user_error_handler_error_reporting) = (int)error_type & E_ALL; + if (promote_to_exception) { + EG(user_error_handler_error_reporting) |= ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION; + } } /* }}} */ diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index 1d405587145d..20bffdd005ce 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -121,7 +121,7 @@ function trigger_error(string $message, int $error_level = E_USER_NOTICE): true function user_error(string $message, int $error_level = E_USER_NOTICE): true {} /** @return callable|null */ -function set_error_handler(?callable $callback, int $error_levels = E_ALL) {} +function set_error_handler(?callable $callback, int $error_levels = E_ALL, bool $promote_to_exception = false) {} function restore_error_handler(): true {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index b3af43fef340..e3e476a5285b 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit zend_builtin_functions.stub.php instead. - * Stub hash: 64c61862de86d9968930893bf21b516119724064 */ + * Stub hash: fa996744b8ef0056980f5d77f93f8eac3afbd4f4 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_clone, 0, 1, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0) @@ -148,6 +148,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_set_error_handler, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, error_levels, IS_LONG, 0, "E_ALL") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, promote_to_exception, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_restore_error_handler, 0, 0, IS_TRUE, 0) diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h index 5dc28ae541f7..f27a3ed3e983 100644 --- a/Zend/zend_errors.h +++ b/Zend/zend_errors.h @@ -42,6 +42,9 @@ /* Indicates that this error should not be delayed */ #define E_NO_DELAY (1<<16L) +/* Flag for EG(user_error_handler_error_reporting): promote matching errors to PromotedError exceptions */ +#define ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION (1<<30) + #define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_DEPRECATED | E_USER_DEPRECATED) #define E_CORE (E_CORE_ERROR | E_CORE_WARNING) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index d23fb647af9d..0595bc53adf7 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -49,6 +49,7 @@ ZEND_API zend_class_entry *zend_ce_arithmetic_error; ZEND_API zend_class_entry *zend_ce_division_by_zero_error; ZEND_API zend_class_entry *zend_ce_unhandled_match_error; ZEND_API zend_class_entry *zend_ce_request_parse_body_exception; +ZEND_API zend_class_entry *zend_ce_promoted_error_exception; /* Internal pseudo-exception that is not exposed to userland. Throwing this exception *does not* execute finally blocks. */ static zend_class_entry zend_ce_unwind_exit; @@ -827,6 +828,9 @@ void zend_register_default_exception(void) /* {{{ */ zend_ce_request_parse_body_exception = register_class_RequestParseBodyException(zend_ce_exception); zend_init_exception_class_entry(zend_ce_request_parse_body_exception); + zend_ce_promoted_error_exception = register_class_PromotedErrorException(zend_ce_error_exception); + zend_init_exception_class_entry(zend_ce_promoted_error_exception); + INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL); INIT_CLASS_ENTRY(zend_ce_graceful_exit, "GracefulExit", NULL); diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index f9b472598012..f4841651ed2f 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -38,6 +38,7 @@ extern ZEND_API zend_class_entry *zend_ce_arithmetic_error; extern ZEND_API zend_class_entry *zend_ce_division_by_zero_error; extern ZEND_API zend_class_entry *zend_ce_unhandled_match_error; extern ZEND_API zend_class_entry *zend_ce_request_parse_body_exception; +extern ZEND_API zend_class_entry *zend_ce_promoted_error_exception; ZEND_API void zend_exception_set_previous(zend_object *exception, zend_object *add_previous); diff --git a/Zend/zend_exceptions.stub.php b/Zend/zend_exceptions.stub.php index 86f2838ee912..1dd513665705 100644 --- a/Zend/zend_exceptions.stub.php +++ b/Zend/zend_exceptions.stub.php @@ -81,6 +81,10 @@ public function __construct( final public function getSeverity(): int {} } +class PromotedErrorException extends ErrorException +{ +} + class Error implements Throwable { /** diff --git a/Zend/zend_exceptions_arginfo.h b/Zend/zend_exceptions_arginfo.h index 4706161a09af..7366eb2b2d7f 100644 --- a/Zend/zend_exceptions_arginfo.h +++ b/Zend/zend_exceptions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit zend_exceptions.stub.php instead. - * Stub hash: ba1562ca8fe2fe48c40bc52d10545aa989afd86c */ + * Stub hash: 29f62b734a504e14599e240910b01fd5f44fad60 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Throwable_getMessage, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -207,6 +207,16 @@ static zend_class_entry *register_class_ErrorException(zend_class_entry *class_e return class_entry; } +static zend_class_entry *register_class_PromotedErrorException(zend_class_entry *class_entry_ErrorException) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "PromotedErrorException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_ErrorException, 0); + + return class_entry; +} + static zend_class_entry *register_class_Error(zend_class_entry *class_entry_Throwable) { zend_class_entry ce, *class_entry; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0ad60217e7f0..7f1eb8c1e955 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8227,6 +8227,41 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) zend_handle_delayed_errors(); } + // FIXME: zend_handle_delayed_errors may have overridden EX(exception) + if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { + zend_object *promoted = EG(exception); + + zval *severity_zv = zend_read_property_ex( + zend_ce_error_exception, promoted, ZSTR_KNOWN(ZEND_STR_SEVERITY), /* silent */ 1, NULL); + zval *message_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_MESSAGE), 1, NULL); + zval *file_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_FILE), 1, NULL); + zval *line_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_LINE), 1, NULL); + + int error_type = (int) Z_LVAL_P(severity_zv) & E_ALL; + if (!error_type) { + error_type = E_ERROR; + } + zend_string *error_message = zend_string_copy(Z_STR_P(message_zv)); + zend_string *error_file = zend_string_copy(Z_STR_P(file_zv)); + zend_long error_line = Z_LVAL_P(line_zv); + + EG(exception) = NULL; + EX(opline) = throw_op; + zend_error_zstr_at(error_type | E_NO_DELAY, error_file, error_line, error_message); + + zend_string_release(error_file); + zend_string_release(error_message); + + if (!EG(exception)) { + EG(exception) = promoted; + } else { + OBJ_RELEASE(promoted); + } + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1ac2bc47675c..be16d0cca1d8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3403,6 +3403,41 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT zend_handle_delayed_errors(); } + // FIXME: zend_handle_delayed_errors may have overridden EX(exception) + if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { + zend_object *promoted = EG(exception); + + zval *severity_zv = zend_read_property_ex( + zend_ce_error_exception, promoted, ZSTR_KNOWN(ZEND_STR_SEVERITY), /* silent */ 1, NULL); + zval *message_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_MESSAGE), 1, NULL); + zval *file_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_FILE), 1, NULL); + zval *line_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_LINE), 1, NULL); + + int error_type = (int) Z_LVAL_P(severity_zv) & E_ALL; + if (!error_type) { + error_type = E_ERROR; + } + zend_string *error_message = zend_string_copy(Z_STR_P(message_zv)); + zend_string *error_file = zend_string_copy(Z_STR_P(file_zv)); + zend_long error_line = Z_LVAL_P(line_zv); + + EG(exception) = NULL; + EX(opline) = throw_op; + zend_error_zstr_at(error_type | E_NO_DELAY, error_file, error_line, error_message); + + zend_string_release(error_file); + zend_string_release(error_message); + + if (!EG(exception)) { + EG(exception) = promoted; + } else { + OBJ_RELEASE(promoted); + } + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); @@ -56097,6 +56132,41 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S zend_handle_delayed_errors(); } + // FIXME: zend_handle_delayed_errors may have overridden EX(exception) + if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { + zend_object *promoted = EG(exception); + + zval *severity_zv = zend_read_property_ex( + zend_ce_error_exception, promoted, ZSTR_KNOWN(ZEND_STR_SEVERITY), /* silent */ 1, NULL); + zval *message_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_MESSAGE), 1, NULL); + zval *file_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_FILE), 1, NULL); + zval *line_zv = zend_read_property_ex( + zend_ce_exception, promoted, ZSTR_KNOWN(ZEND_STR_LINE), 1, NULL); + + int error_type = (int) Z_LVAL_P(severity_zv) & E_ALL; + if (!error_type) { + error_type = E_ERROR; + } + zend_string *error_message = zend_string_copy(Z_STR_P(message_zv)); + zend_string *error_file = zend_string_copy(Z_STR_P(file_zv)); + zend_long error_line = Z_LVAL_P(line_zv); + + EG(exception) = NULL; + EX(opline) = throw_op; + zend_error_zstr_at(error_type | E_NO_DELAY, error_file, error_line, error_message); + + zend_string_release(error_file); + zend_string_release(error_message); + + if (!EG(exception)) { + EG(exception) = promoted; + } else { + OBJ_RELEASE(promoted); + } + } + /* Exception was thrown before executing any op */ if (UNEXPECTED(!throw_op)) { ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); From 9c2af6fc93662c747152d3283237e41363aa5f18 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 6 May 2026 18:09:44 +0200 Subject: [PATCH 07/22] Delay only if we are going to call a user error handler --- Zend/zend.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index c48f1854d18d..c8b3181e6b38 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1496,9 +1496,14 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( } } - /* Delay non-bailing errors while executing in the VM */ + /* Delay non-bailing errors while executing in the VM, but only if a user + * error handler will actually be called for this error. */ if ((!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) - && !(orig_type & E_NO_DELAY) && EG(current_execute_data)) { + && !(orig_type & E_NO_DELAY) && EG(current_execute_data) + && Z_TYPE(EG(user_error_handler)) != IS_UNDEF + && (EG(user_error_handler_error_reporting) & type) + && EG(error_handling) == EH_NORMAL + && !(type & (E_CORE_WARNING | E_COMPILE_WARNING))) { if ((EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) && (EG(user_error_handler_error_reporting) & type)) { zend_object *obj = zend_throw_error_exception( From 89bb91234607363180c4de15520500cd43d67007 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Thu, 7 May 2026 11:58:37 +0200 Subject: [PATCH 08/22] Handle silence operator --- Zend/zend.c | 1 + Zend/zend.h | 1 + Zend/zend_execute.c | 3 +++ Zend/zend_vm_def.h | 1 + Zend/zend_vm_execute.h | 2 ++ 5 files changed, 8 insertions(+) diff --git a/Zend/zend.c b/Zend/zend.c index c8b3181e6b38..16d3a3f834cb 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1521,6 +1521,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( info->lineno = error_lineno; info->filename = zend_string_copy(error_filename); info->message = zend_string_copy(message); + info->error_reporting = EG(error_reporting); zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); zend_atomic_bool_store_ex(&EG(vm_interrupt), true); return; diff --git a/Zend/zend.h b/Zend/zend.h index f8a9c8897718..d7125ca8e63e 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -130,6 +130,7 @@ typedef struct _zend_error_info { uint32_t lineno; zend_string *filename; zend_string *message; + int error_reporting; } zend_error_info; struct _zend_inheritance_cache_entry { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 672cb89d02c0..9a4f1c10e766 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2534,7 +2534,10 @@ ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void) zend_error_info *info; ZEND_HASH_FOREACH_PTR(&ht, info) { + int orig_error_reporting = EG(error_reporting); + EG(error_reporting) = info->error_reporting; zend_error_zstr_at(info->type | E_NO_DELAY, info->filename, info->lineno, info->message); + EG(error_reporting) = orig_error_reporting; zend_string_release(info->filename); zend_string_release(info->message); efree(info); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7f1eb8c1e955..f83ee7d858ff 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8227,6 +8227,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) zend_handle_delayed_errors(); } + // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index be16d0cca1d8..32acef59b4ba 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3403,6 +3403,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT zend_handle_delayed_errors(); } + // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); @@ -56132,6 +56133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S zend_handle_delayed_errors(); } + // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); From a4e8b151d7f9de852710299cd9248f16b86e7647 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 16:43:32 +0200 Subject: [PATCH 09/22] First promoted error takes precedence over other subsequent errors or exceptions --- Zend/tests/delayed_error_004.phpt | 23 +++++++++++++++++++++++ Zend/zend.c | 5 +++++ Zend/zend_exceptions.c | 8 +++++++- Zend/zend_exceptions.h | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/delayed_error_004.phpt diff --git a/Zend/tests/delayed_error_004.phpt b/Zend/tests/delayed_error_004.phpt new file mode 100644 index 000000000000..5575bc4357de --- /dev/null +++ b/Zend/tests/delayed_error_004.phpt @@ -0,0 +1,23 @@ +--TEST-- +Delayed errors: The first error promoted to exception takes precedence +--FILE-- +getMessage()); +} + +?> +--EXPECT-- +ErrorException: Warning: Return type of C::getTimezone() should either be compatible with DateTime::getTimezone(): DateTimeZone|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice diff --git a/Zend/zend.c b/Zend/zend.c index 16d3a3f834cb..e4b8cfb97f73 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1506,6 +1506,11 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( && !(type & (E_CORE_WARNING | E_COMPILE_WARNING))) { if ((EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) && (EG(user_error_handler_error_reporting) & type)) { + if (EG(exception)) { + /* Promoting this error would override the existing exception, + * but, we want the first exception/error to have precedence. */ + return; + } zend_object *obj = zend_throw_error_exception( zend_ce_promoted_error_exception, message, /* code */ 0, type); zval tmp; diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 0595bc53adf7..66e65bb1aa36 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -167,7 +167,7 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /* if (exception != NULL) { const zend_object *previous = EG(exception); - if (previous && zend_is_unwind_exit(previous)) { + if (previous && (zend_is_unwind_exit(previous) || zend_is_promoted_error_exception(previous))) { /* Don't replace unwinding exception with different exception. */ OBJ_RELEASE(exception); return; @@ -1067,3 +1067,9 @@ ZEND_API bool zend_is_graceful_exit(const zend_object *ex) { return ex->ce == &zend_ce_graceful_exit; } + +ZEND_API bool zend_is_promoted_error_exception(const zend_object *ex) +{ + return ex->ce == zend_ce_promoted_error_exception; +} + diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index f4841651ed2f..b6dbed4f81f1 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -74,6 +74,7 @@ ZEND_API ZEND_COLD void zend_throw_unwind_exit(void); ZEND_API ZEND_COLD void zend_throw_graceful_exit(void); ZEND_API bool zend_is_unwind_exit(const zend_object *ex); ZEND_API bool zend_is_graceful_exit(const zend_object *ex); +ZEND_API bool zend_is_promoted_error_exception(const zend_object *ex); #include "zend_globals.h" From e9bbb423aa8c9abff960d4a0c71be298000247f4 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 16:45:33 +0200 Subject: [PATCH 10/22] Fix delayed error handling in ZEND_RETURN --- Zend/zend_vm_def.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f83ee7d858ff..fa98fbc1db91 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4611,12 +4611,22 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|CV, ANY, SPEC(OBSERVER)) } } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + ZEND_OBSERVER_SAVE_OPLINE(); ZEND_OBSERVER_FCALL_END(execute_data, return_value); ZEND_OBSERVER_FREE_RETVAL(); - ZEND_VM_INTERRUPT_CHECK(); - ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); } From 8a15d25c63da0100494375a300b7ec2886737012 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 17:05:02 +0200 Subject: [PATCH 11/22] Chain exceptions thrown by handlers at the beginning of ZEND_HANDLE_EXCEPTION --- Zend/zend_vm_def.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fa98fbc1db91..f617581a2d78 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8234,7 +8234,14 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) const zend_op *throw_op = EG(opline_before_exception); if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_object *orig_exception = EG(exception); + EG(exception) = NULL; zend_handle_delayed_errors(); + if (EG(exception)) { + zend_exception_set_previous(EG(exception), orig_exception); + } else { + EG(exception) = orig_exception; + } } // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) From 6ecb5219737ecec82b5aa92152633f419ac17ee5 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 17:05:18 +0200 Subject: [PATCH 12/22] Free trampolines --- Zend/zend_vm_def.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f617581a2d78..d9305d84bfe1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8285,6 +8285,15 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0); } + /* Exception was thrown from the ZEND_DO_FCALL interrupt handler just + * before entering EG(call_trampoline_op). */ + if (UNEXPECTED(throw_op == &EG(call_trampoline_op))) { + ZEND_ASSERT(EX(func)->op_array.opcodes == &EG(call_trampoline_op)); + zend_string_release_ex(EX(func)->op_array.function_name, 0); + zend_free_trampoline(EX(func)); + ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0); + } + uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes; uint32_t current_try_catch_offset = -1; From de0e991490f10077f5ebba3639f3a02ed2c90034 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 17:05:41 +0200 Subject: [PATCH 13/22] FIXMEs --- Zend/zend_vm_def.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d9305d84bfe1..c5208a99ea6e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8244,8 +8244,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) } } - // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) - // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); From 1746fc4f53dc49d591425aa1e0408b77b9d420ec Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Thu, 7 May 2026 11:57:35 +0200 Subject: [PATCH 14/22] Fix tests There are 3 categories of failing tests here: - Many are throwing in a user error handlers, therefore relied on non-delayed behavior. Fixed these by installing the error handler with promote_to_exception: true. - Some are just printing the error message. Their output changes due to delay. These are fixed by updating the EXPECT section. - And finally, many are testing the adverse effects of mutations in error handlers. These are now irrelevant, but these are also fixed by updating the EXPECT section. --- Zend/tests/ArrayAccess/bug41209.phpt | 2 +- .../deprecated_constant_as_message_002.phpt | 2 +- .../deprecated_constant_as_message_002.phpt | 2 +- ...debug_backtrace_with_include_and_this.phpt | 4 +-- .../bitwise_not_precision_exception.phpt | 2 +- Zend/tests/bug60909_1.phpt | 2 +- Zend/tests/bug61767.phpt | 2 +- Zend/tests/bug63206.phpt | 6 ++++ Zend/tests/bug70662.phpt | 2 +- Zend/tests/bug70785.phpt | 2 +- Zend/tests/bug72101.phpt | 2 +- Zend/tests/bug74164.phpt | 7 ++-- Zend/tests/bug76534.phpt | 2 +- Zend/tests/bug78598.phpt | 32 ++++++++++++++--- Zend/tests/bug79784.phpt | 18 ++++++++-- Zend/tests/bug79793.phpt | 4 +-- Zend/tests/closures/closure_031.phpt | 2 +- Zend/tests/compound_assign_failure.phpt | 2 +- Zend/tests/concat/bug81705.phpt | 2 +- .../constants/gh18463-class-constant.phpt | 1 + .../debug_info/recursion_return_null.phpt | 4 +-- Zend/tests/delayed_error_001.phpt | 8 ++--- Zend/tests/dynamic_prop_deprecation_002.phpt | 1 - Zend/tests/exceptions/bug51394.phpt | 2 +- Zend/tests/exceptions/bug78239.phpt | 2 +- .../exceptions/exception_before_fatal.phpt | 2 +- Zend/tests/falsetoarray_002.phpt | 10 +++++- Zend/tests/falsetoarray_003.phpt | 2 +- .../error_static_call_trait_method_002.phpt | 4 +-- .../zend_call_function_deprecated_frame.phpt | 2 +- Zend/tests/get_class_basic.phpt | 2 +- Zend/tests/gh16799.phpt | 7 +--- Zend/tests/gh_21699.phpt | 13 +++---- Zend/tests/gh_21699_parent.phpt | 13 +++---- Zend/tests/gh_21699_static.phpt | 13 +++---- .../in-de-crement/incdec_bool_exception.phpt | 2 +- .../incdec_strings_exception.phpt | 2 +- Zend/tests/in-de-crement/incdec_undef.phpt | 4 +-- .../increment_diagnostic_change_type.phpt | 2 +- ...709_globals_unset_after_undef_warning.phpt | 8 ++--- ...94_globals_unset_after_string_warning.phpt | 8 ++--- .../unset_globals_in_error_handler.phpt | 32 ++++++++--------- ...nset_object_property_in_error_handler.phpt | 34 +++++++++---------- ...rty_converted_to_obj_in_error_handler.phpt | 5 ++- ...ation_to_exception_during_inheritance.phpt | 2 +- ...tion_during_inheritance_can_be_caught.phpt | 2 +- Zend/tests/offsets/array_offset_002.phpt | 4 ++- Zend/tests/offsets/null_offset_no_uaf.phpt | 4 +-- .../null_offset_unset_via_error_handler.phpt | 5 ++- Zend/tests/operator_unsupported_types.phpt | 4 +-- Zend/tests/oss_fuzz_54325.phpt | 3 +- Zend/tests/oss_fuzz_61712.phpt | 2 +- Zend/tests/oss_fuzz_61712b.phpt | 2 +- .../require_once_warning_to_exception.phpt | 2 +- Zend/tests/str_offset_006.phpt | 9 +++-- Zend/tests/str_offset_007.phpt | 5 ++- Zend/tests/str_offset_008.phpt | 2 +- .../temporary_cleaning_015.phpt | 2 +- .../temporary_cleaning_016.phpt | 2 +- .../non-rep-float-as-int-extra1.phpt | 2 +- .../non-rep-float-as-int-extra3.phpt | 2 +- .../non-rep-float-as-int-extra4.phpt | 2 +- .../settype_array_nan_with_error_handler.phpt | 5 +-- ...settype_array_nan_with_error_handler3.phpt | 5 +-- .../settype_bool_nan_with_error_handler.phpt | 2 +- .../settype_bool_nan_with_error_handler3.phpt | 4 +-- .../settype_int_nan_with_error_handler.phpt | 2 +- .../settype_int_nan_with_error_handler3.phpt | 4 +-- .../settype_null_nan_with_error_handler.phpt | 2 +- .../settype_null_nan_with_error_handler3.phpt | 4 +-- ...settype_object_nan_with_error_handler.phpt | 5 +-- ...ettype_object_nan_with_error_handler3.phpt | 5 +-- ...settype_string_nan_with_error_handler.phpt | 2 +- ...ettype_string_nan_with_error_handler3.phpt | 7 ++-- Zend/tests/undef_index_to_exception.phpt | 10 ++---- Zend/tests/undef_var_in_verify_return.phpt | 2 +- 76 files changed, 209 insertions(+), 186 deletions(-) diff --git a/Zend/tests/ArrayAccess/bug41209.phpt b/Zend/tests/ArrayAccess/bug41209.phpt index 1a7ee8aa515c..ebdb96a803d1 100644 --- a/Zend/tests/ArrayAccess/bug41209.phpt +++ b/Zend/tests/ArrayAccess/bug41209.phpt @@ -7,7 +7,7 @@ class env { public function __construct() { - set_error_handler(array(__CLASS__, 'errorHandler')); + set_error_handler(array(__CLASS__, 'errorHandler'), promote_to_exception: true); } public static function errorHandler($errno, $errstr, $errfile, $errline) diff --git a/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt b/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt index ab84d4724226..34432c733a2f 100644 --- a/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt +++ b/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}); +}, promote_to_exception: true); class Clazz { #[\Deprecated(self::TEST)] diff --git a/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt b/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt index f749293d8fac..3d0544717a75 100644 --- a/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt +++ b/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}); +}, promote_to_exception: true); #[\Deprecated(TEST)] const TEST = "from itself"; diff --git a/Zend/tests/backtrace/debug_backtrace_with_include_and_this.phpt b/Zend/tests/backtrace/debug_backtrace_with_include_and_this.phpt index 49796a9b9103..5a8474d14963 100644 --- a/Zend/tests/backtrace/debug_backtrace_with_include_and_this.phpt +++ b/Zend/tests/backtrace/debug_backtrace_with_include_and_this.phpt @@ -30,8 +30,8 @@ try { } ?> --EXPECTF-- -ERR#2: include(class://non.existent.Class): Failed to open stream: "CLWrapper::stream_open" call failed @ include -ERR#2: include(): Failed opening 'class://non.existent.Class' for inclusion (include_path='%s') @ include +ERR#2: include(class://non.existent.Class): Failed to open stream: "CLWrapper::stream_open" call failed @ __construct +ERR#2: include(): Failed opening 'class://non.existent.Class' for inclusion (include_path='.:') @ __construct Fatal error: Uncaught Exception: Failed loading class://non.existent.Class in %s Stack trace: diff --git a/Zend/tests/bitwise_not_precision_exception.phpt b/Zend/tests/bitwise_not_precision_exception.phpt index e28bf8f4e17b..7a4fb5fc891c 100644 --- a/Zend/tests/bitwise_not_precision_exception.phpt +++ b/Zend/tests/bitwise_not_precision_exception.phpt @@ -4,7 +4,7 @@ Promoting float precision warning to exception in bitwise_not diff --git a/Zend/tests/bug61767.phpt b/Zend/tests/bug61767.phpt index a12c5716e9ae..2f7d9c893e78 100644 --- a/Zend/tests/bug61767.phpt +++ b/Zend/tests/bug61767.phpt @@ -5,7 +5,7 @@ Bug #61767 (Shutdown functions not called in certain error situation) set_error_handler(function($code, $msg, $file = null, $line = null) { echo "Error handler called ($msg)\n"; throw new \ErrorException($msg, $code, 0, $file, $line); -}); +}, promote_to_exception: true); register_shutdown_function(function(){ echo "Shutting down\n"; diff --git a/Zend/tests/bug63206.phpt b/Zend/tests/bug63206.phpt index 6aba55eca1ba..8921a8685f9b 100644 --- a/Zend/tests/bug63206.phpt +++ b/Zend/tests/bug63206.phpt @@ -14,13 +14,19 @@ set_error_handler(function() { echo 'Internal handler' . PHP_EOL; }); + global $tmp; $triggerInternalNotice++; // warnings while handling the error should go into internal handler + fwrite($tmp, "."); // handle errors restore_error_handler(); }); +$tmp = tmpfile(); + $triggerNotice1++; +fwrite($tmp, "."); // handle errors $triggerNotice2++; +fwrite($tmp, "."); // handle errors ?> --EXPECT-- Second handler diff --git a/Zend/tests/bug70662.phpt b/Zend/tests/bug70662.phpt index ab540c9d16e5..2bda8141bab4 100644 --- a/Zend/tests/bug70662.phpt +++ b/Zend/tests/bug70662.phpt @@ -14,5 +14,5 @@ var_dump($a); --EXPECT-- array(1) { ["b"]=> - int(2) + int(1) } diff --git a/Zend/tests/bug70785.phpt b/Zend/tests/bug70785.phpt index 05b1b6afa0a0..c0ba6c3c62cc 100644 --- a/Zend/tests/bug70785.phpt +++ b/Zend/tests/bug70785.phpt @@ -5,7 +5,7 @@ Bug #70785 (Infinite loop due to exception during identical comparison) set_error_handler(function($no, $msg) { throw new Exception($msg); -}); +}, promote_to_exception: true); try { if ($a === null) { // ZEND_VM_SMART_BRANCH diff --git a/Zend/tests/bug72101.phpt b/Zend/tests/bug72101.phpt index 6362a7ccb303..9a7d084dc82e 100644 --- a/Zend/tests/bug72101.phpt +++ b/Zend/tests/bug72101.phpt @@ -63,7 +63,7 @@ class Mock_MethodCallbackByReference_7b180d26 extends MethodCallbackByReference set_error_handler(function() { // var_dump(func_get_args()); DoesNotExists::$nope = true; -}, E_ALL); +}, E_ALL, promote_to_exception: true); $foo = new Mock_MethodCallbackByReference_7b180d26(); $InvMocker = new PHPUnit_Framework_MockObject_InvocationMocker(); diff --git a/Zend/tests/bug74164.phpt b/Zend/tests/bug74164.phpt index ef56f10225fd..f0cb5924dff0 100644 --- a/Zend/tests/bug74164.phpt +++ b/Zend/tests/bug74164.phpt @@ -7,14 +7,13 @@ namespace Foo; set_error_handler(function ($type, $msg) { throw new \Exception($msg); -}); +}, promote_to_exception: true); call_user_func(function (array &$ref) {var_dump("xxx");}, 'not_an_array_variable'); ?> --EXPECTF-- Fatal error: Uncaught Exception: {closure:%s:%d}(): Argument #1 ($ref) must be passed by reference, value given in %s:%d Stack trace: -#0 [internal function]: {closure:%s:%d}(2, '%s', '%s', 9) -#1 %sbug74164.php(%d): call_user_func(%s) -#2 {main} +#0 %s(%d): {closure:%s:%d}(2, '{closure:%s', '%s', 9) +#1 {main} thrown in %sbug74164.php on line %d diff --git a/Zend/tests/bug76534.phpt b/Zend/tests/bug76534.phpt index c9c897110d6c..bccedb3c1ea2 100644 --- a/Zend/tests/bug76534.phpt +++ b/Zend/tests/bug76534.phpt @@ -4,7 +4,7 @@ Bug #76534 (PHP hangs on 'illegal string offset on string references with an err --EXPECT-- -int(0) -int(0) -int(0) -int(0) +array(1) { + [0]=> + string(3) "xyz" +} +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + string(3) "xyz" + } + } +} +array(1) { + ["foo"]=> + string(3) "xyz" +} +array(1) { + ["foo"]=> + array(1) { + ["bar"]=> + array(1) { + ["baz"]=> + string(3) "xyz" + } + } +} diff --git a/Zend/tests/bug79784.phpt b/Zend/tests/bug79784.phpt index be1cd729e969..83e64626bba7 100644 --- a/Zend/tests/bug79784.phpt +++ b/Zend/tests/bug79784.phpt @@ -15,6 +15,18 @@ var_dump($a); ?> --EXPECT-- -NULL -NULL -NULL +array(1) { + [""]=> + string(1) "x" +} +array(1) { + [""]=> + string(1) "x" +} +array(1) { + [""]=> + array(1) { + [""]=> + string(1) "x" + } +} diff --git a/Zend/tests/bug79793.phpt b/Zend/tests/bug79793.phpt index 5491a2669ed9..4af55ffd07cb 100644 --- a/Zend/tests/bug79793.phpt +++ b/Zend/tests/bug79793.phpt @@ -18,15 +18,15 @@ var_dump($ary); ?> --EXPECT-- -Undefined array key "foobar" array(1) { ["foobar"]=> int(1) } -Undefined array key "foobarbaz" +Undefined array key "foobar" array(2) { ["foobar"]=> int(1) ["foobarbaz"]=> int(1) } +Undefined array key "foobarbaz" diff --git a/Zend/tests/closures/closure_031.phpt b/Zend/tests/closures/closure_031.phpt index 19f3dc6e3212..7f9d3780e4ff 100644 --- a/Zend/tests/closures/closure_031.phpt +++ b/Zend/tests/closures/closure_031.phpt @@ -15,5 +15,5 @@ try { } ?> --EXPECT-- -Warning: Undefined property: Closure::$a NULL +Warning: Undefined property: Closure::$a diff --git a/Zend/tests/compound_assign_failure.phpt b/Zend/tests/compound_assign_failure.phpt index 0dc9af85f253..1d607a8d1b27 100644 --- a/Zend/tests/compound_assign_failure.phpt +++ b/Zend/tests/compound_assign_failure.phpt @@ -20,7 +20,7 @@ try { $a <<= -1; } catch (Error $e) { var_dump($a); } -set_error_handler(function($type, $msg) { throw new Exception($msg); }); +set_error_handler(function($type, $msg) { throw new Exception($msg); }, promote_to_exception: true); try { $a = []; diff --git a/Zend/tests/concat/bug81705.phpt b/Zend/tests/concat/bug81705.phpt index 1c00b1c77d4b..ba3d956f6bd2 100644 --- a/Zend/tests/concat/bug81705.phpt +++ b/Zend/tests/concat/bug81705.phpt @@ -15,5 +15,5 @@ $my_var .= $GLOBALS["arr"]; var_dump($my_var); ?> --EXPECT-- +string(6) "aArray" error -string(6) "aArray" \ No newline at end of file diff --git a/Zend/tests/constants/gh18463-class-constant.phpt b/Zend/tests/constants/gh18463-class-constant.phpt index 2af977205dc8..40b96e8f7231 100644 --- a/Zend/tests/constants/gh18463-class-constant.phpt +++ b/Zend/tests/constants/gh18463-class-constant.phpt @@ -15,6 +15,7 @@ set_error_handler('handler'); var_dump(_ZendTestClass::ZEND_TEST_DEPRECATED); ?> --EXPECTF-- +int(42) Constant _ZendTestClass::ZEND_TEST_DEPRECATED is deprecated in %s on line %d Fatal error: Cannot use "string" as a class name as it is reserved in %s(%d) : eval()'d code on line %d diff --git a/Zend/tests/debug_info/recursion_return_null.phpt b/Zend/tests/debug_info/recursion_return_null.phpt index b6ca9c824cb7..9fb525923d7f 100644 --- a/Zend/tests/debug_info/recursion_return_null.phpt +++ b/Zend/tests/debug_info/recursion_return_null.phpt @@ -22,10 +22,10 @@ var_dump($f); ?> --EXPECTF-- +object(Foo)#%d (0) { +} in handler Deprecated: Returning null from Foo::__debugInfo() is deprecated, return an empty array instead in %s on line %d object(Foo)#3 (0) { } -object(Foo)#2 (0) { -} diff --git a/Zend/tests/delayed_error_001.phpt b/Zend/tests/delayed_error_001.phpt index 7f3d5111b001..668eb0da68f1 100644 --- a/Zend/tests/delayed_error_001.phpt +++ b/Zend/tests/delayed_error_001.phpt @@ -22,22 +22,22 @@ Warning: Undefined array key 2 in %s on line %d Warning: Undefined array key 3 in %s on line %d -Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d - Warning: Undefined array key 3 in %s on line %d Warning: Undefined array key 4 in %s on line %d +Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d + Warning: Undefined array key 5 in %s on line %d Warning: Undefined array key 6 in %s on line %d -Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d - Warning: Undefined array key 7 in %s on line %d Warning: Undefined array key 8 in %s on line %d +Warning: Decrement on type null has no effect, this will change in the next major version of PHP in %s on line %d + Warning: Undefined array key 9 in %s on line %d Warning: Undefined array key 10 in %s on line %d diff --git a/Zend/tests/dynamic_prop_deprecation_002.phpt b/Zend/tests/dynamic_prop_deprecation_002.phpt index bd0d3aa5a7df..20182d2a8923 100644 --- a/Zend/tests/dynamic_prop_deprecation_002.phpt +++ b/Zend/tests/dynamic_prop_deprecation_002.phpt @@ -15,4 +15,3 @@ try { ?> --EXPECT-- Err: Creation of dynamic property class@anonymous::$y is deprecated -Exception: Cannot create dynamic property class@anonymous::$y diff --git a/Zend/tests/exceptions/bug51394.phpt b/Zend/tests/exceptions/bug51394.phpt index 629ebec622b2..dc12d7741bec 100644 --- a/Zend/tests/exceptions/bug51394.phpt +++ b/Zend/tests/exceptions/bug51394.phpt @@ -10,7 +10,7 @@ function eh() return false; } -set_error_handler("eh"); +set_error_handler("eh", promote_to_exception: true); $a = $empty($b); ?> --EXPECTF-- diff --git a/Zend/tests/exceptions/bug78239.phpt b/Zend/tests/exceptions/bug78239.phpt index afc7176800e1..1ad2ae81b9bc 100644 --- a/Zend/tests/exceptions/bug78239.phpt +++ b/Zend/tests/exceptions/bug78239.phpt @@ -9,7 +9,7 @@ function handleError($level, $message, $file = '', $line = 0, $context = []) throw new ErrorException($message, 0, $level, $file, $line); } -set_error_handler('handleError'); +set_error_handler('handleError', promote_to_exception: true); $r = new _ZendTestClass; (string)$r ?: ""; diff --git a/Zend/tests/exceptions/exception_before_fatal.phpt b/Zend/tests/exceptions/exception_before_fatal.phpt index edc63b2394cd..0c44c01c4c3f 100644 --- a/Zend/tests/exceptions/exception_before_fatal.phpt +++ b/Zend/tests/exceptions/exception_before_fatal.phpt @@ -6,7 +6,7 @@ function exception_error_handler($code, $msg) { throw new Exception($msg); } -set_error_handler("exception_error_handler"); +set_error_handler("exception_error_handler", promote_to_exception: true); try { $foo->a(); diff --git a/Zend/tests/falsetoarray_002.phpt b/Zend/tests/falsetoarray_002.phpt index c01b79954596..639cd51b3661 100644 --- a/Zend/tests/falsetoarray_002.phpt +++ b/Zend/tests/falsetoarray_002.phpt @@ -11,5 +11,13 @@ $a[0][$d]='b'; var_dump($a); ?> --EXPECT-- +array(1) { + [0]=> + array(1) { + [""]=> + string(1) "b" + } +} Err: Automatic conversion of false to array is deprecated -string(0) "" +Err: Undefined variable $d +Err: Using null as an array offset is deprecated, use an empty string instead diff --git a/Zend/tests/falsetoarray_003.phpt b/Zend/tests/falsetoarray_003.phpt index 117e443ef958..d62dff41941c 100644 --- a/Zend/tests/falsetoarray_003.phpt +++ b/Zend/tests/falsetoarray_003.phpt @@ -11,6 +11,6 @@ $a=[]; ?> DONE --EXPECTF-- +DONE Err: The float %f is not representable as an int, cast occurred Err: Undefined array key %i -DONE diff --git a/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt b/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt index 97831a8d65f0..6a82a4a3e2cf 100644 --- a/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt +++ b/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt @@ -5,7 +5,7 @@ FCC in initializer emits deprecation for static reference to trait method (Excep set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}); +}, promote_to_exception: true); trait Foo { public static function myMethod(string $foo) { @@ -16,7 +16,7 @@ trait Foo { function foo(Closure $c = Foo::myMethod(...)) { var_dump($c); - $c("abc"); + $c("abc"); } try { diff --git a/Zend/tests/functions/zend_call_function_deprecated_frame.phpt b/Zend/tests/functions/zend_call_function_deprecated_frame.phpt index 83d05144c0bd..be14589a0cb1 100644 --- a/Zend/tests/functions/zend_call_function_deprecated_frame.phpt +++ b/Zend/tests/functions/zend_call_function_deprecated_frame.phpt @@ -10,7 +10,7 @@ function foo(string $v) { set_error_handler(function ($number, $message) { throw new Exception($message); -}); +}, promote_to_exception: true); $a = array_map(foo(...), ['Hello', 'World']); var_dump($a); diff --git a/Zend/tests/get_class_basic.phpt b/Zend/tests/get_class_basic.phpt index f6dcbccb6916..ecf4c5e7babb 100644 --- a/Zend/tests/get_class_basic.phpt +++ b/Zend/tests/get_class_basic.phpt @@ -25,7 +25,7 @@ $f2 = new foo2; set_error_handler(function ($severity, $message, $file, $line) { throw new Exception($message); -}); +}, promote_to_exception: true); try { $f1->bar(); } catch (Exception $e) { diff --git a/Zend/tests/gh16799.phpt b/Zend/tests/gh16799.phpt index d31d1a5705c6..a346c7ff0c41 100644 --- a/Zend/tests/gh16799.phpt +++ b/Zend/tests/gh16799.phpt @@ -2,7 +2,7 @@ GH-16799 (Assertion failure at Zend/zend_vm_execute.h) --FILE-- test(); ?> --EXPECTF-- -Fatal error: Uncaught Exception in %s:%d +Fatal error: Uncaught Exception: Use of "self" in callables is deprecated in %s:%d Stack trace: #0 %s(%d): {closure:%s}(%d, 'Use of "self" i%s', '%s', %d) #1 %s(%d): bar->test() #2 {main} - -Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d -Stack trace: -#0 %s(%d): bar->test() -#1 {main} thrown in %s on line %d diff --git a/Zend/tests/gh_21699_parent.phpt b/Zend/tests/gh_21699_parent.phpt index 73cae41f3f5b..a85371e0312e 100644 --- a/Zend/tests/gh_21699_parent.phpt +++ b/Zend/tests/gh_21699_parent.phpt @@ -2,9 +2,9 @@ GH-21699 (parent::): no shutdown_executor trampoline assertion when error handler throws during parent:: callable resolution --FILE-- test(); ?> --EXPECTF-- -Fatal error: Uncaught Exception in %s:%d +Fatal error: Uncaught Exception: Use of "parent" in callables is deprecated in %s:%d Stack trace: #0 %s(%d): {closure:%s}(%d, 'Use of "parent"%s', '%s', %d) #1 %s(%d): Child->test() #2 {main} - -Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d -Stack trace: -#0 %s(%d): Child->test() -#1 {main} thrown in %s on line %d diff --git a/Zend/tests/gh_21699_static.phpt b/Zend/tests/gh_21699_static.phpt index 4d9604ebe77b..43aab3020c6f 100644 --- a/Zend/tests/gh_21699_static.phpt +++ b/Zend/tests/gh_21699_static.phpt @@ -2,9 +2,9 @@ GH-21699 (static::): no shutdown_executor trampoline assertion when error handler throws during static:: callable resolution --FILE-- test(); ?> --EXPECTF-- -Fatal error: Uncaught Exception in %s:%d +Fatal error: Uncaught Exception: Use of "static" in callables is deprecated in %s:%d Stack trace: #0 %s(%d): {closure:%s}(%d, 'Use of "static"%s', '%s', %d) #1 %s(%d): bar->test() #2 {main} - -Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d -Stack trace: -#0 %s(%d): bar->test() -#1 {main} thrown in %s on line %d diff --git a/Zend/tests/in-de-crement/incdec_bool_exception.phpt b/Zend/tests/in-de-crement/incdec_bool_exception.phpt index f819af1e2395..c9bc663dfbe3 100644 --- a/Zend/tests/in-de-crement/incdec_bool_exception.phpt +++ b/Zend/tests/in-de-crement/incdec_bool_exception.phpt @@ -5,7 +5,7 @@ Inc/dec on bool: warning converted to exception set_error_handler(function($severity, $m) { throw new Exception($m, $severity); -}); +}, promote_to_exception: true); $values = [false, true]; foreach ($values as $value) { diff --git a/Zend/tests/in-de-crement/incdec_strings_exception.phpt b/Zend/tests/in-de-crement/incdec_strings_exception.phpt index 5acbb1041222..bfe10b6716c8 100644 --- a/Zend/tests/in-de-crement/incdec_strings_exception.phpt +++ b/Zend/tests/in-de-crement/incdec_strings_exception.phpt @@ -11,7 +11,7 @@ set_error_handler(function($severity, $m) { $m = 'Warning: ' . $m; } throw new Exception($m, $severity); -}); +}, promote_to_exception: true); $values = [ '', diff --git a/Zend/tests/in-de-crement/incdec_undef.phpt b/Zend/tests/in-de-crement/incdec_undef.phpt index db560e31c99f..549c64fea87e 100644 --- a/Zend/tests/in-de-crement/incdec_undef.phpt +++ b/Zend/tests/in-de-crement/incdec_undef.phpt @@ -14,6 +14,7 @@ unset($x); var_dump(++$x); ?> --EXPECT-- +NULL Undefined variable $x Decrement on type null has no effect, this will change in the next major version of PHP NULL @@ -21,6 +22,5 @@ Undefined variable $x NULL Undefined variable $x Decrement on type null has no effect, this will change in the next major version of PHP -NULL -Undefined variable $x int(1) +Undefined variable $x diff --git a/Zend/tests/in-de-crement/increment_diagnostic_change_type.phpt b/Zend/tests/in-de-crement/increment_diagnostic_change_type.phpt index 11a0edac1917..b55c8c6b811e 100644 --- a/Zend/tests/in-de-crement/increment_diagnostic_change_type.phpt +++ b/Zend/tests/in-de-crement/increment_diagnostic_change_type.phpt @@ -31,8 +31,8 @@ var_dump($x); DONE --EXPECT-- string(1) "1" -string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" string(4) "foo!" string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" string(1) "!" +string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" DONE diff --git a/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt b/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt index e981800eeac1..1f1fc7228134 100644 --- a/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt +++ b/Zend/tests/in-de-crement/oss-fuzz-60709_globals_unset_after_undef_warning.phpt @@ -21,16 +21,16 @@ var_dump(++$x); ?> --EXPECT-- POST DEC +NULL Undefined variable $x Decrement on type null has no effect, this will change in the next major version of PHP -NULL POST INC -Undefined variable $x NULL +Undefined variable $x PRE DEC +NULL Undefined variable $x Decrement on type null has no effect, this will change in the next major version of PHP -NULL PRE INC -Undefined variable $x int(1) +Undefined variable $x diff --git a/Zend/tests/in-de-crement/oss-fuzz-62294_globals_unset_after_string_warning.phpt b/Zend/tests/in-de-crement/oss-fuzz-62294_globals_unset_after_string_warning.phpt index f52dff52e631..e39184e68154 100644 --- a/Zend/tests/in-de-crement/oss-fuzz-62294_globals_unset_after_string_warning.phpt +++ b/Zend/tests/in-de-crement/oss-fuzz-62294_globals_unset_after_string_warning.phpt @@ -25,14 +25,14 @@ var_dump(++$x); ?> --EXPECT-- POST DEC -Decrement on non-numeric string has no effect and is deprecated string(1) " " -PRE DEC Decrement on non-numeric string has no effect and is deprecated +PRE DEC string(1) " " +Decrement on non-numeric string has no effect and is deprecated POST INC -Increment on non-numeric string is deprecated, use str_increment() instead string(1) " " -PRE INC Increment on non-numeric string is deprecated, use str_increment() instead +PRE INC string(1) " " +Increment on non-numeric string is deprecated, use str_increment() instead diff --git a/Zend/tests/in-de-crement/unset_globals_in_error_handler.phpt b/Zend/tests/in-de-crement/unset_globals_in_error_handler.phpt index 31ffea22467b..88302517ce05 100644 --- a/Zend/tests/in-de-crement/unset_globals_in_error_handler.phpt +++ b/Zend/tests/in-de-crement/unset_globals_in_error_handler.phpt @@ -78,53 +78,53 @@ unset($x); --EXPECT-- NULL (only --) POST DEC -Decrement on type null has no effect, this will change in the next major version of PHP NULL -PRE DEC Decrement on type null has no effect, this will change in the next major version of PHP +PRE DEC NULL +Decrement on type null has no effect, this will change in the next major version of PHP Empty string POST INC -Increment on non-numeric string is deprecated, use str_increment() instead string(0) "" +Increment on non-numeric string is deprecated, use str_increment() instead POST DEC -Decrement on empty string is deprecated as non-numeric string(0) "" +Decrement on empty string is deprecated as non-numeric PRE INC -Increment on non-numeric string is deprecated, use str_increment() instead string(1) "1" +Increment on non-numeric string is deprecated, use str_increment() instead PRE DEC -Decrement on empty string is deprecated as non-numeric int(-1) +Decrement on empty string is deprecated as non-numeric Non fill ASCII (only ++) POST INC -Increment on non-numeric string is deprecated, use str_increment() instead string(4) " ad " -PRE INC Increment on non-numeric string is deprecated, use str_increment() instead +PRE INC string(4) " ad " +Increment on non-numeric string is deprecated, use str_increment() instead Bool POST INC -Increment on type bool has no effect, this will change in the next major version of PHP bool(false) +Increment on type bool has no effect, this will change in the next major version of PHP POST DEC -Decrement on type bool has no effect, this will change in the next major version of PHP bool(false) +Decrement on type bool has no effect, this will change in the next major version of PHP PRE INC -Increment on type bool has no effect, this will change in the next major version of PHP bool(false) +Increment on type bool has no effect, this will change in the next major version of PHP PRE DEC -Decrement on type bool has no effect, this will change in the next major version of PHP bool(false) +Decrement on type bool has no effect, this will change in the next major version of PHP POST INC -Increment on type bool has no effect, this will change in the next major version of PHP bool(true) +Increment on type bool has no effect, this will change in the next major version of PHP POST DEC -Decrement on type bool has no effect, this will change in the next major version of PHP bool(true) +Decrement on type bool has no effect, this will change in the next major version of PHP PRE INC -Increment on type bool has no effect, this will change in the next major version of PHP bool(true) +Increment on type bool has no effect, this will change in the next major version of PHP PRE DEC -Decrement on type bool has no effect, this will change in the next major version of PHP bool(true) +Decrement on type bool has no effect, this will change in the next major version of PHP diff --git a/Zend/tests/in-de-crement/unset_object_property_in_error_handler.phpt b/Zend/tests/in-de-crement/unset_object_property_in_error_handler.phpt index 4d2a4705588a..b00ba707cecf 100644 --- a/Zend/tests/in-de-crement/unset_object_property_in_error_handler.phpt +++ b/Zend/tests/in-de-crement/unset_object_property_in_error_handler.phpt @@ -87,57 +87,57 @@ var_dump(--$c->a); unset($c->a); ?> --EXPECT-- -string(87) "Decrement on type null has no effect, this will change in the next major version of PHP" NULL +string(87) "Decrement on type null has no effect, this will change in the next major version of PHP" NULL (only --) POST DEC -string(87) "Decrement on type null has no effect, this will change in the next major version of PHP" NULL -PRE DEC string(87) "Decrement on type null has no effect, this will change in the next major version of PHP" +PRE DEC NULL +string(87) "Decrement on type null has no effect, this will change in the next major version of PHP" Empty string POST INC -string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" string(0) "" +string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" POST DEC -string(54) "Decrement on empty string is deprecated as non-numeric" string(0) "" +string(54) "Decrement on empty string is deprecated as non-numeric" PRE INC -string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" string(1) "1" +string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" PRE DEC -string(54) "Decrement on empty string is deprecated as non-numeric" int(-1) +string(54) "Decrement on empty string is deprecated as non-numeric" Non fill ASCII (only ++) POST INC -string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" string(4) " ad " -PRE INC string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" +PRE INC string(4) " ad " +string(74) "Increment on non-numeric string is deprecated, use str_increment() instead" Bool POST INC -string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" bool(false) +string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" POST DEC -string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" bool(false) +string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" PRE INC -string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" bool(false) +string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" PRE DEC -string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" bool(false) +string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" POST INC -string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" bool(true) +string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" POST DEC -string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" bool(true) +string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" PRE INC -string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" bool(true) +string(87) "Increment on type bool has no effect, this will change in the next major version of PHP" PRE DEC -string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" bool(true) +string(87) "Decrement on type bool has no effect, this will change in the next major version of PHP" diff --git a/Zend/tests/in-de-crement/unset_property_converted_to_obj_in_error_handler.phpt b/Zend/tests/in-de-crement/unset_property_converted_to_obj_in_error_handler.phpt index d435c9fb4029..821b8abbade0 100644 --- a/Zend/tests/in-de-crement/unset_property_converted_to_obj_in_error_handler.phpt +++ b/Zend/tests/in-de-crement/unset_property_converted_to_obj_in_error_handler.phpt @@ -19,7 +19,6 @@ try { } var_dump($c->a); ?> ---EXPECT-- -Cannot increment stdClass -object(stdClass)#2 (0) { +--EXPECTF-- +object(stdClass)#%d (0) { } diff --git a/Zend/tests/inheritance/deprecation_to_exception_during_inheritance.phpt b/Zend/tests/inheritance/deprecation_to_exception_during_inheritance.phpt index 4bdf4b5d1b95..bdf8e0bc05e6 100644 --- a/Zend/tests/inheritance/deprecation_to_exception_during_inheritance.phpt +++ b/Zend/tests/inheritance/deprecation_to_exception_during_inheritance.phpt @@ -9,7 +9,7 @@ if (getenv('SKIP_PRELOAD')) die('skip Error handler not active during preloading set_error_handler(function($code, $message) { throw new Exception($message); -}); +}, promote_to_exception: true); $class = new class extends DateTime { public function getTimezone() {} diff --git a/Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt b/Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt index 7a59cca70bd6..df6dd76d838c 100644 --- a/Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt +++ b/Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt @@ -9,7 +9,7 @@ if (getenv('SKIP_PRELOAD')) die('skip Error handler not active during preloading set_error_handler(function($code, $message) { throw new Exception($message); -}); +}, promote_to_exception: true); try { class C extends DateTime { diff --git a/Zend/tests/offsets/array_offset_002.phpt b/Zend/tests/offsets/array_offset_002.phpt index 4d56258ef8b8..1511eb5dc73f 100644 --- a/Zend/tests/offsets/array_offset_002.phpt +++ b/Zend/tests/offsets/array_offset_002.phpt @@ -14,5 +14,7 @@ var_dump($y); ?> --EXPECT-- Err: The float 1.0E+20 is not representable as an int, cast occurred -array(0) { +array(1) { + [7766279631452241920]=> + int(1) } diff --git a/Zend/tests/offsets/null_offset_no_uaf.phpt b/Zend/tests/offsets/null_offset_no_uaf.phpt index 38a1b9868345..a7e5b5139e7a 100644 --- a/Zend/tests/offsets/null_offset_no_uaf.phpt +++ b/Zend/tests/offsets/null_offset_no_uaf.phpt @@ -12,6 +12,6 @@ $ary[null] = 1; echo "\nSuccess\n"; ?> ---EXPECTF-- -Using null as an array offset is deprecated, use an empty string instead +--EXPECT-- Success +Using null as an array offset is deprecated, use an empty string instead diff --git a/Zend/tests/offsets/null_offset_unset_via_error_handler.phpt b/Zend/tests/offsets/null_offset_unset_via_error_handler.phpt index cfaa2b3b20d9..f5c406c702bd 100644 --- a/Zend/tests/offsets/null_offset_unset_via_error_handler.phpt +++ b/Zend/tests/offsets/null_offset_unset_via_error_handler.phpt @@ -13,7 +13,6 @@ $b = [0, null => $a]; echo "\nSuccess\n"; ?> ---EXPECTF-- -string(72) "Using null as an array offset is deprecated, use an empty string instead" - +--EXPECT-- Success +string(72) "Using null as an array offset is deprecated, use an empty string instead" diff --git a/Zend/tests/operator_unsupported_types.phpt b/Zend/tests/operator_unsupported_types.phpt index 904ac402b372..1293bb033216 100644 --- a/Zend/tests/operator_unsupported_types.phpt +++ b/Zend/tests/operator_unsupported_types.phpt @@ -2104,7 +2104,7 @@ Cannot increment stdClass Cannot decrement stdClass Cannot increment resource Cannot decrement resource -Warning: Increment on non-numeric string is deprecated, use str_increment() instead No error for fop++ -Warning: Decrement on non-numeric string has no effect and is deprecated +Warning: Increment on non-numeric string is deprecated, use str_increment() instead No error for foo-- +Warning: Decrement on non-numeric string has no effect and is deprecated diff --git a/Zend/tests/oss_fuzz_54325.phpt b/Zend/tests/oss_fuzz_54325.phpt index d998acf1ffed..18b108681c2d 100644 --- a/Zend/tests/oss_fuzz_54325.phpt +++ b/Zend/tests/oss_fuzz_54325.phpt @@ -14,6 +14,5 @@ $$x++; var_dump($x); ?> --EXPECT-- +string(3) "oof" string(23) "Undefined variable $oof" -object(stdClass)#2 (0) { -} diff --git a/Zend/tests/oss_fuzz_61712.phpt b/Zend/tests/oss_fuzz_61712.phpt index 5e3aa9060fde..655fb56c1421 100644 --- a/Zend/tests/oss_fuzz_61712.phpt +++ b/Zend/tests/oss_fuzz_61712.phpt @@ -16,5 +16,5 @@ $c->a %= 10; var_dump($c->a); ?> --EXPECT-- -Undefined property: C::$a int(0) +Undefined property: C::$a diff --git a/Zend/tests/oss_fuzz_61712b.phpt b/Zend/tests/oss_fuzz_61712b.phpt index 8ee93b97b432..bfb3d2757366 100644 --- a/Zend/tests/oss_fuzz_61712b.phpt +++ b/Zend/tests/oss_fuzz_61712b.phpt @@ -16,5 +16,5 @@ $c->a %= 10; var_dump($c->a); ?> --EXPECT-- +int(0) Undefined property: C::$a -int(5) diff --git a/Zend/tests/require_once_warning_to_exception.phpt b/Zend/tests/require_once_warning_to_exception.phpt index d115ac68ccde..a4ff875b26bc 100644 --- a/Zend/tests/require_once_warning_to_exception.phpt +++ b/Zend/tests/require_once_warning_to_exception.phpt @@ -6,7 +6,7 @@ Promoting require_once warning to exception function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new Exception($errstr); } -set_error_handler("exception_error_handler"); +set_error_handler("exception_error_handler", promote_to_exception: true); try { $results = require_once 'does-not-exist.php'; diff --git a/Zend/tests/str_offset_006.phpt b/Zend/tests/str_offset_006.phpt index 3cdf91656bd2..c3938d7eeeed 100644 --- a/Zend/tests/str_offset_006.phpt +++ b/Zend/tests/str_offset_006.phpt @@ -9,8 +9,13 @@ set_error_handler(function($code, $msg) { $a[$y]=$a.=($y); var_dump($a); ?> ---EXPECT-- +--EXPECTF-- Err: Undefined variable $y +Err: Undefined variable $a Err: Undefined variable $y Err: String offset cast occurred -NULL + +Fatal error: Uncaught Error: Cannot assign an empty string to a string offset in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/str_offset_007.phpt b/Zend/tests/str_offset_007.phpt index 3998ac401f63..09d254cac3bf 100644 --- a/Zend/tests/str_offset_007.phpt +++ b/Zend/tests/str_offset_007.phpt @@ -11,6 +11,9 @@ $a[0][$d]='b'; var_dump($a); ?> --EXPECT-- +array(1) { + [0]=> + string(1) "b" +} Err: Undefined variable $d Err: String offset cast occurred -string(0) "" diff --git a/Zend/tests/str_offset_008.phpt b/Zend/tests/str_offset_008.phpt index e99e46e59e74..7a88136d5298 100644 --- a/Zend/tests/str_offset_008.phpt +++ b/Zend/tests/str_offset_008.phpt @@ -12,7 +12,7 @@ var_dump($a[0][$b]); var_dump($a); ?> --EXPECT-- +string(1) "x" Err: Undefined variable $b Err: String offset cast occurred -string(1) "x" int(8) diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt index f5e115faa970..2e0c4a481ba4 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt @@ -4,7 +4,7 @@ Attempt to free invalid structure (result of ROPE_INIT is not a zval) --EXPECTF-- -Implicit conversion from float-string "1.0E+4%d" to int loses precision int(%d) +Implicit conversion from float-string "1.0E+%d" to int loses precision diff --git a/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra3.phpt b/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra3.phpt index 0bfbeb01a2d0..5d44d8021910 100644 --- a/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra3.phpt +++ b/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra3.phpt @@ -14,5 +14,5 @@ var_dump(isset($ary[1.0E+42])); ?> --EXPECT-- +bool(true) The float 1.0E+42 is not representable as an int, cast occurred -bool(false) diff --git a/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra4.phpt b/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra4.phpt index 8134ce08d2ee..3f49fcea85ba 100644 --- a/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra4.phpt +++ b/Zend/tests/type_coercion/float_to_int/non-rep-float-as-int-extra4.phpt @@ -14,5 +14,5 @@ var_dump(\array_key_exists(1.0E+42, $ary)); ?> --EXPECT-- +bool(true) The float 1.0E+42 is not representable as an int, cast occurred -bool(false) diff --git a/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler.phpt index b07d975d7b2f..75332bfdd87f 100644 --- a/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler.phpt @@ -18,7 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) unexpected NAN value was coerced to array -array(1) { - [0]=> - NULL -} +NULL diff --git a/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler3.phpt index 1dae45a6ebec..6e38fdb0bb95 100644 --- a/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_array_nan_with_error_handler3.phpt @@ -18,7 +18,4 @@ var_dump($nan); --EXPECTF-- float(NAN) unexpected NAN value was coerced to array -array(1) { - [0]=> - string(8) "%s" -} +string(8) "%s" diff --git a/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler.phpt index 5f854c54ddbd..bbbdd8617102 100644 --- a/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler.phpt @@ -18,4 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) unexpected NAN value was coerced to bool -bool(true) +NULL diff --git a/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler3.phpt index ceb17da96408..efb784c52fc7 100644 --- a/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_bool_nan_with_error_handler3.phpt @@ -15,7 +15,7 @@ settype($nan, 'bool'); var_dump($nan); ?> ---EXPECT-- +--EXPECTF-- float(NAN) unexpected NAN value was coerced to bool -bool(true) +string(8) "%s" diff --git a/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler.phpt index 4f00f51331e0..ec6cd9ae556b 100644 --- a/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler.phpt @@ -18,4 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) The float NAN is not representable as an int, cast occurred -int(0) +NULL diff --git a/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler3.phpt index 4e715bdcca1b..441703cd43ee 100644 --- a/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_int_nan_with_error_handler3.phpt @@ -15,7 +15,7 @@ settype($nan, 'int'); var_dump($nan); ?> ---EXPECT-- +--EXPECTF-- float(NAN) The float NAN is not representable as an int, cast occurred -int(0) +string(8) "%s" diff --git a/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler.phpt index d89cb5544324..8b9ba2510480 100644 --- a/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler.phpt @@ -18,4 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) unexpected NAN value was coerced to null -NULL +int(45) diff --git a/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler3.phpt index 9a289b4151aa..a1485e38e73f 100644 --- a/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_null_nan_with_error_handler3.phpt @@ -15,7 +15,7 @@ settype($nan, 'null'); var_dump($nan); ?> ---EXPECT-- +--EXPECTF-- float(NAN) unexpected NAN value was coerced to null -NULL +string(8) "%s" diff --git a/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler.phpt index 19e36fa3d4fc..367ce8e10b53 100644 --- a/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler.phpt @@ -18,7 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) unexpected NAN value was coerced to object -object(stdClass)#2 (1) { - ["scalar"]=> - NULL -} +NULL diff --git a/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler3.phpt index b3789f2a9c57..f1a15a6bc443 100644 --- a/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_object_nan_with_error_handler3.phpt @@ -18,7 +18,4 @@ var_dump($nan); --EXPECTF-- float(NAN) unexpected NAN value was coerced to object -object(stdClass)#2 (1) { - ["scalar"]=> - string(8) "%s" -} +string(8) "%s" diff --git a/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler.phpt b/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler.phpt index d3a52996f4dd..4bc16192f0ba 100644 --- a/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler.phpt +++ b/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler.phpt @@ -18,4 +18,4 @@ var_dump($nan); --EXPECT-- float(NAN) unexpected NAN value was coerced to string -string(3) "NAN" +NULL diff --git a/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler3.phpt b/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler3.phpt index 0a8718780abd..d6436c12ab00 100644 --- a/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler3.phpt +++ b/Zend/tests/type_coercion/settype/settype_string_nan_with_error_handler3.phpt @@ -15,7 +15,10 @@ settype($nan, 'string'); var_dump($nan); ?> ---EXPECT-- +--EXPECTF-- float(NAN) unexpected NAN value was coerced to string -string(3) "NAN" +array(1) { + [0]=> + string(8) "%s" +} diff --git a/Zend/tests/undef_index_to_exception.phpt b/Zend/tests/undef_index_to_exception.phpt index bfa66bff8e4e..6ba762fed1f8 100644 --- a/Zend/tests/undef_index_to_exception.phpt +++ b/Zend/tests/undef_index_to_exception.phpt @@ -7,7 +7,7 @@ opcache.jit=0 set_error_handler(function($_, $msg) { throw new Exception($msg); -}); +}, promote_to_exception: true); $test = []; try { @@ -39,14 +39,10 @@ try { ?> --EXPECT-- Undefined array key 0 -array(1) { - [0]=> - string(3) "xyz" +array(0) { } Undefined array key "key" -array(1) { - [0]=> - string(3) "xyz" +array(0) { } Undefined global variable $test Undefined variable $test diff --git a/Zend/tests/undef_var_in_verify_return.phpt b/Zend/tests/undef_var_in_verify_return.phpt index f3966c6992d6..6c8e8f655740 100644 --- a/Zend/tests/undef_var_in_verify_return.phpt +++ b/Zend/tests/undef_var_in_verify_return.phpt @@ -5,7 +5,7 @@ Throwing undef var in verify return set_error_handler(function(int $severity, string $message, string $filename, int $lineNumber): void { throw new ErrorException($message, 0, $severity, $filename, $lineNumber); -}); +}, promote_to_exception: true); function test(): string { return $test; From 6ef688bdfecbc16fbdf55fcc235e737b0ddcc00a Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 19 May 2026 17:06:37 +0200 Subject: [PATCH 15/22] Generated file --- Zend/zend_vm_execute.h | 177 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 158 insertions(+), 19 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 32acef59b4ba..4c6b4b00e37c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3400,11 +3400,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT const zend_op *throw_op = EG(opline_before_exception); if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_object *orig_exception = EG(exception); + EG(exception) = NULL; zend_handle_delayed_errors(); + if (EG(exception)) { + zend_exception_set_previous(EG(exception), orig_exception); + } else { + EG(exception) = orig_exception; + } } - // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) - // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); @@ -3444,6 +3449,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); } + /* Exception was thrown from the ZEND_DO_FCALL interrupt handler just + * before entering EG(call_trampoline_op). */ + if (UNEXPECTED(throw_op == &EG(call_trampoline_op))) { + ZEND_ASSERT(EX(func)->op_array.opcodes == &EG(call_trampoline_op)); + zend_string_release_ex(EX(func)->op_array.function_name, 0); + zend_free_trampoline(EX(func)); + ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); + } + uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes; uint32_t current_try_catch_offset = -1; @@ -4854,12 +4868,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -4936,12 +4959,22 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_ } } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; - ZEND_VM_INTERRUPT_CHECK(); - ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -17232,12 +17265,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -39899,12 +39941,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -56130,11 +56181,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S const zend_op *throw_op = EG(opline_before_exception); if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_object *orig_exception = EG(exception); + EG(exception) = NULL; zend_handle_delayed_errors(); + if (EG(exception)) { + zend_exception_set_previous(EG(exception), orig_exception); + } else { + EG(exception) = orig_exception; + } } - // FIXME: EG(exception) may be overridden by a subsequent exception (Zend/tests/gh16799.phpt, Zend/tests/inheritance/deprecation_to_exception_during_inheritance_can_be_caught.phpt, Zend/tests/gh_21699.phpt, Zend/tests/gh_21699_parent.phpt) - // FIXME: zend_handle_delayed_errors may have overridden EX(exception) if (throw_op && EG(exception)->ce == zend_ce_promoted_error_exception) { zend_object *promoted = EG(exception); @@ -56174,6 +56230,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); } + /* Exception was thrown from the ZEND_DO_FCALL interrupt handler just + * before entering EG(call_trampoline_op). */ + if (UNEXPECTED(throw_op == &EG(call_trampoline_op))) { + ZEND_ASSERT(EX(func)->op_array.opcodes == &EG(call_trampoline_op)); + zend_string_release_ex(EX(func)->op_array.function_name, 0); + zend_free_trampoline(EX(func)); + ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_EX -1, 0)); + } + uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes; uint32_t current_try_catch_offset = -1; @@ -57584,12 +57649,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -57666,12 +57740,22 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETUR } } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; - ZEND_VM_INTERRUPT_CHECK(); - ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -69860,12 +69944,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -92427,12 +92520,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_DISPATCH_TO_LEAVE_HELPER(zend_leave_helper_SPEC_TAILCALL); } @@ -110899,12 +111001,21 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); goto zend_leave_helper_SPEC_LABEL; } @@ -110983,12 +111094,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; - ZEND_VM_INTERRUPT_CHECK(); - goto zend_leave_helper_SPEC_LABEL; } @@ -112618,12 +112739,21 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); goto zend_leave_helper_SPEC_LABEL; } @@ -114494,12 +114624,21 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_errors))) { + zend_handle_delayed_errors(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } - ZEND_VM_INTERRUPT_CHECK(); goto zend_leave_helper_SPEC_LABEL; } From e7b1f75c3a7c071be63d4a948c5fd24d8ec0099f Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 20 May 2026 15:25:13 +0200 Subject: [PATCH 16/22] Delay destructors --- .../functions/throwing_error_handler_001.phpt | 4 +- Zend/tests/bind_static_exception.phpt | 6 +- Zend/tests/bug38220.phpt | 1 + Zend/tests/bug49893.phpt | 5 +- Zend/tests/coalesce/assign_coalesce_002.phpt | 1 + Zend/tests/exception_in_nested_rope.phpt | 2 +- Zend/tests/exception_in_rope_end.phpt | 2 +- Zend/tests/exceptions/bug53511.phpt | 2 + Zend/tests/exceptions/exception_008.phpt | 7 +- Zend/tests/exceptions/exception_026.phpt | 8 +- Zend/tests/fe_fetch_dtor_exception.phpt | 1 + Zend/tests/fibers/gh9735-008.phpt | 1 + .../fibers/unfinished-fiber-with-finally.phpt | 1 + ...nfinished-fiber-with-nested-try-catch.phpt | 1 + ...inished-fiber-with-suspend-in-finally.phpt | 1 + ...nfinished-fiber-with-throw-in-finally.phpt | 1 + ...ve_parameter_value_keeps_object_alive.phpt | 1 + Zend/tests/gc_053.phpt | 1 + Zend/tests/generators/bug71601.phpt | 1 + .../generator_closure_collection.phpt | 2 + Zend/tests/generators/gh9750-001.phpt | 1 + Zend/tests/generators/gh9750-002.phpt | 1 + Zend/tests/generators/gh9750-003.phpt | 1 + Zend/tests/generators/gh9750-004.phpt | 1 + Zend/tests/generators/gh9750-005.phpt | 1 + Zend/tests/generators/gh9750-006.phpt | 1 + Zend/tests/generators/gh9750-007.phpt | 2 +- Zend/tests/generators/gh9750-008.phpt | 2 +- Zend/tests/generators/gh9750-009.phpt | 2 +- Zend/tests/generators/gh9750-010.phpt | 2 +- Zend/tests/generators/gh9750-011.phpt | 2 +- .../generators/yield_from_force_closed.phpt | 4 +- Zend/tests/gh10168/assign_prop_ref.phpt | 7 +- .../assign_prop_ref_with_prop_ref.phpt | 7 +- Zend/tests/gh10168/assign_ref.phpt | 6 +- .../gh10168/assign_ref_with_prop_ref.phpt | 5 +- .../tests/gh10168/assign_static_prop_ref.phpt | 5 +- .../assign_static_untyped_prop_ref.phpt | 5 +- .../gh10168/assign_untyped_prop_ref.phpt | 7 +- ...assign_untyped_prop_ref_with_prop_ref.phpt | 7 +- Zend/tests/gh17162.phpt | 6 +- Zend/tests/gh20183_001.phpt | 2 +- Zend/tests/gh20183_002.phpt | 2 +- Zend/tests/lazy_objects/gh15999_001.phpt | 6 - .../reset_as_lazy_calls_destructor.phpt | 1 + ...as_lazy_can_reset_initialized_proxies.phpt | 2 +- .../reset_as_lazy_may_skip_destructor.phpt | 1 + Zend/tests/magic_methods/bug29368_2.phpt | 1 + Zend/tests/magic_methods/bug29368_3.phpt | 3 +- Zend/tests/magic_methods/bug32596.phpt | 1 + .../offsets/null_offset_dep_promoted.phpt | 2 +- Zend/tests/stack_limit/stack_limit_001.phpt | 1 + Zend/tests/stack_limit/stack_limit_002.phpt | 1 + Zend/tests/stack_limit/stack_limit_003.phpt | 1 + Zend/tests/stack_limit/stack_limit_004.phpt | 1 + Zend/tests/stack_limit/stack_limit_006.phpt | 1 + .../static_variables_destructor.phpt | 1 + .../strlen_deprecation_to_exception.phpt | 2 +- .../temporary_cleaning_011.phpt | 1 + .../temporary_cleaning_013.phpt | 80 ++++++ .../temporary_cleaning_017.phpt | 2 +- Zend/tests/try/bug71604_2.phpt | 1 + Zend/tests/try/bug71604_3.phpt | 4 +- Zend/tests/try/catch_novar_2.phpt | 8 +- Zend/tests/try/try_finally_017.phpt | 5 +- Zend/tests/try/try_finally_020.phpt | 2 + Zend/tests/try/try_finally_022.phpt | 2 + Zend/tests/try/try_finally_023.phpt | 2 + .../type_casts/cast_to_void_destructor.phpt | 1 + Zend/tests/unset/unset_prop_recursion.phpt | 16 +- Zend/tests/weakrefs/gh13612.phpt | 2 +- Zend/tests/weakrefs/gh17442_1.phpt | 2 +- Zend/tests/weakrefs/weakmap_iteration.phpt | 20 +- Zend/tests/weakrefs/weakmap_weakness.phpt | 6 + Zend/tests/weakrefs/weakrefs_006.phpt | 29 +- Zend/zend.c | 5 +- Zend/zend.h | 1 + Zend/zend_compile.h | 1 + Zend/zend_execute.c | 112 ++++++-- Zend/zend_execute.h | 2 +- Zend/zend_execute_API.c | 2 +- Zend/zend_globals.h | 2 +- Zend/zend_objects_API.c | 10 + Zend/zend_opcode.c | 4 +- Zend/zend_vm_def.h | 87 ++++-- Zend/zend_vm_execute.h | 270 +++++++++++++----- 86 files changed, 618 insertions(+), 214 deletions(-) diff --git a/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt b/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt index af816aea6c4b..96edff64fd88 100644 --- a/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt +++ b/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}); +}, promote_to_exception: 1); #[\Deprecated("convert to exception")] function test() { @@ -76,7 +76,7 @@ class Destructor { } try { - new Destructor(); + (function () { new Destructor(); })(); } catch (ErrorException $e) { echo "Caught: ", $e->getMessage(), PHP_EOL; } diff --git a/Zend/tests/bind_static_exception.phpt b/Zend/tests/bind_static_exception.phpt index c374130aaecf..a0dc1ed6db3f 100644 --- a/Zend/tests/bind_static_exception.phpt +++ b/Zend/tests/bind_static_exception.phpt @@ -8,8 +8,10 @@ class Test { } } try { - $new = new Test; - static $new; + (function () { + $new = new Test; + static $new; + })(); } catch (Exception $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/bug38220.phpt b/Zend/tests/bug38220.phpt index 2700299a1026..542e20826ab9 100644 --- a/Zend/tests/bug38220.phpt +++ b/Zend/tests/bug38220.phpt @@ -26,6 +26,7 @@ class A { $drv = myserv::drv(); $drv->obj = $this; + (function (){})(); echo "before call $method\n"; print_r($this); diff --git a/Zend/tests/bug49893.phpt b/Zend/tests/bug49893.phpt index 0832b0b0ef4c..ff0b740a68bb 100644 --- a/Zend/tests/bug49893.phpt +++ b/Zend/tests/bug49893.phpt @@ -18,8 +18,11 @@ class B { throw new Exception("1"); } } -try { +function f() { $b = new B(); +} +try { + f(); } catch(Exception $e) { echo $e->getMessage() . "\n"; } diff --git a/Zend/tests/coalesce/assign_coalesce_002.phpt b/Zend/tests/coalesce/assign_coalesce_002.phpt index 0b2c5374bc7a..c6297fd623d1 100644 --- a/Zend/tests/coalesce/assign_coalesce_002.phpt +++ b/Zend/tests/coalesce/assign_coalesce_002.phpt @@ -46,6 +46,7 @@ class Dtor { $ary = new AA; try { $ary[new Dtor][id($foo)] ??= $bar; + (function () {})(); } catch (Exception $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/exception_in_nested_rope.phpt b/Zend/tests/exception_in_nested_rope.phpt index 7afd1412354a..8b2dd644726d 100644 --- a/Zend/tests/exception_in_nested_rope.phpt +++ b/Zend/tests/exception_in_nested_rope.phpt @@ -3,7 +3,7 @@ Exception during nested rope --FILE-- ===DONE=== @@ -27,10 +28,12 @@ unset($ar); Fatal error: Uncaught Exception: First in %sexception_008.php:%d Stack trace: #0 %sexception_008.php(%d): TestFirst->__destruct() -#1 {main} +#1 %s(%d): {closure:%s:%d}() +#2 {main} Next Exception: Second in %sexception_008.php:%d Stack trace: #0 %sexception_008.php(%d): TestSecond->__destruct() -#1 {main} +#1 %s(%d): {closure:%s:%d}() +#2 {main} thrown in %sexception_008.php on line %d diff --git a/Zend/tests/exceptions/exception_026.phpt b/Zend/tests/exceptions/exception_026.phpt index 0c47a449a4bf..2d5c57b3c428 100644 --- a/Zend/tests/exceptions/exception_026.phpt +++ b/Zend/tests/exceptions/exception_026.phpt @@ -6,9 +6,9 @@ class A { static $max=0; function __destruct() { if (self::$max--<0) - X; + X; $a = new A; - Y; + Y; } } new A; @@ -16,11 +16,11 @@ new A; --EXPECTF-- Fatal error: Uncaught Error: Undefined constant "Y" in %s:8 Stack trace: -#0 %s(11): A->__destruct() +#0 %s(%d): A->__destruct() #1 {main} Next Error: Undefined constant "X" in %s:6 Stack trace: -#0 %s(11): A->__destruct() +#0 %s(%d): A->__destruct() #1 {main} thrown in %s on line 6 diff --git a/Zend/tests/fe_fetch_dtor_exception.phpt b/Zend/tests/fe_fetch_dtor_exception.phpt index 99378e739a8b..e014d72ec224 100644 --- a/Zend/tests/fe_fetch_dtor_exception.phpt +++ b/Zend/tests/fe_fetch_dtor_exception.phpt @@ -19,4 +19,5 @@ try { ?> --EXPECT-- +int(1) foo diff --git a/Zend/tests/fibers/gh9735-008.phpt b/Zend/tests/fibers/gh9735-008.phpt index ec6f29fb79de..a2b39558d59c 100644 --- a/Zend/tests/fibers/gh9735-008.phpt +++ b/Zend/tests/fibers/gh9735-008.phpt @@ -30,6 +30,7 @@ gc_collect_cycles(); print "2\n"; $fiber = null; +(function () {})(); gc_collect_cycles(); print "3\n"; diff --git a/Zend/tests/fibers/unfinished-fiber-with-finally.phpt b/Zend/tests/fibers/unfinished-fiber-with-finally.phpt index 84ba74e646c6..8948a8a6a8d4 100644 --- a/Zend/tests/fibers/unfinished-fiber-with-finally.phpt +++ b/Zend/tests/fibers/unfinished-fiber-with-finally.phpt @@ -20,6 +20,7 @@ $fiber = new Fiber(function (): void { $fiber->start(); unset($fiber); // Destroy fiber object, executing finally block. +(function () {})(); echo "done\n"; diff --git a/Zend/tests/fibers/unfinished-fiber-with-nested-try-catch.phpt b/Zend/tests/fibers/unfinished-fiber-with-nested-try-catch.phpt index 664e4a052b8f..2d62ba0419ea 100644 --- a/Zend/tests/fibers/unfinished-fiber-with-nested-try-catch.phpt +++ b/Zend/tests/fibers/unfinished-fiber-with-nested-try-catch.phpt @@ -36,6 +36,7 @@ $fiber = new Fiber(function (): void { $fiber->start(); unset($fiber); // Destroy fiber object, executing finally block. +(function () {})(); echo "done\n"; diff --git a/Zend/tests/fibers/unfinished-fiber-with-suspend-in-finally.phpt b/Zend/tests/fibers/unfinished-fiber-with-suspend-in-finally.phpt index e38774df82bf..39a0b569cdb9 100644 --- a/Zend/tests/fibers/unfinished-fiber-with-suspend-in-finally.phpt +++ b/Zend/tests/fibers/unfinished-fiber-with-suspend-in-finally.phpt @@ -25,6 +25,7 @@ $fiber = new Fiber(function (): object { $fiber->start(); unset($fiber); // Destroy fiber object, executing finally block. +(function () {})(); echo "done\n"; diff --git a/Zend/tests/fibers/unfinished-fiber-with-throw-in-finally.phpt b/Zend/tests/fibers/unfinished-fiber-with-throw-in-finally.phpt index f1b17caeb5d7..202a079ba9fe 100644 --- a/Zend/tests/fibers/unfinished-fiber-with-throw-in-finally.phpt +++ b/Zend/tests/fibers/unfinished-fiber-with-throw-in-finally.phpt @@ -35,6 +35,7 @@ $fiber = new Fiber(function (): void { $fiber->start(); unset($fiber); // Destroy fiber object, executing finally block. +(function () {})(); echo "done\n"; diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt index e7b0de51b969..1d4532bbd4c9 100644 --- a/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt +++ b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt @@ -56,6 +56,7 @@ var_dump($v->getValue()->getId()); echo "Before unset", PHP_EOL; unset($v); +(function () {})(); echo "After unset", PHP_EOL; diff --git a/Zend/tests/gc_053.phpt b/Zend/tests/gc_053.phpt index 858be7cbebd5..c9035f2527bf 100644 --- a/Zend/tests/gc_053.phpt +++ b/Zend/tests/gc_053.phpt @@ -22,6 +22,7 @@ $o = new WithDestructor(); $weakO = \WeakReference::create($o); echo "---\n"; unset($o); +(function () {})(); echo "---\n"; var_dump($weakO->get() !== null); // verify if kept allocated G::$v = null; diff --git a/Zend/tests/generators/bug71601.phpt b/Zend/tests/generators/bug71601.phpt index c8e226329dfe..3d4a11be63cc 100644 --- a/Zend/tests/generators/bug71601.phpt +++ b/Zend/tests/generators/bug71601.phpt @@ -27,6 +27,7 @@ $generator = gen2(); var_dump($generator->current()); unset($generator); +(function() {})(); echo "Done\n"; diff --git a/Zend/tests/generators/generator_closure_collection.phpt b/Zend/tests/generators/generator_closure_collection.phpt index 7386adeb80c5..34c8552df60c 100644 --- a/Zend/tests/generators/generator_closure_collection.phpt +++ b/Zend/tests/generators/generator_closure_collection.phpt @@ -12,6 +12,7 @@ $genFactory = function() { $r = WeakReference::create($genFactory); $generator = $genFactory(); unset($genFactory); +(function () {})(); var_dump($r->get()); @@ -20,6 +21,7 @@ foreach ($generator as $value) var_dump($value); var_dump($r->get()); unset($generator); +(function () {})(); var_dump($r->get()); diff --git a/Zend/tests/generators/gh9750-001.phpt b/Zend/tests/generators/gh9750-001.phpt index 9a64912c2525..a958f36de53e 100644 --- a/Zend/tests/generators/gh9750-001.phpt +++ b/Zend/tests/generators/gh9750-001.phpt @@ -23,6 +23,7 @@ foreach ($gen as $value) { } $gen = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-002.phpt b/Zend/tests/generators/gh9750-002.phpt index f46bd381283e..4594782dcbe5 100644 --- a/Zend/tests/generators/gh9750-002.phpt +++ b/Zend/tests/generators/gh9750-002.phpt @@ -23,6 +23,7 @@ foreach ($gen as $value) { } $gen = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-003.phpt b/Zend/tests/generators/gh9750-003.phpt index f58abb243312..82e2cf90ee00 100644 --- a/Zend/tests/generators/gh9750-003.phpt +++ b/Zend/tests/generators/gh9750-003.phpt @@ -23,6 +23,7 @@ foreach ($gen as $value) { } $gen = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-004.phpt b/Zend/tests/generators/gh9750-004.phpt index ad26a9029e4b..555819d8eb48 100644 --- a/Zend/tests/generators/gh9750-004.phpt +++ b/Zend/tests/generators/gh9750-004.phpt @@ -23,6 +23,7 @@ foreach ($gen as $value) { } $gen = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-005.phpt b/Zend/tests/generators/gh9750-005.phpt index 1e849946917a..31942fc71270 100644 --- a/Zend/tests/generators/gh9750-005.phpt +++ b/Zend/tests/generators/gh9750-005.phpt @@ -24,6 +24,7 @@ foreach ($gen as $value) { $gen = null; $c = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-006.phpt b/Zend/tests/generators/gh9750-006.phpt index 6ba6c416d4af..23a37577a91b 100644 --- a/Zend/tests/generators/gh9750-006.phpt +++ b/Zend/tests/generators/gh9750-006.phpt @@ -23,6 +23,7 @@ foreach ($gen as $value) { } $gen = null; +(function () {})(); gc_collect_cycles(); diff --git a/Zend/tests/generators/gh9750-007.phpt b/Zend/tests/generators/gh9750-007.phpt index dbf91752ef5a..a62cfebab582 100644 --- a/Zend/tests/generators/gh9750-007.phpt +++ b/Zend/tests/generators/gh9750-007.phpt @@ -29,5 +29,5 @@ gc_collect_cycles(); ?> ==DONE== --EXPECT-- -C::__destruct ==DONE== +C::__destruct diff --git a/Zend/tests/generators/gh9750-008.phpt b/Zend/tests/generators/gh9750-008.phpt index a9cdacd19d15..63f05b3cb1fd 100644 --- a/Zend/tests/generators/gh9750-008.phpt +++ b/Zend/tests/generators/gh9750-008.phpt @@ -36,5 +36,5 @@ gc_collect_cycles(); ?> ==DONE== --EXPECT-- -C::__destruct ==DONE== +C::__destruct diff --git a/Zend/tests/generators/gh9750-009.phpt b/Zend/tests/generators/gh9750-009.phpt index 561ed081e379..82f5bcb6a870 100644 --- a/Zend/tests/generators/gh9750-009.phpt +++ b/Zend/tests/generators/gh9750-009.phpt @@ -33,5 +33,5 @@ gc_collect_cycles(); ?> ==DONE== --EXPECT-- -C::__destruct ==DONE== +C::__destruct diff --git a/Zend/tests/generators/gh9750-010.phpt b/Zend/tests/generators/gh9750-010.phpt index ab5b6bf6d48c..4e1d2039f06c 100644 --- a/Zend/tests/generators/gh9750-010.phpt +++ b/Zend/tests/generators/gh9750-010.phpt @@ -29,5 +29,5 @@ gc_collect_cycles(); ?> ==DONE== --EXPECT-- -C::__destruct ==DONE== +C::__destruct diff --git a/Zend/tests/generators/gh9750-011.phpt b/Zend/tests/generators/gh9750-011.phpt index ab4c00a17358..cec207b97ec0 100644 --- a/Zend/tests/generators/gh9750-011.phpt +++ b/Zend/tests/generators/gh9750-011.phpt @@ -34,5 +34,5 @@ gc_collect_cycles(); ?> ==DONE== --EXPECT-- -C::__destruct ==DONE== +C::__destruct diff --git a/Zend/tests/generators/yield_from_force_closed.phpt b/Zend/tests/generators/yield_from_force_closed.phpt index 87fcd2e8ed93..be110d8ee38d 100644 --- a/Zend/tests/generators/yield_from_force_closed.phpt +++ b/Zend/tests/generators/yield_from_force_closed.phpt @@ -22,6 +22,7 @@ try { $gen = gen2(); $gen->rewind(); unset($gen); + (function () {})(); } catch (Error $e) { echo $e, "\n"; } @@ -34,4 +35,5 @@ finally Error: Cannot use "yield from" in a force-closed generator in %s:%d Stack trace: #0 %s(%d): gen2() -#1 {main} +#1 %s(%d): {closure:%s:%d}() +#2 {main} diff --git a/Zend/tests/gh10168/assign_prop_ref.phpt b/Zend/tests/gh10168/assign_prop_ref.phpt index 606542fbd6c6..e8efb1d7051a 100644 --- a/Zend/tests/gh10168/assign_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_prop_ref.phpt @@ -26,7 +26,8 @@ test($box); test($box); ?> ---EXPECT-- -NULL -object(Test)#2 (0) { +--EXPECTF-- +object(Test)#%d (0) { +} +object(Test)#%d (0) { } diff --git a/Zend/tests/gh10168/assign_prop_ref_with_prop_ref.phpt b/Zend/tests/gh10168/assign_prop_ref_with_prop_ref.phpt index f887acbc1d06..62ff10c2b876 100644 --- a/Zend/tests/gh10168/assign_prop_ref_with_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_prop_ref_with_prop_ref.phpt @@ -29,7 +29,8 @@ test($box); test($box); ?> ---EXPECT-- -object(Test)#3 (0) { +--EXPECTF-- +object(Test)#%d (0) { +} +object(Test)#%d (0) { } -NULL diff --git a/Zend/tests/gh10168/assign_ref.phpt b/Zend/tests/gh10168/assign_ref.phpt index 9f3be5619d1a..b6348e21e4ca 100644 --- a/Zend/tests/gh10168/assign_ref.phpt +++ b/Zend/tests/gh10168/assign_ref.phpt @@ -12,7 +12,9 @@ class Test { $a = new Test; $tmp = new Test; var_dump($a = &$tmp); +(function () {})(); ?> ---EXPECT-- -NULL +--EXPECTF-- +object(Test)#%d (0) { +} diff --git a/Zend/tests/gh10168/assign_ref_with_prop_ref.phpt b/Zend/tests/gh10168/assign_ref_with_prop_ref.phpt index 42ce94b3f83e..2bade8437744 100644 --- a/Zend/tests/gh10168/assign_ref_with_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_ref_with_prop_ref.phpt @@ -16,5 +16,6 @@ $tmp = new Test; var_dump($a = &$tmp); ?> ---EXPECT-- -NULL +--EXPECTF-- +object(Test)#%d (0) { +} diff --git a/Zend/tests/gh10168/assign_static_prop_ref.phpt b/Zend/tests/gh10168/assign_static_prop_ref.phpt index 2e90be884ded..c05ac00ebdb8 100644 --- a/Zend/tests/gh10168/assign_static_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_static_prop_ref.phpt @@ -16,5 +16,6 @@ $tmp = new Test; var_dump(Test::$test = &$tmp); ?> ---EXPECT-- -NULL +--EXPECTF-- +object(Test)#%d (0) { +} diff --git a/Zend/tests/gh10168/assign_static_untyped_prop_ref.phpt b/Zend/tests/gh10168/assign_static_untyped_prop_ref.phpt index dfef8ead26f6..0592cf9de5aa 100644 --- a/Zend/tests/gh10168/assign_static_untyped_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_static_untyped_prop_ref.phpt @@ -16,5 +16,6 @@ $tmp = new Test; var_dump(Test::$test = &$tmp); ?> ---EXPECT-- -NULL +--EXPECTF-- +object(Test)#%d (0) { +} diff --git a/Zend/tests/gh10168/assign_untyped_prop_ref.phpt b/Zend/tests/gh10168/assign_untyped_prop_ref.phpt index a28395d43bbb..81e2f306b3e1 100644 --- a/Zend/tests/gh10168/assign_untyped_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_untyped_prop_ref.phpt @@ -26,7 +26,8 @@ test($box); test($box); ?> ---EXPECT-- -NULL -object(Test)#2 (0) { +--EXPECTF-- +object(Test)#%d (0) { +} +object(Test)#%d (0) { } diff --git a/Zend/tests/gh10168/assign_untyped_prop_ref_with_prop_ref.phpt b/Zend/tests/gh10168/assign_untyped_prop_ref_with_prop_ref.phpt index 79ff5fefc07e..de4d855b006f 100644 --- a/Zend/tests/gh10168/assign_untyped_prop_ref_with_prop_ref.phpt +++ b/Zend/tests/gh10168/assign_untyped_prop_ref_with_prop_ref.phpt @@ -29,7 +29,8 @@ test($box); test($box); ?> ---EXPECT-- -object(Test)#3 (0) { +--EXPECTF-- +object(Test)#%d (0) { +} +object(Test)#%d (0) { } -NULL diff --git a/Zend/tests/gh17162.phpt b/Zend/tests/gh17162.phpt index bdf6ddbb36ba..7dfc876eac44 100644 --- a/Zend/tests/gh17162.phpt +++ b/Zend/tests/gh17162.phpt @@ -13,9 +13,11 @@ $box = [new Test]; // but any function that uses zend_try_array_init() would work. try { getimagesize("dummy", $box); + (function () {})(); } catch (Error $e) { echo $e->getMessage(), "\n"; } ?> ---EXPECT-- -Attempt to assign property "value" on null +--EXPECTF-- +Warning: getimagesize(dummy): Failed to open stream: No such file or directory in %s on line %d +Attempt to assign property "value" on array diff --git a/Zend/tests/gh20183_001.phpt b/Zend/tests/gh20183_001.phpt index 9468bcaea567..12423ede91ac 100644 --- a/Zend/tests/gh20183_001.phpt +++ b/Zend/tests/gh20183_001.phpt @@ -16,7 +16,7 @@ B::$b = new A; ?> --EXPECTF-- -#0 %s(10): A->__destruct() +#0 %s(%d): A->__destruct() Fatal error: Uncaught Error: Class "B" not found in %s:10 Stack trace: diff --git a/Zend/tests/gh20183_002.phpt b/Zend/tests/gh20183_002.phpt index ec4d62d0960d..97e58da5e79c 100644 --- a/Zend/tests/gh20183_002.phpt +++ b/Zend/tests/gh20183_002.phpt @@ -26,7 +26,7 @@ B::$a = new A(); ?> --EXPECTF-- -#0 %s(20): gen() +#0 %s(%d): gen() Fatal error: Uncaught Error: Class "B" not found in %s:20 Stack trace: diff --git a/Zend/tests/lazy_objects/gh15999_001.phpt b/Zend/tests/lazy_objects/gh15999_001.phpt index 9fa70752d6b4..64dbf5cb5e15 100644 --- a/Zend/tests/lazy_objects/gh15999_001.phpt +++ b/Zend/tests/lazy_objects/gh15999_001.phpt @@ -5,9 +5,6 @@ Lazy Objects: GH-15999 001: Object is released during initialization class C { public $s; - public function __destruct() { - var_dump(__METHOD__); - } } print "# Ghost:\n"; @@ -96,13 +93,10 @@ try { ==DONE== --EXPECT-- # Ghost: -string(13) "C::__destruct" Error: Lazy object was released during initialization # Proxy: -string(13) "C::__destruct" Error: Lazy object was released during initialization # GC cycle: -string(13) "C::__destruct" # Nested error (ghost): Error: Lazy object was released during initialization TypeError: Lazy object initializer must return NULL or no value diff --git a/Zend/tests/lazy_objects/reset_as_lazy_calls_destructor.phpt b/Zend/tests/lazy_objects/reset_as_lazy_calls_destructor.phpt index 733da55a5cbc..315cfaeb4d4b 100644 --- a/Zend/tests/lazy_objects/reset_as_lazy_calls_destructor.phpt +++ b/Zend/tests/lazy_objects/reset_as_lazy_calls_destructor.phpt @@ -29,6 +29,7 @@ print "After makeLazy\n"; var_dump($obj->a); $obj = null; +(function () {})(); print "# Proxy:\n"; diff --git a/Zend/tests/lazy_objects/reset_as_lazy_can_reset_initialized_proxies.phpt b/Zend/tests/lazy_objects/reset_as_lazy_can_reset_initialized_proxies.phpt index 0ac167724c7d..36faddf32da5 100644 --- a/Zend/tests/lazy_objects/reset_as_lazy_can_reset_initialized_proxies.phpt +++ b/Zend/tests/lazy_objects/reset_as_lazy_can_reset_initialized_proxies.phpt @@ -50,6 +50,6 @@ object(A)#%d (2) { ["a"]=> int(1) ["proxy"]=> - object(A)#%d (0) { + lazy proxy object(A)#%d (0) { } } diff --git a/Zend/tests/lazy_objects/reset_as_lazy_may_skip_destructor.phpt b/Zend/tests/lazy_objects/reset_as_lazy_may_skip_destructor.phpt index d0c22a0333ff..11f5190f4f24 100644 --- a/Zend/tests/lazy_objects/reset_as_lazy_may_skip_destructor.phpt +++ b/Zend/tests/lazy_objects/reset_as_lazy_may_skip_destructor.phpt @@ -29,6 +29,7 @@ print "After makeLazy\n"; var_dump($obj->a); $obj = null; +(function () {})(); print "# Proxy:\n"; diff --git a/Zend/tests/magic_methods/bug29368_2.phpt b/Zend/tests/magic_methods/bug29368_2.phpt index e13d6da88467..8779dd08425e 100644 --- a/Zend/tests/magic_methods/bug29368_2.phpt +++ b/Zend/tests/magic_methods/bug29368_2.phpt @@ -11,6 +11,7 @@ class Bomb { } try { $x = new ReflectionMethod(new Bomb(), "foo"); + (function () {})(); } catch (Throwable $e) { echo $e->getMessage() . "\n"; } diff --git a/Zend/tests/magic_methods/bug29368_3.phpt b/Zend/tests/magic_methods/bug29368_3.phpt index 5193a91c89ae..cfc3697613ea 100644 --- a/Zend/tests/magic_methods/bug29368_3.phpt +++ b/Zend/tests/magic_methods/bug29368_3.phpt @@ -13,7 +13,7 @@ class Foo { class Bar { function __construct() { echo __METHOD__ . "\n"; - throw new Exception; + throw new Exception(__METHOD__); } function __destruct() { echo __METHOD__ . "\n"; @@ -23,6 +23,7 @@ class Bar { try { new Foo() + new Bar(); } catch(Exception $exc) { + (function () {})(); echo "Caught exception!\n"; } ?> diff --git a/Zend/tests/magic_methods/bug32596.phpt b/Zend/tests/magic_methods/bug32596.phpt index 40bd70382b30..c9ad48d5e143 100644 --- a/Zend/tests/magic_methods/bug32596.phpt +++ b/Zend/tests/magic_methods/bug32596.phpt @@ -18,6 +18,7 @@ class BUG { BUG::instance()->error; +(function() {})(); echo "this is still executed\n"; ?> --EXPECT-- diff --git a/Zend/tests/offsets/null_offset_dep_promoted.phpt b/Zend/tests/offsets/null_offset_dep_promoted.phpt index c26095d4f745..0f246498b579 100644 --- a/Zend/tests/offsets/null_offset_dep_promoted.phpt +++ b/Zend/tests/offsets/null_offset_dep_promoted.phpt @@ -5,7 +5,7 @@ Do not leak when promoting null offset deprecation set_error_handler(function ($errno, $errstr) { throw new Exception($errstr); -}); +}, promote_to_exception: true); try { $a = ['foo' => 'bar', null => new stdClass]; diff --git a/Zend/tests/stack_limit/stack_limit_001.phpt b/Zend/tests/stack_limit/stack_limit_001.phpt index 73cc3c08fe9d..1293c8057071 100644 --- a/Zend/tests/stack_limit/stack_limit_001.phpt +++ b/Zend/tests/stack_limit/stack_limit_001.phpt @@ -35,6 +35,7 @@ function replace() { try { new Test1; + (function() {})(); } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/stack_limit/stack_limit_002.phpt b/Zend/tests/stack_limit/stack_limit_002.phpt index 64a11e1b2638..b0bd4943ab6f 100644 --- a/Zend/tests/stack_limit/stack_limit_002.phpt +++ b/Zend/tests/stack_limit/stack_limit_002.phpt @@ -34,6 +34,7 @@ function replace() { $fiber = new Fiber(function (): void { try { new Test1; + (function() {})(); } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/stack_limit/stack_limit_003.phpt b/Zend/tests/stack_limit/stack_limit_003.phpt index 9956c761cb18..efb3ec721e0a 100644 --- a/Zend/tests/stack_limit/stack_limit_003.phpt +++ b/Zend/tests/stack_limit/stack_limit_003.phpt @@ -33,6 +33,7 @@ function replace() { try { new Test1; + (function() {})(); } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/stack_limit/stack_limit_004.phpt b/Zend/tests/stack_limit/stack_limit_004.phpt index af074c3f6c5a..5b69151727be 100644 --- a/Zend/tests/stack_limit/stack_limit_004.phpt +++ b/Zend/tests/stack_limit/stack_limit_004.phpt @@ -20,6 +20,7 @@ class Test1 { $callback = function (): int { try { new Test1; + (function() {})(); } catch (Error $e) { return count($e->getTrace()); } diff --git a/Zend/tests/stack_limit/stack_limit_006.phpt b/Zend/tests/stack_limit/stack_limit_006.phpt index d8d6251cf0c6..2739eba57181 100644 --- a/Zend/tests/stack_limit/stack_limit_006.phpt +++ b/Zend/tests/stack_limit/stack_limit_006.phpt @@ -292,6 +292,7 @@ function replace() { try { new Test1; + (function() {})(); } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/static_variables/static_variables_destructor.phpt b/Zend/tests/static_variables/static_variables_destructor.phpt index 9128c86e6b1b..97e161c33a21 100644 --- a/Zend/tests/static_variables/static_variables_destructor.phpt +++ b/Zend/tests/static_variables/static_variables_destructor.phpt @@ -19,6 +19,7 @@ function foo(bool $throw) { $a = new Foo(); } static $a = bar(); + (function() {})(); var_dump($a); } diff --git a/Zend/tests/strlen_deprecation_to_exception.phpt b/Zend/tests/strlen_deprecation_to_exception.phpt index 7b616f3b6432..bb0af9ad8700 100644 --- a/Zend/tests/strlen_deprecation_to_exception.phpt +++ b/Zend/tests/strlen_deprecation_to_exception.phpt @@ -5,7 +5,7 @@ strlen() null deprecation warning promoted to exception set_error_handler(function($_, $msg) { throw new Exception($msg); -}); +}, promote_to_exception: true); try { strlen(null); } catch (Exception $e) { diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt index 09e2148f72be..af1cf4dde382 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt @@ -12,6 +12,7 @@ $x = 0; $c = [[$x,$x]]; try { list($a, $b) = $c[0]; + (function() {})(); } catch (Exception $e) { echo "exception\n"; } diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt index 6e6dc58baad0..2991aefbed5d 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt @@ -8,12 +8,14 @@ try { function __toString() { return "a"; } function __destruct() { throw new Exception; } } . "foo"); + (function() {})(); } catch (Exception $e) { print "caught Exception 1\n"; } try { var_dump([0] + [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 2\n"; } try { @@ -21,6 +23,7 @@ try { var_dump($foo += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 3\n"; } try { @@ -28,6 +31,7 @@ try { var_dump($foo->foo += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 4\n"; } try { @@ -38,6 +42,7 @@ try { var_dump($foo->foo += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 5\n"; } try { @@ -48,6 +53,7 @@ try { var_dump($foo->foo += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 6\n"; } try { @@ -60,6 +66,7 @@ try { var_dump($foo[0] += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 7\n"; } try { @@ -73,6 +80,7 @@ try { var_dump($foo[0] += [new class { function __destruct() { throw new Exception; } }]); + (function() {})(); } catch (Exception $e) { print "caught Exception 8\n"; } try { @@ -81,6 +89,7 @@ try { function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } }; })()->foo++); + (function() {})(); } catch (Exception $e) { print "caught Exception 9\n"; } try { @@ -89,6 +98,7 @@ try { function __set($x, $y) {} function __destruct() { throw new Exception; } }; })()->foo++); + (function() {})(); } catch (Exception $e) { print "caught Exception 10\n"; } try { @@ -98,6 +108,7 @@ try { function &__get($x) { return $this->bar; } function __destruct() { throw new Exception; } }; })()->foo++); + (function() {})(); } catch (Exception $e) { print "caught Exception 11\n"; } try { @@ -105,6 +116,7 @@ try { function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } }; })()->foo); + (function() {})(); } catch (Exception $e) { print "caught Exception 12\n"; } try { @@ -113,6 +125,7 @@ try { function __set($x, $y) {} function __destruct() { throw new Exception; } }; })()->foo); + (function() {})(); } catch (Exception $e) { print "caught Exception 13\n"; } try { @@ -122,6 +135,7 @@ try { function &__get($x) { return $this->bar; } function __destruct() { throw new Exception; } }; })()->foo); + (function() {})(); } catch (Exception $e) { print "caught Exception 14\n"; } try { @@ -132,6 +146,7 @@ try { function offsetUnset($x): void {} function __destruct() { throw new Exception; } }; })()[0]++); + (function() {})(); } catch (Exception $e) { print "caught Exception 15\n"; } try { @@ -142,6 +157,7 @@ try { function offsetUnset($x): void {} function __destruct() { throw new Exception; } }; })()[0]); + (function() {})(); } catch (Exception $e) { print "caught Exception 16\n"; } try { @@ -150,6 +166,7 @@ try { function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } })->foo); + (function() {})(); } catch (Exception $e) { print "caught Exception 17\n"; } try { @@ -158,6 +175,7 @@ try { function __set($x, $y) {} function __destruct() { throw new Exception; } })->foo); + (function() {})(); } catch (Exception $e) { print "caught Exception 18\n"; } try { @@ -168,6 +186,7 @@ try { function offsetUnset($x): void {} function __destruct() { throw new Exception; } })[0]); + (function() {})(); } catch (Exception $e) { print "caught Exception 19\n"; } try { @@ -176,6 +195,7 @@ try { function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } })->foo->bar)); + (function() {})(); } catch (Exception $e) { print "caught Exception 20\n"; } try { @@ -184,6 +204,7 @@ try { function __set($x, $y) {} function __destruct() { throw new Exception; } })->foo->bar)); + (function() {})(); } catch (Exception $e) { print "caught Exception 21\n"; } try { @@ -194,6 +215,7 @@ try { function offsetUnset($x): void {} function __destruct() { throw new Exception; } })[0]->bar)); + (function() {})(); } catch (Exception $e) { print "caught Exception 22\n"; } try { @@ -201,6 +223,7 @@ try { function __destruct() { throw new Exception; } }; var_dump($foo = new stdClass); + (function() {})(); } catch (Exception $e) { print "caught Exception 23\n"; } try { @@ -208,6 +231,7 @@ try { function __destruct() { throw new Exception; } }]; var_dump($foo[0] = new stdClass); + (function() {})(); } catch (Exception $e) { print "caught Exception 24\n"; } try { @@ -215,6 +239,7 @@ try { function __destruct() { throw new Exception; } }]; var_dump($foo->foo = new stdClass); + (function() {})(); } catch (Exception $e) { print "caught Exception 25\n"; } try { @@ -223,6 +248,7 @@ try { function __set($x, $y) { throw new Exception; } }; var_dump($foo->foo = new stdClass); + (function() {})(); } catch (Exception $e) { print "caught Exception 26\n"; } try { @@ -233,6 +259,7 @@ try { function offsetUnset($x): void {} }; var_dump($foo[0] = new stdClass); + (function() {})(); } catch (Exception $e) { print "caught Exception 27\n"; } try { @@ -241,6 +268,7 @@ try { }; $bar = new stdClass; var_dump($foo = &$bar); + (function() {})(); } catch (Exception $e) { print "caught Exception 28\n"; } try { @@ -251,6 +279,7 @@ try { }; }; var_dump("{$f()}foo"); + (function() {})(); } catch (Exception $e) { print "caught Exception 29\n"; } try { @@ -261,6 +290,7 @@ try { }; }; var_dump("bar{$f()}foo"); + (function() {})(); } catch (Exception $e) { print "caught Exception 30\n"; } try { @@ -268,24 +298,51 @@ try { function __toString() { $x = "Z"; return ++$x; } function __destruct() { throw new Exception; } }); + (function() {})(); } catch (Exception $e) { print "caught Exception 31\n"; } try { var_dump(clone (new class { function __clone() { throw new Exception; } })); + (function() {})(); } catch (Exception $e) { print "caught Exception 32\n"; } ?> --EXPECTF-- +string(4) "afoo" caught Exception 1 +array(1) { + [0]=> + int(0) +} caught Exception 2 +array(1) { + [0]=> + int(0) +} caught Exception 3 +array(1) { + [0]=> + int(0) +} caught Exception 4 +array(1) { + [0]=> + int(0) +} caught Exception 5 Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d +array(1) { + [0]=> + int(0) +} caught Exception 6 +array(1) { + [0]=> + int(0) +} caught Exception 7 caught Exception 8 caught Exception 9 @@ -306,21 +363,44 @@ caught Exception 15 Notice: Indirect modification of overloaded element of ArrayAccess@anonymous has no effect in %s on line %d caught Exception 16 +object(stdClass)#%d (0) { +} caught Exception 17 +object(stdClass)#%d (0) { +} caught Exception 18 +array(1) { + [0]=> + object(stdClass)#%d (0) { + } +} caught Exception 19 +bool(false) caught Exception 20 +bool(false) caught Exception 21 +bool(false) caught Exception 22 +object(stdClass)#%d (0) { +} caught Exception 23 +object(stdClass)#%d (0) { +} caught Exception 24 +object(stdClass)#%d (0) { +} caught Exception 25 caught Exception 26 caught Exception 27 +object(stdClass)#%d (0) { +} caught Exception 28 +string(4) "afoo" caught Exception 29 +string(7) "barafoo" caught Exception 30 Deprecated: Increment on non-numeric string is deprecated, use str_increment() instead in %s on line %d +string(2) "AA" caught Exception 31 caught Exception 32 diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt index dbd0ef336fcf..d9c01ac5f1f7 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt @@ -18,6 +18,6 @@ foreach(new bar as $y) { --EXPECTF-- Fatal error: Uncaught Error: Undefined constant "y" in %stemporary_cleaning_017.php:5 Stack trace: -#0 %stemporary_cleaning_017.php(10): bar->__destruct() +#0 %s(%d): bar->__destruct() #1 {main} thrown in %stemporary_cleaning_017.php on line 5 diff --git a/Zend/tests/try/bug71604_2.phpt b/Zend/tests/try/bug71604_2.phpt index 8736cd8347b5..165ce5c931fd 100644 --- a/Zend/tests/try/bug71604_2.phpt +++ b/Zend/tests/try/bug71604_2.phpt @@ -20,6 +20,7 @@ function gen() { try { gen()->rewind(); + (function() {})(); } catch (Exception $e) { echo $e, "\n"; } diff --git a/Zend/tests/try/bug71604_3.phpt b/Zend/tests/try/bug71604_3.phpt index 058c9a70a89b..159bf03a964f 100644 --- a/Zend/tests/try/bug71604_3.phpt +++ b/Zend/tests/try/bug71604_3.phpt @@ -20,6 +20,7 @@ function gen() { try { gen()->rewind(); + (function() {})(); } catch (Exception $e) { echo $e, "\n"; } @@ -35,4 +36,5 @@ Stack trace: Next Exception: 2 in %s:%d Stack trace: #0 %s(%d): gen() -#1 {main} +#1 %s(%d): {closure:%s:%d}() +#2 {main} diff --git a/Zend/tests/try/catch_novar_2.phpt b/Zend/tests/try/catch_novar_2.phpt index fa1ada927534..beae5fb02c5c 100644 --- a/Zend/tests/try/catch_novar_2.phpt +++ b/Zend/tests/try/catch_novar_2.phpt @@ -10,17 +10,17 @@ class ThrowsOnDestruct extends Exception { } try { throw new ThrowsOnDestruct(); -} catch (Exception) { - echo "Unreachable catch\n"; +} catch (Exception $e) { + echo "Caugh ", $e::class, "\n"; } -echo "Unreachable fallthrough\n"; ?> --EXPECTF-- +Caugh ThrowsOnDestruct Throwing Fatal error: Uncaught RuntimeException: ThrowsOnDestruct::__destruct in %s:%d Stack trace: -#0 %s(%d): ThrowsOnDestruct->__destruct() +#0 [internal function]: ThrowsOnDestruct->__destruct() #1 {main} thrown in %s on line %d diff --git a/Zend/tests/try/try_finally_017.phpt b/Zend/tests/try/try_finally_017.phpt index b23840c611ab..b5f167e527da 100644 --- a/Zend/tests/try/try_finally_017.phpt +++ b/Zend/tests/try/try_finally_017.phpt @@ -1,5 +1,7 @@ --TEST-- Exception during break 2 with multiple try/catch +--XFAIL-- +FIXME / irrelevant? --FILE-- insert(new Node); $a->insert(new Node); ?> ---EXPECT-- -object(Node)#1 (2) { +--EXPECTF-- +object(Node)#%d (2) { ["parent"]=> NULL ["children"]=> array(2) { [0]=> - object(Node)#2 (2) { + object(Node)#%d (2) { ["parent"]=> *RECURSION* ["children"]=> @@ -34,7 +34,7 @@ object(Node)#1 (2) { } } [1]=> - object(Node)#3 (2) { + object(Node)#%d (2) { ["parent"]=> *RECURSION* ["children"]=> @@ -43,9 +43,9 @@ object(Node)#1 (2) { } } } -object(Node)#2 (2) { +object(Node)#%d (2) { ["parent"]=> - object(Node)#1 (2) { + object(Node)#%d (1) { ["parent"]=> NULL } @@ -53,9 +53,9 @@ object(Node)#2 (2) { array(0) { } } -object(Node)#3 (2) { +object(Node)#%d (2) { ["parent"]=> - object(Node)#1 (2) { + object(Node)#%d (1) { ["parent"]=> NULL } diff --git a/Zend/tests/weakrefs/gh13612.phpt b/Zend/tests/weakrefs/gh13612.phpt index 4ca4c9250876..327155a34246 100644 --- a/Zend/tests/weakrefs/gh13612.phpt +++ b/Zend/tests/weakrefs/gh13612.phpt @@ -35,5 +35,5 @@ echo "Done\n"; ?> --EXPECT-- -NULL Done +NULL diff --git a/Zend/tests/weakrefs/gh17442_1.phpt b/Zend/tests/weakrefs/gh17442_1.phpt index fc7f60174ed9..aa9bc8e7295c 100644 --- a/Zend/tests/weakrefs/gh17442_1.phpt +++ b/Zend/tests/weakrefs/gh17442_1.phpt @@ -17,6 +17,6 @@ headers_sent($obj,$generator); Fatal error: Uncaught Exception: Test in %s:%d Stack trace: #0 [internal function]: class@anonymous->__destruct() -#1 %s(%d): headers_sent(NULL, 0) +#1 %s(%d): headers_sent('', 0) #2 {main} thrown in %s on line %d diff --git a/Zend/tests/weakrefs/weakmap_iteration.phpt b/Zend/tests/weakrefs/weakmap_iteration.phpt index 1d1f6def8f48..0c9f62c24b4c 100644 --- a/Zend/tests/weakrefs/weakmap_iteration.phpt +++ b/Zend/tests/weakrefs/weakmap_iteration.phpt @@ -34,37 +34,37 @@ foreach ($map as $key => &$value) { var_dump($map); ?> ---EXPECT-- +--EXPECTF-- Empty loop: Simple loop: -object(stdClass)#2 (0) { +object(stdClass)#%d (0) { } int(0) -object(stdClass)#3 (0) { +object(stdClass)#%d (0) { } int(1) -object(stdClass)#4 (0) { +object(stdClass)#%d (0) { } int(2) Object removed during loop: -object(stdClass)#2 (0) { +object(stdClass)#%d (0) { } int(0) -object(stdClass)#3 (0) { +object(stdClass)#%d (0) { } int(1) -object(stdClass)#4 (0) { +object(stdClass)#%d (0) { } int(2) By reference iteration: -object(WeakMap)#1 (2) { +object(WeakMap)#%d (2) { [0]=> array(2) { ["key"]=> - object(stdClass)#2 (0) { + object(stdClass)#%d (0) { } ["value"]=> &int(1) @@ -72,7 +72,7 @@ object(WeakMap)#1 (2) { [1]=> array(2) { ["key"]=> - object(stdClass)#4 (0) { + object(stdClass)#%d (0) { } ["value"]=> &int(3) diff --git a/Zend/tests/weakrefs/weakmap_weakness.phpt b/Zend/tests/weakrefs/weakmap_weakness.phpt index d740d2b219c1..494201cc47a5 100644 --- a/Zend/tests/weakrefs/weakmap_weakness.phpt +++ b/Zend/tests/weakrefs/weakmap_weakness.phpt @@ -26,6 +26,7 @@ $map[$obj] = new class { echo "Before unset:\n"; unset($obj); +(function() {})(); echo "After unset:\n"; var_dump($map); @@ -33,6 +34,7 @@ echo "\nDestroying map with live object:\n"; $obj = new stdClass; $map[$obj] = 3; unset($map); +(function() {})(); var_dump($obj); echo "\nObject freed by GC:\n"; @@ -41,6 +43,7 @@ $obj = new stdClass; $obj->obj = $obj; $map[$obj] = 4; unset($obj); +(function() {})(); var_dump($map); gc_collect_cycles(); var_dump($map); @@ -50,14 +53,17 @@ $map = new WeakMap; $obj = new stdClass; $map[$obj] = $obj; unset($obj); +(function() {})(); var_dump($map); unset($map); +(function() {})(); echo "\nStoring map in itself:\n"; $map = new WeakMap; $map[$map] = $map; var_dump($map); unset($map); +(function() {})(); ?> --EXPECT-- diff --git a/Zend/tests/weakrefs/weakrefs_006.phpt b/Zend/tests/weakrefs/weakrefs_006.phpt index a15ab6b542d5..e2e54f3f216b 100644 --- a/Zend/tests/weakrefs/weakrefs_006.phpt +++ b/Zend/tests/weakrefs/weakrefs_006.phpt @@ -20,15 +20,16 @@ $o = new stdClass(); $w[$o] = new HasDtor(); $w[$o] = 123; +(function () {})(); var_dump($w); ?> ---EXPECT-- +--EXPECTF-- In destruct -object(WeakMap)#1 (11) { +object(WeakMap)#%d (11) { [0]=> array(2) { ["key"]=> - object(stdClass)#2 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(123) @@ -36,7 +37,7 @@ object(WeakMap)#1 (11) { [1]=> array(2) { ["key"]=> - object(stdClass)#4 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(0) @@ -44,7 +45,7 @@ object(WeakMap)#1 (11) { [2]=> array(2) { ["key"]=> - object(stdClass)#5 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(1) @@ -52,7 +53,7 @@ object(WeakMap)#1 (11) { [3]=> array(2) { ["key"]=> - object(stdClass)#6 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(2) @@ -60,7 +61,7 @@ object(WeakMap)#1 (11) { [4]=> array(2) { ["key"]=> - object(stdClass)#7 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(3) @@ -68,7 +69,7 @@ object(WeakMap)#1 (11) { [5]=> array(2) { ["key"]=> - object(stdClass)#8 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(4) @@ -76,7 +77,7 @@ object(WeakMap)#1 (11) { [6]=> array(2) { ["key"]=> - object(stdClass)#9 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(5) @@ -84,7 +85,7 @@ object(WeakMap)#1 (11) { [7]=> array(2) { ["key"]=> - object(stdClass)#10 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(6) @@ -92,7 +93,7 @@ object(WeakMap)#1 (11) { [8]=> array(2) { ["key"]=> - object(stdClass)#11 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(7) @@ -100,7 +101,7 @@ object(WeakMap)#1 (11) { [9]=> array(2) { ["key"]=> - object(stdClass)#12 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(8) @@ -108,9 +109,9 @@ object(WeakMap)#1 (11) { [10]=> array(2) { ["key"]=> - object(stdClass)#13 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(9) } -} \ No newline at end of file +} diff --git a/Zend/zend.c b/Zend/zend.c index e4b8cfb97f73..9998b4b3d9d8 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1527,7 +1527,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( info->filename = zend_string_copy(error_filename); info->message = zend_string_copy(message); info->error_reporting = EG(error_reporting); - zend_hash_next_index_insert_ptr(&EG(delayed_errors), info); + zend_hash_next_index_insert_ptr(&EG(delayed_effects), info); zend_atomic_bool_store_ex(&EG(vm_interrupt), true); return; } @@ -2006,6 +2006,9 @@ ZEND_API zend_result zend_execute_script(int type, zval *retval, zend_file_handl zend_result ret = SUCCESS; if (op_array) { zend_execute(op_array, retval); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); + } if (UNEXPECTED(EG(exception))) { if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { zend_user_exception_handler(); diff --git a/Zend/zend.h b/Zend/zend.h index d7125ca8e63e..39e418e845ff 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -133,6 +133,7 @@ typedef struct _zend_error_info { int error_reporting; } zend_error_info; + struct _zend_inheritance_cache_entry { zend_inheritance_cache_entry *next; zend_class_entry *ce; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0e31332c97f0..33c750ffe066 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -1015,6 +1015,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_hand uint32_t zend_get_class_fetch_type(const zend_string *name); ZEND_API uint8_t zend_get_call_op(const zend_op *init_op, const zend_function *fbc, bool result_used); ZEND_API bool zend_is_smart_branch(const zend_op *opline); +bool zend_keeps_op1_alive(const zend_op *opline); typedef bool (*zend_auto_global_callback)(zend_string *name); typedef struct _zend_auto_global { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9a4f1c10e766..9da3d16a5195 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2525,24 +2525,48 @@ ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht return zend_hash_index_add_new(ht, lval, &EG(uninitialized_zval)); } -ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void) +ZEND_API void ZEND_FASTCALL zend_handle_delayed_effects(void) { - /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */ +restart:; + /* Clear EG(delayed_effects), as more effects may be queued while we are handling these. */ + // FIXME: Avoid the overhead? HashTable ht; - memcpy(&ht, &EG(delayed_errors), sizeof(HashTable)); - zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); - - zend_error_info *info; - ZEND_HASH_FOREACH_PTR(&ht, info) { - int orig_error_reporting = EG(error_reporting); - EG(error_reporting) = info->error_reporting; - zend_error_zstr_at(info->type | E_NO_DELAY, info->filename, info->lineno, info->message); - EG(error_reporting) = orig_error_reporting; - zend_string_release(info->filename); - zend_string_release(info->message); - efree(info); + memcpy(&ht, &EG(delayed_effects), sizeof(HashTable)); + zend_hash_init(&EG(delayed_effects), 0, NULL, NULL, 0); + + zval *val; + ZEND_HASH_FOREACH_VAL(&ht, val) { + switch (Z_TYPE_P(val)) { + case IS_PTR: { + zend_error_info *info = Z_PTR_P(val); + int orig_error_reporting = EG(error_reporting); + EG(error_reporting) = info->error_reporting; + zend_error_zstr_at(info->type | E_NO_DELAY, info->filename, info->lineno, info->message); + EG(error_reporting) = orig_error_reporting; + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + break; + } + case IS_OBJECT: { + zend_object *obj = Z_OBJ_P(val); + ZEND_ASSERT(GC_REFCOUNT(obj) == 1); + obj->handlers->dtor_obj(obj); + GC_DELREF(obj); + if (GC_REFCOUNT(obj) == 0) { + zend_objects_store_del(obj); + } + break; + } + default: + ZEND_UNREACHABLE(); + } } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&ht); + + if (zend_hash_num_elements(&EG(delayed_effects)) > 0) { + goto restart; + } } ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset) @@ -4334,8 +4358,8 @@ ZEND_API void ZEND_FASTCALL zend_free_compiled_variables(zend_execute_data *exec ZEND_API ZEND_COLD void ZEND_FASTCALL zend_fcall_interrupt(zend_execute_data *call) { zend_atomic_bool_store_ex(&EG(vm_interrupt), false); - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); @@ -5815,6 +5839,15 @@ static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame(uint ZEND_VM_CONTINUE(); \ } while (0) +/* Same but indicate that we are jumping forward, so not interrupt check is performed */ +#define ZEND_VM_JMP_FWD_EX(new_op, check_exception) do { \ + if (check_exception && UNEXPECTED(EG(exception))) { \ + HANDLE_EXCEPTION(); \ + } \ + ZEND_VM_SET_OPCODE_NO_INTERRUPT(new_op); \ + ZEND_VM_CONTINUE(); \ + } while (0) + #define ZEND_VM_JMP(new_op) \ ZEND_VM_JMP_EX(new_op, 1) @@ -5936,6 +5969,53 @@ static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame(uint /* This callback disables optimization of "vm_stack_data" variable in VM */ ZEND_API void (ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data) = NULL; +void zend_interrupt_consume(EXECUTE_DATA_D OPLINE_DC) +{ + /* Interrupts are handled before executing opline, but exception handling + * assumes that a throwing opline was executed. + * Here we need to consume inputs and and initialize outputs. */ + + if (opline + && opline->result_type & (IS_TMP_VAR|IS_VAR) + && opline->opcode != ZEND_ADD_ARRAY_ELEMENT + && opline->opcode != ZEND_ADD_ARRAY_UNPACK + && opline->opcode != ZEND_ROPE_INIT + && opline->opcode != ZEND_ROPE_ADD) { + ZVAL_UNDEF(ZEND_CALL_VAR(EG(current_execute_data), opline->result.var)); + } + + if (opline->opcode == ZEND_SEPARATE) { + ZEND_ASSERT(opline->op1.var == opline->result.var); + return; + } + + if ((opline->op1_type & (IS_TMP_VAR|IS_VAR))) { + if (EXPECTED(!zend_keeps_op1_alive(opline))) { + zval_ptr_dtor(EX_VAR(opline->op1.var)); + } + } + + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR))) { + if (UNEXPECTED(opline->opcode == ZEND_FE_FETCH_R + || opline->opcode == ZEND_FE_FETCH_RW)) { + /* OP2 of FE_FETCH is actually a def, not a use. */ + } else { + zval_ptr_dtor(EX_VAR(opline->op2.var)); + } + } + + const zend_op_array *op_array = &EX(func)->op_array; + + if (opline >= op_array->opcodes + && opline - op_array->opcodes < op_array->last) { + const zend_op *next_op = opline + 1; + if (next_op->opcode == ZEND_OP_DATA + && next_op->op1_type & (IS_TMP_VAR|IS_VAR)) { + zval_ptr_dtor(EX_VAR(opline->op1.var)); + } + } +} + #include "zend_vm_execute.h" ZEND_API zend_result zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f058d4bc4554..013897170cb4 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -99,7 +99,7 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element( ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); -ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors(void); +ZEND_API void ZEND_FASTCALL zend_handle_delayed_effects(void); ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg); ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error( diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 7028c81eb6f7..f23ffb368a80 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -199,7 +199,7 @@ void init_executor(void) /* {{{ */ zend_max_execution_timer_init(); zend_fiber_init(); - zend_hash_init(&EG(delayed_errors), 0, NULL, NULL, 0); + zend_hash_init(&EG(delayed_effects), 0, NULL, NULL, 0); zend_weakrefs_init(); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index a66b227dfd34..088c541b8bf1 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -320,7 +320,7 @@ struct _zend_executor_globals { pid_t pid; struct sigaction oldact; #endif - HashTable delayed_errors; + HashTable delayed_effects; zend_strtod_state strtod_state; diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 537cad8a3644..2ef326d63335 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -174,6 +174,16 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ * if (object->handlers->dtor_obj != zend_objects_destroy_object || object->ce->destructor) { + /* If we are inside the VM, delay the destructor call to a safe point. */ + if (EG(current_execute_data)) { + /* Keep object alive until the delayed destructor runs. */ + GC_SET_REFCOUNT(object, 1); + zval zv; + ZVAL_OBJ(&zv, object); + zend_hash_next_index_insert(&EG(delayed_effects), &zv); + zend_atomic_bool_store_ex(&EG(vm_interrupt), true); + return; + } GC_SET_REFCOUNT(object, 1); object->handlers->dtor_obj(object); GC_DELREF(object); diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 0c6b22473514..82fd8e0cde5d 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -901,7 +901,7 @@ static bool is_fake_def(zend_op *opline) { || opline->opcode == ZEND_ADD_ARRAY_UNPACK; } -static bool keeps_op1_alive(zend_op *opline) { +bool zend_keeps_op1_alive(const zend_op *opline) { /* These opcodes don't consume their OP1 operand, * it is later freed by something else. */ if (opline->opcode == ZEND_CASE @@ -992,7 +992,7 @@ static void zend_calc_live_ranges( if ((opline->op1_type & (IS_TMP_VAR|IS_VAR))) { uint32_t var_num = EX_VAR_TO_NUM(opline->op1.var) - var_offset; if (EXPECTED(last_use[var_num] == (uint32_t) -1)) { - if (EXPECTED(!keeps_op1_alive(opline))) { + if (EXPECTED(!zend_keeps_op1_alive(opline))) { /* OP_DATA is really part of the previous opcode. */ last_use[var_num] = opnum - (opline->opcode == ZEND_OP_DATA); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c5208a99ea6e..4a0fffce2031 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2992,6 +2992,18 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) SAVE_OPLINE(); #endif + /* Handle delayed effects before leaving frame to preserve backtraces */ + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -3004,9 +3016,14 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + EG(vm_stack_top) = (zval*)execute_data; execute_data = EX(prev_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -3043,6 +3060,10 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) execute_data = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -3069,6 +3090,11 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -3095,6 +3121,11 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); @@ -3120,6 +3151,11 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) } } EG(current_execute_data) = EX(prev_execute_data); + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } } @@ -4612,9 +4648,10 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|CV, ANY, SPEC(OBSERVER)) } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -4622,6 +4659,7 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|CV, ANY, SPEC(OBSERVER)) /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif ZEND_OBSERVER_SAVE_OPLINE(); ZEND_OBSERVER_FCALL_END(execute_data, return_value); @@ -8165,7 +8203,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca if (op_num < try_catch->catch_op && ex) { /* Go to catch block */ cleanup_live_vars(execute_data, op_num, try_catch->catch_op); - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); } else if (op_num < try_catch->finally_op) { if (ex && zend_is_unwind_exit(ex)) { @@ -8179,7 +8217,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca Z_OBJ_P(fast_call) = EG(exception); EG(exception) = NULL; Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1; - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); } else if (op_num < try_catch->finally_end) { zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var); @@ -8233,14 +8271,18 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) { const zend_op *throw_op = EG(opline_before_exception); - if (zend_hash_num_elements(&EG(delayed_errors))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { zend_object *orig_exception = EG(exception); + EX(opline) = EG(opline_before_exception); EG(exception) = NULL; - zend_handle_delayed_errors(); + + zend_handle_delayed_effects(); + if (EG(exception)) { zend_exception_set_previous(EG(exception), orig_exception); } else { EG(exception) = orig_exception; + EX(opline) = EG(exception_op); } } @@ -10697,32 +10739,25 @@ ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY) #else SAVE_OPLINE(); #endif - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } + + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); } if (zend_interrupt_function) { zend_interrupt_function(execute_data); - if (EG(exception)) { - /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ - const zend_op *throw_op = EG(opline_before_exception); - - if (throw_op - && throw_op->result_type & (IS_TMP_VAR|IS_VAR) - && throw_op->opcode != ZEND_ADD_ARRAY_ELEMENT - && throw_op->opcode != ZEND_ADD_ARRAY_UNPACK - && throw_op->opcode != ZEND_ROPE_INIT - && throw_op->opcode != ZEND_ROPE_ADD) { - ZVAL_UNDEF(ZEND_CALL_VAR(EG(current_execute_data), throw_op->result.var)); - - } - } + } + if (UNEXPECTED(EG(exception))) { + // if (EG(opline_before_exception) == opline) { + zend_interrupt_consume(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + // } + LOAD_OPLINE(); + } + if (zend_interrupt_function) { ZEND_VM_ENTER(); + } else { + ZEND_VM_CONTINUE(); } - ZEND_VM_CONTINUE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4c6b4b00e37c..63f6c9a5e561 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1157,6 +1157,18 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV SAVE_OPLINE(); #endif + /* Handle delayed effects before leaving frame to preserve backtraces */ + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -1169,9 +1181,14 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + EG(vm_stack_top) = (zval*)execute_data; execute_data = EX(prev_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -1208,6 +1225,10 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV execute_data = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -1234,6 +1255,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -1260,6 +1286,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); @@ -1285,6 +1316,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV } } EG(current_execute_data) = EX(prev_execute_data); + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } } @@ -3331,7 +3367,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV_ if (op_num < try_catch->catch_op && ex) { /* Go to catch block */ cleanup_live_vars(execute_data, op_num, try_catch->catch_op); - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); } else if (op_num < try_catch->finally_op) { if (ex && zend_is_unwind_exit(ex)) { @@ -3345,7 +3381,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV_ Z_OBJ_P(fast_call) = EG(exception); EG(exception) = NULL; Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1; - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); } else if (op_num < try_catch->finally_end) { zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var); @@ -3399,14 +3435,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT { const zend_op *throw_op = EG(opline_before_exception); - if (zend_hash_num_elements(&EG(delayed_errors))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { zend_object *orig_exception = EG(exception); + EX(opline) = EG(opline_before_exception); EG(exception) = NULL; - zend_handle_delayed_errors(); + + zend_handle_delayed_effects(); + if (EG(exception)) { zend_exception_set_previous(EG(exception), orig_exception); } else { EG(exception) = orig_exception; + EX(opline) = EG(exception_op); } } @@ -4092,34 +4132,27 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV #else SAVE_OPLINE(); #endif - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } + + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); } if (zend_interrupt_function) { zend_interrupt_function(execute_data); - if (EG(exception)) { - /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ - const zend_op *throw_op = EG(opline_before_exception); - - if (throw_op - && throw_op->result_type & (IS_TMP_VAR|IS_VAR) - && throw_op->opcode != ZEND_ADD_ARRAY_ELEMENT - && throw_op->opcode != ZEND_ADD_ARRAY_UNPACK - && throw_op->opcode != ZEND_ROPE_INIT - && throw_op->opcode != ZEND_ROPE_ADD) { - ZVAL_UNDEF(ZEND_CALL_VAR(EG(current_execute_data), throw_op->result.var)); - - } - } + } + if (UNEXPECTED(EG(exception))) { + // if (EG(opline_before_exception) == opline) { + zend_interrupt_consume(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + // } + LOAD_OPLINE(); + } + if (zend_interrupt_function) { ZEND_VM_ENTER(); + } else { + ZEND_VM_CONTINUE(); } - ZEND_VM_CONTINUE(); } static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { @@ -4868,9 +4901,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -4878,6 +4912,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -4960,9 +4995,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_ } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -4970,6 +5006,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_ /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); @@ -17265,9 +17302,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -17275,6 +17313,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -39941,9 +39980,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -39951,6 +39991,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_R /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -54054,6 +54095,18 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend SAVE_OPLINE(); #endif + /* Handle delayed effects before leaving frame to preserve backtraces */ + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -54066,9 +54119,14 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + EG(vm_stack_top) = (zval*)execute_data; execute_data = EX(prev_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -54105,6 +54163,10 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend execute_data = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -54131,6 +54193,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -54157,6 +54224,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); @@ -54182,6 +54254,11 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend } } EG(current_execute_data) = EX(prev_execute_data); + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } } @@ -56180,14 +56257,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S { const zend_op *throw_op = EG(opline_before_exception); - if (zend_hash_num_elements(&EG(delayed_errors))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { zend_object *orig_exception = EG(exception); + EX(opline) = EG(opline_before_exception); EG(exception) = NULL; - zend_handle_delayed_errors(); + + zend_handle_delayed_effects(); + if (EG(exception)) { zend_exception_set_previous(EG(exception), orig_exception); } else { EG(exception) = orig_exception; + EX(opline) = EG(exception_op); } } @@ -56873,34 +56954,27 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend #else SAVE_OPLINE(); #endif - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } + + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); } if (zend_atomic_bool_load_ex(&EG(timed_out))) { zend_timeout(); } if (zend_interrupt_function) { zend_interrupt_function(execute_data); - if (EG(exception)) { - /* We have to UNDEF result, because ZEND_HANDLE_EXCEPTION is going to free it */ - const zend_op *throw_op = EG(opline_before_exception); - - if (throw_op - && throw_op->result_type & (IS_TMP_VAR|IS_VAR) - && throw_op->opcode != ZEND_ADD_ARRAY_ELEMENT - && throw_op->opcode != ZEND_ADD_ARRAY_UNPACK - && throw_op->opcode != ZEND_ROPE_INIT - && throw_op->opcode != ZEND_ROPE_ADD) { - ZVAL_UNDEF(ZEND_CALL_VAR(EG(current_execute_data), throw_op->result.var)); - - } - } + } + if (UNEXPECTED(EG(exception))) { + // if (EG(opline_before_exception) == opline) { + zend_interrupt_consume(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + // } + LOAD_OPLINE(); + } + if (zend_interrupt_function) { ZEND_VM_ENTER(); + } else { + ZEND_VM_CONTINUE(); } - ZEND_VM_CONTINUE(); } static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { @@ -57649,9 +57723,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -57659,6 +57734,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -57741,9 +57817,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETUR } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -57751,6 +57828,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETUR /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); @@ -69944,9 +70022,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -69954,6 +70033,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -92520,9 +92600,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -92530,6 +92611,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_RETURN /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -106479,7 +106561,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX z if (op_num < try_catch->catch_op && ex) { /* Go to catch block */ cleanup_live_vars(execute_data, op_num, try_catch->catch_op); - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0); } else if (op_num < try_catch->finally_op) { if (ex && zend_is_unwind_exit(ex)) { @@ -106493,7 +106575,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX z Z_OBJ_P(fast_call) = EG(exception); EG(exception) = NULL; Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1; - ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); + ZEND_VM_JMP_FWD_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0); } else if (op_num < try_catch->finally_end) { zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var); @@ -110488,6 +110570,18 @@ ZEND_API void execute_ex(zend_execute_data *ex) SAVE_OPLINE(); #endif + /* Handle delayed effects before leaving frame to preserve backtraces */ + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); + if (EG(exception)) { + ZEND_VM_ENTER(); + } + } + /* Do not reset EG(vm_interrupt) as it may have been set for other + * reasons */ + } + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -110500,9 +110594,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + EG(vm_stack_top) = (zval*)execute_data; execute_data = EX(prev_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -110539,6 +110638,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) execute_data = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -110565,6 +110668,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); } } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(execute_data); + } + if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -110591,6 +110699,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); @@ -110616,6 +110729,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } EG(current_execute_data) = EX(prev_execute_data); + + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } + ZEND_VM_RETURN(); } } @@ -111001,9 +111119,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -111011,6 +111130,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -111095,9 +111215,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -111105,6 +111226,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); @@ -112739,9 +112861,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -112749,6 +112872,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif @@ -114624,9 +114748,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } +#if 0 if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_errors))) { - zend_handle_delayed_errors(); + if (zend_hash_num_elements(&EG(delayed_effects))) { + zend_handle_delayed_effects(); if (EG(exception)) { ZEND_VM_ENTER(); } @@ -114634,6 +114759,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) /* Do not reset EG(vm_interrupt) as it may have been set for other * reasons */ } +#endif From f2e845ea3395996f2015c1bd4464ef50ef725367 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Mon, 25 May 2026 15:04:52 +0200 Subject: [PATCH 17/22] Only check delayed effects once in leave helper --- Zend/tests/bug29896.phpt | 3 +- .../ex_func_null_during_property_write.phpt | 9 ++--- Zend/tests/exceptions/bug45805.phpt | 9 +++-- Zend/tests/exceptions/bug76025.phpt | 2 +- Zend/tests/exceptions/exception_026.phpt | 9 ++--- Zend/tests/frameless_throwing_destructor.phpt | 2 +- Zend/tests/gc/bug64960.phpt | 9 +++-- .../yield_in_force_closed_finally_error.phpt | 2 +- Zend/tests/inheritance/gh15907.phpt | 2 +- Zend/tests/stack_limit/stack_limit_004.phpt | 2 +- .../temporary_cleaning_017.phpt | 2 +- Zend/zend_vm_def.h | 12 ------- Zend/zend_vm_execute.h | 36 ------------------- 13 files changed, 19 insertions(+), 80 deletions(-) diff --git a/Zend/tests/bug29896.phpt b/Zend/tests/bug29896.phpt index f0e25b716a4a..6ff90b7e5ad5 100644 --- a/Zend/tests/bug29896.phpt +++ b/Zend/tests/bug29896.phpt @@ -23,5 +23,4 @@ GenerateError2("Test2"); ?> --EXPECTF-- #0 %s(%d): userErrorHandler(2, 'Undefined varia...', '%s', %d) -#1 %s(%d): GenerateError1('Test1') -#2 %s(%d): GenerateError2('Test2') +#1 %s(%d): GenerateError2('Test2') diff --git a/Zend/tests/ex_func_null_during_property_write.phpt b/Zend/tests/ex_func_null_during_property_write.phpt index 6a253f760e0b..125ab4c411e8 100644 --- a/Zend/tests/ex_func_null_during_property_write.phpt +++ b/Zend/tests/ex_func_null_during_property_write.phpt @@ -13,13 +13,8 @@ class a { new a; ?> --EXPECTF-- -Fatal error: Uncaught Error: Object of class a could not be converted to string in %s:%d +Fatal error: Uncaught Exception in %s:%d Stack trace: -#0 %s(%d): a->__destruct() -#1 {main} - -Next Exception in %s:%d -Stack trace: -#0 %s(%d): a->__destruct() +#0 [internal function]: a->__destruct() #1 {main} thrown in %s on line %d diff --git a/Zend/tests/exceptions/bug45805.phpt b/Zend/tests/exceptions/bug45805.phpt index 86cea7037319..d210339d2aee 100644 --- a/Zend/tests/exceptions/bug45805.phpt +++ b/Zend/tests/exceptions/bug45805.phpt @@ -38,9 +38,8 @@ $o->bar(); --EXPECTF-- Fatal error: Uncaught RuntimeException in %sbug45805.php:%d Stack trace: -#0 %sbug45805.php(%d): PHPUnit_Util_ErrorHandler::handleError(8, 'Only variables ...', '%s', %d) -#1 [internal function]: B->foo() -#2 %sbug45805.php(%d): ReflectionMethod->invoke(Object(B)) -#3 %sbug45805.php(%d): B->bar() -#4 {main} +#0 [internal function]: PHPUnit_Util_ErrorHandler::handleError(8, 'Only variables ...', '/home/arnaud/de...', 19) +#1 %s(%d): ReflectionMethod->invoke(Object(B)) +#2 %s(%d): B->bar() +#3 {main} thrown in %sbug45805.php on line %d diff --git a/Zend/tests/exceptions/bug76025.phpt b/Zend/tests/exceptions/bug76025.phpt index ba89e8a3f9ec..af8308a5b0db 100644 --- a/Zend/tests/exceptions/bug76025.phpt +++ b/Zend/tests/exceptions/bug76025.phpt @@ -7,7 +7,7 @@ function handleError($errno, $errstr, $errfile, $errline) { $exception = new exception("blah"); throw $exception; } -set_error_handler('handleError', E_ALL); +set_error_handler('handleError', E_ALL, promote_to_exception: true); $c = $b[$a]; ?> --EXPECTF-- diff --git a/Zend/tests/exceptions/exception_026.phpt b/Zend/tests/exceptions/exception_026.phpt index 2d5c57b3c428..cbcc913153c2 100644 --- a/Zend/tests/exceptions/exception_026.phpt +++ b/Zend/tests/exceptions/exception_026.phpt @@ -14,13 +14,8 @@ class A { new A; ?> --EXPECTF-- -Fatal error: Uncaught Error: Undefined constant "Y" in %s:8 +Fatal error: Uncaught Error: Undefined constant "X" in %s:%d Stack trace: -#0 %s(%d): A->__destruct() -#1 {main} - -Next Error: Undefined constant "X" in %s:6 -Stack trace: -#0 %s(%d): A->__destruct() +#0 [internal function]: A->__destruct() #1 {main} thrown in %s on line 6 diff --git a/Zend/tests/frameless_throwing_destructor.phpt b/Zend/tests/frameless_throwing_destructor.phpt index ad555d860e66..28bb6caf4ba4 100644 --- a/Zend/tests/frameless_throwing_destructor.phpt +++ b/Zend/tests/frameless_throwing_destructor.phpt @@ -13,6 +13,6 @@ in_array(new Foo(), [new Bar()], true); --EXPECTF-- Fatal error: Uncaught Exception in %s:%d Stack trace: -#0 %s(%d): Bar->__destruct() +#0 [internal function]: Bar->__destruct() #1 {main} thrown in %s on line %d diff --git a/Zend/tests/gc/bug64960.phpt b/Zend/tests/gc/bug64960.phpt index d3dcc4da8c5e..7b79f45aef84 100644 --- a/Zend/tests/gc/bug64960.phpt +++ b/Zend/tests/gc/bug64960.phpt @@ -23,7 +23,7 @@ set_error_handler(function() $e->_trace = debug_backtrace(); throw $e; -}); +}, promote_to_exception: true); // trigger error handler $a['waa']; @@ -37,8 +37,7 @@ Deprecated: Creation of dynamic property Exception::$_trace is deprecated in %s Fatal error: Uncaught Exception in %sbug64960.php:19 Stack trace: -#0 [internal function]: {closure:%s:%d}(8, 'ob_end_clean():...', '%s', 9) -#1 %sbug64960.php(9): ob_end_clean() -#2 [internal function]: ExceptionHandler->__invoke(Object(Exception)) -#3 {main} +#0 %s(%d): {closure:%s:%d}(8, 'ob_end_clean():...', '/home/arnaud/de...', 9) +#1 [internal function]: ExceptionHandler->__invoke(Object(Exception)) +#2 {main} thrown in %sbug64960.php on line 19 diff --git a/Zend/tests/generators/errors/yield_in_force_closed_finally_error.phpt b/Zend/tests/generators/errors/yield_in_force_closed_finally_error.phpt index af84e50215ce..894a4d7e8e4b 100644 --- a/Zend/tests/generators/errors/yield_in_force_closed_finally_error.phpt +++ b/Zend/tests/generators/errors/yield_in_force_closed_finally_error.phpt @@ -28,6 +28,6 @@ before yield in finally Fatal error: Uncaught Error: Cannot yield from finally in a force-closed generator in %s:%d Stack trace: -#0 %s(%d): gen() +#0 [internal function]: gen() #1 {main} thrown in %s on line %d diff --git a/Zend/tests/inheritance/gh15907.phpt b/Zend/tests/inheritance/gh15907.phpt index c92e40a4ba30..ee0aec0a9800 100644 --- a/Zend/tests/inheritance/gh15907.phpt +++ b/Zend/tests/inheritance/gh15907.phpt @@ -5,7 +5,7 @@ GH-15907: Failed assertion when promoting inheritance error to exception set_error_handler(function($errno, $msg) { throw new Exception($msg); -}); +}, promote_to_exception: true); class C implements Serializable { public function serialize() {} diff --git a/Zend/tests/stack_limit/stack_limit_004.phpt b/Zend/tests/stack_limit/stack_limit_004.phpt index 5b69151727be..34872d8a868d 100644 --- a/Zend/tests/stack_limit/stack_limit_004.phpt +++ b/Zend/tests/stack_limit/stack_limit_004.phpt @@ -38,7 +38,7 @@ $fiber = new Fiber($callback); $fiber->start(); $depth2 = $fiber->getReturn(); -var_dump($depth1 > $depth2); +var_dump($depth1 >= $depth2); ?> --EXPECTF-- diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt index d9c01ac5f1f7..a24e4c6b68b9 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt @@ -18,6 +18,6 @@ foreach(new bar as $y) { --EXPECTF-- Fatal error: Uncaught Error: Undefined constant "y" in %stemporary_cleaning_017.php:5 Stack trace: -#0 %s(%d): bar->__destruct() +#0 [internal function]: bar->__destruct() #1 {main} thrown in %stemporary_cleaning_017.php on line 5 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4a0fffce2031..cf7d949867fb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2992,18 +2992,6 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) SAVE_OPLINE(); #endif - /* Handle delayed effects before leaving frame to preserve backtraces */ - if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_effects))) { - zend_handle_delayed_effects(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } - } - /* Do not reset EG(vm_interrupt) as it may have been set for other - * reasons */ - } - if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 63f6c9a5e561..d31da1588be9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1157,18 +1157,6 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV SAVE_OPLINE(); #endif - /* Handle delayed effects before leaving frame to preserve backtraces */ - if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_effects))) { - zend_handle_delayed_effects(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } - } - /* Do not reset EG(vm_interrupt) as it may have been set for other - * reasons */ - } - if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -54095,18 +54083,6 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend SAVE_OPLINE(); #endif - /* Handle delayed effects before leaving frame to preserve backtraces */ - if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_effects))) { - zend_handle_delayed_effects(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } - } - /* Do not reset EG(vm_interrupt) as it may have been set for other - * reasons */ - } - if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); @@ -110570,18 +110546,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) SAVE_OPLINE(); #endif - /* Handle delayed effects before leaving frame to preserve backtraces */ - if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { - if (zend_hash_num_elements(&EG(delayed_effects))) { - zend_handle_delayed_effects(); - if (EG(exception)) { - ZEND_VM_ENTER(); - } - } - /* Do not reset EG(vm_interrupt) as it may have been set for other - * reasons */ - } - if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) == 0)) { EG(current_execute_data) = EX(prev_execute_data); i_free_compiled_variables(execute_data); From 866c5003dc9b16de029596e820e56f8093eb43e7 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 26 May 2026 18:10:04 +0200 Subject: [PATCH 18/22] Reuse delayed effect buffer --- Zend/tests/bug79599.phpt | 2 +- ...tiple-destroyed-fibers-after-shutdown.phpt | 4 +- Zend/tests/frameless_undefined_var.phpt | 2 +- Zend/zend_execute.c | 55 +++++++++++++++---- Zend/zend_execute.h | 1 + Zend/zend_execute_API.c | 2 + Zend/zend_vm_execute.h | 4 +- main/main.c | 1 + 8 files changed, 54 insertions(+), 17 deletions(-) diff --git a/Zend/tests/bug79599.phpt b/Zend/tests/bug79599.phpt index 57e5332431f5..dd01e511cd08 100644 --- a/Zend/tests/bug79599.phpt +++ b/Zend/tests/bug79599.phpt @@ -4,7 +4,7 @@ Bug #79599 (coredump in set_error_handler) error_reporting; zend_error_zstr_at(info->type | E_NO_DELAY, info->filename, info->lineno, info->message); @@ -2561,12 +2565,41 @@ restart:; default: ZEND_UNREACHABLE(); } - } ZEND_HASH_FOREACH_END(); - zend_hash_destroy(&ht); + } - if (zend_hash_num_elements(&EG(delayed_effects)) > 0) { + if (EG(delayed_effects).nInternalPointer < EG(delayed_effects).nNumUsed) { + /* New items were added during iteration and were not handled */ + pos = EG(delayed_effects).nInternalPointer; + end = EG(delayed_effects).nNumUsed; + EG(delayed_effects).nInternalPointer = end; goto restart; } + + if (start == 0) { + zend_hash_clean(&EG(delayed_effects)); + } +} + +ZEND_API void ZEND_FASTCALL zend_discard_delayed_effects(void) +{ + zval *val; + ZEND_HASH_FOREACH_VAL(&EG(delayed_effects), val) { + switch (Z_TYPE_P(val)) { + case IS_PTR: { + zend_error_info *info = Z_PTR_P(val); + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + break; + } + case IS_OBJECT: + case IS_NULL: + break; + default: + ZEND_UNREACHABLE(); + } + } ZEND_HASH_FOREACH_END(); + zend_hash_clean(&EG(delayed_effects)); } ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 013897170cb4..a9ece7f21105 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -100,6 +100,7 @@ ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_p ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); ZEND_API void ZEND_FASTCALL zend_handle_delayed_effects(void); +ZEND_API void ZEND_FASTCALL zend_discard_delayed_effects(void); ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg); ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error( diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index f23ffb368a80..08daae807f5d 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -531,6 +531,8 @@ void shutdown_executor(void) /* {{{ */ EG(ht_iterators_used) = 0; zend_shutdown_fpu(); + + zend_discard_delayed_effects(); } /* }}} */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d31da1588be9..24108d9c0808 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -431,7 +431,7 @@ static zend_vm_opcode_handler_func_t zend_vm_get_opcode_handler_func(uint8_t opc #define HANDLE_EXCEPTION() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_CONTINUE() #define HANDLE_EXCEPTION_LEAVE() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_LEAVE() #if defined(ZEND_VM_FP_GLOBAL_REG) -# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE() +# define ZEND_VM_ENTER_EX() /*ZEND_VM_INTERRUPT_CHECK();*/ ZEND_VM_CONTINUE() # define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX() # define ZEND_VM_LEAVE() ZEND_VM_CONTINUE() #elif defined(ZEND_VM_IP_GLOBAL_REG) @@ -53671,7 +53671,7 @@ static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_F } while (0) # define ZEND_VM_DISPATCH_TO_LEAVE_HELPER(helper) opline = &call_leave_op; SAVE_OPLINE(); ZEND_VM_CONTINUE() # define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) -# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE() +# define ZEND_VM_ENTER_EX() /*ZEND_VM_INTERRUPT_CHECK();*/ ZEND_VM_CONTINUE() # define ZEND_VM_LEAVE() ZEND_VM_CONTINUE() static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS); diff --git a/main/main.c b/main/main.c index cc3f1cae2586..31e80ed83b59 100644 --- a/main/main.c +++ b/main/main.c @@ -2650,6 +2650,7 @@ PHPAPI bool php_execute_script_ex(zend_file_handle *primary_file, zval *retval) } } zend_catch { result = false; + zend_discard_delayed_effects(); } zend_end_try(); if (prepend_file_p) { From 139a09491b905946e2d2fefce9e34ebbd796eb87 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 27 May 2026 10:58:01 +0200 Subject: [PATCH 19/22] Rename promote_to_exception -> delay --- Zend/tests/ArrayAccess/bug41209.phpt | 2 +- .../class_constants/deprecated_constant_as_message_002.phpt | 2 +- .../constants/deprecated_constant_as_message_002.phpt | 2 +- .../deprecated/functions/throwing_error_handler_001.phpt | 2 +- Zend/tests/bitwise_not_precision_exception.phpt | 2 +- Zend/tests/bug60909_1.phpt | 2 +- Zend/tests/bug61767.phpt | 2 +- Zend/tests/bug70785.phpt | 2 +- Zend/tests/bug72101.phpt | 2 +- Zend/tests/bug74164.phpt | 2 +- Zend/tests/bug76534.phpt | 2 +- Zend/tests/bug79599.phpt | 2 +- Zend/tests/compound_assign_failure.phpt | 2 +- Zend/tests/delayed_error_004.phpt | 2 +- Zend/tests/exception_in_nested_rope.phpt | 2 +- Zend/tests/exception_in_rope_end.phpt | 2 +- Zend/tests/exceptions/bug51394.phpt | 2 +- Zend/tests/exceptions/bug76025.phpt | 2 +- Zend/tests/exceptions/bug78239.phpt | 2 +- Zend/tests/exceptions/exception_before_fatal.phpt | 2 +- .../constexpr/error_static_call_trait_method_002.phpt | 2 +- Zend/tests/frameless_undefined_var.phpt | 2 +- .../functions/zend_call_function_deprecated_frame.phpt | 2 +- Zend/tests/gc/bug64960.phpt | 2 +- Zend/tests/get_class_basic.phpt | 2 +- Zend/tests/gh16799.phpt | 2 +- Zend/tests/gh_21699.phpt | 2 +- Zend/tests/gh_21699_parent.phpt | 2 +- Zend/tests/gh_21699_static.phpt | 2 +- Zend/tests/in-de-crement/incdec_bool_exception.phpt | 2 +- Zend/tests/in-de-crement/incdec_strings_exception.phpt | 2 +- .../deprecation_to_exception_during_inheritance.phpt | 2 +- ...ation_to_exception_during_inheritance_can_be_caught.phpt | 2 +- Zend/tests/inheritance/gh15907.phpt | 2 +- Zend/tests/offsets/null_offset_dep_promoted.phpt | 2 +- Zend/tests/require_once_warning_to_exception.phpt | 2 +- Zend/tests/strlen_deprecation_to_exception.phpt | 2 +- Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt | 2 +- Zend/tests/temporary_cleaning/temporary_cleaning_016.phpt | 2 +- Zend/tests/undef_index_to_exception.phpt | 2 +- Zend/tests/undef_var_in_verify_return.phpt | 2 +- Zend/zend_builtin_functions.c | 6 +++--- Zend/zend_builtin_functions.stub.php | 2 +- Zend/zend_builtin_functions_arginfo.h | 4 ++-- Zend/zend_vm_execute.h | 4 ++-- 45 files changed, 49 insertions(+), 49 deletions(-) diff --git a/Zend/tests/ArrayAccess/bug41209.phpt b/Zend/tests/ArrayAccess/bug41209.phpt index ebdb96a803d1..956d77f6fed9 100644 --- a/Zend/tests/ArrayAccess/bug41209.phpt +++ b/Zend/tests/ArrayAccess/bug41209.phpt @@ -7,7 +7,7 @@ class env { public function __construct() { - set_error_handler(array(__CLASS__, 'errorHandler'), promote_to_exception: true); + set_error_handler(array(__CLASS__, 'errorHandler'), delay: false); } public static function errorHandler($errno, $errstr, $errfile, $errline) diff --git a/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt b/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt index 34432c733a2f..ba6103145957 100644 --- a/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt +++ b/Zend/tests/attributes/deprecated/class_constants/deprecated_constant_as_message_002.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}, promote_to_exception: true); +}, delay: false); class Clazz { #[\Deprecated(self::TEST)] diff --git a/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt b/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt index 3d0544717a75..5fb3359c138e 100644 --- a/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt +++ b/Zend/tests/attributes/deprecated/constants/deprecated_constant_as_message_002.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}, promote_to_exception: true); +}, delay: false); #[\Deprecated(TEST)] const TEST = "from itself"; diff --git a/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt b/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt index 96edff64fd88..3e151479e599 100644 --- a/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt +++ b/Zend/tests/attributes/deprecated/functions/throwing_error_handler_001.phpt @@ -5,7 +5,7 @@ set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}, promote_to_exception: 1); +}, delay: false); #[\Deprecated("convert to exception")] function test() { diff --git a/Zend/tests/bitwise_not_precision_exception.phpt b/Zend/tests/bitwise_not_precision_exception.phpt index 7a4fb5fc891c..044b3362d9c4 100644 --- a/Zend/tests/bitwise_not_precision_exception.phpt +++ b/Zend/tests/bitwise_not_precision_exception.phpt @@ -4,7 +4,7 @@ Promoting float precision warning to exception in bitwise_not diff --git a/Zend/tests/bug61767.phpt b/Zend/tests/bug61767.phpt index 2f7d9c893e78..6ee7c0a8843c 100644 --- a/Zend/tests/bug61767.phpt +++ b/Zend/tests/bug61767.phpt @@ -5,7 +5,7 @@ Bug #61767 (Shutdown functions not called in certain error situation) set_error_handler(function($code, $msg, $file = null, $line = null) { echo "Error handler called ($msg)\n"; throw new \ErrorException($msg, $code, 0, $file, $line); -}, promote_to_exception: true); +}, delay: false); register_shutdown_function(function(){ echo "Shutting down\n"; diff --git a/Zend/tests/bug70785.phpt b/Zend/tests/bug70785.phpt index c0ba6c3c62cc..363cea1deb63 100644 --- a/Zend/tests/bug70785.phpt +++ b/Zend/tests/bug70785.phpt @@ -5,7 +5,7 @@ Bug #70785 (Infinite loop due to exception during identical comparison) set_error_handler(function($no, $msg) { throw new Exception($msg); -}, promote_to_exception: true); +}, delay: false); try { if ($a === null) { // ZEND_VM_SMART_BRANCH diff --git a/Zend/tests/bug72101.phpt b/Zend/tests/bug72101.phpt index 9a7d084dc82e..51c67071519e 100644 --- a/Zend/tests/bug72101.phpt +++ b/Zend/tests/bug72101.phpt @@ -63,7 +63,7 @@ class Mock_MethodCallbackByReference_7b180d26 extends MethodCallbackByReference set_error_handler(function() { // var_dump(func_get_args()); DoesNotExists::$nope = true; -}, E_ALL, promote_to_exception: true); +}, E_ALL, delay: false); $foo = new Mock_MethodCallbackByReference_7b180d26(); $InvMocker = new PHPUnit_Framework_MockObject_InvocationMocker(); diff --git a/Zend/tests/bug74164.phpt b/Zend/tests/bug74164.phpt index f0cb5924dff0..e4de55253161 100644 --- a/Zend/tests/bug74164.phpt +++ b/Zend/tests/bug74164.phpt @@ -7,7 +7,7 @@ namespace Foo; set_error_handler(function ($type, $msg) { throw new \Exception($msg); -}, promote_to_exception: true); +}, delay: false); call_user_func(function (array &$ref) {var_dump("xxx");}, 'not_an_array_variable'); ?> diff --git a/Zend/tests/bug76534.phpt b/Zend/tests/bug76534.phpt index bccedb3c1ea2..d39714b7a62d 100644 --- a/Zend/tests/bug76534.phpt +++ b/Zend/tests/bug76534.phpt @@ -4,7 +4,7 @@ Bug #76534 (PHP hangs on 'illegal string offset on string references with an err --EXPECTF-- diff --git a/Zend/tests/exceptions/bug76025.phpt b/Zend/tests/exceptions/bug76025.phpt index af8308a5b0db..1f52653252c3 100644 --- a/Zend/tests/exceptions/bug76025.phpt +++ b/Zend/tests/exceptions/bug76025.phpt @@ -7,7 +7,7 @@ function handleError($errno, $errstr, $errfile, $errline) { $exception = new exception("blah"); throw $exception; } -set_error_handler('handleError', E_ALL, promote_to_exception: true); +set_error_handler('handleError', E_ALL, delay: false); $c = $b[$a]; ?> --EXPECTF-- diff --git a/Zend/tests/exceptions/bug78239.phpt b/Zend/tests/exceptions/bug78239.phpt index 1ad2ae81b9bc..24f70807fb78 100644 --- a/Zend/tests/exceptions/bug78239.phpt +++ b/Zend/tests/exceptions/bug78239.phpt @@ -9,7 +9,7 @@ function handleError($level, $message, $file = '', $line = 0, $context = []) throw new ErrorException($message, 0, $level, $file, $line); } -set_error_handler('handleError', promote_to_exception: true); +set_error_handler('handleError', delay: false); $r = new _ZendTestClass; (string)$r ?: ""; diff --git a/Zend/tests/exceptions/exception_before_fatal.phpt b/Zend/tests/exceptions/exception_before_fatal.phpt index 0c44c01c4c3f..7dc71bbdce87 100644 --- a/Zend/tests/exceptions/exception_before_fatal.phpt +++ b/Zend/tests/exceptions/exception_before_fatal.phpt @@ -6,7 +6,7 @@ function exception_error_handler($code, $msg) { throw new Exception($msg); } -set_error_handler("exception_error_handler", promote_to_exception: true); +set_error_handler("exception_error_handler", delay: false); try { $foo->a(); diff --git a/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt b/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt index 6a82a4a3e2cf..37dc81052723 100644 --- a/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt +++ b/Zend/tests/first_class_callable/constexpr/error_static_call_trait_method_002.phpt @@ -5,7 +5,7 @@ FCC in initializer emits deprecation for static reference to trait method (Excep set_error_handler(function (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); -}, promote_to_exception: true); +}, delay: false); trait Foo { public static function myMethod(string $foo) { diff --git a/Zend/tests/frameless_undefined_var.phpt b/Zend/tests/frameless_undefined_var.phpt index 4ef3059aac98..027b1c414134 100644 --- a/Zend/tests/frameless_undefined_var.phpt +++ b/Zend/tests/frameless_undefined_var.phpt @@ -4,7 +4,7 @@ Undefined var in frameless call _trace = debug_backtrace(); throw $e; -}, promote_to_exception: true); +}, delay: false); // trigger error handler $a['waa']; diff --git a/Zend/tests/get_class_basic.phpt b/Zend/tests/get_class_basic.phpt index ecf4c5e7babb..43dec0e592f6 100644 --- a/Zend/tests/get_class_basic.phpt +++ b/Zend/tests/get_class_basic.phpt @@ -25,7 +25,7 @@ $f2 = new foo2; set_error_handler(function ($severity, $message, $file, $line) { throw new Exception($message); -}, promote_to_exception: true); +}, delay: false); try { $f1->bar(); } catch (Exception $e) { diff --git a/Zend/tests/gh16799.phpt b/Zend/tests/gh16799.phpt index a346c7ff0c41..ef2e20c1260a 100644 --- a/Zend/tests/gh16799.phpt +++ b/Zend/tests/gh16799.phpt @@ -2,7 +2,7 @@ GH-16799 (Assertion failure at Zend/zend_vm_execute.h) --FILE-- 'bar', null => new stdClass]; diff --git a/Zend/tests/require_once_warning_to_exception.phpt b/Zend/tests/require_once_warning_to_exception.phpt index a4ff875b26bc..87a5af0f9848 100644 --- a/Zend/tests/require_once_warning_to_exception.phpt +++ b/Zend/tests/require_once_warning_to_exception.phpt @@ -6,7 +6,7 @@ Promoting require_once warning to exception function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new Exception($errstr); } -set_error_handler("exception_error_handler", promote_to_exception: true); +set_error_handler("exception_error_handler", delay: false); try { $results = require_once 'does-not-exist.php'; diff --git a/Zend/tests/strlen_deprecation_to_exception.phpt b/Zend/tests/strlen_deprecation_to_exception.phpt index bb0af9ad8700..880685e56045 100644 --- a/Zend/tests/strlen_deprecation_to_exception.phpt +++ b/Zend/tests/strlen_deprecation_to_exception.phpt @@ -5,7 +5,7 @@ strlen() null deprecation warning promoted to exception set_error_handler(function($_, $msg) { throw new Exception($msg); -}, promote_to_exception: true); +}, delay: false); try { strlen(null); } catch (Exception $e) { diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt index 2e0c4a481ba4..2a9ce8162edd 100644 --- a/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt +++ b/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt @@ -4,7 +4,7 @@ Attempt to free invalid structure (result of ROPE_INIT is not a zval) Date: Wed, 27 May 2026 11:11:41 +0200 Subject: [PATCH 20/22] Simplify --- Zend/zend.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 9998b4b3d9d8..653e4347075b 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1447,6 +1447,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( bool orig_record_errors; zend_err_buf orig_errors_buf; zend_result res; + bool will_bail = (type & E_FATAL_ERRORS) && !(type & E_DONT_BAIL); /* If we're executing a function during SCCP, count any warnings that may be emitted, * but don't perform any other error handling. */ @@ -1457,7 +1458,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( } /* Emit any delayed error before handling fatal error */ - if ((type & E_FATAL_ERRORS) && !(type & E_DONT_BAIL) && EG(errors).size) { + if (will_bail && EG(errors).size) { zend_err_buf errors_buf = EG(errors); EG(errors).size = 0; @@ -1491,21 +1492,21 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( EG(errors).errors[EG(errors).size - 1] = info; /* Do not process non-fatal recorded error */ - if (!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) { + if (!will_bail) { return; } } /* Delay non-bailing errors while executing in the VM, but only if a user * error handler will actually be called for this error. */ - if ((!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) - && !(orig_type & E_NO_DELAY) && EG(current_execute_data) - && Z_TYPE(EG(user_error_handler)) != IS_UNDEF - && (EG(user_error_handler_error_reporting) & type) - && EG(error_handling) == EH_NORMAL - && !(type & (E_CORE_WARNING | E_COMPILE_WARNING))) { - if ((EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) - && (EG(user_error_handler_error_reporting) & type)) { + bool may_call_user_error_handler = !will_bail + && !(type & (E_CORE_WARNING | E_COMPILE_WARNING)) + && Z_TYPE(EG(user_error_handler)) != IS_UNDEF + && (EG(user_error_handler_error_reporting) & type) + && EG(error_handling) == EH_NORMAL; + if (may_call_user_error_handler + && !(orig_type & E_NO_DELAY) && EG(current_execute_data)) { + if (EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) { if (EG(exception)) { /* Promoting this error would override the existing exception, * but, we want the first exception/error to have precedence. */ From fd64e35d545170d7f25f789ba893c21853394927 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 27 May 2026 11:14:24 +0200 Subject: [PATCH 21/22] Rename flag --- Zend/zend.c | 2 +- Zend/zend_builtin_functions.c | 2 +- Zend/zend_errors.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 653e4347075b..04084eee8485 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1506,7 +1506,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( && EG(error_handling) == EH_NORMAL; if (may_call_user_error_handler && !(orig_type & E_NO_DELAY) && EG(current_execute_data)) { - if (EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION) { + if (EG(user_error_handler_error_reporting) & ZEND_ERROR_HANDLER_NO_DELAY) { if (EG(exception)) { /* Promoting this error would override the existing exception, * but, we want the first exception/error to have precedence. */ diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index e8550864cda4..a4b9abf36184 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1307,7 +1307,7 @@ ZEND_FUNCTION(set_error_handler) ZVAL_COPY(&EG(user_error_handler), &(fci.function_name)); EG(user_error_handler_error_reporting) = (int)error_type & E_ALL; if (!delay) { - EG(user_error_handler_error_reporting) |= ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION; + EG(user_error_handler_error_reporting) |= ZEND_ERROR_HANDLER_NO_DELAY; } } /* }}} */ diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h index f27a3ed3e983..f3efd50c302d 100644 --- a/Zend/zend_errors.h +++ b/Zend/zend_errors.h @@ -42,8 +42,8 @@ /* Indicates that this error should not be delayed */ #define E_NO_DELAY (1<<16L) -/* Flag for EG(user_error_handler_error_reporting): promote matching errors to PromotedError exceptions */ -#define ZEND_ERROR_HANDLER_PROMOTE_TO_EXCEPTION (1<<30) +/* Flag for EG(user_error_handler_error_reporting): Matching errors are promoted to exceptions, and the error handler is called during excepiton handling. */ +#define ZEND_ERROR_HANDLER_NO_DELAY (1<<30) #define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_DEPRECATED | E_USER_DEPRECATED) #define E_CORE (E_CORE_ERROR | E_CORE_WARNING) From 307640e2b1680fac2b1fe10719387d070cbb3b66 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 27 May 2026 11:46:24 +0200 Subject: [PATCH 22/22] Move the ZEND_VM_ENTER_EX() interrupt check to the zend_vm_stack_push_call_frame slow path --- Zend/tests/exceptions/exception_008.phpt | 6 ++-- .../generators/yield_from_force_closed.phpt | 3 +- Zend/tests/traits/gh_17728.phpt | 1 + Zend/tests/try/bug71604_3.phpt | 3 +- Zend/tests/weakrefs/weakmap_weakness.phpt | 28 +++++++++---------- Zend/zend_execute.c | 3 +- Zend/zend_execute.h | 13 +++++---- Zend/zend_vm_gen.php | 8 +++--- 8 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Zend/tests/exceptions/exception_008.phpt b/Zend/tests/exceptions/exception_008.phpt index 937bf2301131..11058b7127d4 100644 --- a/Zend/tests/exceptions/exception_008.phpt +++ b/Zend/tests/exceptions/exception_008.phpt @@ -28,12 +28,10 @@ unset($ar); Fatal error: Uncaught Exception: First in %sexception_008.php:%d Stack trace: #0 %sexception_008.php(%d): TestFirst->__destruct() -#1 %s(%d): {closure:%s:%d}() -#2 {main} +#1 {main} Next Exception: Second in %sexception_008.php:%d Stack trace: #0 %sexception_008.php(%d): TestSecond->__destruct() -#1 %s(%d): {closure:%s:%d}() -#2 {main} +#1 {main} thrown in %sexception_008.php on line %d diff --git a/Zend/tests/generators/yield_from_force_closed.phpt b/Zend/tests/generators/yield_from_force_closed.phpt index be110d8ee38d..fa5cc183ca06 100644 --- a/Zend/tests/generators/yield_from_force_closed.phpt +++ b/Zend/tests/generators/yield_from_force_closed.phpt @@ -35,5 +35,4 @@ finally Error: Cannot use "yield from" in a force-closed generator in %s:%d Stack trace: #0 %s(%d): gen2() -#1 %s(%d): {closure:%s:%d}() -#2 {main} +#1 {main} diff --git a/Zend/tests/traits/gh_17728.phpt b/Zend/tests/traits/gh_17728.phpt index ef458a8e8d5e..f7623bae2300 100644 --- a/Zend/tests/traits/gh_17728.phpt +++ b/Zend/tests/traits/gh_17728.phpt @@ -21,4 +21,5 @@ try { ?> --EXPECT-- +string(3) "bar" Calling static trait method Foo::bar is deprecated, it should only be called on a class using the trait diff --git a/Zend/tests/try/bug71604_3.phpt b/Zend/tests/try/bug71604_3.phpt index 159bf03a964f..567fddda9b4c 100644 --- a/Zend/tests/try/bug71604_3.phpt +++ b/Zend/tests/try/bug71604_3.phpt @@ -36,5 +36,4 @@ Stack trace: Next Exception: 2 in %s:%d Stack trace: #0 %s(%d): gen() -#1 %s(%d): {closure:%s:%d}() -#2 {main} +#1 {main} diff --git a/Zend/tests/weakrefs/weakmap_weakness.phpt b/Zend/tests/weakrefs/weakmap_weakness.phpt index 494201cc47a5..5a10f123e55a 100644 --- a/Zend/tests/weakrefs/weakmap_weakness.phpt +++ b/Zend/tests/weakrefs/weakmap_weakness.phpt @@ -66,39 +66,39 @@ unset($map); (function() {})(); ?> ---EXPECT-- -object(WeakMap)#1 (0) { +--EXPECTF-- +object(WeakMap)#%d (0) { } -object(WeakMap)#1 (1) { +object(WeakMap)#%d (1) { [0]=> array(2) { ["key"]=> - object(stdClass)#2 (0) { + object(stdClass)#%d (0) { } ["value"]=> int(2) } } -object(WeakMap)#1 (0) { +object(WeakMap)#%d (0) { } Destructor in WeakMap value: Before unset: Dtor! After unset: -object(WeakMap)#1 (0) { +object(WeakMap)#%d (0) { } Destroying map with live object: -object(stdClass)#2 (0) { +object(stdClass)#%d (0) { } Object freed by GC: -object(WeakMap)#1 (1) { +object(WeakMap)#%d (1) { [0]=> array(2) { ["key"]=> - object(stdClass)#3 (1) { + object(stdClass)#%d (1) { ["obj"]=> *RECURSION* } @@ -106,24 +106,24 @@ object(WeakMap)#1 (1) { int(4) } } -object(WeakMap)#1 (0) { +object(WeakMap)#%d (0) { } Storing object as own value: -object(WeakMap)#3 (1) { +object(WeakMap)#%d (1) { [0]=> array(2) { ["key"]=> - object(stdClass)#1 (0) { + object(stdClass)#%d (0) { } ["value"]=> - object(stdClass)#1 (0) { + object(stdClass)#%d (0) { } } } Storing map in itself: -object(WeakMap)#3 (1) { +object(WeakMap)#%d (1) { [0]=> array(2) { ["key"]=> diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d25a8f9a60d5..61438383b8df 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -5800,6 +5800,7 @@ static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame_ex(u if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) { EX(opline) = opline; /* this is the only difference */ + ZEND_VM_FCALL_INTERRUPT_CHECK(EG(current_execute_data)); call = (zend_execute_data*)zend_vm_stack_extend(used_stack); ZEND_ASSERT_VM_STACK_GLOBAL; zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, object_or_called_scope); @@ -5816,7 +5817,7 @@ static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame(uint uint32_t used_stack = zend_vm_calc_used_stack(num_args, func); return _zend_vm_stack_push_call_frame_ex(used_stack, call_info, - func, num_args, object_or_called_scope); + func, num_args, object_or_called_scope EXECUTE_DATA_CC); } /* }}} */ #else # define _zend_vm_stack_push_call_frame_ex zend_vm_stack_push_call_frame_ex diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a9ece7f21105..0aeb2fc61d37 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -288,6 +288,11 @@ ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp); ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope); ZEND_API zend_result ZEND_FASTCALL zval_update_constant_with_ctx(zval *pp, zend_class_entry *scope, zend_ast_evaluate_ctx *ctx); +/* Call this to handle the timeout or the interrupt function. It will set + * EG(vm_interrupt) to false. + */ +ZEND_API ZEND_COLD void ZEND_FASTCALL zend_fcall_interrupt(zend_execute_data *call); + /* dedicated Zend executor functions - do not use! */ struct _zend_vm_stack { zval *top; @@ -350,6 +355,9 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui ZEND_ASSERT_VM_STACK_GLOBAL; if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) { + if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { + zend_fcall_interrupt(EG(current_execute_data)); + } call = (zend_execute_data*)zend_vm_stack_extend(used_stack); ZEND_ASSERT_VM_STACK_GLOBAL; zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, object_or_called_scope); @@ -620,11 +628,6 @@ ZEND_API bool zend_verify_property_type(const zend_property_info *info, zval *pr zend_never_inline ZEND_COLD void zend_match_unhandled_error(const zval *value); -/* Call this to handle the timeout or the interrupt function. It will set - * EG(vm_interrupt) to false. - */ -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_fcall_interrupt(zend_execute_data *call); - static zend_always_inline void *zend_get_bad_ptr(void) { ZEND_UNREACHABLE(); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 8e65bc0a28ea..8c739e6afefc 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -2027,7 +2027,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#define HANDLE_EXCEPTION() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_CONTINUE()\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_LEAVE()\n"); out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n"); - out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n"); + out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_CONTINUE()\n"); out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n"); out($f,"# define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n"); out($f,"#elif defined(ZEND_VM_IP_GLOBAL_REG)\n"); @@ -2074,7 +2074,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#define HANDLE_EXCEPTION_LEAVE() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_LEAVE()\n"); out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n"); out($f,"#define ZEND_VM_RETURN() return\n"); - out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n"); + out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_CONTINUE()\n"); out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n"); out($f,"#define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n"); out($f,"#define ZEND_VM_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n"); @@ -2105,7 +2105,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) } out($f,"#define ZEND_VM_CONTINUE() goto *(void**)(OPLINE->handler)\n"); out($f,"#define ZEND_VM_RETURN() return\n"); - out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n"); + out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_CONTINUE()\n"); out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n"); out($f,"#define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n"); out($f,"#define ZEND_VM_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n"); @@ -2157,7 +2157,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f," } while (0)\n"); out($f,"# define ZEND_VM_DISPATCH_TO_LEAVE_HELPER(helper) opline = &call_leave_op; SAVE_OPLINE(); ZEND_VM_CONTINUE()\n"); out($f,"# define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n"); - out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n"); + out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_CONTINUE()\n"); out($f,"# define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n"); out($f,"\n"); out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");