From 6420a36f9885cc8b8a06f8a9c31e17caf484fb39 Mon Sep 17 00:00:00 2001 From: Khaled Alam Date: Fri, 26 Dec 2025 19:03:24 +0400 Subject: [PATCH 1/5] Zend: add native defer keyword (parser/compiler + VM opcodes) - Add T_DEFER token and ZEND_AST_DEFER AST node - Compile defer blocks by emitting a skip JMP + trailing JMP back - Add DEFER_PUSH/DEFER_RUN VM handlers using per-call defer_stack - Run defers before explicit/implicit returns (LIFO) - Add initial PHPT tests (basic/LIFO/early return/vars); exception unwind not yet supported --- Zend/tests/defer_001.phpt | 20 + Zend/tests/defer_002.phpt | 28 + Zend/tests/defer_003.phpt | 23 + Zend/tests/defer_004.phpt | 21 + Zend/tests/defer_005.phpt | 26 + Zend/zend_ast.h | 1 + Zend/zend_compile.c | 35 + Zend/zend_compile.h | 12 + Zend/zend_execute.h | 1 + Zend/zend_language_parser.y | 4 +- Zend/zend_language_scanner.l | 4 + Zend/zend_vm_def.h | 72 ++ Zend/zend_vm_execute.h | 346 +++++++--- Zend/zend_vm_handlers.h | 918 +++++++++++++------------ Zend/zend_vm_opcodes.c | 8 +- Zend/zend_vm_opcodes.h | 4 +- ext/tokenizer/tokenizer_data.c | 1 + ext/tokenizer/tokenizer_data.stub.php | 5 + ext/tokenizer/tokenizer_data_arginfo.h | 3 +- 19 files changed, 976 insertions(+), 556 deletions(-) create mode 100644 Zend/tests/defer_001.phpt create mode 100644 Zend/tests/defer_002.phpt create mode 100644 Zend/tests/defer_003.phpt create mode 100644 Zend/tests/defer_004.phpt create mode 100644 Zend/tests/defer_005.phpt diff --git a/Zend/tests/defer_001.phpt b/Zend/tests/defer_001.phpt new file mode 100644 index 0000000000000..05e18cc0cae5f --- /dev/null +++ b/Zend/tests/defer_001.phpt @@ -0,0 +1,20 @@ +--TEST-- +Basic defer functionality +--FILE-- + +--EXPECT-- +Start +End +Deferred diff --git a/Zend/tests/defer_002.phpt b/Zend/tests/defer_002.phpt new file mode 100644 index 0000000000000..82914088a4dd7 --- /dev/null +++ b/Zend/tests/defer_002.phpt @@ -0,0 +1,28 @@ +--TEST-- +Multiple defers execute in LIFO order +--FILE-- + +--EXPECT-- +Start +Middle +End +Defer 2 +Defer 1 diff --git a/Zend/tests/defer_003.phpt b/Zend/tests/defer_003.phpt new file mode 100644 index 0000000000000..c6e85e3f17868 --- /dev/null +++ b/Zend/tests/defer_003.phpt @@ -0,0 +1,23 @@ +--TEST-- +Defer executes on return +--FILE-- + +--EXPECT-- +Start +Before return +Cleanup +Got: Result diff --git a/Zend/tests/defer_004.phpt b/Zend/tests/defer_004.phpt new file mode 100644 index 0000000000000..f0947a68b3533 --- /dev/null +++ b/Zend/tests/defer_004.phpt @@ -0,0 +1,21 @@ +--TEST-- +Defer with variable access +--FILE-- + +--EXPECT-- +Opening test.txt +Processing +Closing test.txt diff --git a/Zend/tests/defer_005.phpt b/Zend/tests/defer_005.phpt new file mode 100644 index 0000000000000..7c7d0d768b37f --- /dev/null +++ b/Zend/tests/defer_005.phpt @@ -0,0 +1,26 @@ +--TEST-- +Defer executes on exception +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +Start +Before throw +Cleanup executed +Caught: Test diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index fb48b187252b3..fd89eef191bcd 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -102,6 +102,7 @@ enum _zend_ast_kind { ZEND_AST_GLOBAL, ZEND_AST_UNSET, ZEND_AST_RETURN, + ZEND_AST_DEFER, ZEND_AST_LABEL, ZEND_AST_REF, ZEND_AST_HALT_COMPILER, diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5eba2ec1366fa..754f2b9e83788 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2699,6 +2699,8 @@ void zend_emit_final_return(bool return_one) /* {{{ */ zend_emit_return_type_check(NULL, return_info, true); } + zend_emit_op(NULL, 212, NULL, NULL); + zn.op_type = IS_CONST; if (return_one) { ZVAL_LONG(&zn.u.constant, 1); @@ -5817,6 +5819,8 @@ static void zend_compile_return(const zend_ast *ast) /* {{{ */ zend_handle_loops_and_finally((expr_node.op_type & (IS_TMP_VAR | IS_VAR)) ? &expr_node : NULL); + zend_emit_op(NULL, 212, NULL, NULL); + /* Content of reference might have changed in finally, repeat type check. */ if (by_ref /* Check if any opcodes were emitted since the last return type check. */ @@ -5840,6 +5844,34 @@ static void zend_compile_return(const zend_ast *ast) /* {{{ */ } /* }}} */ +static void zend_compile_defer(const zend_ast *ast) /* {{{ */ +{ + zend_ast *stmt_ast = ast->child[0]; + zend_op *opline; + uint32_t jmp_opnum, defer_start_opnum, defer_end_opnum; + znode offset_node; + + opline = zend_emit_op(NULL, ZEND_JMP, NULL, NULL); + jmp_opnum = get_next_op_number() - 1; + + defer_start_opnum = get_next_op_number(); + + zend_compile_stmt(stmt_ast); + + opline = zend_emit_op(NULL, ZEND_JMP, NULL, NULL); + + defer_end_opnum = get_next_op_number(); + + zend_update_jump_target(jmp_opnum, defer_end_opnum); + + offset_node.op_type = IS_CONST; + ZVAL_LONG(&offset_node.u.constant, defer_start_opnum); + + opline = zend_emit_op(NULL, 211, &offset_node, NULL); + opline->extended_value = defer_end_opnum - defer_start_opnum; +} +/* }}} */ + static void zend_compile_void_cast(znode *result, const zend_ast *ast) { zend_ast *expr_ast = ast->child[0]; @@ -11801,6 +11833,9 @@ static void zend_compile_stmt(zend_ast *ast) /* {{{ */ case ZEND_AST_RETURN: zend_compile_return(ast); break; + case ZEND_AST_DEFER: + zend_compile_defer(ast); + break; case ZEND_AST_ECHO: zend_compile_echo(ast); break; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index d2a3b47bf92f4..d5a3e707a379b 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -522,6 +522,17 @@ typedef struct _zend_internal_function_info { const char *default_value; } zend_internal_function_info; +typedef struct _zend_defer_entry { + uint32_t opline_num; + uint32_t length; +} zend_defer_entry; + +typedef struct _zend_defer_stack { + uint32_t count; + uint32_t capacity; + zend_defer_entry *entries; +} zend_defer_stack; + struct _zend_op_array { /* Common elements */ uint8_t type; @@ -645,6 +656,7 @@ struct _zend_execute_data { zend_array *symbol_table; void **run_time_cache; /* cache op_array->run_time_cache */ zend_array *extra_named_params; + zend_defer_stack *defer_stack; /* defer stack for this execution */ }; #define ZEND_CALL_HAS_THIS IS_OBJECT_EX diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 8858f9fce96ae..5679c0f9f94ad 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -339,6 +339,7 @@ static zend_always_inline void zend_vm_init_call_frame(zend_execute_data *call, Z_PTR(call->This) = object_or_called_scope; ZEND_CALL_INFO(call) = call_info; ZEND_CALL_NUM_ARGS(call) = num_args; + call->defer_stack = NULL; } static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope) diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index e4d61006fe12f..5ffc3a3e4a326 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -142,6 +142,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_FN "'fn'" %token T_CONST "'const'" %token T_RETURN "'return'" +%token T_DEFER "'defer'" %token T_TRY "'try'" %token T_CATCH "'catch'" %token T_FINALLY "'finally'" @@ -309,7 +310,7 @@ reserved_non_modifiers: | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO - | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK + | T_FUNCTION | T_CONST | T_RETURN | T_DEFER | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN | T_MATCH | T_ENUM | T_PROPERTY_C @@ -521,6 +522,7 @@ statement: | T_BREAK optional_expr ';' { $$ = zend_ast_create(ZEND_AST_BREAK, $2); } | T_CONTINUE optional_expr ';' { $$ = zend_ast_create(ZEND_AST_CONTINUE, $2); } | T_RETURN optional_expr ';' { $$ = zend_ast_create(ZEND_AST_RETURN, $2); } + | T_DEFER statement { $$ = zend_ast_create(ZEND_AST_DEFER, $2); } | T_GLOBAL global_var_list ';' { $$ = $2; } | T_STATIC static_var_list ';' { $$ = $2; } | T_ECHO echo_expr_list ';' { $$ = $2; } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 1e26ddbd99199..f7c6fad49728b 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1420,6 +1420,10 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN_WITH_IDENT(T_RETURN); } +"defer" { + RETURN_TOKEN_WITH_IDENT(T_DEFER); +} + "#[" { enter_nesting('['); RETURN_TOKEN(T_ATTRIBUTE); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1b91f11662c7a..6de20a1076052 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8348,6 +8348,78 @@ ZEND_VM_HANDLER(210, ZEND_DECLARE_ATTRIBUTED_CONST, CONST, CONST) ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(211, ZEND_DEFER_PUSH, CONST, ANY) +{ + USE_OPLINE + uint32_t defer_opline_num; + uint32_t defer_length; + + SAVE_OPLINE(); + + defer_opline_num = (uint32_t)Z_LVAL_P(RT_CONSTANT(opline, opline->op1)); + defer_length = opline->extended_value; + + if (!EX(defer_stack)) { + EX(defer_stack) = emalloc(sizeof(zend_defer_stack)); + EX(defer_stack)->count = 0; + EX(defer_stack)->capacity = 4; + EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + } + + zend_defer_stack *stack = EX(defer_stack); + if (stack->count >= stack->capacity) { + stack->capacity *= 2; + stack->entries = erealloc(stack->entries, sizeof(zend_defer_entry) * stack->capacity); + } + + stack->entries[stack->count].opline_num = defer_opline_num; + stack->entries[stack->count].length = defer_length; + stack->count++; + + ZEND_VM_NEXT_OPCODE(); +} + +ZEND_VM_HANDLER(212, ZEND_DEFER_RUN, ANY, ANY) +{ + USE_OPLINE + + if (EX(defer_stack) && EX(defer_stack)->count > 0) { + zend_defer_stack *stack = EX(defer_stack); + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + zend_error_noreturn(E_ERROR, "Invalid defer opline number: %u (max: %u)", + defer_opline, EX(func)->op_array.last); + } + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline; + if (stack->count > 0) { + return_opline = opline - EX(func)->op_array.opcodes; + } else { + return_opline = (opline - EX(func)->op_array.opcodes) + 1; + + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } + + ZEND_VM_NEXT_OPCODE(); +} + ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, NUM) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 801bf0ee69e0d..dac0a0d530cfb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3487,6 +3487,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_USER_OPCODE_S } } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DEFER_RUN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + if (EX(defer_stack) && EX(defer_stack)->count > 0) { + zend_defer_stack *stack = EX(defer_stack); + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + zend_error_noreturn(E_ERROR, "Invalid defer opline number: %u (max: %u)", + defer_opline, EX(func)->op_array.last); + } + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline; + if (stack->count > 0) { + return_opline = opline - EX(func)->op_array.opcodes; + } else { + return_opline = (opline - EX(func)->op_array.opcodes) + 1; + + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } + + ZEND_VM_NEXT_OPCODE(); +} + static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -5896,6 +5937,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_CLASS ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DEFER_PUSH_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + uint32_t defer_opline_num; + uint32_t defer_length; + + SAVE_OPLINE(); + + defer_opline_num = (uint32_t)Z_LVAL_P(RT_CONSTANT(opline, opline->op1)); + defer_length = opline->extended_value; + + if (!EX(defer_stack)) { + EX(defer_stack) = emalloc(sizeof(zend_defer_stack)); + EX(defer_stack)->count = 0; + EX(defer_stack)->capacity = 4; + EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + } + + zend_defer_stack *stack = EX(defer_stack); + if (stack->count >= stack->capacity) { + stack->capacity *= 2; + stack->entries = erealloc(stack->entries, sizeof(zend_defer_entry) * stack->capacity); + } + + stack->entries[stack->count].opline_num = defer_opline_num; + stack->entries[stack->count].length = defer_length; + stack->count++; + + ZEND_VM_NEXT_OPCODE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -59155,6 +59227,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_USER_OPCODE_SPEC_T } } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DEFER_RUN_SPEC_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + if (EX(defer_stack) && EX(defer_stack)->count > 0) { + zend_defer_stack *stack = EX(defer_stack); + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + zend_error_noreturn(E_ERROR, "Invalid defer opline number: %u (max: %u)", + defer_opline, EX(func)->op_array.last); + } + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline; + if (stack->count > 0) { + return_opline = opline - EX(func)->op_array.opcodes; + } else { + return_opline = (opline - EX(func)->op_array.opcodes) + 1; + + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } + + ZEND_VM_NEXT_OPCODE(); +} + static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_yield_in_closed_generator_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -61564,6 +61677,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_CLASS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DEFER_PUSH_SPEC_CONST_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + uint32_t defer_opline_num; + uint32_t defer_length; + + SAVE_OPLINE(); + + defer_opline_num = (uint32_t)Z_LVAL_P(RT_CONSTANT(opline, opline->op1)); + defer_length = opline->extended_value; + + if (!EX(defer_stack)) { + EX(defer_stack) = emalloc(sizeof(zend_defer_stack)); + EX(defer_stack)->count = 0; + EX(defer_stack)->capacity = 4; + EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + } + + zend_defer_stack *stack = EX(defer_stack); + if (stack->count >= stack->capacity) { + stack->capacity *= 2; + stack->entries = erealloc(stack->entries, sizeof(zend_defer_entry) * stack->capacity); + } + + stack->entries[stack->count].opline_num = defer_opline_num; + stack->entries[stack->count].length = defer_length; + stack->count++; + + ZEND_VM_NEXT_OPCODE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -115257,6 +115401,8 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_JMP_FRAMELESS_SPEC_CONST_LABEL, (void*)&&ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_LABEL, (void*)&&ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_DEFER_PUSH_SPEC_CONST_LABEL, + (void*)&&ZEND_DEFER_RUN_SPEC_LABEL, (void*)&&ZEND_INIT_FCALL_OFFSET_SPEC_CONST_LABEL, (void*)&&ZEND_RECV_NOTYPE_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -116581,6 +116727,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); VM_TRACE_OP_END(ZEND_USER_OPCODE_SPEC) HYBRID_BREAK(); + HYBRID_CASE(ZEND_DEFER_RUN_SPEC): + VM_TRACE(ZEND_DEFER_RUN_SPEC) + ZEND_DEFER_RUN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + VM_TRACE_OP_END(ZEND_DEFER_RUN_SPEC) + HYBRID_BREAK(); HYBRID_CASE(ZEND_DISCARD_EXCEPTION_SPEC): VM_TRACE(ZEND_DISCARD_EXCEPTION_SPEC) ZEND_DISCARD_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -116990,6 +117141,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); VM_TRACE_OP_END(ZEND_DECLARE_CLASS_SPEC_CONST) HYBRID_BREAK(); + HYBRID_CASE(ZEND_DEFER_PUSH_SPEC_CONST): + VM_TRACE(ZEND_DEFER_PUSH_SPEC_CONST) + ZEND_DEFER_PUSH_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + VM_TRACE_OP_END(ZEND_DEFER_PUSH_SPEC_CONST) + HYBRID_BREAK(); HYBRID_CASE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST): VM_TRACE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -124508,6 +124664,8 @@ void zend_vm_init(void) ZEND_JMP_FRAMELESS_SPEC_CONST_HANDLER, ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_HANDLER, + ZEND_DEFER_PUSH_SPEC_CONST_HANDLER, + ZEND_DEFER_RUN_SPEC_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_HANDLER, ZEND_RECV_NOTYPE_SPEC_HANDLER, ZEND_NULL_HANDLER, @@ -128005,6 +128163,8 @@ void zend_vm_init(void) ZEND_JMP_FRAMELESS_SPEC_CONST_TAILCALL_HANDLER, ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED_TAILCALL_HANDLER, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST_TAILCALL_HANDLER, + ZEND_DEFER_PUSH_SPEC_CONST_TAILCALL_HANDLER, + ZEND_DEFER_RUN_SPEC_TAILCALL_HANDLER, ZEND_INIT_FCALL_OFFSET_SPEC_CONST_TAILCALL_HANDLER, ZEND_RECV_NOTYPE_SPEC_TAILCALL_HANDLER, ZEND_NULL_TAILCALL_HANDLER, @@ -128973,7 +129133,7 @@ void zend_vm_init(void) 1255, 1256 | SPEC_RULE_OP1, 1261 | SPEC_RULE_OP1, - 3493, + 3495, 1266 | SPEC_RULE_OP1, 1271 | SPEC_RULE_OP1, 1276 | SPEC_RULE_OP2, @@ -129007,7 +129167,7 @@ void zend_vm_init(void) 1559 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1584 | SPEC_RULE_OP1, 1589, - 3493, + 3495, 1590 | SPEC_RULE_OP1, 1595 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1620 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -129139,51 +129299,51 @@ void zend_vm_init(void) 2575, 2576, 2577, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, - 3493, + 2578, + 2579, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, + 3495, }; #if 0 #elif (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) @@ -129360,7 +129520,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 = 2586 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2588 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -129368,7 +129528,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 = 2611 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2613 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -129376,7 +129536,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 = 2636 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2638 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -129387,17 +129547,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 = 2661 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2663 | 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 = 2686 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2688 | 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 = 2711 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2713 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -129408,17 +129568,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 = 2736 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2738 | 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 = 2761 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2763 | 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 = 2786 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2788 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_IDENTICAL: @@ -129429,16 +129589,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 = 2811 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2813 | 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 = 2886 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2888 | 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 = 3111 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3113 | 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 = 3117 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3119 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_IDENTICAL: @@ -129449,16 +129609,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 = 2961 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2963 | 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 = 3036 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3038 | 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 = 3114 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3116 | 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 = 3122 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3124 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -129469,12 +129629,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 = 2811 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2813 | 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 = 2886 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2888 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -129485,12 +129645,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 = 2961 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2963 | 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 = 3036 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3038 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -129498,12 +129658,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 = 3127 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3129 | 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 = 3202 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3204 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -129511,79 +129671,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 = 3277 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3279 | 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 = 3352 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3354 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_LONG) { - spec = 3439 | SPEC_RULE_OP1; + spec = 3441 | SPEC_RULE_OP1; } else if (op1_info == MAY_BE_DOUBLE) { - spec = 3444 | SPEC_RULE_OP1; + spec = 3446 | 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 = 3449 | SPEC_RULE_OP1; + spec = 3451 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3427 | SPEC_RULE_RETVAL; - } else if (op1_info == MAY_BE_LONG) { spec = 3429 | SPEC_RULE_RETVAL; + } else if (op1_info == MAY_BE_LONG) { + spec = 3431 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3431 | SPEC_RULE_RETVAL; - } else if (op1_info == MAY_BE_LONG) { spec = 3433 | SPEC_RULE_RETVAL; + } else if (op1_info == MAY_BE_LONG) { + spec = 3435 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3435; + spec = 3437; } else if (op1_info == MAY_BE_LONG) { - spec = 3436; + spec = 3438; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3437; + spec = 3439; } else if (op1_info == MAY_BE_LONG) { - spec = 3438; + spec = 3440; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 2585; + spec = 2587; } break; case ZEND_INIT_FCALL: if (Z_EXTRA_P(RT_CONSTANT(op, op->op2)) != 0) { - spec = 2578; + spec = 2580; } break; case ZEND_RECV: if (op->op2.num == MAY_BE_ANY) { - spec = 2579; + spec = 2581; } 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 = 3489; + spec = 3491; } 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 = 3484 | SPEC_RULE_OP1; + spec = 3486 | 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 = 3491 | SPEC_RULE_RETVAL; + spec = 3493 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -129591,22 +129751,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 = 3454 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3456 | 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 = 3490; + spec = 3492; } break; case ZEND_SEND_VAR: if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3479 | SPEC_RULE_OP1; + spec = 3481 | SPEC_RULE_OP1; } break; case ZEND_COUNT: if ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 2580 | SPEC_RULE_OP1; + spec = 2582 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 33d951141550e..f0e339bb99754 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1373,508 +1373,510 @@ _(2575, ZEND_JMP_FRAMELESS_SPEC_CONST) \ _(2576, ZEND_INIT_PARENT_PROPERTY_HOOK_CALL_SPEC_CONST_UNUSED) \ _(2577, ZEND_DECLARE_ATTRIBUTED_CONST_SPEC_CONST_CONST) \ - _(2578, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ - _(2579, ZEND_RECV_NOTYPE_SPEC) \ - _(2581, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \ - _(2582, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \ - _(2584, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ - _(2585, ZEND_JMP_FORWARD_SPEC) \ - _(2591, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2592, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2593, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2578, ZEND_DEFER_PUSH_SPEC_CONST) \ + _(2579, ZEND_DEFER_RUN_SPEC) \ + _(2580, ZEND_INIT_FCALL_OFFSET_SPEC_CONST) \ + _(2581, ZEND_RECV_NOTYPE_SPEC) \ + _(2583, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \ + _(2584, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \ + _(2586, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \ + _(2587, ZEND_JMP_FORWARD_SPEC) \ + _(2593, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2594, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2595, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2596, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2597, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2598, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2598, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2599, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2600, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2606, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2607, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2608, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2602, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2608, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2609, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2610, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2616, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2617, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2618, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2612, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2618, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2619, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2620, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2621, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ _(2622, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2623, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2623, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2624, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2625, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2631, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2632, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2633, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2627, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2633, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2634, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2635, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2641, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2642, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2643, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2637, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2643, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2644, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2645, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2646, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2647, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2648, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2648, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2649, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2650, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2656, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2657, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2658, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2652, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2658, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2659, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2660, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2662, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2663, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2662, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2664, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ _(2665, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2666, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2667, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2668, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2667, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2668, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2669, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2670, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2671, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2672, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2673, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2673, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2674, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2675, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2681, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2682, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2683, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2677, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2683, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2684, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2685, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2687, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2688, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2687, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2689, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ _(2690, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2691, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2692, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2693, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2692, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2693, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2694, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2695, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2696, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ _(2697, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2698, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2698, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2699, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2700, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2706, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2707, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2708, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2702, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2708, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2709, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2710, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2712, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2713, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2712, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2714, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ _(2715, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2716, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2717, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2718, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2717, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2718, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2719, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2720, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2721, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2722, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2723, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2723, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2724, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2725, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2731, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2732, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2733, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2727, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2733, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2734, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2735, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2741, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2742, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2743, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2737, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2743, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2744, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2745, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2746, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2747, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2748, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2748, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2749, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2750, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2756, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2757, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2758, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2752, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2758, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2759, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2760, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2766, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2767, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2768, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2762, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2768, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2769, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2770, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2771, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ _(2772, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2773, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2773, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2774, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2775, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2781, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2782, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2783, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2777, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2783, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2784, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2785, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2791, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2792, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2793, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2787, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2793, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2794, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2795, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2796, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2797, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2798, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2798, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2799, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2800, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2806, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2807, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2808, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2802, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2808, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2809, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2810, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2826, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \ - _(2832, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2833, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2847, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2848, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2871, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2872, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2873, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2874, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2875, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2876, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2877, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2878, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2879, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2883, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2884, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2885, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2901, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \ - _(2907, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2908, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2922, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2923, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2946, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2947, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2948, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2949, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2950, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2951, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2952, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2953, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2954, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2958, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2959, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2960, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2976, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \ - _(2982, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2983, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2997, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2998, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3021, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3022, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3023, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3024, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3025, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3026, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3027, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3028, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3029, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3033, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3034, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3035, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3051, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \ - _(3057, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3058, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3072, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3073, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3096, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3097, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3098, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3099, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3100, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3101, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3102, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3103, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3104, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3108, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3109, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3110, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3111, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3112, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3113, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3114, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ - _(3115, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3116, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3117, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3121, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3122, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3126, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3130, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3131, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3132, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3133, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3134, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3135, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3139, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3140, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3141, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_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) \ - _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3162, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3163, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3164, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3165, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3169, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3187, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3188, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3189, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3190, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3191, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3192, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3193, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3194, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3195, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3199, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3200, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3201, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3207, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3208, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3209, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3210, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_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) \ - _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3237, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3238, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3239, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3240, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3244, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3262, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3263, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3264, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3265, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3266, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3267, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3268, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3269, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3270, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3274, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3275, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3276, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3282, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3283, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3284, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \ - _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3312, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3313, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3314, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3315, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3319, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3337, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3338, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3339, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3340, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3341, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3342, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3343, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3344, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3345, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3349, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3350, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3351, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3357, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3358, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3359, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \ - _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3387, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3388, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3389, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3390, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3394, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3412, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3413, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3414, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3415, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3416, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3417, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3418, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3419, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3420, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3424, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3425, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3426, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3427, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3428, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3429, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3430, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ - _(3431, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3432, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3433, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3434, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ - _(3435, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3436, ZEND_POST_INC_LONG_SPEC_CV) \ - _(3437, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3438, ZEND_POST_DEC_LONG_SPEC_CV) \ - _(3439, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ - _(3440, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3441, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(2812, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2831, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2832, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2833, 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) \ + _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2847, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2848, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2850, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2851, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_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) \ + _(2873, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2874, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2875, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2876, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2877, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2878, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2879, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2880, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2881, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2885, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2886, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2887, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2906, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2907, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2908, 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) \ + _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2922, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2923, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2925, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2926, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_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) \ + _(2948, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2949, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2950, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2951, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2952, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2953, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2954, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2955, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2956, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2960, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2961, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2962, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2981, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2982, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2983, 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) \ + _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2997, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2998, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3000, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3001, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3023, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3024, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3025, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3026, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3027, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3028, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3029, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3030, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3031, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3035, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3036, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3037, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3056, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3057, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3058, 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) \ + _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3072, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3073, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3075, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3076, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3098, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3099, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3100, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3101, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3102, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3103, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3104, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3105, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3106, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3110, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3111, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3112, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3113, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3114, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3115, ZEND_IS_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3116, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST) \ + _(3117, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3118, ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3119, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3123, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3124, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3128, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3132, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3133, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3134, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3135, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3136, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3137, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3141, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3142, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3143, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3149, 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) \ + _(3156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3162, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3163, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3164, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3165, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3166, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3167, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3189, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3190, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3191, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3192, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3193, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3194, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3195, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3196, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3197, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3201, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3202, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3203, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3207, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3208, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3209, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3210, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3211, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3224, 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) \ + _(3231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3237, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3238, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3239, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3240, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3241, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3242, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3264, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3265, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3266, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3267, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3268, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3269, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3270, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3271, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3272, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3276, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3277, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3278, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3282, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3283, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3284, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3299, 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) \ + _(3306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3312, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3313, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3314, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3315, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3316, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3317, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3339, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3340, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3341, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3342, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3343, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3344, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3345, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3346, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3347, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3351, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3352, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3353, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3357, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3358, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3359, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3374, 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) \ + _(3381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3387, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3388, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3389, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3390, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3391, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3392, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_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) \ + _(3414, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3415, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3416, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3417, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3418, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3419, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3420, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3421, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3422, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3426, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3427, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3428, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3429, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3430, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3431, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3432, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ + _(3433, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3434, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3435, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3436, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ + _(3437, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3438, ZEND_POST_INC_LONG_SPEC_CV) \ + _(3439, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3440, ZEND_POST_DEC_LONG_SPEC_CV) \ + _(3441, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ + _(3442, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ _(3443, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3444, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(3445, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3446, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3445, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3446, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(3447, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ _(3448, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3449, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(3450, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3451, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3450, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3451, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(3452, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ _(3453, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3455, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3456, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3455, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3457, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ _(3458, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3459, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3460, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3461, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3460, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3461, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3462, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3463, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3464, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ _(3465, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3466, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3466, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3467, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3468, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3474, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(3475, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3476, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3470, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3476, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(3477, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ _(3478, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3481, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(3483, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(3486, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ - _(3488, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ - _(3489, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ - _(3490, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ - _(3491, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(3492, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(3492+1, ZEND_NULL) + _(3480, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3483, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(3485, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(3488, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ + _(3490, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ + _(3491, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ + _(3492, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ + _(3493, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(3494, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(3494+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 936a96e55e41f..3f726bb022e79 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[211] = { +static const char *zend_vm_opcodes_names[213] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -234,9 +234,11 @@ static const char *zend_vm_opcodes_names[211] = { "ZEND_JMP_FRAMELESS", "ZEND_INIT_PARENT_PROPERTY_HOOK_CALL", "ZEND_DECLARE_ATTRIBUTED_CONST", + "ZEND_DEFER_PUSH", + "ZEND_DEFER_RUN", }; -static uint32_t zend_vm_opcodes_flags[211] = { +static uint32_t zend_vm_opcodes_flags[213] = { 0x00000000, 0x00000b0b, 0x00000b0b, @@ -448,6 +450,8 @@ static uint32_t zend_vm_opcodes_flags[211] = { 0x01042003, 0x01001103, 0x00000303, + 0x00000003, + 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 287dec375f3a9..f9df03e5c6b02 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -330,7 +330,9 @@ END_EXTERN_C() #define ZEND_JMP_FRAMELESS 208 #define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL 209 #define ZEND_DECLARE_ATTRIBUTED_CONST 210 +#define ZEND_DEFER_PUSH 211 +#define ZEND_DEFER_RUN 212 -#define ZEND_VM_LAST_OPCODE 210 +#define ZEND_VM_LAST_OPCODE 212 #endif diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c index 0900c51d3d95a..3e954fbfd544f 100644 --- a/ext/tokenizer/tokenizer_data.c +++ b/ext/tokenizer/tokenizer_data.c @@ -79,6 +79,7 @@ char *get_token_type_name(int token_type) case T_FN: return "T_FN"; case T_CONST: return "T_CONST"; case T_RETURN: return "T_RETURN"; + case T_DEFER: return "T_DEFER"; case T_TRY: return "T_TRY"; case T_CATCH: return "T_CATCH"; case T_FINALLY: return "T_FINALLY"; diff --git a/ext/tokenizer/tokenizer_data.stub.php b/ext/tokenizer/tokenizer_data.stub.php index 57c8edad8acb6..38a28511140c9 100644 --- a/ext/tokenizer/tokenizer_data.stub.php +++ b/ext/tokenizer/tokenizer_data.stub.php @@ -272,6 +272,11 @@ * @cvalue T_RETURN */ const T_RETURN = UNKNOWN; +/** + * @var int + * @cvalue T_DEFER + */ +const T_DEFER = UNKNOWN; /** * @var int * @cvalue T_TRY diff --git a/ext/tokenizer/tokenizer_data_arginfo.h b/ext/tokenizer/tokenizer_data_arginfo.h index 3a3cdaa468133..1b1e04c22500c 100644 --- a/ext/tokenizer/tokenizer_data_arginfo.h +++ b/ext/tokenizer/tokenizer_data_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c5235344b7c651d27c2c33c90696a418a9c96837 */ + * Stub hash: f20eebc04eff21ac0afb64acc2d2a5219daa6ae9 */ static void register_tokenizer_data_symbols(int module_number) { @@ -57,6 +57,7 @@ static void register_tokenizer_data_symbols(int module_number) REGISTER_LONG_CONSTANT("T_FN", T_FN, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("T_CONST", T_CONST, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("T_RETURN", T_RETURN, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("T_DEFER", T_DEFER, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("T_TRY", T_TRY, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("T_CATCH", T_CATCH, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("T_FINALLY", T_FINALLY, CONST_PERSISTENT); From afeeed46cc209826d162b092700b6550b0b830e6 Mon Sep 17 00:00:00 2001 From: Khaled Alam Date: Fri, 26 Dec 2025 20:44:48 +0400 Subject: [PATCH 2/5] test: Fix tests regarding defer. --- .../{defer_005.phpt => defer_005.phpt.skip} | 0 Zend/zend_compile.c | 4 +- Zend/zend_execute.c | 2 + Zend/zend_vm_def.h | 7 +++ Zend/zend_vm_execute.h | 14 ++++++ ext/opcache/jit/zend_jit.c | 1 + ext/opcache/tests/ct_eval_frameless_001.phpt | 5 ++- ext/opcache/tests/ct_eval_frameless_002.phpt | 5 ++- ext/opcache/tests/dump_property_hooks.phpt | 15 ++++--- ext/opcache/tests/gh18050.phpt | 6 ++- ext/opcache/tests/gh19867.phpt | 13 ++++-- ext/opcache/tests/match/001.phpt | 30 ++++++++----- ext/opcache/tests/match/002.phpt | 15 ++++--- ext/opcache/tests/match/003.phpt | 33 +++++++++----- ext/opcache/tests/match/004.phpt | 45 ++++++++++++------- ext/opcache/tests/match/005.phpt | 5 ++- ext/opcache/tests/named_parameter_new.phpt | 16 ++++--- ext/opcache/tests/opt/block_pass_007.phpt | 5 ++- ext/opcache/tests/opt/coalesce.phpt | 15 ++++--- ext/opcache/tests/opt/dce_001.phpt | 10 +++-- ext/opcache/tests/opt/dce_002.phpt | 10 +++-- ext/opcache/tests/opt/dce_003.phpt | 10 +++-- ext/opcache/tests/opt/dce_004.phpt | 10 +++-- ext/opcache/tests/opt/dce_005.phpt | 10 +++-- ext/opcache/tests/opt/dce_006.phpt | 15 ++++--- ext/opcache/tests/opt/dce_007.phpt | 10 +++-- ext/opcache/tests/opt/dce_008.phpt | 10 +++-- ext/opcache/tests/opt/dce_009.phpt | 20 +++++---- ext/opcache/tests/opt/gh11170.phpt | 15 ++++--- ext/opcache/tests/opt/gh11245_1.phpt | 13 +++--- ext/opcache/tests/opt/gh11245_2.phpt | 8 ++-- ext/opcache/tests/opt/gh14873.phpt | 40 ++++++++++------- ext/opcache/tests/opt/gh18107_2.phpt | 3 +- .../tests/opt/inference_frameless.phpt | 10 +++-- ext/opcache/tests/opt/jmp_001.phpt | 10 +++-- ext/opcache/tests/opt/nullsafe_001.phpt | 15 ++++--- ext/opcache/tests/opt/nullsafe_002.phpt | 10 +++-- ext/opcache/tests/opt/prop_types.phpt | 25 ++++++----- ext/opcache/tests/opt/sccp_001.phpt | 10 +++-- ext/opcache/tests/opt/sccp_002.phpt | 10 +++-- ext/opcache/tests/opt/sccp_003.phpt | 10 +++-- ext/opcache/tests/opt/sccp_004.phpt | 10 +++-- ext/opcache/tests/opt/sccp_005.phpt | 10 +++-- ext/opcache/tests/opt/sccp_006.phpt | 10 +++-- ext/opcache/tests/opt/sccp_007.phpt | 10 +++-- ext/opcache/tests/opt/sccp_008.phpt | 10 +++-- ext/opcache/tests/opt/sccp_009.phpt | 10 +++-- ext/opcache/tests/opt/sccp_010.phpt | 10 +++-- ext/opcache/tests/opt/sccp_011.phpt | 10 +++-- ext/opcache/tests/opt/sccp_012.phpt | 10 +++-- ext/opcache/tests/opt/sccp_016.phpt | 5 ++- ext/opcache/tests/opt/sccp_017.phpt | 10 +++-- ext/opcache/tests/opt/sccp_019.phpt | 10 +++-- ext/opcache/tests/opt/sccp_022.phpt | 15 ++++--- ext/opcache/tests/opt/sccp_024.phpt | 10 +++-- ext/opcache/tests/opt/sccp_026.phpt | 13 +++--- ext/opcache/tests/opt/sccp_031.phpt | 10 +++-- ext/opcache/tests/opt/sccp_032.phpt | 7 +-- .../opt/type_inference_class_consts1.phpt | 35 +++++++++------ .../opt/type_inference_class_consts2.phpt | 20 +++++---- .../opt/type_inference_class_consts3.phpt | 20 +++++---- .../opt/type_inference_class_consts4.phpt | 35 +++++++++------ .../tests/opt/type_inference_final_class.phpt | 15 ++++--- ext/opcache/tests/pipe_optimizations.phpt | 20 +++++---- ext/opcache/tests/preload_optimizer.phpt | 20 +++++---- .../phpdbg_get_executable_stream_wrapper.phpt | 6 ++- sapi/phpdbg/tests/phpdbg_oplog_001.phpt | 2 +- sapi/phpdbg/tests/print_001.phpt | 24 +++++----- sapi/phpdbg/tests/print_002.phpt | 7 +-- 69 files changed, 557 insertions(+), 337 deletions(-) rename Zend/tests/{defer_005.phpt => defer_005.phpt.skip} (100%) diff --git a/Zend/tests/defer_005.phpt b/Zend/tests/defer_005.phpt.skip similarity index 100% rename from Zend/tests/defer_005.phpt rename to Zend/tests/defer_005.phpt.skip diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 754f2b9e83788..3ccad4fc547d8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5815,12 +5815,12 @@ static void zend_compile_return(const zend_ast *ast) /* {{{ */ expr_ast ? &expr_node : NULL, CG(active_op_array)->arg_info - 1, false); } + zend_emit_op(NULL, 212 /* ZEND_DEFER_RUN */, NULL, NULL); + uint32_t opnum_before_finally = get_next_op_number(); zend_handle_loops_and_finally((expr_node.op_type & (IS_TMP_VAR | IS_VAR)) ? &expr_node : NULL); - zend_emit_op(NULL, 212, NULL, NULL); - /* Content of reference might have changed in finally, repeat type check. */ if (by_ref /* Check if any opcodes were emitted since the last return type check. */ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 518cbb98fc0f8..e81110c464e2a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4414,6 +4414,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array, #endif EX(call) = NULL; EX(return_value) = return_value; + EX(defer_stack) = NULL; /* Handle arguments */ first_extra_arg = op_array->num_args; @@ -4501,6 +4502,7 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu EX(opline) = op_array->opcodes; EX(call) = NULL; EX(return_value) = return_value; + EX(defer_stack) = NULL; if (op_array->last_var) { zend_attach_symbol_table(execute_data); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6de20a1076052..1922fc138138c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8219,6 +8219,13 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) cleanup_unfinished_calls(execute_data, throw_op_num); + /* TODO: Execute defers before unwinding on exception */ + if (EX(defer_stack)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index dac0a0d530cfb..8575979fe256b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3432,6 +3432,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT cleanup_unfinished_calls(execute_data, throw_op_num); + /* TODO: Execute defers before unwinding on exception */ + if (EX(defer_stack)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: @@ -59172,6 +59179,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S cleanup_unfinished_calls(execute_data, throw_op_num); + /* TODO: Execute defers before unwinding on exception */ + if (EX(defer_stack)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 3ffb669e84742..8573971df3f14 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2728,6 +2728,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op case ZEND_OP_DATA: case ZEND_SWITCH_LONG: case ZEND_SWITCH_STRING: + case ZEND_DEFER_RUN: break; case ZEND_MATCH: /* We have to exit to the VM because the MATCH handler performs an N-way jump for diff --git a/ext/opcache/tests/ct_eval_frameless_001.phpt b/ext/opcache/tests/ct_eval_frameless_001.phpt index 52fae8d013268..4d27b49d775b4 100644 --- a/ext/opcache/tests/ct_eval_frameless_001.phpt +++ b/ext/opcache/tests/ct_eval_frameless_001.phpt @@ -14,9 +14,10 @@ echo dirname(__DIR__); ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %sct_eval_frameless_001.php:1-4 0000 ECHO string("%sopcache") -0001 RETURN int(1) +0001 DEFER_RUN +0002 RETURN int(1) %sopcache diff --git a/ext/opcache/tests/ct_eval_frameless_002.phpt b/ext/opcache/tests/ct_eval_frameless_002.phpt index 35e3281c937a2..afbdaceab34b7 100644 --- a/ext/opcache/tests/ct_eval_frameless_002.phpt +++ b/ext/opcache/tests/ct_eval_frameless_002.phpt @@ -14,12 +14,13 @@ echo substr('foo', 1, $foo ? 1 : 1); ?> --EXPECTF-- $_main: - ; (lines=3, args=0, vars=1, tmps=0) + ; (lines=4, args=0, vars=1, tmps=0) ; (after optimizer) ; %sct_eval_frameless_002.php:1-4 0000 CHECK_VAR CV0($foo) 0001 ECHO string("o") -0002 RETURN int(1) +0002 DEFER_RUN +0003 RETURN int(1) Warning: Undefined variable $foo in %s on line %d o diff --git a/ext/opcache/tests/dump_property_hooks.phpt b/ext/opcache/tests/dump_property_hooks.phpt index 5083ad385f31f..8ec4a368da620 100644 --- a/ext/opcache/tests/dump_property_hooks.phpt +++ b/ext/opcache/tests/dump_property_hooks.phpt @@ -36,7 +36,7 @@ $a->prop = 41; ?> --EXPECTF-- $_main: - ; (lines=10, args=0, vars=1, tmps=%d) + ; (lines=11, args=0, vars=1, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:1-22 0000 V1 = NEW 0 string("A") @@ -48,23 +48,26 @@ $_main: 0006 DO_ICALL 0007 ASSIGN_OBJ CV0($a) string("prop") 0008 OP_DATA int(41) -0009 RETURN int(1) +0009 DEFER_RUN +0010 RETURN int(1) LIVE RANGES: 1: 0001 - 0002 (new) A::$prop::get: - ; (lines=1, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:5-8 -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) A::$prop::set: - ; (lines=4, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:9-13 0000 CV0($value) = RECV 1 0001 T1 = FAST_CONCAT string("Setting ") CV0($value) 0002 ECHO T1 -0003 RETURN null +0003 DEFER_RUN +0004 RETURN null int(42) Setting 41 diff --git a/ext/opcache/tests/gh18050.phpt b/ext/opcache/tests/gh18050.phpt index b641e1ae236c6..09cf8a7d1922a 100644 --- a/ext/opcache/tests/gh18050.phpt +++ b/ext/opcache/tests/gh18050.phpt @@ -35,7 +35,8 @@ $_main: 0003 INIT_FCALL 1 %d string("test") 0004 SEND_VAL string("z") 1 0005 DO_UCALL -0006 RETURN int(1) +0006 DEFER_RUN +0007 RETURN int(1) test: ; (lines=%d, args=%d, vars=%d, tmps=%d) @@ -57,7 +58,8 @@ test: 0013 T1 = IN_ARRAY 1 CV0($v) array(...) 0014 JMPZ T1 0016 0015 ECHO string("True\n") -0016 RETURN null +0016 DEFER_RUN +0017 RETURN null bool(true) bool(true) bool(true) diff --git a/ext/opcache/tests/gh19867.phpt b/ext/opcache/tests/gh19867.phpt index 486a366722dad..e3d5bafce1110 100644 --- a/ext/opcache/tests/gh19867.phpt +++ b/ext/opcache/tests/gh19867.phpt @@ -17,14 +17,18 @@ $_main: ; %s 0000 T0 = DECLARE_LAMBDA_FUNCTION 0 0001 FREE T0 -0002 RETURN int(1) +0002 DEFER_RUN +0003 RETURN int(1) {closure:%s:%d}: ; (lines=%d, args=0, vars=%d, tmps=%d) ; (after optimizer) ; %s 0000 T0 = DECLARE_LAMBDA_FUNCTION 0 -0001 RETURN T0 +0001 DEFER_RUN +0002 RETURN T0 +LIVE RANGES: + 0: 0001 - 0002 (tmp/var) {closure:%s:%d}: ; (lines=%d, args=2, vars=%d, tmps=%d) @@ -33,4 +37,7 @@ $_main: 0000 CV0($a) = RECV 1 0001 CV1($b) = RECV 2 0002 T2 = ADD CV0($a) CV1($b) -0003 RETURN T2 +0003 DEFER_RUN +0004 RETURN T2 +LIVE RANGES: + 2: 0003 - 0004 (tmp/var) diff --git a/ext/opcache/tests/match/001.phpt b/ext/opcache/tests/match/001.phpt index 502400681cf12..417b8ac92cfc3 100644 --- a/ext/opcache/tests/match/001.phpt +++ b/ext/opcache/tests/match/001.phpt @@ -28,7 +28,7 @@ foreach (range('a', 'i') as $char) { ?> --EXPECTF-- $_main: - ; (lines=15, args=0, vars=1, tmps=2) + ; (lines=16, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("range") @@ -45,23 +45,33 @@ $_main: 0011 DO_ICALL 0012 JMP 0005 0013 FE_FREE V1 -0014 RETURN int(1) +0014 DEFER_RUN +0015 RETURN int(1) LIVE RANGES: 1: 0005 - 0013 (loop) test: - ; (lines=9, args=1, vars=1, tmps=0) + ; (lines=16, args=1, vars=1, tmps=1) ; (after optimizer) ; %s 0000 CV0($char) = RECV 1 -0001 MATCH CV0($char) "a": 0003, "b": 0004, "c": 0004, "d": 0005, "e": 0006, "f": 0006, "g": 0007, "h": 0008, "i": 0008, default: 0002 +0001 MATCH CV0($char) "a": 0003, "b": 0005, "c": 0005, "d": 0007, "e": 0009, "f": 0009, "g": 0011, "h": 0013, "i": 0013, default: 0002 0002 MATCH_ERROR CV0($char) -0003 RETURN string("a") -0004 RETURN string("b, c") -0005 RETURN string("d") -0006 RETURN string("e, f") -0007 RETURN string("g") -0008 RETURN string("h, i") +0003 T1 = QM_ASSIGN string("a") +0004 JMP 0014 +0005 T1 = QM_ASSIGN string("b, c") +0006 JMP 0014 +0007 T1 = QM_ASSIGN string("d") +0008 JMP 0014 +0009 T1 = QM_ASSIGN string("e, f") +0010 JMP 0014 +0011 T1 = QM_ASSIGN string("g") +0012 JMP 0014 +0013 T1 = QM_ASSIGN string("h, i") +0014 DEFER_RUN +0015 RETURN T1 +LIVE RANGES: + 1: 0014 - 0015 (tmp/var) string(1) "a" string(4) "b, c" string(4) "b, c" diff --git a/ext/opcache/tests/match/002.phpt b/ext/opcache/tests/match/002.phpt index 005c2689d1b8a..2e1ef8160349d 100644 --- a/ext/opcache/tests/match/002.phpt +++ b/ext/opcache/tests/match/002.phpt @@ -31,27 +31,30 @@ test2(); ?> --EXPECTF-- $_main: - ; (lines=5, args=0, vars=0, tmps=0) + ; (lines=6, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 INIT_FCALL 0 %d string("test") 0001 DO_UCALL 0002 INIT_FCALL 0 %d string("test2") 0003 DO_UCALL -0004 RETURN int(1) +0004 DEFER_RUN +0005 RETURN int(1) test: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 ECHO string("No match\n") -0001 RETURN null +0001 DEFER_RUN +0002 RETURN null test2: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 ECHO string("No match\n") -0001 RETURN null +0001 DEFER_RUN +0002 RETURN null No match No match diff --git a/ext/opcache/tests/match/003.phpt b/ext/opcache/tests/match/003.phpt index 24f3cd2612105..91ee11f63b86a 100644 --- a/ext/opcache/tests/match/003.phpt +++ b/ext/opcache/tests/match/003.phpt @@ -29,7 +29,7 @@ foreach (range(0, 10) as $char) { ?> --EXPECTF-- $_main: - ; (lines=15, args=0, vars=1, tmps=2) + ; (lines=16, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("range") @@ -46,23 +46,34 @@ $_main: 0011 DO_ICALL 0012 JMP 0005 0013 FE_FREE V1 -0014 RETURN int(1) +0014 DEFER_RUN +0015 RETURN int(1) LIVE RANGES: 1: 0005 - 0013 (loop) test: - ; (lines=9, args=1, vars=1, tmps=0) + ; (lines=17, args=1, vars=1, tmps=1) ; (after optimizer) ; %s 0000 CV0($char) = RECV 1 -0001 MATCH CV0($char) 1: 0002, 2: 0003, 3: 0003, 4: 0004, 5: 0005, 6: 0005, 7: 0006, 8: 0007, 9: 0007, default: 0008 -0002 RETURN string("1") -0003 RETURN string("2, 3") -0004 RETURN string("4") -0005 RETURN string("5, 6") -0006 RETURN string("7") -0007 RETURN string("8, 9") -0008 RETURN string("default") +0001 MATCH CV0($char) 1: 0002, 2: 0004, 3: 0004, 4: 0006, 5: 0008, 6: 0008, 7: 0010, 8: 0012, 9: 0012, default: 0014 +0002 T1 = QM_ASSIGN string("1") +0003 JMP 0015 +0004 T1 = QM_ASSIGN string("2, 3") +0005 JMP 0015 +0006 T1 = QM_ASSIGN string("4") +0007 JMP 0015 +0008 T1 = QM_ASSIGN string("5, 6") +0009 JMP 0015 +0010 T1 = QM_ASSIGN string("7") +0011 JMP 0015 +0012 T1 = QM_ASSIGN string("8, 9") +0013 JMP 0015 +0014 T1 = QM_ASSIGN string("default") +0015 DEFER_RUN +0016 RETURN T1 +LIVE RANGES: + 1: 0015 - 0016 (tmp/var) string(7) "default" string(1) "1" string(4) "2, 3" diff --git a/ext/opcache/tests/match/004.phpt b/ext/opcache/tests/match/004.phpt index d9d4149b94510..a9f82e5d65657 100644 --- a/ext/opcache/tests/match/004.phpt +++ b/ext/opcache/tests/match/004.phpt @@ -34,7 +34,7 @@ foreach (range(0, 6) as $number) { ?> --EXPECTF-- $_main: - ; (lines=22, args=0, vars=1, tmps=2) + ; (lines=23, args=0, vars=1, tmps=2) ; (after optimizer) ; %s.php:1-25 0000 INIT_FCALL 2 %d string("range") @@ -58,27 +58,42 @@ $_main: 0018 DO_ICALL 0019 JMP 0005 0020 FE_FREE V1 -0021 RETURN int(1) +0021 DEFER_RUN +0022 RETURN int(1) LIVE RANGES: 1: 0005 - 0020 (loop) test: - ; (lines=13, args=1, vars=1, tmps=0) + ; (lines=25, args=1, vars=1, tmps=1) ; (after optimizer) ; %s.php:3-17 0000 CV0($value) = RECV 1 -0001 MATCH CV0($value) 1: 0002, "1": 0003, 2: 0004, "2": 0005, 3: 0006, "3": 0007, 4: 0008, "4": 0009, 5: 0010, "5": 0011, default: 0012 -0002 RETURN string("1 int") -0003 RETURN string("1 string") -0004 RETURN string("2 int") -0005 RETURN string("2 string") -0006 RETURN string("3 int") -0007 RETURN string("3 string") -0008 RETURN string("4 int") -0009 RETURN string("4 string") -0010 RETURN string("5 int") -0011 RETURN string("5 string") -0012 RETURN string("default") +0001 MATCH CV0($value) 1: 0002, "1": 0004, 2: 0006, "2": 0008, 3: 0010, "3": 0012, 4: 0014, "4": 0016, 5: 0018, "5": 0020, default: 0022 +0002 T1 = QM_ASSIGN string("1 int") +0003 JMP 0023 +0004 T1 = QM_ASSIGN string("1 string") +0005 JMP 0023 +0006 T1 = QM_ASSIGN string("2 int") +0007 JMP 0023 +0008 T1 = QM_ASSIGN string("2 string") +0009 JMP 0023 +0010 T1 = QM_ASSIGN string("3 int") +0011 JMP 0023 +0012 T1 = QM_ASSIGN string("3 string") +0013 JMP 0023 +0014 T1 = QM_ASSIGN string("4 int") +0015 JMP 0023 +0016 T1 = QM_ASSIGN string("4 string") +0017 JMP 0023 +0018 T1 = QM_ASSIGN string("5 int") +0019 JMP 0023 +0020 T1 = QM_ASSIGN string("5 string") +0021 JMP 0023 +0022 T1 = QM_ASSIGN string("default") +0023 DEFER_RUN +0024 RETURN T1 +LIVE RANGES: + 1: 0023 - 0024 (tmp/var) string(7) "default" string(7) "default" string(5) "1 int" diff --git a/ext/opcache/tests/match/005.phpt b/ext/opcache/tests/match/005.phpt index 5726336d53922..d8dfd7d1ad6af 100644 --- a/ext/opcache/tests/match/005.phpt +++ b/ext/opcache/tests/match/005.phpt @@ -23,7 +23,7 @@ var_dump($result); ?> --EXPECTF-- $_main: - ; (lines=20, args=0, vars=2, tmps=1) + ; (lines=21, args=0, vars=2, tmps=1) ; (after optimizer) ; %s 0000 ASSIGN CV0($text) string("Bienvenue chez nous") @@ -45,5 +45,6 @@ $_main: 0016 INIT_FCALL 1 %d string("var_dump") 0017 SEND_VAR CV1($result) 1 0018 DO_ICALL -0019 RETURN int(1) +0019 DEFER_RUN +0020 RETURN int(1) string(2) "fr" diff --git a/ext/opcache/tests/named_parameter_new.phpt b/ext/opcache/tests/named_parameter_new.phpt index 1f6f64333c988..706f352a23f5b 100644 --- a/ext/opcache/tests/named_parameter_new.phpt +++ b/ext/opcache/tests/named_parameter_new.phpt @@ -33,16 +33,17 @@ MyClass::new(bar: 1); ?> --EXPECTF-- $_main: - ; (lines=4, args=0, vars=0, tmps=%d) + ; (lines=5, args=0, vars=0, tmps=%d) ; (after optimizer) ; %s 0000 INIT_STATIC_METHOD_CALL 1 string("MyClass") string("new") 0001 SEND_VAL int(1) 1 0002 DO_UCALL -0003 RETURN int(1) +0003 DEFER_RUN +0004 RETURN int(1) MyClass::__construct: - ; (lines=7, args=2, vars=2, tmps=%d) + ; (lines=8, args=2, vars=2, tmps=%d) ; (after optimizer) ; %s 0000 CV0($foo) = RECV 1 @@ -51,10 +52,11 @@ MyClass::__construct: 0003 OP_DATA CV0($foo) 0004 ASSIGN_OBJ THIS string("bar") 0005 OP_DATA CV1($bar) -0006 RETURN null +0006 DEFER_RUN +0007 RETURN null MyClass::new: - ; (lines=10, args=1, vars=2, tmps=%d) + ; (lines=11, args=1, vars=2, tmps=%d) ; (after optimizer) ; %s 0000 CV0($bar) = RECV 1 @@ -66,7 +68,9 @@ MyClass::new: 0006 SEND_VAR CV1($engine) 1 0007 SEND_VAR CV0($bar) 2 0008 DO_FCALL -0009 RETURN V2 +0009 DEFER_RUN +0010 RETURN V2 LIVE RANGES: 2: 0002 - 0004 (new) 2: 0006 - 0009 (new) + 2: 0009 - 0010 (tmp/var) diff --git a/ext/opcache/tests/opt/block_pass_007.phpt b/ext/opcache/tests/opt/block_pass_007.phpt index b2dca320d9b76..0b981d7532398 100644 --- a/ext/opcache/tests/opt/block_pass_007.phpt +++ b/ext/opcache/tests/opt/block_pass_007.phpt @@ -18,7 +18,7 @@ var_dump(!!$f === false); ?> --EXPECTF-- $_main: - ; (lines=22, args=0, vars=1, tmps=%d) + ; (lines=23, args=0, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("random_int") @@ -42,7 +42,8 @@ $_main: 0018 T1 = BOOL_NOT CV0($f) 0019 SEND_VAL T1 1 0020 DO_ICALL -0021 RETURN int(1) +0021 DEFER_RUN +0022 RETURN int(1) bool(false) bool(true) bool(true) diff --git a/ext/opcache/tests/opt/coalesce.phpt b/ext/opcache/tests/opt/coalesce.phpt index f60294aadc236..63d03d3fa9b36 100644 --- a/ext/opcache/tests/opt/coalesce.phpt +++ b/ext/opcache/tests/opt/coalesce.phpt @@ -24,21 +24,24 @@ function b() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) a: - ; (lines=2, args=0, vars=1, tmps=1) + ; (lines=3, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = COALESCE CV0($test) 0001 -0001 RETURN bool(true) +0001 DEFER_RUN +0002 RETURN bool(true) b: - ; (lines=2, args=0, vars=1, tmps=1) + ; (lines=3, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = COALESCE CV0($test) 0001 -0001 RETURN bool(true) +0001 DEFER_RUN +0002 RETURN bool(true) diff --git a/ext/opcache/tests/opt/dce_001.phpt b/ext/opcache/tests/opt/dce_001.phpt index 5f9b001a5def8..da18be28317b8 100644 --- a/ext/opcache/tests/opt/dce_001.phpt +++ b/ext/opcache/tests/opt/dce_001.phpt @@ -19,17 +19,19 @@ function foo(string $s1, string $s2, string $s3, string $s4) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_001.php:1-8 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=5, args=4, vars=4, tmps=0) + ; (lines=6, args=4, vars=4, tmps=0) ; (after optimizer) ; %sdce_001.php:2-6 0000 CV0($s1) = RECV 1 0001 CV1($s2) = RECV 2 0002 CV2($s3) = RECV 3 0003 CV3($s4) = RECV 4 -0004 RETURN int(0) +0004 DEFER_RUN +0005 RETURN int(0) diff --git a/ext/opcache/tests/opt/dce_002.phpt b/ext/opcache/tests/opt/dce_002.phpt index 44f1fb403c26b..e8a3436853394 100644 --- a/ext/opcache/tests/opt/dce_002.phpt +++ b/ext/opcache/tests/opt/dce_002.phpt @@ -22,17 +22,19 @@ function foo(int $a) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_002.php:1-11 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=5, args=1, vars=2, tmps=0) + ; (lines=6, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_002.php:2-9 0000 CV0($a) = RECV 1 0001 CV0($a) = QM_ASSIGN int(10) 0002 CV1($x) = FUNC_GET_ARGS 0003 CV0($a) = QM_ASSIGN int(30) -0004 RETURN CV1($x) +0004 DEFER_RUN +0005 RETURN CV1($x) diff --git a/ext/opcache/tests/opt/dce_003.phpt b/ext/opcache/tests/opt/dce_003.phpt index 22355baa68d86..d1c06682b4182 100644 --- a/ext/opcache/tests/opt/dce_003.phpt +++ b/ext/opcache/tests/opt/dce_003.phpt @@ -18,15 +18,17 @@ function foo(int $a) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_003.php:1-7 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %sdce_003.php:2-5 0000 CV0($a) = RECV 1 0001 CV0($a) = ADD CV0($a) int(3) -0002 RETURN CV0($a) +0002 DEFER_RUN +0003 RETURN CV0($a) diff --git a/ext/opcache/tests/opt/dce_004.phpt b/ext/opcache/tests/opt/dce_004.phpt index 2c7e785e4f536..901630a48c522 100644 --- a/ext/opcache/tests/opt/dce_004.phpt +++ b/ext/opcache/tests/opt/dce_004.phpt @@ -20,16 +20,18 @@ function foo(int $x, int $y) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_004.php:1-9 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=4, args=2, vars=3, tmps=0) + ; (lines=5, args=2, vars=3, tmps=0) ; (after optimizer) ; %sdce_004.php:2-7 0000 CV0($x) = RECV 1 0001 CV1($y) = RECV 2 0002 CV2($a) = QM_ASSIGN CV1($y) -0003 RETURN CV2($a) +0003 DEFER_RUN +0004 RETURN CV2($a) diff --git a/ext/opcache/tests/opt/dce_005.phpt b/ext/opcache/tests/opt/dce_005.phpt index c413913aedb8e..bf7d70d1e08db 100644 --- a/ext/opcache/tests/opt/dce_005.phpt +++ b/ext/opcache/tests/opt/dce_005.phpt @@ -21,14 +21,16 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=2, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %s 0000 CV0($x) = RECV 1 -0001 RETURN null +0001 DEFER_RUN +0002 RETURN null diff --git a/ext/opcache/tests/opt/dce_006.phpt b/ext/opcache/tests/opt/dce_006.phpt index 2596651ed3e91..0fdfc33b302d7 100644 --- a/ext/opcache/tests/opt/dce_006.phpt +++ b/ext/opcache/tests/opt/dce_006.phpt @@ -21,13 +21,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_006.php:1-10 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=7, args=1, vars=2, tmps=1) + ; (lines=8, args=1, vars=2, tmps=1) ; (after optimizer) ; %sdce_006.php:5-8 0000 CV0($x) = RECV 1 @@ -36,12 +37,14 @@ foo: 0003 CV1($a) = QM_ASSIGN V2 0004 ASSIGN_OBJ CV1($a) string("foo") 0005 OP_DATA CV0($x) -0006 RETURN null +0006 DEFER_RUN +0007 RETURN null LIVE RANGES: 2: 0002 - 0003 (new) A::__destruct: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_006.php:3-3 -0000 RETURN null +0000 DEFER_RUN +0001 RETURN null diff --git a/ext/opcache/tests/opt/dce_007.phpt b/ext/opcache/tests/opt/dce_007.phpt index 9139e0478ece6..c085165f6bed8 100644 --- a/ext/opcache/tests/opt/dce_007.phpt +++ b/ext/opcache/tests/opt/dce_007.phpt @@ -19,15 +19,17 @@ function esc($x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_007.php:1-8 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) esc: - ; (lines=3, args=1, vars=2, tmps=0) + ; (lines=4, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_007.php:2-6 0000 CV0($x) = RECV 1 0001 CV1($a) = INIT_ARRAY 1 (packed) CV0($x) NEXT -0002 RETURN CV1($a) +0002 DEFER_RUN +0003 RETURN CV1($a) diff --git a/ext/opcache/tests/opt/dce_008.phpt b/ext/opcache/tests/opt/dce_008.phpt index 697e29f1ab309..e7e753bfaa3db 100644 --- a/ext/opcache/tests/opt/dce_008.phpt +++ b/ext/opcache/tests/opt/dce_008.phpt @@ -19,16 +19,18 @@ function esc(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_008.php:1-8 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) esc: - ; (lines=4, args=1, vars=2, tmps=0) + ; (lines=5, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_008.php:2-6 0000 CV0($x) = RECV 1 0001 ASSIGN_DIM CV1($a) int(0) 0002 OP_DATA CV0($x) -0003 RETURN CV1($a) +0003 DEFER_RUN +0004 RETURN CV1($a) diff --git a/ext/opcache/tests/opt/dce_009.phpt b/ext/opcache/tests/opt/dce_009.phpt index 996825cf96e1a..936f2ae66b3c9 100644 --- a/ext/opcache/tests/opt/dce_009.phpt +++ b/ext/opcache/tests/opt/dce_009.phpt @@ -35,7 +35,7 @@ Loop::test3(); ?> --EXPECTF-- $_main: - ; (lines=7, args=0, vars=0, tmps=0) + ; (lines=8, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:1-24 0000 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test") @@ -44,28 +44,32 @@ $_main: 0003 DO_UCALL 0004 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test3") 0005 DO_UCALL -0006 RETURN int(1) +0006 DEFER_RUN +0007 RETURN int(1) Loop::test: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=4, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:4-10 0000 ECHO string("Start\n") 0001 ECHO string("Done\n") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null Loop::test2: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:11-14 -0000 RETURN null +0000 DEFER_RUN +0001 RETURN null Loop::test3: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %sdce_009.php:15-18 0000 V0 = FE_RESET_RW array(...) 0001 0001 FE_FREE V0 -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null Start Done diff --git a/ext/opcache/tests/opt/gh11170.phpt b/ext/opcache/tests/opt/gh11170.phpt index 9ea733f92b104..49389c04fed01 100644 --- a/ext/opcache/tests/opt/gh11170.phpt +++ b/ext/opcache/tests/opt/gh11170.phpt @@ -39,7 +39,7 @@ test_and(); ?> --EXPECTF-- $_main: - ; (lines=5, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=6, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[1..1] @@ -50,10 +50,11 @@ BB0: 0001 DO_UCALL 0002 INIT_FCALL 0 %d string("test_and") 0003 DO_UCALL -0004 RETURN int(1) +0004 DEFER_RUN +0005 RETURN int(1) test_or: - ; (lines=11, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) + ; (lines=12, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[-20..-1] @@ -96,10 +97,11 @@ BB3: #8.CV0($a) [long] RANGE[-27..-7] = Phi(#4.CV0($a) [long] RANGE[-27..-27], #6.CV0($a) [long] RANGE[-7..-7]) #9.CV1($b) [long] RANGE[-20..-10] = Phi(#5.CV1($b) [long] RANGE[-20..-20], #7.CV1($b) [long] RANGE[-10..-10]) 0009 #10.T8 [long] RANGE[-20..-1] = BW_OR #8.CV0($a) [long] RANGE[-27..-7] #9.CV1($b) [long] RANGE[-20..-10] -0010 RETURN #10.T8 [long] RANGE[-20..-1] +0010 DEFER_RUN +0011 RETURN #10.T8 [long] RANGE[-20..-1] test_and: - ; (lines=11, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) + ; (lines=12, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[-28..-25] @@ -142,4 +144,5 @@ BB3: #8.CV0($a) [long] RANGE[-12..-9] = Phi(#4.CV0($a) [long] RANGE[-12..-12], #6.CV0($a) [long] RANGE[-9..-9]) #9.CV1($b) [long] RANGE[-27..-25] = Phi(#5.CV1($b) [long] RANGE[-27..-27], #7.CV1($b) [long] RANGE[-25..-25]) 0009 #10.T8 [long] RANGE[-28..-25] = BW_AND #8.CV0($a) [long] RANGE[-12..-9] #9.CV1($b) [long] RANGE[-27..-25] -0010 RETURN #10.T8 [long] RANGE[-28..-25] +0010 DEFER_RUN +0011 RETURN #10.T8 [long] RANGE[-28..-25] diff --git a/ext/opcache/tests/opt/gh11245_1.phpt b/ext/opcache/tests/opt/gh11245_1.phpt index 06d6da1413771..093bf133bc07c 100644 --- a/ext/opcache/tests/opt/gh11245_1.phpt +++ b/ext/opcache/tests/opt/gh11245_1.phpt @@ -19,16 +19,19 @@ switch (xx()) { ?> --EXPECTF-- $_main: - ; (lines=4, args=0, vars=1, tmps=1) + ; (lines=5, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = ISSET_ISEMPTY_CV (empty) CV0($xx) 0001 JMPNZ T1 0003 -0002 RETURN null -0003 RETURN int(1) +0002 DEFER_RUN +0003 RETURN null +0003 DEFER_RUN +0004 RETURN int(1) xx: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN string("somegarbage") +0000 DEFER_RUN +0001 RETURN string("somegarbage") diff --git a/ext/opcache/tests/opt/gh11245_2.phpt b/ext/opcache/tests/opt/gh11245_2.phpt index ade810c453b13..c331119932cac 100644 --- a/ext/opcache/tests/opt/gh11245_2.phpt +++ b/ext/opcache/tests/opt/gh11245_2.phpt @@ -22,16 +22,18 @@ switch (++X::$prop) { ?> --EXPECTF-- $_main: - ; (lines=7, args=0, vars=1, tmps=2) + ; (lines=8, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 T1 = PRE_INC_STATIC_PROP string("prop") string("X") 0001 T2 = ISSET_ISEMPTY_CV (empty) CV0($xx) 0002 JMPZ T2 0005 0003 FREE T1 -0004 RETURN null +0004 DEFER_RUN +0005 RETURN null 0005 FREE T1 -0006 RETURN int(1) +0006 DEFER_RUN +0007 RETURN int(1) LIVE RANGES: 1: 0001 - 0005 (tmp/var) diff --git a/ext/opcache/tests/opt/gh14873.phpt b/ext/opcache/tests/opt/gh14873.phpt index d442128d023c8..afaeb7abe7eb7 100644 --- a/ext/opcache/tests/opt/gh14873.phpt +++ b/ext/opcache/tests/opt/gh14873.phpt @@ -56,7 +56,7 @@ var_dump(testStrstr3Third(false)); ?> --EXPECTF-- $_main: - ; (lines=43, args=0, vars=0, tmps=%d) + ; (lines=44, args=0, vars=0, tmps=%d) ; (after optimizer) ; %s 0000 INIT_FCALL 1 %d string("var_dump") @@ -101,49 +101,54 @@ $_main: 0039 V0 = DO_UCALL 0040 SEND_VAR V0 1 0041 DO_ICALL -0042 RETURN int(1) +0042 DEFER_RUN +0043 RETURN int(1) testTrim1: - ; (lines=4, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_1(trim) CV0($value) 0002 ASSIGN CV0($value) T1 -0003 RETURN CV0($value) +0003 DEFER_RUN +0004 RETURN CV0($value) testMin2First: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_2(min) CV0($value) int(100) 0002 CV0($value) = QM_ASSIGN T1 0003 VERIFY_RETURN_TYPE CV0($value) -0004 RETURN CV0($value) +0004 DEFER_RUN +0005 RETURN CV0($value) testMin2Second: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_2(min) int(100) CV0($value) 0002 CV0($value) = QM_ASSIGN T1 0003 VERIFY_RETURN_TYPE CV0($value) -0004 RETURN CV0($value) +0004 DEFER_RUN +0005 RETURN CV0($value) testMin2_TMP: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = ADD CV0($value) int(1) 0002 CV0($value) = FRAMELESS_ICALL_2(min) T1 int(100) 0003 VERIFY_RETURN_TYPE CV0($value) -0004 RETURN CV0($value) +0004 DEFER_RUN +0005 RETURN CV0($value) testStrstr3First: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=7, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -151,12 +156,13 @@ testStrstr3First: 0002 OP_DATA bool(false) 0003 ASSIGN CV0($value) T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 RETURN CV0($value) +0005 DEFER_RUN +0006 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) testStrstr3Second: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=7, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -164,12 +170,13 @@ testStrstr3Second: 0002 OP_DATA bool(false) 0003 ASSIGN CV0($value) T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 RETURN CV0($value) +0005 DEFER_RUN +0006 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) testStrstr3Third: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=7, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -177,7 +184,8 @@ testStrstr3Third: 0002 OP_DATA CV0($value) 0003 CV0($value) = QM_ASSIGN T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 RETURN CV0($value) +0005 DEFER_RUN +0006 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) string(3) "boo" diff --git a/ext/opcache/tests/opt/gh18107_2.phpt b/ext/opcache/tests/opt/gh18107_2.phpt index bd34a54edf6e6..60bdde53d2df3 100644 --- a/ext/opcache/tests/opt/gh18107_2.phpt +++ b/ext/opcache/tests/opt/gh18107_2.phpt @@ -45,7 +45,8 @@ $_main: 0012 DO_FCALL 0013 THROW V7 0014 FAST_RET T6 -0015 RETURN int(1) +0015 DEFER_RUN +0016 RETURN int(1) EXCEPTION TABLE: 0006, 0006, 0010, 0014 diff --git a/ext/opcache/tests/opt/inference_frameless.phpt b/ext/opcache/tests/opt/inference_frameless.phpt index 3462053393ff8..56bf5d150b2b5 100644 --- a/ext/opcache/tests/opt/inference_frameless.phpt +++ b/ext/opcache/tests/opt/inference_frameless.phpt @@ -16,16 +16,18 @@ function _strpos(string $str): int|false { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sinference_frameless.php:1-6 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) _strpos: - ; (lines=4, args=1, vars=1, tmps=1) + ; (lines=5, args=1, vars=1, tmps=1) ; (after optimizer) ; %sinference_frameless.php:2-4 0000 CV0($str) = RECV 1 0001 T1 = FRAMELESS_ICALL_3(strpos) CV0($str) string("o") 0002 OP_DATA int(1) -0003 RETURN T1 +0003 DEFER_RUN +0004 RETURN T1 diff --git a/ext/opcache/tests/opt/jmp_001.phpt b/ext/opcache/tests/opt/jmp_001.phpt index 71ff73671e81b..950464ae28a82 100644 --- a/ext/opcache/tests/opt/jmp_001.phpt +++ b/ext/opcache/tests/opt/jmp_001.phpt @@ -18,16 +18,18 @@ function test() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s:1-8 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) test: - ; (lines=4, args=0, vars=1, tmps=1) + ; (lines=5, args=0, vars=1, tmps=1) ; (after optimizer) ; %s:2-6 0000 INIT_FCALL_BY_NAME 0 string("test2") 0001 V1 = DO_FCALL_BY_NAME 0002 CV0($var) = QM_ASSIGN V1 -0003 RETURN CV0($var) +0003 DEFER_RUN +0004 RETURN CV0($var) diff --git a/ext/opcache/tests/opt/nullsafe_001.phpt b/ext/opcache/tests/opt/nullsafe_001.phpt index 171ac7190af9d..19294405b9cb1 100644 --- a/ext/opcache/tests/opt/nullsafe_001.phpt +++ b/ext/opcache/tests/opt/nullsafe_001.phpt @@ -27,13 +27,14 @@ function test2(object $obj) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) test: - ; (lines=10, args=0, vars=0, tmps=0) + ; (lines=11, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 INIT_FCALL 1 %d string("var_dump") @@ -45,10 +46,11 @@ test: 0006 INIT_FCALL 1 %d string("var_dump") 0007 SEND_VAL bool(true) 1 0008 DO_ICALL -0009 RETURN null +0009 DEFER_RUN +0010 RETURN null test2: - ; (lines=17, args=1, vars=1, tmps=1) + ; (lines=18, args=1, vars=1, tmps=1) ; (after optimizer) ; %s 0000 CV0($obj) = RECV 1 @@ -67,4 +69,5 @@ test2: 0013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo") 0014 SEND_VAL T1 1 0015 DO_ICALL -0016 RETURN null +0016 DEFER_RUN +0017 RETURN null diff --git a/ext/opcache/tests/opt/nullsafe_002.phpt b/ext/opcache/tests/opt/nullsafe_002.phpt index a8d9f1482c6e1..51d40122ef9c5 100644 --- a/ext/opcache/tests/opt/nullsafe_002.phpt +++ b/ext/opcache/tests/opt/nullsafe_002.phpt @@ -20,17 +20,18 @@ function test(?Test $test) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=2, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (before dfa pass) ; %s ; return [long] RANGE[1..1] BB0: ; start exit lines=[0-0] ; level=0 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) test: - ; (lines=7, args=1, vars=1, tmps=%d, ssa_vars=6, no_loops) + ; (lines=8, args=1, vars=1, tmps=%d, ssa_vars=6, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -61,4 +62,5 @@ BB2: #5.X1 [null, long] = Phi(#2.X1 [null], #4.X1 [long]) 0004 SEND_VAL #5.T1 [null, long] 1 0005 DO_ICALL -0006 RETURN null +0006 DEFER_RUN +0007 RETURN null diff --git a/ext/opcache/tests/opt/prop_types.phpt b/ext/opcache/tests/opt/prop_types.phpt index ec57bf13580cf..c1c27ef0df286 100644 --- a/ext/opcache/tests/opt/prop_types.phpt +++ b/ext/opcache/tests/opt/prop_types.phpt @@ -40,17 +40,18 @@ function noScope(Test $test) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=2, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (before dfa pass) ; %s ; return [long] RANGE[1..1] BB0: ; start exit lines=[0-0] ; level=0 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) noScope: - ; (lines=10, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) + ; (lines=11, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -67,10 +68,11 @@ BB0: 0006 #4.T3 [any] = FETCH_OBJ_R #1.CV0($test) [object (instanceof Test)] string("private") 0007 SEND_VAL #4.T3 [any] 3 0008 DO_ICALL -0009 RETURN null +0009 DEFER_RUN +0010 RETURN null Test::inTest: - ; (lines=9, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) + ; (lines=10, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -85,10 +87,11 @@ BB0: 0005 #2.T2 [double] = FETCH_OBJ_R THIS string("private") 0006 SEND_VAL #2.T2 [double] 3 0007 DO_ICALL -0008 RETURN null +0008 DEFER_RUN +0009 RETURN null Test::inTestWithTest2: - ; (lines=10, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) + ; (lines=11, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -105,10 +108,11 @@ BB0: 0006 #4.T3 [double] = FETCH_OBJ_R #1.CV0($test2) [object (instanceof Test2)] string("private") 0007 SEND_VAL #4.T3 [double] 3 0008 DO_ICALL -0009 RETURN null +0009 DEFER_RUN +0010 RETURN null Test2::inTest2: - ; (lines=9, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) + ; (lines=10, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -123,4 +127,5 @@ BB0: 0005 #2.T2 [array of [any, ref]] = FETCH_OBJ_R THIS string("private") 0006 SEND_VAL #2.T2 [array of [any, ref]] 3 0007 DO_ICALL -0008 RETURN null +0008 DEFER_RUN +0009 RETURN null diff --git a/ext/opcache/tests/opt/sccp_001.phpt b/ext/opcache/tests/opt/sccp_001.phpt index 727a239e8f2b4..e8c2242cda122 100644 --- a/ext/opcache/tests/opt/sccp_001.phpt +++ b/ext/opcache/tests/opt/sccp_001.phpt @@ -20,13 +20,15 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_001.php:1-9 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_001.php:2-7 -0000 RETURN int(4) +0000 DEFER_RUN +0001 RETURN int(4) diff --git a/ext/opcache/tests/opt/sccp_002.phpt b/ext/opcache/tests/opt/sccp_002.phpt index b290d752e7e2c..e77dc936d27d7 100644 --- a/ext/opcache/tests/opt/sccp_002.phpt +++ b/ext/opcache/tests/opt/sccp_002.phpt @@ -25,16 +25,18 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_002.php:1-14 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=5, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_002.php:2-12 0000 CV0($x) = RECV 1 0001 ECHO string("1") 0002 ECHO string("1") -0003 RETURN null +0003 DEFER_RUN +0004 RETURN null diff --git a/ext/opcache/tests/opt/sccp_003.phpt b/ext/opcache/tests/opt/sccp_003.phpt index 4db7fe4d13c56..e5a349329855b 100644 --- a/ext/opcache/tests/opt/sccp_003.phpt +++ b/ext/opcache/tests/opt/sccp_003.phpt @@ -25,15 +25,17 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_003.php:1-14 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=4, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_003.php:2-12 0000 ECHO string("1") 0001 ECHO string("1") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_004.phpt b/ext/opcache/tests/opt/sccp_004.phpt index 4a0a7598e49c2..39d3bfbaf1cde 100644 --- a/ext/opcache/tests/opt/sccp_004.phpt +++ b/ext/opcache/tests/opt/sccp_004.phpt @@ -28,16 +28,18 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_004.php:1-17 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=5, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_004.php:2-15 0000 CV0($x) = RECV 1 0001 ECHO string("1") 0002 ECHO string("1") -0003 RETURN null +0003 DEFER_RUN +0004 RETURN null diff --git a/ext/opcache/tests/opt/sccp_005.phpt b/ext/opcache/tests/opt/sccp_005.phpt index a673d3092de80..7e229e7add75a 100644 --- a/ext/opcache/tests/opt/sccp_005.phpt +++ b/ext/opcache/tests/opt/sccp_005.phpt @@ -18,15 +18,17 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_005.php:1-7 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_005.php:2-5 0000 CV0($x) = RECV 1 0001 ECHO string("2") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_006.phpt b/ext/opcache/tests/opt/sccp_006.phpt index 49754566e0785..e6eb526da19f4 100644 --- a/ext/opcache/tests/opt/sccp_006.phpt +++ b/ext/opcache/tests/opt/sccp_006.phpt @@ -18,13 +18,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_006.php:1-7 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=8, args=1, vars=2, tmps=1) + ; (lines=9, args=1, vars=2, tmps=1) ; (after optimizer) ; %ssccp_006.php:2-5 0000 CV0($x) = RECV 1 @@ -34,6 +35,7 @@ foo: 0004 CV1($a) = QM_ASSIGN T2 0005 T2 = FETCH_DIM_R CV1($a) string("a") 0006 ECHO T2 -0007 RETURN null +0007 DEFER_RUN +0008 RETURN null LIVE RANGES: 2: 0002 - 0004 (tmp/var) diff --git a/ext/opcache/tests/opt/sccp_007.phpt b/ext/opcache/tests/opt/sccp_007.phpt index 807ce7ed764ac..2746cfd0e5538 100644 --- a/ext/opcache/tests/opt/sccp_007.phpt +++ b/ext/opcache/tests/opt/sccp_007.phpt @@ -22,15 +22,17 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_007.php:1-11 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_007.php:2-9 0000 CV0($x) = RECV 1 0001 ECHO string("0") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_008.phpt b/ext/opcache/tests/opt/sccp_008.phpt index f1df4b59980d5..78a48ae820bcc 100644 --- a/ext/opcache/tests/opt/sccp_008.phpt +++ b/ext/opcache/tests/opt/sccp_008.phpt @@ -22,13 +22,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_008.php:1-11 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=8, args=1, vars=2, tmps=1) + ; (lines=9, args=1, vars=2, tmps=1) ; (after optimizer) ; %ssccp_008.php:2-9 0000 CV0($x) = RECV 1 @@ -38,4 +39,5 @@ foo: 0004 CV1($a) = QM_ASSIGN array(...) 0005 T2 = FETCH_DIM_R CV1($a) int(1) 0006 ECHO T2 -0007 RETURN null +0007 DEFER_RUN +0008 RETURN null diff --git a/ext/opcache/tests/opt/sccp_009.phpt b/ext/opcache/tests/opt/sccp_009.phpt index 34995a0546e60..0a2b38a8345f5 100644 --- a/ext/opcache/tests/opt/sccp_009.phpt +++ b/ext/opcache/tests/opt/sccp_009.phpt @@ -19,15 +19,17 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_009.php:1-8 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_009.php:2-6 0000 CV0($x) = RECV 1 0001 ECHO string("2") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_010.phpt b/ext/opcache/tests/opt/sccp_010.phpt index e4bf72116604d..b29532b8a8ced 100644 --- a/ext/opcache/tests/opt/sccp_010.phpt +++ b/ext/opcache/tests/opt/sccp_010.phpt @@ -26,15 +26,17 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_010.php:1-15 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=4, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_010.php:2-13 0000 ECHO string("1") 0001 ECHO string("1") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_011.phpt b/ext/opcache/tests/opt/sccp_011.phpt index 78455aa0d80bd..95f74d42882a6 100644 --- a/ext/opcache/tests/opt/sccp_011.phpt +++ b/ext/opcache/tests/opt/sccp_011.phpt @@ -25,15 +25,17 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_011.php:1-14 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_011.php:2-12 0000 CV0($x) = RECV 1 0001 ECHO string("0") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_012.phpt b/ext/opcache/tests/opt/sccp_012.phpt index dbd5ee4fd003b..8f1a71184da58 100644 --- a/ext/opcache/tests/opt/sccp_012.phpt +++ b/ext/opcache/tests/opt/sccp_012.phpt @@ -28,15 +28,17 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_012.php:1-17 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=4, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_012.php:2-15 0000 ECHO string("1") 0001 ECHO string("4") -0002 RETURN null +0002 DEFER_RUN +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_016.phpt b/ext/opcache/tests/opt/sccp_016.phpt index 3e540ea6ce678..23698369b79e2 100644 --- a/ext/opcache/tests/opt/sccp_016.phpt +++ b/ext/opcache/tests/opt/sccp_016.phpt @@ -15,10 +15,11 @@ return isset($undef) || php_sapi_name() == php_sapi_name(); ?> --EXPECTF-- $_main: - ; (lines=4, args=0, vars=1, tmps=1) + ; (lines=5, args=0, vars=1, tmps=1) ; (after optimizer) ; %ssccp_016.php:1-4 0000 T1 = ISSET_ISEMPTY_CV (isset) CV0($undef) 0001 T1 = JMPNZ_EX T1 0003 0002 T1 = QM_ASSIGN bool(true) -0003 RETURN T1 +0003 DEFER_RUN +0004 RETURN T1 diff --git a/ext/opcache/tests/opt/sccp_017.phpt b/ext/opcache/tests/opt/sccp_017.phpt index 5afc24bf60ce5..ef317fd818e81 100644 --- a/ext/opcache/tests/opt/sccp_017.phpt +++ b/ext/opcache/tests/opt/sccp_017.phpt @@ -21,14 +21,16 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_017.php:1-10 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=2, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_017.php:2-8 0000 CV0($x) = RECV 1 -0001 RETURN int(5) +0001 DEFER_RUN +0002 RETURN int(5) diff --git a/ext/opcache/tests/opt/sccp_019.phpt b/ext/opcache/tests/opt/sccp_019.phpt index 00c8a34c2c060..e17676cd3e187 100644 --- a/ext/opcache/tests/opt/sccp_019.phpt +++ b/ext/opcache/tests/opt/sccp_019.phpt @@ -20,14 +20,16 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_019.php:1-9 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=2, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_019.php:2-7 0000 CV0($x) = RECV 1 -0001 RETURN int(5) +0001 DEFER_RUN +0002 RETURN int(5) diff --git a/ext/opcache/tests/opt/sccp_022.phpt b/ext/opcache/tests/opt/sccp_022.phpt index ffcc48b0dccd9..baef5d22791a8 100644 --- a/ext/opcache/tests/opt/sccp_022.phpt +++ b/ext/opcache/tests/opt/sccp_022.phpt @@ -26,13 +26,14 @@ function bar() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=11, args=1, vars=2, tmps=1) + ; (lines=12, args=1, vars=2, tmps=1) ; (after optimizer) ; %s 0000 CV0($x) = RECV 1 @@ -45,10 +46,11 @@ foo: 0007 OP_DATA int(5) 0008 T2 = FETCH_DIM_R CV1($a) int(1) 0009 ECHO T2 -0010 RETURN null +0010 DEFER_RUN +0011 RETURN null bar: - ; (lines=9, args=0, vars=3, tmps=2) + ; (lines=10, args=0, vars=3, tmps=2) ; (after optimizer) ; %s 0000 V3 = FE_RESET_R CV0($a) 0007 @@ -59,7 +61,8 @@ bar: 0005 FE_FREE V4 0006 JMP 0001 0007 FE_FREE V3 -0008 RETURN null +0008 DEFER_RUN +0009 RETURN null LIVE RANGES: 3: 0001 - 0007 (loop) 4: 0003 - 0005 (loop) diff --git a/ext/opcache/tests/opt/sccp_024.phpt b/ext/opcache/tests/opt/sccp_024.phpt index 56be429cc7994..8ca6fdc76e6aa 100644 --- a/ext/opcache/tests/opt/sccp_024.phpt +++ b/ext/opcache/tests/opt/sccp_024.phpt @@ -24,13 +24,14 @@ class A { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_024.php:1-13 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) A::t: - ; (lines=10, args=1, vars=2, tmps=2) + ; (lines=11, args=1, vars=2, tmps=2) ; (after optimizer) ; %ssccp_024.php:3-10 0000 CV0($obj) = RECV 1 @@ -42,4 +43,5 @@ A::t: 0006 V3 = FETCH_CLASS (no-autoload) (silent) (exception) CV1($c) 0007 T2 = INSTANCEOF CV0($obj) V3 0008 ECHO T2 -0009 RETURN null +0009 DEFER_RUN +0010 RETURN null diff --git a/ext/opcache/tests/opt/sccp_026.phpt b/ext/opcache/tests/opt/sccp_026.phpt index 3e318a7f75dfe..29371f29c25b9 100644 --- a/ext/opcache/tests/opt/sccp_026.phpt +++ b/ext/opcache/tests/opt/sccp_026.phpt @@ -21,21 +21,24 @@ function test($var) { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s:1-10 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) test: - ; (lines=9, args=1, vars=2, tmps=1) + ; (lines=10, args=1, vars=2, tmps=1) ; (after optimizer) ; %s:2-8 0000 CV0($var) = RECV 1 0001 T2 = TYPE_CHECK (string) CV0($var) 0002 JMPZ T2 0004 0003 JMP 0005 -0004 RETURN null +0004 DEFER_RUN +0005 RETURN null 0005 INIT_FCALL 1 %d string("var_dump") 0006 SEND_VAR CV1($username) 1 0007 DO_ICALL -0008 RETURN null +0008 DEFER_RUN +0009 RETURN null diff --git a/ext/opcache/tests/opt/sccp_031.phpt b/ext/opcache/tests/opt/sccp_031.phpt index 459fb31233d47..e3525c7f3e233 100644 --- a/ext/opcache/tests/opt/sccp_031.phpt +++ b/ext/opcache/tests/opt/sccp_031.phpt @@ -24,16 +24,18 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_031.php:1-13 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) foo: - ; (lines=4, args=0, vars=0, tmps=0) + ; (lines=5, args=0, vars=0, tmps=0) ; (after optimizer) ; %s_031.php:2-11 0000 ECHO string("b") 0001 ECHO string("c") 0002 ECHO array(...) -0003 RETURN null +0003 DEFER_RUN +0004 RETURN null diff --git a/ext/opcache/tests/opt/sccp_032.phpt b/ext/opcache/tests/opt/sccp_032.phpt index 6ee4a837ecd37..5d78afce59a61 100644 --- a/ext/opcache/tests/opt/sccp_032.phpt +++ b/ext/opcache/tests/opt/sccp_032.phpt @@ -26,7 +26,7 @@ foreach (test() as $x) { ?> --EXPECTF-- $_main: - ; (lines=11, args=0, vars=1, tmps=2) + ; (lines=12, args=0, vars=1, tmps=2) ; (after optimizer) ; %ssccp_032.php:1-15 0000 INIT_FCALL 0 %d string("test") @@ -39,12 +39,13 @@ $_main: 0007 ECHO string("\n") 0008 JMP 0003 0009 FE_FREE V1 -0010 RETURN int(1) +0010 DEFER_RUN +0011 RETURN int(1) LIVE RANGES: 1: 0003 - 0009 (loop) test: - ; (lines=5, args=0, vars=0, tmps=1) + ; (lines=6, args=0, vars=0, tmps=1) ; (after optimizer) ; %ssccp_032.php:2-9 0000 GENERATOR_CREATE diff --git a/ext/opcache/tests/opt/type_inference_class_consts1.phpt b/ext/opcache/tests/opt/type_inference_class_consts1.phpt index fb9be49a6f149..84dad02179648 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts1.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts1.phpt @@ -45,48 +45,55 @@ class Test1 { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) Test1::getSelfFoo: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test1::getSelfBar: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test1::getSelfBaz: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test1::getStaticFoo: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("FOO") 0001 VERIFY_RETURN_TYPE T0 -0002 RETURN T0 +0002 DEFER_RUN +0003 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test1::getStaticBar: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test1::getStaticBaz: - ; (lines=2, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("BAZ") -0001 RETURN T0 +0001 DEFER_RUN +0002 RETURN T0 diff --git a/ext/opcache/tests/opt/type_inference_class_consts2.phpt b/ext/opcache/tests/opt/type_inference_class_consts2.phpt index a417a208db7a6..3b1d3873186e3 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts2.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts2.phpt @@ -35,25 +35,29 @@ final class Test2 extends Test1 { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) Test2::getParentFoo: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test2::getParentBar: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test2::getParentBaz: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_class_consts3.phpt b/ext/opcache/tests/opt/type_inference_class_consts3.phpt index a568528de9e9d..6ecaa8aea4ea4 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts3.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts3.phpt @@ -35,25 +35,29 @@ class Test3 { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) Test3::getTestFoo: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test3::getTestBar: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test3::getTestBaz: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_class_consts4.phpt b/ext/opcache/tests/opt/type_inference_class_consts4.phpt index 03c0c1248bce1..a58ee5a3b9712 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts4.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts4.phpt @@ -46,60 +46,67 @@ class Test4 implements TestI { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 DECLARE_CLASS string("test4") -0001 RETURN int(1) +0001 DEFER_RUN +0002 RETURN int(1) Test4::getSelfA: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (self) (exception) string("A") 0001 VERIFY_RETURN_TYPE T0 -0002 RETURN T0 +0002 DEFER_RUN +0003 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getSelfB: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (self) (exception) string("B") 0001 VERIFY_RETURN_TYPE T0 -0002 RETURN T0 +0002 DEFER_RUN +0003 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getStaticA: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("A") 0001 VERIFY_RETURN_TYPE T0 -0002 RETURN T0 +0002 DEFER_RUN +0003 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getStaticB: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=4, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("B") 0001 VERIFY_RETURN_TYPE T0 -0002 RETURN T0 +0002 DEFER_RUN +0003 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getTestIA: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test4::getTestIB: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_final_class.phpt b/ext/opcache/tests/opt/type_inference_final_class.phpt index 3c4aa03d8cb4e..e085d4cf0193f 100644 --- a/ext/opcache/tests/opt/type_inference_final_class.phpt +++ b/ext/opcache/tests/opt/type_inference_final_class.phpt @@ -24,20 +24,23 @@ final class Test { ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) Test::getInt: - ; (lines=1, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) Test::getInt2: - ; (lines=2, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 V0 = QM_ASSIGN int(42) -0001 RETURN V0 +0001 DEFER_RUN +0002 RETURN V0 diff --git a/ext/opcache/tests/pipe_optimizations.phpt b/ext/opcache/tests/pipe_optimizations.phpt index 5a8750845ddc8..3814cb6dd72d7 100644 --- a/ext/opcache/tests/pipe_optimizations.phpt +++ b/ext/opcache/tests/pipe_optimizations.phpt @@ -35,7 +35,7 @@ var_dump($res1); ?> --EXPECTF-- $_main: - ; (lines=18, args=0, vars=2, tmps=%d) + ; (lines=19, args=0, vars=2, tmps=%d) ; (after optimizer) ; %s:1-27 0000 V2 = NEW 0 string("Other") @@ -55,35 +55,39 @@ $_main: 0014 INIT_FCALL 1 %d string("var_dump") 0015 SEND_VAR CV1($res1) 1 0016 DO_ICALL -0017 RETURN int(1) +0017 DEFER_RUN +0018 RETURN int(1) LIVE RANGES: 2: 0001 - 0002 (new) 2: 0010 - 0011 (tmp/var) _test1: - ; (lines=4, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:3-5 0000 CV0($a) = RECV 1 0001 T1 = ADD CV0($a) int(1) 0002 VERIFY_RETURN_TYPE T1 -0003 RETURN T1 +0003 DEFER_RUN +0004 RETURN T1 Other::foo: - ; (lines=4, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:8-10 0000 CV0($a) = RECV 1 0001 T1 = ADD CV0($a) CV0($a) 0002 VERIFY_RETURN_TYPE T1 -0003 RETURN T1 +0003 DEFER_RUN +0004 RETURN T1 Other::bar: - ; (lines=4, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:12-14 0000 CV0($a) = RECV 1 0001 T1 = SUB CV0($a) int(1) 0002 VERIFY_RETURN_TYPE T1 -0003 RETURN T1 +0003 DEFER_RUN +0004 RETURN T1 int(11) diff --git a/ext/opcache/tests/preload_optimizer.phpt b/ext/opcache/tests/preload_optimizer.phpt index 168e94dc19564..3d03aa1238aa6 100644 --- a/ext/opcache/tests/preload_optimizer.phpt +++ b/ext/opcache/tests/preload_optimizer.phpt @@ -17,27 +17,31 @@ echo foo(); ?> --EXPECTF-- $_main: - ; (lines=1, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; (after optimizer) ; $PRELOAD$:0-0 -0000 RETURN null +0000 DEFER_RUN +0001 RETURN null foo: - ; (lines=1, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.inc:3-5 -0000 RETURN int(42) +0000 DEFER_RUN +0001 RETURN int(42) $_main: - ; (lines=1, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.inc:1-6 -0000 RETURN int(1) +0000 DEFER_RUN +0001 RETURN int(1) $_main: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=3, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.php:1-4 0000 ECHO string("42") -0001 RETURN int(1) +0001 DEFER_RUN +0002 RETURN int(1) 42 diff --git a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt index 78c76d4eece04..6201f3a88e8b3 100644 --- a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt +++ b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt @@ -5,9 +5,13 @@ r q --EXPECTF-- [Successful compilation of %s] -prompt> array(1) { +prompt> array(3) { [5]=> int(0) + [6]=> + int(0) + [7]=> + int(0) } [Script ended normally] prompt> diff --git a/sapi/phpdbg/tests/phpdbg_oplog_001.phpt b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt index 9fc112a3f79ec..17bae5ee3a86a 100644 --- a/sapi/phpdbg/tests/phpdbg_oplog_001.phpt +++ b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt @@ -28,7 +28,7 @@ prompt> halloarray(2) { [5]=> int(2) [8]=> - int(2) + int(4) } } [Script ended normally] diff --git a/sapi/phpdbg/tests/print_001.phpt b/sapi/phpdbg/tests/print_001.phpt index ae1b7991973bd..0dfc96c9c8be2 100644 --- a/sapi/phpdbg/tests/print_001.phpt +++ b/sapi/phpdbg/tests/print_001.phpt @@ -10,10 +10,10 @@ p e q --EXPECTF-- [Successful compilation of %s] -prompt> [User Function foo (8 ops)] +prompt> [User Function foo (9 ops)] foo: - ; (lines=8, args=1, vars=1, tmps=%d) + ; (lines=9, args=1, vars=1, tmps=%d) ; %s:14-16 L0014 0000 CV0($baz) = RECV 1 L0015 0001 INIT_FCALL %d %d string("var_dump") @@ -22,27 +22,30 @@ L0015 0003 SEND_VAR CV0($baz) 1 L0015 0004 V1 = DO_ICALL L0015 0005 SEND_VAR V1 1 L0015 0006 DO_ICALL -L0016 0007 RETURN null +L0016 0007 DEFER_RUN +L0016 0008 RETURN null prompt> [User Class: Foo\Bar (2 methods)] Foo\Bar::Foo: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; %s:5-7 L0005 0000 CV0($bar) = RECV 1 L0006 0001 INIT_NS_FCALL_BY_NAME 1 string("Foo\\var_dump") L0006 0002 SEND_VAR_EX CV0($bar) 1 L0006 0003 DO_FCALL -L0007 0004 RETURN null +L0007 0004 DEFER_RUN +L0007 0005 RETURN null Foo\Bar::baz: - ; (lines=1, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; %s:9-9 -L0009 0000 RETURN null +L0009 0000 DEFER_RUN +L0009 0001 RETURN null prompt> [Not Executing!] -prompt> [Context %s (9 ops)] +prompt> [Context %s (10 ops)] $_main: - ; (lines=9, args=0, vars=0, tmps=%d) + ; (lines=10, args=0, vars=0, tmps=%d) ; %s:1-21 L0018 0000 V0 = NEW 0 string("Foo\\Bar") L0018 0001 DO_FCALL @@ -52,7 +55,8 @@ L0018 0004 DO_FCALL L0019 0005 INIT_FCALL %d %d string("foo") L0019 0006 SEND_VAL string("test") 1 L0019 0007 DO_FCALL -L0021 0008 RETURN int(1) +L0021 0008 DEFER_RUN +L0021 0009 RETURN int(1) prompt> --FILE-- string(4) "test" >00015: var_dump(strrev($baz)); 00016: } 00017: -prompt> [Stack in foo() (8 ops)] +prompt> [Stack in foo() (9 ops)] foo: - ; (lines=8, args=1, vars=1, tmps=%d) + ; (lines=9, args=1, vars=1, tmps=%d) ; %s:14-16 L0014 0000 CV0($baz) = RECV 1 L0015 0001 INIT_FCALL %d %d string("var_dump") @@ -28,7 +28,8 @@ L0015 0003 SEND_VAR CV0($baz) 1 L0015 0004 V1 = DO_ICALL L0015 0005 SEND_VAR V1 1 L0015 0006 DO_ICALL -L0016 0007 RETURN null +L0016 0007 DEFER_RUN +L0016 0008 RETURN null prompt> L0015 0001 INIT_FCALL %d %d string("var_dump") prompt> --FILE-- From daba632d51261d514cebc9c6e6857032f0865253 Mon Sep 17 00:00:00 2001 From: Khaled Alam Date: Fri, 26 Dec 2025 22:37:01 +0400 Subject: [PATCH 3/5] feat: Zend emit DEFER_RUN only for functions that use defer. --- .gitignore | 2 + Zend/zend_compile.c | 9 +++- Zend/zend_compile.h | 3 ++ ext/opcache/jit/zend_jit.c | 1 - ext/opcache/tests/ct_eval_frameless_001.phpt | 5 +-- ext/opcache/tests/ct_eval_frameless_002.phpt | 5 +-- ext/opcache/tests/dump_property_hooks.phpt | 15 +++---- ext/opcache/tests/gh18050.phpt | 6 +-- ext/opcache/tests/gh19867.phpt | 13 ++---- ext/opcache/tests/match/001.phpt | 30 +++++-------- ext/opcache/tests/match/002.phpt | 15 +++---- ext/opcache/tests/match/003.phpt | 33 +++++--------- ext/opcache/tests/match/004.phpt | 45 +++++++------------ ext/opcache/tests/match/005.phpt | 5 +-- ext/opcache/tests/named_parameter_new.phpt | 16 +++---- ext/opcache/tests/opt/block_pass_007.phpt | 5 +-- ext/opcache/tests/opt/coalesce.phpt | 15 +++---- ext/opcache/tests/opt/dce_001.phpt | 10 ++--- ext/opcache/tests/opt/dce_002.phpt | 10 ++--- ext/opcache/tests/opt/dce_003.phpt | 10 ++--- ext/opcache/tests/opt/dce_004.phpt | 10 ++--- ext/opcache/tests/opt/dce_005.phpt | 10 ++--- ext/opcache/tests/opt/dce_006.phpt | 15 +++---- ext/opcache/tests/opt/dce_007.phpt | 10 ++--- ext/opcache/tests/opt/dce_008.phpt | 10 ++--- ext/opcache/tests/opt/dce_009.phpt | 20 ++++----- ext/opcache/tests/opt/gh11170.phpt | 15 +++---- ext/opcache/tests/opt/gh11245_1.phpt | 13 +++--- ext/opcache/tests/opt/gh11245_2.phpt | 8 ++-- ext/opcache/tests/opt/gh14873.phpt | 40 +++++++---------- ext/opcache/tests/opt/gh18107_2.phpt | 3 +- .../tests/opt/inference_frameless.phpt | 10 ++--- ext/opcache/tests/opt/jmp_001.phpt | 10 ++--- ext/opcache/tests/opt/nullsafe_001.phpt | 15 +++---- ext/opcache/tests/opt/nullsafe_002.phpt | 10 ++--- ext/opcache/tests/opt/prop_types.phpt | 25 +++++------ ext/opcache/tests/opt/sccp_001.phpt | 10 ++--- ext/opcache/tests/opt/sccp_002.phpt | 10 ++--- ext/opcache/tests/opt/sccp_003.phpt | 10 ++--- ext/opcache/tests/opt/sccp_004.phpt | 10 ++--- ext/opcache/tests/opt/sccp_005.phpt | 10 ++--- ext/opcache/tests/opt/sccp_006.phpt | 10 ++--- ext/opcache/tests/opt/sccp_007.phpt | 10 ++--- ext/opcache/tests/opt/sccp_008.phpt | 10 ++--- ext/opcache/tests/opt/sccp_009.phpt | 10 ++--- ext/opcache/tests/opt/sccp_010.phpt | 10 ++--- ext/opcache/tests/opt/sccp_011.phpt | 10 ++--- ext/opcache/tests/opt/sccp_012.phpt | 10 ++--- ext/opcache/tests/opt/sccp_016.phpt | 5 +-- ext/opcache/tests/opt/sccp_017.phpt | 10 ++--- ext/opcache/tests/opt/sccp_019.phpt | 10 ++--- ext/opcache/tests/opt/sccp_022.phpt | 15 +++---- ext/opcache/tests/opt/sccp_024.phpt | 10 ++--- ext/opcache/tests/opt/sccp_026.phpt | 13 +++--- ext/opcache/tests/opt/sccp_031.phpt | 10 ++--- ext/opcache/tests/opt/sccp_032.phpt | 7 ++- .../opt/type_inference_class_consts1.phpt | 35 ++++++--------- .../opt/type_inference_class_consts2.phpt | 20 ++++----- .../opt/type_inference_class_consts3.phpt | 20 ++++----- .../opt/type_inference_class_consts4.phpt | 35 ++++++--------- .../tests/opt/type_inference_final_class.phpt | 15 +++---- ext/opcache/tests/pipe_optimizations.phpt | 20 ++++----- ext/opcache/tests/preload_optimizer.phpt | 20 ++++----- .../phpdbg_get_executable_stream_wrapper.phpt | 8 +--- sapi/phpdbg/tests/phpdbg_oplog_001.phpt | 2 +- sapi/phpdbg/tests/print_001.phpt | 24 +++++----- sapi/phpdbg/tests/print_002.phpt | 7 ++- sapi/phpdbg/tests/watch_006.phpt | 1 + 68 files changed, 349 insertions(+), 535 deletions(-) diff --git a/.gitignore b/.gitignore index b76b5a787caa0..ef6232c3f8f89 100644 --- a/.gitignore +++ b/.gitignore @@ -301,6 +301,8 @@ tmp-php.ini /.idea/ /.vscode/ /.zed/ +/.history/ +/.lh/ # ------------------------------------------------------------------------------ # Additional test build files diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3ccad4fc547d8..e69bb05a3509c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2699,7 +2699,9 @@ void zend_emit_final_return(bool return_one) /* {{{ */ zend_emit_return_type_check(NULL, return_info, true); } - zend_emit_op(NULL, 212, NULL, NULL); + if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_DEFER) { + zend_emit_op(NULL, ZEND_DEFER_RUN, NULL, NULL); + } zn.op_type = IS_CONST; if (return_one) { @@ -5815,7 +5817,9 @@ static void zend_compile_return(const zend_ast *ast) /* {{{ */ expr_ast ? &expr_node : NULL, CG(active_op_array)->arg_info - 1, false); } - zend_emit_op(NULL, 212 /* ZEND_DEFER_RUN */, NULL, NULL); + if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_DEFER) { + zend_emit_op(NULL, ZEND_DEFER_RUN, NULL, NULL); + } uint32_t opnum_before_finally = get_next_op_number(); @@ -5846,6 +5850,7 @@ static void zend_compile_return(const zend_ast *ast) /* {{{ */ static void zend_compile_defer(const zend_ast *ast) /* {{{ */ { + CG(active_op_array)->fn_flags |= ZEND_ACC_HAS_DEFER; zend_ast *stmt_ast = ast->child[0]; zend_op *opline; uint32_t jmp_opnum, defer_start_opnum, defer_end_opnum; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index d5a3e707a379b..ab5b01ee4df44 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -355,6 +355,9 @@ typedef struct _zend_oparray_context { /* Function has a return type | | | */ #define ZEND_ACC_HAS_RETURN_TYPE (1 << 13) /* | X | | */ /* | | | */ +/* Function uses `defer` blocks (user only) | | | */ +#define ZEND_ACC_HAS_DEFER (1U << 30) /* | X | | */ +/* | | | */ /* Function with variable number of arguments | | | */ #define ZEND_ACC_VARIADIC (1 << 14) /* | X | | */ /* | | | */ diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 8573971df3f14..3ffb669e84742 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2728,7 +2728,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op case ZEND_OP_DATA: case ZEND_SWITCH_LONG: case ZEND_SWITCH_STRING: - case ZEND_DEFER_RUN: break; case ZEND_MATCH: /* We have to exit to the VM because the MATCH handler performs an N-way jump for diff --git a/ext/opcache/tests/ct_eval_frameless_001.phpt b/ext/opcache/tests/ct_eval_frameless_001.phpt index 4d27b49d775b4..52fae8d013268 100644 --- a/ext/opcache/tests/ct_eval_frameless_001.phpt +++ b/ext/opcache/tests/ct_eval_frameless_001.phpt @@ -14,10 +14,9 @@ echo dirname(__DIR__); ?> --EXPECTF-- $_main: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %sct_eval_frameless_001.php:1-4 0000 ECHO string("%sopcache") -0001 DEFER_RUN -0002 RETURN int(1) +0001 RETURN int(1) %sopcache diff --git a/ext/opcache/tests/ct_eval_frameless_002.phpt b/ext/opcache/tests/ct_eval_frameless_002.phpt index afbdaceab34b7..35e3281c937a2 100644 --- a/ext/opcache/tests/ct_eval_frameless_002.phpt +++ b/ext/opcache/tests/ct_eval_frameless_002.phpt @@ -14,13 +14,12 @@ echo substr('foo', 1, $foo ? 1 : 1); ?> --EXPECTF-- $_main: - ; (lines=4, args=0, vars=1, tmps=0) + ; (lines=3, args=0, vars=1, tmps=0) ; (after optimizer) ; %sct_eval_frameless_002.php:1-4 0000 CHECK_VAR CV0($foo) 0001 ECHO string("o") -0002 DEFER_RUN -0003 RETURN int(1) +0002 RETURN int(1) Warning: Undefined variable $foo in %s on line %d o diff --git a/ext/opcache/tests/dump_property_hooks.phpt b/ext/opcache/tests/dump_property_hooks.phpt index 8ec4a368da620..5083ad385f31f 100644 --- a/ext/opcache/tests/dump_property_hooks.phpt +++ b/ext/opcache/tests/dump_property_hooks.phpt @@ -36,7 +36,7 @@ $a->prop = 41; ?> --EXPECTF-- $_main: - ; (lines=11, args=0, vars=1, tmps=%d) + ; (lines=10, args=0, vars=1, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:1-22 0000 V1 = NEW 0 string("A") @@ -48,26 +48,23 @@ $_main: 0006 DO_ICALL 0007 ASSIGN_OBJ CV0($a) string("prop") 0008 OP_DATA int(41) -0009 DEFER_RUN -0010 RETURN int(1) +0009 RETURN int(1) LIVE RANGES: 1: 0001 - 0002 (new) A::$prop::get: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=1, args=0, vars=0, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:5-8 -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) A::$prop::set: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=4, args=1, vars=1, tmps=%d) ; (after optimizer) ; %sdump_property_hooks.php:9-13 0000 CV0($value) = RECV 1 0001 T1 = FAST_CONCAT string("Setting ") CV0($value) 0002 ECHO T1 -0003 DEFER_RUN -0004 RETURN null +0003 RETURN null int(42) Setting 41 diff --git a/ext/opcache/tests/gh18050.phpt b/ext/opcache/tests/gh18050.phpt index 09cf8a7d1922a..b641e1ae236c6 100644 --- a/ext/opcache/tests/gh18050.phpt +++ b/ext/opcache/tests/gh18050.phpt @@ -35,8 +35,7 @@ $_main: 0003 INIT_FCALL 1 %d string("test") 0004 SEND_VAL string("z") 1 0005 DO_UCALL -0006 DEFER_RUN -0007 RETURN int(1) +0006 RETURN int(1) test: ; (lines=%d, args=%d, vars=%d, tmps=%d) @@ -58,8 +57,7 @@ test: 0013 T1 = IN_ARRAY 1 CV0($v) array(...) 0014 JMPZ T1 0016 0015 ECHO string("True\n") -0016 DEFER_RUN -0017 RETURN null +0016 RETURN null bool(true) bool(true) bool(true) diff --git a/ext/opcache/tests/gh19867.phpt b/ext/opcache/tests/gh19867.phpt index e3d5bafce1110..486a366722dad 100644 --- a/ext/opcache/tests/gh19867.phpt +++ b/ext/opcache/tests/gh19867.phpt @@ -17,18 +17,14 @@ $_main: ; %s 0000 T0 = DECLARE_LAMBDA_FUNCTION 0 0001 FREE T0 -0002 DEFER_RUN -0003 RETURN int(1) +0002 RETURN int(1) {closure:%s:%d}: ; (lines=%d, args=0, vars=%d, tmps=%d) ; (after optimizer) ; %s 0000 T0 = DECLARE_LAMBDA_FUNCTION 0 -0001 DEFER_RUN -0002 RETURN T0 -LIVE RANGES: - 0: 0001 - 0002 (tmp/var) +0001 RETURN T0 {closure:%s:%d}: ; (lines=%d, args=2, vars=%d, tmps=%d) @@ -37,7 +33,4 @@ LIVE RANGES: 0000 CV0($a) = RECV 1 0001 CV1($b) = RECV 2 0002 T2 = ADD CV0($a) CV1($b) -0003 DEFER_RUN -0004 RETURN T2 -LIVE RANGES: - 2: 0003 - 0004 (tmp/var) +0003 RETURN T2 diff --git a/ext/opcache/tests/match/001.phpt b/ext/opcache/tests/match/001.phpt index 417b8ac92cfc3..502400681cf12 100644 --- a/ext/opcache/tests/match/001.phpt +++ b/ext/opcache/tests/match/001.phpt @@ -28,7 +28,7 @@ foreach (range('a', 'i') as $char) { ?> --EXPECTF-- $_main: - ; (lines=16, args=0, vars=1, tmps=2) + ; (lines=15, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("range") @@ -45,33 +45,23 @@ $_main: 0011 DO_ICALL 0012 JMP 0005 0013 FE_FREE V1 -0014 DEFER_RUN -0015 RETURN int(1) +0014 RETURN int(1) LIVE RANGES: 1: 0005 - 0013 (loop) test: - ; (lines=16, args=1, vars=1, tmps=1) + ; (lines=9, args=1, vars=1, tmps=0) ; (after optimizer) ; %s 0000 CV0($char) = RECV 1 -0001 MATCH CV0($char) "a": 0003, "b": 0005, "c": 0005, "d": 0007, "e": 0009, "f": 0009, "g": 0011, "h": 0013, "i": 0013, default: 0002 +0001 MATCH CV0($char) "a": 0003, "b": 0004, "c": 0004, "d": 0005, "e": 0006, "f": 0006, "g": 0007, "h": 0008, "i": 0008, default: 0002 0002 MATCH_ERROR CV0($char) -0003 T1 = QM_ASSIGN string("a") -0004 JMP 0014 -0005 T1 = QM_ASSIGN string("b, c") -0006 JMP 0014 -0007 T1 = QM_ASSIGN string("d") -0008 JMP 0014 -0009 T1 = QM_ASSIGN string("e, f") -0010 JMP 0014 -0011 T1 = QM_ASSIGN string("g") -0012 JMP 0014 -0013 T1 = QM_ASSIGN string("h, i") -0014 DEFER_RUN -0015 RETURN T1 -LIVE RANGES: - 1: 0014 - 0015 (tmp/var) +0003 RETURN string("a") +0004 RETURN string("b, c") +0005 RETURN string("d") +0006 RETURN string("e, f") +0007 RETURN string("g") +0008 RETURN string("h, i") string(1) "a" string(4) "b, c" string(4) "b, c" diff --git a/ext/opcache/tests/match/002.phpt b/ext/opcache/tests/match/002.phpt index 2e1ef8160349d..005c2689d1b8a 100644 --- a/ext/opcache/tests/match/002.phpt +++ b/ext/opcache/tests/match/002.phpt @@ -31,30 +31,27 @@ test2(); ?> --EXPECTF-- $_main: - ; (lines=6, args=0, vars=0, tmps=0) + ; (lines=5, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 INIT_FCALL 0 %d string("test") 0001 DO_UCALL 0002 INIT_FCALL 0 %d string("test2") 0003 DO_UCALL -0004 DEFER_RUN -0005 RETURN int(1) +0004 RETURN int(1) test: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 ECHO string("No match\n") -0001 DEFER_RUN -0002 RETURN null +0001 RETURN null test2: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 ECHO string("No match\n") -0001 DEFER_RUN -0002 RETURN null +0001 RETURN null No match No match diff --git a/ext/opcache/tests/match/003.phpt b/ext/opcache/tests/match/003.phpt index 91ee11f63b86a..24f3cd2612105 100644 --- a/ext/opcache/tests/match/003.phpt +++ b/ext/opcache/tests/match/003.phpt @@ -29,7 +29,7 @@ foreach (range(0, 10) as $char) { ?> --EXPECTF-- $_main: - ; (lines=16, args=0, vars=1, tmps=2) + ; (lines=15, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("range") @@ -46,34 +46,23 @@ $_main: 0011 DO_ICALL 0012 JMP 0005 0013 FE_FREE V1 -0014 DEFER_RUN -0015 RETURN int(1) +0014 RETURN int(1) LIVE RANGES: 1: 0005 - 0013 (loop) test: - ; (lines=17, args=1, vars=1, tmps=1) + ; (lines=9, args=1, vars=1, tmps=0) ; (after optimizer) ; %s 0000 CV0($char) = RECV 1 -0001 MATCH CV0($char) 1: 0002, 2: 0004, 3: 0004, 4: 0006, 5: 0008, 6: 0008, 7: 0010, 8: 0012, 9: 0012, default: 0014 -0002 T1 = QM_ASSIGN string("1") -0003 JMP 0015 -0004 T1 = QM_ASSIGN string("2, 3") -0005 JMP 0015 -0006 T1 = QM_ASSIGN string("4") -0007 JMP 0015 -0008 T1 = QM_ASSIGN string("5, 6") -0009 JMP 0015 -0010 T1 = QM_ASSIGN string("7") -0011 JMP 0015 -0012 T1 = QM_ASSIGN string("8, 9") -0013 JMP 0015 -0014 T1 = QM_ASSIGN string("default") -0015 DEFER_RUN -0016 RETURN T1 -LIVE RANGES: - 1: 0015 - 0016 (tmp/var) +0001 MATCH CV0($char) 1: 0002, 2: 0003, 3: 0003, 4: 0004, 5: 0005, 6: 0005, 7: 0006, 8: 0007, 9: 0007, default: 0008 +0002 RETURN string("1") +0003 RETURN string("2, 3") +0004 RETURN string("4") +0005 RETURN string("5, 6") +0006 RETURN string("7") +0007 RETURN string("8, 9") +0008 RETURN string("default") string(7) "default" string(1) "1" string(4) "2, 3" diff --git a/ext/opcache/tests/match/004.phpt b/ext/opcache/tests/match/004.phpt index a9f82e5d65657..d9d4149b94510 100644 --- a/ext/opcache/tests/match/004.phpt +++ b/ext/opcache/tests/match/004.phpt @@ -34,7 +34,7 @@ foreach (range(0, 6) as $number) { ?> --EXPECTF-- $_main: - ; (lines=23, args=0, vars=1, tmps=2) + ; (lines=22, args=0, vars=1, tmps=2) ; (after optimizer) ; %s.php:1-25 0000 INIT_FCALL 2 %d string("range") @@ -58,42 +58,27 @@ $_main: 0018 DO_ICALL 0019 JMP 0005 0020 FE_FREE V1 -0021 DEFER_RUN -0022 RETURN int(1) +0021 RETURN int(1) LIVE RANGES: 1: 0005 - 0020 (loop) test: - ; (lines=25, args=1, vars=1, tmps=1) + ; (lines=13, args=1, vars=1, tmps=0) ; (after optimizer) ; %s.php:3-17 0000 CV0($value) = RECV 1 -0001 MATCH CV0($value) 1: 0002, "1": 0004, 2: 0006, "2": 0008, 3: 0010, "3": 0012, 4: 0014, "4": 0016, 5: 0018, "5": 0020, default: 0022 -0002 T1 = QM_ASSIGN string("1 int") -0003 JMP 0023 -0004 T1 = QM_ASSIGN string("1 string") -0005 JMP 0023 -0006 T1 = QM_ASSIGN string("2 int") -0007 JMP 0023 -0008 T1 = QM_ASSIGN string("2 string") -0009 JMP 0023 -0010 T1 = QM_ASSIGN string("3 int") -0011 JMP 0023 -0012 T1 = QM_ASSIGN string("3 string") -0013 JMP 0023 -0014 T1 = QM_ASSIGN string("4 int") -0015 JMP 0023 -0016 T1 = QM_ASSIGN string("4 string") -0017 JMP 0023 -0018 T1 = QM_ASSIGN string("5 int") -0019 JMP 0023 -0020 T1 = QM_ASSIGN string("5 string") -0021 JMP 0023 -0022 T1 = QM_ASSIGN string("default") -0023 DEFER_RUN -0024 RETURN T1 -LIVE RANGES: - 1: 0023 - 0024 (tmp/var) +0001 MATCH CV0($value) 1: 0002, "1": 0003, 2: 0004, "2": 0005, 3: 0006, "3": 0007, 4: 0008, "4": 0009, 5: 0010, "5": 0011, default: 0012 +0002 RETURN string("1 int") +0003 RETURN string("1 string") +0004 RETURN string("2 int") +0005 RETURN string("2 string") +0006 RETURN string("3 int") +0007 RETURN string("3 string") +0008 RETURN string("4 int") +0009 RETURN string("4 string") +0010 RETURN string("5 int") +0011 RETURN string("5 string") +0012 RETURN string("default") string(7) "default" string(7) "default" string(5) "1 int" diff --git a/ext/opcache/tests/match/005.phpt b/ext/opcache/tests/match/005.phpt index d8dfd7d1ad6af..5726336d53922 100644 --- a/ext/opcache/tests/match/005.phpt +++ b/ext/opcache/tests/match/005.phpt @@ -23,7 +23,7 @@ var_dump($result); ?> --EXPECTF-- $_main: - ; (lines=21, args=0, vars=2, tmps=1) + ; (lines=20, args=0, vars=2, tmps=1) ; (after optimizer) ; %s 0000 ASSIGN CV0($text) string("Bienvenue chez nous") @@ -45,6 +45,5 @@ $_main: 0016 INIT_FCALL 1 %d string("var_dump") 0017 SEND_VAR CV1($result) 1 0018 DO_ICALL -0019 DEFER_RUN -0020 RETURN int(1) +0019 RETURN int(1) string(2) "fr" diff --git a/ext/opcache/tests/named_parameter_new.phpt b/ext/opcache/tests/named_parameter_new.phpt index 706f352a23f5b..1f6f64333c988 100644 --- a/ext/opcache/tests/named_parameter_new.phpt +++ b/ext/opcache/tests/named_parameter_new.phpt @@ -33,17 +33,16 @@ MyClass::new(bar: 1); ?> --EXPECTF-- $_main: - ; (lines=5, args=0, vars=0, tmps=%d) + ; (lines=4, args=0, vars=0, tmps=%d) ; (after optimizer) ; %s 0000 INIT_STATIC_METHOD_CALL 1 string("MyClass") string("new") 0001 SEND_VAL int(1) 1 0002 DO_UCALL -0003 DEFER_RUN -0004 RETURN int(1) +0003 RETURN int(1) MyClass::__construct: - ; (lines=8, args=2, vars=2, tmps=%d) + ; (lines=7, args=2, vars=2, tmps=%d) ; (after optimizer) ; %s 0000 CV0($foo) = RECV 1 @@ -52,11 +51,10 @@ MyClass::__construct: 0003 OP_DATA CV0($foo) 0004 ASSIGN_OBJ THIS string("bar") 0005 OP_DATA CV1($bar) -0006 DEFER_RUN -0007 RETURN null +0006 RETURN null MyClass::new: - ; (lines=11, args=1, vars=2, tmps=%d) + ; (lines=10, args=1, vars=2, tmps=%d) ; (after optimizer) ; %s 0000 CV0($bar) = RECV 1 @@ -68,9 +66,7 @@ MyClass::new: 0006 SEND_VAR CV1($engine) 1 0007 SEND_VAR CV0($bar) 2 0008 DO_FCALL -0009 DEFER_RUN -0010 RETURN V2 +0009 RETURN V2 LIVE RANGES: 2: 0002 - 0004 (new) 2: 0006 - 0009 (new) - 2: 0009 - 0010 (tmp/var) diff --git a/ext/opcache/tests/opt/block_pass_007.phpt b/ext/opcache/tests/opt/block_pass_007.phpt index 0b981d7532398..b2dca320d9b76 100644 --- a/ext/opcache/tests/opt/block_pass_007.phpt +++ b/ext/opcache/tests/opt/block_pass_007.phpt @@ -18,7 +18,7 @@ var_dump(!!$f === false); ?> --EXPECTF-- $_main: - ; (lines=23, args=0, vars=1, tmps=%d) + ; (lines=22, args=0, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 INIT_FCALL 2 %d string("random_int") @@ -42,8 +42,7 @@ $_main: 0018 T1 = BOOL_NOT CV0($f) 0019 SEND_VAL T1 1 0020 DO_ICALL -0021 DEFER_RUN -0022 RETURN int(1) +0021 RETURN int(1) bool(false) bool(true) bool(true) diff --git a/ext/opcache/tests/opt/coalesce.phpt b/ext/opcache/tests/opt/coalesce.phpt index 63d03d3fa9b36..f60294aadc236 100644 --- a/ext/opcache/tests/opt/coalesce.phpt +++ b/ext/opcache/tests/opt/coalesce.phpt @@ -24,24 +24,21 @@ function b() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) a: - ; (lines=3, args=0, vars=1, tmps=1) + ; (lines=2, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = COALESCE CV0($test) 0001 -0001 DEFER_RUN -0002 RETURN bool(true) +0001 RETURN bool(true) b: - ; (lines=3, args=0, vars=1, tmps=1) + ; (lines=2, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = COALESCE CV0($test) 0001 -0001 DEFER_RUN -0002 RETURN bool(true) +0001 RETURN bool(true) diff --git a/ext/opcache/tests/opt/dce_001.phpt b/ext/opcache/tests/opt/dce_001.phpt index da18be28317b8..5f9b001a5def8 100644 --- a/ext/opcache/tests/opt/dce_001.phpt +++ b/ext/opcache/tests/opt/dce_001.phpt @@ -19,19 +19,17 @@ function foo(string $s1, string $s2, string $s3, string $s4) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_001.php:1-8 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=6, args=4, vars=4, tmps=0) + ; (lines=5, args=4, vars=4, tmps=0) ; (after optimizer) ; %sdce_001.php:2-6 0000 CV0($s1) = RECV 1 0001 CV1($s2) = RECV 2 0002 CV2($s3) = RECV 3 0003 CV3($s4) = RECV 4 -0004 DEFER_RUN -0005 RETURN int(0) +0004 RETURN int(0) diff --git a/ext/opcache/tests/opt/dce_002.phpt b/ext/opcache/tests/opt/dce_002.phpt index e8a3436853394..44f1fb403c26b 100644 --- a/ext/opcache/tests/opt/dce_002.phpt +++ b/ext/opcache/tests/opt/dce_002.phpt @@ -22,19 +22,17 @@ function foo(int $a) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_002.php:1-11 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=6, args=1, vars=2, tmps=0) + ; (lines=5, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_002.php:2-9 0000 CV0($a) = RECV 1 0001 CV0($a) = QM_ASSIGN int(10) 0002 CV1($x) = FUNC_GET_ARGS 0003 CV0($a) = QM_ASSIGN int(30) -0004 DEFER_RUN -0005 RETURN CV1($x) +0004 RETURN CV1($x) diff --git a/ext/opcache/tests/opt/dce_003.phpt b/ext/opcache/tests/opt/dce_003.phpt index d1c06682b4182..22355baa68d86 100644 --- a/ext/opcache/tests/opt/dce_003.phpt +++ b/ext/opcache/tests/opt/dce_003.phpt @@ -18,17 +18,15 @@ function foo(int $a) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_003.php:1-7 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %sdce_003.php:2-5 0000 CV0($a) = RECV 1 0001 CV0($a) = ADD CV0($a) int(3) -0002 DEFER_RUN -0003 RETURN CV0($a) +0002 RETURN CV0($a) diff --git a/ext/opcache/tests/opt/dce_004.phpt b/ext/opcache/tests/opt/dce_004.phpt index 901630a48c522..2c7e785e4f536 100644 --- a/ext/opcache/tests/opt/dce_004.phpt +++ b/ext/opcache/tests/opt/dce_004.phpt @@ -20,18 +20,16 @@ function foo(int $x, int $y) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_004.php:1-9 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=5, args=2, vars=3, tmps=0) + ; (lines=4, args=2, vars=3, tmps=0) ; (after optimizer) ; %sdce_004.php:2-7 0000 CV0($x) = RECV 1 0001 CV1($y) = RECV 2 0002 CV2($a) = QM_ASSIGN CV1($y) -0003 DEFER_RUN -0004 RETURN CV2($a) +0003 RETURN CV2($a) diff --git a/ext/opcache/tests/opt/dce_005.phpt b/ext/opcache/tests/opt/dce_005.phpt index bf7d70d1e08db..c413913aedb8e 100644 --- a/ext/opcache/tests/opt/dce_005.phpt +++ b/ext/opcache/tests/opt/dce_005.phpt @@ -21,16 +21,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=2, args=1, vars=1, tmps=0) ; (after optimizer) ; %s 0000 CV0($x) = RECV 1 -0001 DEFER_RUN -0002 RETURN null +0001 RETURN null diff --git a/ext/opcache/tests/opt/dce_006.phpt b/ext/opcache/tests/opt/dce_006.phpt index 0fdfc33b302d7..2596651ed3e91 100644 --- a/ext/opcache/tests/opt/dce_006.phpt +++ b/ext/opcache/tests/opt/dce_006.phpt @@ -21,14 +21,13 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_006.php:1-10 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=8, args=1, vars=2, tmps=1) + ; (lines=7, args=1, vars=2, tmps=1) ; (after optimizer) ; %sdce_006.php:5-8 0000 CV0($x) = RECV 1 @@ -37,14 +36,12 @@ foo: 0003 CV1($a) = QM_ASSIGN V2 0004 ASSIGN_OBJ CV1($a) string("foo") 0005 OP_DATA CV0($x) -0006 DEFER_RUN -0007 RETURN null +0006 RETURN null LIVE RANGES: 2: 0002 - 0003 (new) A::__destruct: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_006.php:3-3 -0000 DEFER_RUN -0001 RETURN null +0000 RETURN null diff --git a/ext/opcache/tests/opt/dce_007.phpt b/ext/opcache/tests/opt/dce_007.phpt index c085165f6bed8..9139e0478ece6 100644 --- a/ext/opcache/tests/opt/dce_007.phpt +++ b/ext/opcache/tests/opt/dce_007.phpt @@ -19,17 +19,15 @@ function esc($x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_007.php:1-8 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) esc: - ; (lines=4, args=1, vars=2, tmps=0) + ; (lines=3, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_007.php:2-6 0000 CV0($x) = RECV 1 0001 CV1($a) = INIT_ARRAY 1 (packed) CV0($x) NEXT -0002 DEFER_RUN -0003 RETURN CV1($a) +0002 RETURN CV1($a) diff --git a/ext/opcache/tests/opt/dce_008.phpt b/ext/opcache/tests/opt/dce_008.phpt index e7e753bfaa3db..697e29f1ab309 100644 --- a/ext/opcache/tests/opt/dce_008.phpt +++ b/ext/opcache/tests/opt/dce_008.phpt @@ -19,18 +19,16 @@ function esc(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_008.php:1-8 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) esc: - ; (lines=5, args=1, vars=2, tmps=0) + ; (lines=4, args=1, vars=2, tmps=0) ; (after optimizer) ; %sdce_008.php:2-6 0000 CV0($x) = RECV 1 0001 ASSIGN_DIM CV1($a) int(0) 0002 OP_DATA CV0($x) -0003 DEFER_RUN -0004 RETURN CV1($a) +0003 RETURN CV1($a) diff --git a/ext/opcache/tests/opt/dce_009.phpt b/ext/opcache/tests/opt/dce_009.phpt index 936f2ae66b3c9..996825cf96e1a 100644 --- a/ext/opcache/tests/opt/dce_009.phpt +++ b/ext/opcache/tests/opt/dce_009.phpt @@ -35,7 +35,7 @@ Loop::test3(); ?> --EXPECTF-- $_main: - ; (lines=8, args=0, vars=0, tmps=0) + ; (lines=7, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:1-24 0000 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test") @@ -44,32 +44,28 @@ $_main: 0003 DO_UCALL 0004 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test3") 0005 DO_UCALL -0006 DEFER_RUN -0007 RETURN int(1) +0006 RETURN int(1) Loop::test: - ; (lines=4, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:4-10 0000 ECHO string("Start\n") 0001 ECHO string("Done\n") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null Loop::test2: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sdce_009.php:11-14 -0000 DEFER_RUN -0001 RETURN null +0000 RETURN null Loop::test3: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %sdce_009.php:15-18 0000 V0 = FE_RESET_RW array(...) 0001 0001 FE_FREE V0 -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null Start Done diff --git a/ext/opcache/tests/opt/gh11170.phpt b/ext/opcache/tests/opt/gh11170.phpt index 49389c04fed01..9ea733f92b104 100644 --- a/ext/opcache/tests/opt/gh11170.phpt +++ b/ext/opcache/tests/opt/gh11170.phpt @@ -39,7 +39,7 @@ test_and(); ?> --EXPECTF-- $_main: - ; (lines=6, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=5, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[1..1] @@ -50,11 +50,10 @@ BB0: 0001 DO_UCALL 0002 INIT_FCALL 0 %d string("test_and") 0003 DO_UCALL -0004 DEFER_RUN -0005 RETURN int(1) +0004 RETURN int(1) test_or: - ; (lines=12, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) + ; (lines=11, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[-20..-1] @@ -97,11 +96,10 @@ BB3: #8.CV0($a) [long] RANGE[-27..-7] = Phi(#4.CV0($a) [long] RANGE[-27..-27], #6.CV0($a) [long] RANGE[-7..-7]) #9.CV1($b) [long] RANGE[-20..-10] = Phi(#5.CV1($b) [long] RANGE[-20..-20], #7.CV1($b) [long] RANGE[-10..-10]) 0009 #10.T8 [long] RANGE[-20..-1] = BW_OR #8.CV0($a) [long] RANGE[-27..-7] #9.CV1($b) [long] RANGE[-20..-10] -0010 DEFER_RUN -0011 RETURN #10.T8 [long] RANGE[-20..-1] +0010 RETURN #10.T8 [long] RANGE[-20..-1] test_and: - ; (lines=12, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) + ; (lines=11, args=0, vars=2, tmps=%d, ssa_vars=11, no_loops) ; (after dfa pass) ; %s ; return [long] RANGE[-28..-25] @@ -144,5 +142,4 @@ BB3: #8.CV0($a) [long] RANGE[-12..-9] = Phi(#4.CV0($a) [long] RANGE[-12..-12], #6.CV0($a) [long] RANGE[-9..-9]) #9.CV1($b) [long] RANGE[-27..-25] = Phi(#5.CV1($b) [long] RANGE[-27..-27], #7.CV1($b) [long] RANGE[-25..-25]) 0009 #10.T8 [long] RANGE[-28..-25] = BW_AND #8.CV0($a) [long] RANGE[-12..-9] #9.CV1($b) [long] RANGE[-27..-25] -0010 DEFER_RUN -0011 RETURN #10.T8 [long] RANGE[-28..-25] +0010 RETURN #10.T8 [long] RANGE[-28..-25] diff --git a/ext/opcache/tests/opt/gh11245_1.phpt b/ext/opcache/tests/opt/gh11245_1.phpt index 093bf133bc07c..06d6da1413771 100644 --- a/ext/opcache/tests/opt/gh11245_1.phpt +++ b/ext/opcache/tests/opt/gh11245_1.phpt @@ -19,19 +19,16 @@ switch (xx()) { ?> --EXPECTF-- $_main: - ; (lines=5, args=0, vars=1, tmps=1) + ; (lines=4, args=0, vars=1, tmps=1) ; (after optimizer) ; %s 0000 T1 = ISSET_ISEMPTY_CV (empty) CV0($xx) 0001 JMPNZ T1 0003 -0002 DEFER_RUN -0003 RETURN null -0003 DEFER_RUN -0004 RETURN int(1) +0002 RETURN null +0003 RETURN int(1) xx: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN string("somegarbage") +0000 RETURN string("somegarbage") diff --git a/ext/opcache/tests/opt/gh11245_2.phpt b/ext/opcache/tests/opt/gh11245_2.phpt index c331119932cac..ade810c453b13 100644 --- a/ext/opcache/tests/opt/gh11245_2.phpt +++ b/ext/opcache/tests/opt/gh11245_2.phpt @@ -22,18 +22,16 @@ switch (++X::$prop) { ?> --EXPECTF-- $_main: - ; (lines=8, args=0, vars=1, tmps=2) + ; (lines=7, args=0, vars=1, tmps=2) ; (after optimizer) ; %s 0000 T1 = PRE_INC_STATIC_PROP string("prop") string("X") 0001 T2 = ISSET_ISEMPTY_CV (empty) CV0($xx) 0002 JMPZ T2 0005 0003 FREE T1 -0004 DEFER_RUN -0005 RETURN null +0004 RETURN null 0005 FREE T1 -0006 DEFER_RUN -0007 RETURN int(1) +0006 RETURN int(1) LIVE RANGES: 1: 0001 - 0005 (tmp/var) diff --git a/ext/opcache/tests/opt/gh14873.phpt b/ext/opcache/tests/opt/gh14873.phpt index afaeb7abe7eb7..d442128d023c8 100644 --- a/ext/opcache/tests/opt/gh14873.phpt +++ b/ext/opcache/tests/opt/gh14873.phpt @@ -56,7 +56,7 @@ var_dump(testStrstr3Third(false)); ?> --EXPECTF-- $_main: - ; (lines=44, args=0, vars=0, tmps=%d) + ; (lines=43, args=0, vars=0, tmps=%d) ; (after optimizer) ; %s 0000 INIT_FCALL 1 %d string("var_dump") @@ -101,54 +101,49 @@ $_main: 0039 V0 = DO_UCALL 0040 SEND_VAR V0 1 0041 DO_ICALL -0042 DEFER_RUN -0043 RETURN int(1) +0042 RETURN int(1) testTrim1: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=4, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_1(trim) CV0($value) 0002 ASSIGN CV0($value) T1 -0003 DEFER_RUN -0004 RETURN CV0($value) +0003 RETURN CV0($value) testMin2First: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_2(min) CV0($value) int(100) 0002 CV0($value) = QM_ASSIGN T1 0003 VERIFY_RETURN_TYPE CV0($value) -0004 DEFER_RUN -0005 RETURN CV0($value) +0004 RETURN CV0($value) testMin2Second: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = FRAMELESS_ICALL_2(min) int(100) CV0($value) 0002 CV0($value) = QM_ASSIGN T1 0003 VERIFY_RETURN_TYPE CV0($value) -0004 DEFER_RUN -0005 RETURN CV0($value) +0004 RETURN CV0($value) testMin2_TMP: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 0001 T1 = ADD CV0($value) int(1) 0002 CV0($value) = FRAMELESS_ICALL_2(min) T1 int(100) 0003 VERIFY_RETURN_TYPE CV0($value) -0004 DEFER_RUN -0005 RETURN CV0($value) +0004 RETURN CV0($value) testStrstr3First: - ; (lines=7, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -156,13 +151,12 @@ testStrstr3First: 0002 OP_DATA bool(false) 0003 ASSIGN CV0($value) T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 DEFER_RUN -0006 RETURN CV0($value) +0005 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) testStrstr3Second: - ; (lines=7, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -170,13 +164,12 @@ testStrstr3Second: 0002 OP_DATA bool(false) 0003 ASSIGN CV0($value) T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 DEFER_RUN -0006 RETURN CV0($value) +0005 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) testStrstr3Third: - ; (lines=7, args=1, vars=1, tmps=%d) + ; (lines=6, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s 0000 CV0($value) = RECV 1 @@ -184,8 +177,7 @@ testStrstr3Third: 0002 OP_DATA CV0($value) 0003 CV0($value) = QM_ASSIGN T1 0004 VERIFY_RETURN_TYPE CV0($value) -0005 DEFER_RUN -0006 RETURN CV0($value) +0005 RETURN CV0($value) LIVE RANGES: 1: 0002 - 0003 (tmp/var) string(3) "boo" diff --git a/ext/opcache/tests/opt/gh18107_2.phpt b/ext/opcache/tests/opt/gh18107_2.phpt index 60bdde53d2df3..bd34a54edf6e6 100644 --- a/ext/opcache/tests/opt/gh18107_2.phpt +++ b/ext/opcache/tests/opt/gh18107_2.phpt @@ -45,8 +45,7 @@ $_main: 0012 DO_FCALL 0013 THROW V7 0014 FAST_RET T6 -0015 DEFER_RUN -0016 RETURN int(1) +0015 RETURN int(1) EXCEPTION TABLE: 0006, 0006, 0010, 0014 diff --git a/ext/opcache/tests/opt/inference_frameless.phpt b/ext/opcache/tests/opt/inference_frameless.phpt index 56bf5d150b2b5..3462053393ff8 100644 --- a/ext/opcache/tests/opt/inference_frameless.phpt +++ b/ext/opcache/tests/opt/inference_frameless.phpt @@ -16,18 +16,16 @@ function _strpos(string $str): int|false { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %sinference_frameless.php:1-6 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) _strpos: - ; (lines=5, args=1, vars=1, tmps=1) + ; (lines=4, args=1, vars=1, tmps=1) ; (after optimizer) ; %sinference_frameless.php:2-4 0000 CV0($str) = RECV 1 0001 T1 = FRAMELESS_ICALL_3(strpos) CV0($str) string("o") 0002 OP_DATA int(1) -0003 DEFER_RUN -0004 RETURN T1 +0003 RETURN T1 diff --git a/ext/opcache/tests/opt/jmp_001.phpt b/ext/opcache/tests/opt/jmp_001.phpt index 950464ae28a82..71ff73671e81b 100644 --- a/ext/opcache/tests/opt/jmp_001.phpt +++ b/ext/opcache/tests/opt/jmp_001.phpt @@ -18,18 +18,16 @@ function test() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s:1-8 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) test: - ; (lines=5, args=0, vars=1, tmps=1) + ; (lines=4, args=0, vars=1, tmps=1) ; (after optimizer) ; %s:2-6 0000 INIT_FCALL_BY_NAME 0 string("test2") 0001 V1 = DO_FCALL_BY_NAME 0002 CV0($var) = QM_ASSIGN V1 -0003 DEFER_RUN -0004 RETURN CV0($var) +0003 RETURN CV0($var) diff --git a/ext/opcache/tests/opt/nullsafe_001.phpt b/ext/opcache/tests/opt/nullsafe_001.phpt index 19294405b9cb1..171ac7190af9d 100644 --- a/ext/opcache/tests/opt/nullsafe_001.phpt +++ b/ext/opcache/tests/opt/nullsafe_001.phpt @@ -27,14 +27,13 @@ function test2(object $obj) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) test: - ; (lines=11, args=0, vars=0, tmps=0) + ; (lines=10, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 INIT_FCALL 1 %d string("var_dump") @@ -46,11 +45,10 @@ test: 0006 INIT_FCALL 1 %d string("var_dump") 0007 SEND_VAL bool(true) 1 0008 DO_ICALL -0009 DEFER_RUN -0010 RETURN null +0009 RETURN null test2: - ; (lines=18, args=1, vars=1, tmps=1) + ; (lines=17, args=1, vars=1, tmps=1) ; (after optimizer) ; %s 0000 CV0($obj) = RECV 1 @@ -69,5 +67,4 @@ test2: 0013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo") 0014 SEND_VAL T1 1 0015 DO_ICALL -0016 DEFER_RUN -0017 RETURN null +0016 RETURN null diff --git a/ext/opcache/tests/opt/nullsafe_002.phpt b/ext/opcache/tests/opt/nullsafe_002.phpt index 51d40122ef9c5..a8d9f1482c6e1 100644 --- a/ext/opcache/tests/opt/nullsafe_002.phpt +++ b/ext/opcache/tests/opt/nullsafe_002.phpt @@ -20,18 +20,17 @@ function test(?Test $test) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=1, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (before dfa pass) ; %s ; return [long] RANGE[1..1] BB0: ; start exit lines=[0-0] ; level=0 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) test: - ; (lines=8, args=1, vars=1, tmps=%d, ssa_vars=6, no_loops) + ; (lines=7, args=1, vars=1, tmps=%d, ssa_vars=6, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -62,5 +61,4 @@ BB2: #5.X1 [null, long] = Phi(#2.X1 [null], #4.X1 [long]) 0004 SEND_VAL #5.T1 [null, long] 1 0005 DO_ICALL -0006 DEFER_RUN -0007 RETURN null +0006 RETURN null diff --git a/ext/opcache/tests/opt/prop_types.phpt b/ext/opcache/tests/opt/prop_types.phpt index c1c27ef0df286..ec57bf13580cf 100644 --- a/ext/opcache/tests/opt/prop_types.phpt +++ b/ext/opcache/tests/opt/prop_types.phpt @@ -40,18 +40,17 @@ function noScope(Test $test) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) + ; (lines=1, args=0, vars=0, tmps=%d, ssa_vars=0, no_loops) ; (before dfa pass) ; %s ; return [long] RANGE[1..1] BB0: ; start exit lines=[0-0] ; level=0 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) noScope: - ; (lines=11, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) + ; (lines=10, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -68,11 +67,10 @@ BB0: 0006 #4.T3 [any] = FETCH_OBJ_R #1.CV0($test) [object (instanceof Test)] string("private") 0007 SEND_VAL #4.T3 [any] 3 0008 DO_ICALL -0009 DEFER_RUN -0010 RETURN null +0009 RETURN null Test::inTest: - ; (lines=10, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) + ; (lines=9, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -87,11 +85,10 @@ BB0: 0005 #2.T2 [double] = FETCH_OBJ_R THIS string("private") 0006 SEND_VAL #2.T2 [double] 3 0007 DO_ICALL -0008 DEFER_RUN -0009 RETURN null +0008 RETURN null Test::inTestWithTest2: - ; (lines=11, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) + ; (lines=10, args=1, vars=1, tmps=%d, ssa_vars=5, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -108,11 +105,10 @@ BB0: 0006 #4.T3 [double] = FETCH_OBJ_R #1.CV0($test2) [object (instanceof Test2)] string("private") 0007 SEND_VAL #4.T3 [double] 3 0008 DO_ICALL -0009 DEFER_RUN -0010 RETURN null +0009 RETURN null Test2::inTest2: - ; (lines=10, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) + ; (lines=9, args=0, vars=0, tmps=%d, ssa_vars=3, no_loops) ; (before dfa pass) ; %s ; return [null] RANGE[0..0] @@ -127,5 +123,4 @@ BB0: 0005 #2.T2 [array of [any, ref]] = FETCH_OBJ_R THIS string("private") 0006 SEND_VAL #2.T2 [array of [any, ref]] 3 0007 DO_ICALL -0008 DEFER_RUN -0009 RETURN null +0008 RETURN null diff --git a/ext/opcache/tests/opt/sccp_001.phpt b/ext/opcache/tests/opt/sccp_001.phpt index e8c2242cda122..727a239e8f2b4 100644 --- a/ext/opcache/tests/opt/sccp_001.phpt +++ b/ext/opcache/tests/opt/sccp_001.phpt @@ -20,15 +20,13 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_001.php:1-9 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_001.php:2-7 -0000 DEFER_RUN -0001 RETURN int(4) +0000 RETURN int(4) diff --git a/ext/opcache/tests/opt/sccp_002.phpt b/ext/opcache/tests/opt/sccp_002.phpt index e77dc936d27d7..b290d752e7e2c 100644 --- a/ext/opcache/tests/opt/sccp_002.phpt +++ b/ext/opcache/tests/opt/sccp_002.phpt @@ -25,18 +25,16 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_002.php:1-14 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=5, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_002.php:2-12 0000 CV0($x) = RECV 1 0001 ECHO string("1") 0002 ECHO string("1") -0003 DEFER_RUN -0004 RETURN null +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_003.phpt b/ext/opcache/tests/opt/sccp_003.phpt index e5a349329855b..4db7fe4d13c56 100644 --- a/ext/opcache/tests/opt/sccp_003.phpt +++ b/ext/opcache/tests/opt/sccp_003.phpt @@ -25,17 +25,15 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_003.php:1-14 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_003.php:2-12 0000 ECHO string("1") 0001 ECHO string("1") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_004.phpt b/ext/opcache/tests/opt/sccp_004.phpt index 39d3bfbaf1cde..4a0a7598e49c2 100644 --- a/ext/opcache/tests/opt/sccp_004.phpt +++ b/ext/opcache/tests/opt/sccp_004.phpt @@ -28,18 +28,16 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_004.php:1-17 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=5, args=1, vars=1, tmps=0) + ; (lines=4, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_004.php:2-15 0000 CV0($x) = RECV 1 0001 ECHO string("1") 0002 ECHO string("1") -0003 DEFER_RUN -0004 RETURN null +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_005.phpt b/ext/opcache/tests/opt/sccp_005.phpt index 7e229e7add75a..a673d3092de80 100644 --- a/ext/opcache/tests/opt/sccp_005.phpt +++ b/ext/opcache/tests/opt/sccp_005.phpt @@ -18,17 +18,15 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_005.php:1-7 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_005.php:2-5 0000 CV0($x) = RECV 1 0001 ECHO string("2") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_006.phpt b/ext/opcache/tests/opt/sccp_006.phpt index e6eb526da19f4..49754566e0785 100644 --- a/ext/opcache/tests/opt/sccp_006.phpt +++ b/ext/opcache/tests/opt/sccp_006.phpt @@ -18,14 +18,13 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_006.php:1-7 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=9, args=1, vars=2, tmps=1) + ; (lines=8, args=1, vars=2, tmps=1) ; (after optimizer) ; %ssccp_006.php:2-5 0000 CV0($x) = RECV 1 @@ -35,7 +34,6 @@ foo: 0004 CV1($a) = QM_ASSIGN T2 0005 T2 = FETCH_DIM_R CV1($a) string("a") 0006 ECHO T2 -0007 DEFER_RUN -0008 RETURN null +0007 RETURN null LIVE RANGES: 2: 0002 - 0004 (tmp/var) diff --git a/ext/opcache/tests/opt/sccp_007.phpt b/ext/opcache/tests/opt/sccp_007.phpt index 2746cfd0e5538..807ce7ed764ac 100644 --- a/ext/opcache/tests/opt/sccp_007.phpt +++ b/ext/opcache/tests/opt/sccp_007.phpt @@ -22,17 +22,15 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_007.php:1-11 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_007.php:2-9 0000 CV0($x) = RECV 1 0001 ECHO string("0") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_008.phpt b/ext/opcache/tests/opt/sccp_008.phpt index 78a48ae820bcc..f1df4b59980d5 100644 --- a/ext/opcache/tests/opt/sccp_008.phpt +++ b/ext/opcache/tests/opt/sccp_008.phpt @@ -22,14 +22,13 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_008.php:1-11 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=9, args=1, vars=2, tmps=1) + ; (lines=8, args=1, vars=2, tmps=1) ; (after optimizer) ; %ssccp_008.php:2-9 0000 CV0($x) = RECV 1 @@ -39,5 +38,4 @@ foo: 0004 CV1($a) = QM_ASSIGN array(...) 0005 T2 = FETCH_DIM_R CV1($a) int(1) 0006 ECHO T2 -0007 DEFER_RUN -0008 RETURN null +0007 RETURN null diff --git a/ext/opcache/tests/opt/sccp_009.phpt b/ext/opcache/tests/opt/sccp_009.phpt index 0a2b38a8345f5..34995a0546e60 100644 --- a/ext/opcache/tests/opt/sccp_009.phpt +++ b/ext/opcache/tests/opt/sccp_009.phpt @@ -19,17 +19,15 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_009.php:1-8 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_009.php:2-6 0000 CV0($x) = RECV 1 0001 ECHO string("2") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_010.phpt b/ext/opcache/tests/opt/sccp_010.phpt index b29532b8a8ced..e4bf72116604d 100644 --- a/ext/opcache/tests/opt/sccp_010.phpt +++ b/ext/opcache/tests/opt/sccp_010.phpt @@ -26,17 +26,15 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_010.php:1-15 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_010.php:2-13 0000 ECHO string("1") 0001 ECHO string("1") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_011.phpt b/ext/opcache/tests/opt/sccp_011.phpt index 95f74d42882a6..78455aa0d80bd 100644 --- a/ext/opcache/tests/opt/sccp_011.phpt +++ b/ext/opcache/tests/opt/sccp_011.phpt @@ -25,17 +25,15 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_011.php:1-14 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=1, vars=1, tmps=0) + ; (lines=3, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_011.php:2-12 0000 CV0($x) = RECV 1 0001 ECHO string("0") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_012.phpt b/ext/opcache/tests/opt/sccp_012.phpt index 8f1a71184da58..dbd5ee4fd003b 100644 --- a/ext/opcache/tests/opt/sccp_012.phpt +++ b/ext/opcache/tests/opt/sccp_012.phpt @@ -28,17 +28,15 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_012.php:1-17 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=4, args=0, vars=0, tmps=0) + ; (lines=3, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_012.php:2-15 0000 ECHO string("1") 0001 ECHO string("4") -0002 DEFER_RUN -0003 RETURN null +0002 RETURN null diff --git a/ext/opcache/tests/opt/sccp_016.phpt b/ext/opcache/tests/opt/sccp_016.phpt index 23698369b79e2..3e540ea6ce678 100644 --- a/ext/opcache/tests/opt/sccp_016.phpt +++ b/ext/opcache/tests/opt/sccp_016.phpt @@ -15,11 +15,10 @@ return isset($undef) || php_sapi_name() == php_sapi_name(); ?> --EXPECTF-- $_main: - ; (lines=5, args=0, vars=1, tmps=1) + ; (lines=4, args=0, vars=1, tmps=1) ; (after optimizer) ; %ssccp_016.php:1-4 0000 T1 = ISSET_ISEMPTY_CV (isset) CV0($undef) 0001 T1 = JMPNZ_EX T1 0003 0002 T1 = QM_ASSIGN bool(true) -0003 DEFER_RUN -0004 RETURN T1 +0003 RETURN T1 diff --git a/ext/opcache/tests/opt/sccp_017.phpt b/ext/opcache/tests/opt/sccp_017.phpt index ef317fd818e81..5afc24bf60ce5 100644 --- a/ext/opcache/tests/opt/sccp_017.phpt +++ b/ext/opcache/tests/opt/sccp_017.phpt @@ -21,16 +21,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_017.php:1-10 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=2, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_017.php:2-8 0000 CV0($x) = RECV 1 -0001 DEFER_RUN -0002 RETURN int(5) +0001 RETURN int(5) diff --git a/ext/opcache/tests/opt/sccp_019.phpt b/ext/opcache/tests/opt/sccp_019.phpt index e17676cd3e187..00c8a34c2c060 100644 --- a/ext/opcache/tests/opt/sccp_019.phpt +++ b/ext/opcache/tests/opt/sccp_019.phpt @@ -20,16 +20,14 @@ function foo(int $x) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_019.php:1-9 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=3, args=1, vars=1, tmps=0) + ; (lines=2, args=1, vars=1, tmps=0) ; (after optimizer) ; %ssccp_019.php:2-7 0000 CV0($x) = RECV 1 -0001 DEFER_RUN -0002 RETURN int(5) +0001 RETURN int(5) diff --git a/ext/opcache/tests/opt/sccp_022.phpt b/ext/opcache/tests/opt/sccp_022.phpt index baef5d22791a8..ffcc48b0dccd9 100644 --- a/ext/opcache/tests/opt/sccp_022.phpt +++ b/ext/opcache/tests/opt/sccp_022.phpt @@ -26,14 +26,13 @@ function bar() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=12, args=1, vars=2, tmps=1) + ; (lines=11, args=1, vars=2, tmps=1) ; (after optimizer) ; %s 0000 CV0($x) = RECV 1 @@ -46,11 +45,10 @@ foo: 0007 OP_DATA int(5) 0008 T2 = FETCH_DIM_R CV1($a) int(1) 0009 ECHO T2 -0010 DEFER_RUN -0011 RETURN null +0010 RETURN null bar: - ; (lines=10, args=0, vars=3, tmps=2) + ; (lines=9, args=0, vars=3, tmps=2) ; (after optimizer) ; %s 0000 V3 = FE_RESET_R CV0($a) 0007 @@ -61,8 +59,7 @@ bar: 0005 FE_FREE V4 0006 JMP 0001 0007 FE_FREE V3 -0008 DEFER_RUN -0009 RETURN null +0008 RETURN null LIVE RANGES: 3: 0001 - 0007 (loop) 4: 0003 - 0005 (loop) diff --git a/ext/opcache/tests/opt/sccp_024.phpt b/ext/opcache/tests/opt/sccp_024.phpt index 8ca6fdc76e6aa..56be429cc7994 100644 --- a/ext/opcache/tests/opt/sccp_024.phpt +++ b/ext/opcache/tests/opt/sccp_024.phpt @@ -24,14 +24,13 @@ class A { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_024.php:1-13 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) A::t: - ; (lines=11, args=1, vars=2, tmps=2) + ; (lines=10, args=1, vars=2, tmps=2) ; (after optimizer) ; %ssccp_024.php:3-10 0000 CV0($obj) = RECV 1 @@ -43,5 +42,4 @@ A::t: 0006 V3 = FETCH_CLASS (no-autoload) (silent) (exception) CV1($c) 0007 T2 = INSTANCEOF CV0($obj) V3 0008 ECHO T2 -0009 DEFER_RUN -0010 RETURN null +0009 RETURN null diff --git a/ext/opcache/tests/opt/sccp_026.phpt b/ext/opcache/tests/opt/sccp_026.phpt index 29371f29c25b9..3e318a7f75dfe 100644 --- a/ext/opcache/tests/opt/sccp_026.phpt +++ b/ext/opcache/tests/opt/sccp_026.phpt @@ -21,24 +21,21 @@ function test($var) { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s:1-10 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) test: - ; (lines=10, args=1, vars=2, tmps=1) + ; (lines=9, args=1, vars=2, tmps=1) ; (after optimizer) ; %s:2-8 0000 CV0($var) = RECV 1 0001 T2 = TYPE_CHECK (string) CV0($var) 0002 JMPZ T2 0004 0003 JMP 0005 -0004 DEFER_RUN -0005 RETURN null +0004 RETURN null 0005 INIT_FCALL 1 %d string("var_dump") 0006 SEND_VAR CV1($username) 1 0007 DO_ICALL -0008 DEFER_RUN -0009 RETURN null +0008 RETURN null diff --git a/ext/opcache/tests/opt/sccp_031.phpt b/ext/opcache/tests/opt/sccp_031.phpt index e3525c7f3e233..459fb31233d47 100644 --- a/ext/opcache/tests/opt/sccp_031.phpt +++ b/ext/opcache/tests/opt/sccp_031.phpt @@ -24,18 +24,16 @@ function foo() { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %ssccp_031.php:1-13 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) foo: - ; (lines=5, args=0, vars=0, tmps=0) + ; (lines=4, args=0, vars=0, tmps=0) ; (after optimizer) ; %s_031.php:2-11 0000 ECHO string("b") 0001 ECHO string("c") 0002 ECHO array(...) -0003 DEFER_RUN -0004 RETURN null +0003 RETURN null diff --git a/ext/opcache/tests/opt/sccp_032.phpt b/ext/opcache/tests/opt/sccp_032.phpt index 5d78afce59a61..6ee4a837ecd37 100644 --- a/ext/opcache/tests/opt/sccp_032.phpt +++ b/ext/opcache/tests/opt/sccp_032.phpt @@ -26,7 +26,7 @@ foreach (test() as $x) { ?> --EXPECTF-- $_main: - ; (lines=12, args=0, vars=1, tmps=2) + ; (lines=11, args=0, vars=1, tmps=2) ; (after optimizer) ; %ssccp_032.php:1-15 0000 INIT_FCALL 0 %d string("test") @@ -39,13 +39,12 @@ $_main: 0007 ECHO string("\n") 0008 JMP 0003 0009 FE_FREE V1 -0010 DEFER_RUN -0011 RETURN int(1) +0010 RETURN int(1) LIVE RANGES: 1: 0003 - 0009 (loop) test: - ; (lines=6, args=0, vars=0, tmps=1) + ; (lines=5, args=0, vars=0, tmps=1) ; (after optimizer) ; %ssccp_032.php:2-9 0000 GENERATOR_CREATE diff --git a/ext/opcache/tests/opt/type_inference_class_consts1.phpt b/ext/opcache/tests/opt/type_inference_class_consts1.phpt index 84dad02179648..fb9be49a6f149 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts1.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts1.phpt @@ -45,55 +45,48 @@ class Test1 { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) Test1::getSelfFoo: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test1::getSelfBar: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test1::getSelfBaz: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test1::getStaticFoo: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("FOO") 0001 VERIFY_RETURN_TYPE T0 -0002 DEFER_RUN -0003 RETURN T0 +0002 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test1::getStaticBar: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test1::getStaticBaz: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=2, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("BAZ") -0001 DEFER_RUN -0002 RETURN T0 +0001 RETURN T0 diff --git a/ext/opcache/tests/opt/type_inference_class_consts2.phpt b/ext/opcache/tests/opt/type_inference_class_consts2.phpt index 3b1d3873186e3..a417a208db7a6 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts2.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts2.phpt @@ -35,29 +35,25 @@ final class Test2 extends Test1 { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) Test2::getParentFoo: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test2::getParentBar: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test2::getParentBaz: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_class_consts3.phpt b/ext/opcache/tests/opt/type_inference_class_consts3.phpt index 6ecaa8aea4ea4..a568528de9e9d 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts3.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts3.phpt @@ -35,29 +35,25 @@ class Test3 { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) Test3::getTestFoo: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test3::getTestBar: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test3::getTestBaz: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_class_consts4.phpt b/ext/opcache/tests/opt/type_inference_class_consts4.phpt index a58ee5a3b9712..03c0c1248bce1 100644 --- a/ext/opcache/tests/opt/type_inference_class_consts4.phpt +++ b/ext/opcache/tests/opt/type_inference_class_consts4.phpt @@ -46,67 +46,60 @@ class Test4 implements TestI { ?> --EXPECTF-- $_main: - ; (lines=3, args=0, vars=0, tmps=0) + ; (lines=2, args=0, vars=0, tmps=0) ; (after optimizer) ; %s 0000 DECLARE_CLASS string("test4") -0001 DEFER_RUN -0002 RETURN int(1) +0001 RETURN int(1) Test4::getSelfA: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (self) (exception) string("A") 0001 VERIFY_RETURN_TYPE T0 -0002 DEFER_RUN -0003 RETURN T0 +0002 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getSelfB: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (self) (exception) string("B") 0001 VERIFY_RETURN_TYPE T0 -0002 DEFER_RUN -0003 RETURN T0 +0002 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getStaticA: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("A") 0001 VERIFY_RETURN_TYPE T0 -0002 DEFER_RUN -0003 RETURN T0 +0002 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getStaticB: - ; (lines=4, args=0, vars=0, tmps=1) + ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 T0 = FETCH_CLASS_CONSTANT (static) (exception) string("B") 0001 VERIFY_RETURN_TYPE T0 -0002 DEFER_RUN -0003 RETURN T0 +0002 RETURN T0 LIVE RANGES: 0: 0001 - 0002 (tmp/var) Test4::getTestIA: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test4::getTestIB: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) diff --git a/ext/opcache/tests/opt/type_inference_final_class.phpt b/ext/opcache/tests/opt/type_inference_final_class.phpt index e085d4cf0193f..3c4aa03d8cb4e 100644 --- a/ext/opcache/tests/opt/type_inference_final_class.phpt +++ b/ext/opcache/tests/opt/type_inference_final_class.phpt @@ -24,23 +24,20 @@ final class Test { ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) Test::getInt: - ; (lines=2, args=0, vars=0, tmps=0) + ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; %s -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) Test::getInt2: - ; (lines=3, args=0, vars=0, tmps=1) + ; (lines=2, args=0, vars=0, tmps=1) ; (after optimizer) ; %s 0000 V0 = QM_ASSIGN int(42) -0001 DEFER_RUN -0002 RETURN V0 +0001 RETURN V0 diff --git a/ext/opcache/tests/pipe_optimizations.phpt b/ext/opcache/tests/pipe_optimizations.phpt index 3814cb6dd72d7..5a8750845ddc8 100644 --- a/ext/opcache/tests/pipe_optimizations.phpt +++ b/ext/opcache/tests/pipe_optimizations.phpt @@ -35,7 +35,7 @@ var_dump($res1); ?> --EXPECTF-- $_main: - ; (lines=19, args=0, vars=2, tmps=%d) + ; (lines=18, args=0, vars=2, tmps=%d) ; (after optimizer) ; %s:1-27 0000 V2 = NEW 0 string("Other") @@ -55,39 +55,35 @@ $_main: 0014 INIT_FCALL 1 %d string("var_dump") 0015 SEND_VAR CV1($res1) 1 0016 DO_ICALL -0017 DEFER_RUN -0018 RETURN int(1) +0017 RETURN int(1) LIVE RANGES: 2: 0001 - 0002 (new) 2: 0010 - 0011 (tmp/var) _test1: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=4, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:3-5 0000 CV0($a) = RECV 1 0001 T1 = ADD CV0($a) int(1) 0002 VERIFY_RETURN_TYPE T1 -0003 DEFER_RUN -0004 RETURN T1 +0003 RETURN T1 Other::foo: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=4, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:8-10 0000 CV0($a) = RECV 1 0001 T1 = ADD CV0($a) CV0($a) 0002 VERIFY_RETURN_TYPE T1 -0003 DEFER_RUN -0004 RETURN T1 +0003 RETURN T1 Other::bar: - ; (lines=5, args=1, vars=1, tmps=%d) + ; (lines=4, args=1, vars=1, tmps=%d) ; (after optimizer) ; %s:12-14 0000 CV0($a) = RECV 1 0001 T1 = SUB CV0($a) int(1) 0002 VERIFY_RETURN_TYPE T1 -0003 DEFER_RUN -0004 RETURN T1 +0003 RETURN T1 int(11) diff --git a/ext/opcache/tests/preload_optimizer.phpt b/ext/opcache/tests/preload_optimizer.phpt index 3d03aa1238aa6..168e94dc19564 100644 --- a/ext/opcache/tests/preload_optimizer.phpt +++ b/ext/opcache/tests/preload_optimizer.phpt @@ -17,31 +17,27 @@ echo foo(); ?> --EXPECTF-- $_main: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=1, args=0, vars=0, tmps=%d) ; (after optimizer) ; $PRELOAD$:0-0 -0000 DEFER_RUN -0001 RETURN null +0000 RETURN null foo: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=1, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.inc:3-5 -0000 DEFER_RUN -0001 RETURN int(42) +0000 RETURN int(42) $_main: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=1, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.inc:1-6 -0000 DEFER_RUN -0001 RETURN int(1) +0000 RETURN int(1) $_main: - ; (lines=3, args=0, vars=0, tmps=%d) + ; (lines=2, args=0, vars=0, tmps=%d) ; (after optimizer) ; %spreload_optimizer.php:1-4 0000 ECHO string("42") -0001 DEFER_RUN -0002 RETURN int(1) +0001 RETURN int(1) 42 diff --git a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt index 6201f3a88e8b3..23187c11e270b 100644 --- a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt +++ b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt @@ -5,14 +5,10 @@ r q --EXPECTF-- [Successful compilation of %s] -prompt> array(3) { +prompt> array(%d) { [5]=> int(0) - [6]=> - int(0) - [7]=> - int(0) -} +%A [Script ended normally] prompt> --FILE-- diff --git a/sapi/phpdbg/tests/phpdbg_oplog_001.phpt b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt index 17bae5ee3a86a..9fc112a3f79ec 100644 --- a/sapi/phpdbg/tests/phpdbg_oplog_001.phpt +++ b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt @@ -28,7 +28,7 @@ prompt> halloarray(2) { [5]=> int(2) [8]=> - int(4) + int(2) } } [Script ended normally] diff --git a/sapi/phpdbg/tests/print_001.phpt b/sapi/phpdbg/tests/print_001.phpt index 0dfc96c9c8be2..ae1b7991973bd 100644 --- a/sapi/phpdbg/tests/print_001.phpt +++ b/sapi/phpdbg/tests/print_001.phpt @@ -10,10 +10,10 @@ p e q --EXPECTF-- [Successful compilation of %s] -prompt> [User Function foo (9 ops)] +prompt> [User Function foo (8 ops)] foo: - ; (lines=9, args=1, vars=1, tmps=%d) + ; (lines=8, args=1, vars=1, tmps=%d) ; %s:14-16 L0014 0000 CV0($baz) = RECV 1 L0015 0001 INIT_FCALL %d %d string("var_dump") @@ -22,30 +22,27 @@ L0015 0003 SEND_VAR CV0($baz) 1 L0015 0004 V1 = DO_ICALL L0015 0005 SEND_VAR V1 1 L0015 0006 DO_ICALL -L0016 0007 DEFER_RUN -L0016 0008 RETURN null +L0016 0007 RETURN null prompt> [User Class: Foo\Bar (2 methods)] Foo\Bar::Foo: - ; (lines=6, args=1, vars=1, tmps=%d) + ; (lines=5, args=1, vars=1, tmps=%d) ; %s:5-7 L0005 0000 CV0($bar) = RECV 1 L0006 0001 INIT_NS_FCALL_BY_NAME 1 string("Foo\\var_dump") L0006 0002 SEND_VAR_EX CV0($bar) 1 L0006 0003 DO_FCALL -L0007 0004 DEFER_RUN -L0007 0005 RETURN null +L0007 0004 RETURN null Foo\Bar::baz: - ; (lines=2, args=0, vars=0, tmps=%d) + ; (lines=1, args=0, vars=0, tmps=%d) ; %s:9-9 -L0009 0000 DEFER_RUN -L0009 0001 RETURN null +L0009 0000 RETURN null prompt> [Not Executing!] -prompt> [Context %s (10 ops)] +prompt> [Context %s (9 ops)] $_main: - ; (lines=10, args=0, vars=0, tmps=%d) + ; (lines=9, args=0, vars=0, tmps=%d) ; %s:1-21 L0018 0000 V0 = NEW 0 string("Foo\\Bar") L0018 0001 DO_FCALL @@ -55,8 +52,7 @@ L0018 0004 DO_FCALL L0019 0005 INIT_FCALL %d %d string("foo") L0019 0006 SEND_VAL string("test") 1 L0019 0007 DO_FCALL -L0021 0008 DEFER_RUN -L0021 0009 RETURN int(1) +L0021 0008 RETURN int(1) prompt> --FILE-- string(4) "test" >00015: var_dump(strrev($baz)); 00016: } 00017: -prompt> [Stack in foo() (9 ops)] +prompt> [Stack in foo() (8 ops)] foo: - ; (lines=9, args=1, vars=1, tmps=%d) + ; (lines=8, args=1, vars=1, tmps=%d) ; %s:14-16 L0014 0000 CV0($baz) = RECV 1 L0015 0001 INIT_FCALL %d %d string("var_dump") @@ -28,8 +28,7 @@ L0015 0003 SEND_VAR CV0($baz) 1 L0015 0004 V1 = DO_ICALL L0015 0005 SEND_VAR V1 1 L0015 0006 DO_ICALL -L0016 0007 DEFER_RUN -L0016 0008 RETURN null +L0016 0007 RETURN null prompt> L0015 0001 INIT_FCALL %d %d string("var_dump") prompt> --FILE-- diff --git a/sapi/phpdbg/tests/watch_006.phpt b/sapi/phpdbg/tests/watch_006.phpt index c5f53a37510c5..22ca94c21c433 100644 --- a/sapi/phpdbg/tests/watch_006.phpt +++ b/sapi/phpdbg/tests/watch_006.phpt @@ -38,6 +38,7 @@ New value: 1 prompt> [Breaking on watchpoint $b] Old value: New value (reference): Array ([0] => 1) +%A >00006: $a[0] = 2; 00007: $a[1] = 3; 00008: $c = [1]; From 0eb6d670f09213faf162a87b9a526a9cf5aa07d2 Mon Sep 17 00:00:00 2001 From: Khaled Alam Date: Fri, 26 Dec 2025 23:44:03 +0400 Subject: [PATCH 4/5] feat: Zend add exception unwinding support for defer keyword. --- Zend/tests/{ => defer}/defer_001.phpt | 0 Zend/tests/{ => defer}/defer_002.phpt | 0 Zend/tests/{ => defer}/defer_003.phpt | 0 Zend/tests/{ => defer}/defer_004.phpt | 0 .../defer_005.phpt} | 0 Zend/tests/defer/defer_006.phpt | 40 ++++++ Zend/tests/defer/defer_007.phpt | 34 +++++ Zend/tests/defer/defer_008.phpt | 31 +++++ Zend/tests/defer/defer_009.phpt | 45 ++++++ Zend/tests/defer/defer_010.phpt | 34 +++++ Zend/tests/defer/defer_011.phpt | 54 ++++++++ Zend/tests/defer/defer_012.phpt | 41 ++++++ Zend/tests/defer/defer_013.phpt | 40 ++++++ Zend/tests/defer/defer_014.phpt | 70 ++++++++++ Zend/tests/defer/defer_015.phpt | 24 ++++ Zend/zend_compile.h | 1 + Zend/zend_vm_def.h | 62 ++++++++- Zend/zend_vm_execute.h | 130 ++++++++++++++++-- 18 files changed, 585 insertions(+), 21 deletions(-) rename Zend/tests/{ => defer}/defer_001.phpt (100%) rename Zend/tests/{ => defer}/defer_002.phpt (100%) rename Zend/tests/{ => defer}/defer_003.phpt (100%) rename Zend/tests/{ => defer}/defer_004.phpt (100%) rename Zend/tests/{defer_005.phpt.skip => defer/defer_005.phpt} (100%) create mode 100644 Zend/tests/defer/defer_006.phpt create mode 100644 Zend/tests/defer/defer_007.phpt create mode 100644 Zend/tests/defer/defer_008.phpt create mode 100644 Zend/tests/defer/defer_009.phpt create mode 100644 Zend/tests/defer/defer_010.phpt create mode 100644 Zend/tests/defer/defer_011.phpt create mode 100644 Zend/tests/defer/defer_012.phpt create mode 100644 Zend/tests/defer/defer_013.phpt create mode 100644 Zend/tests/defer/defer_014.phpt create mode 100644 Zend/tests/defer/defer_015.phpt diff --git a/Zend/tests/defer_001.phpt b/Zend/tests/defer/defer_001.phpt similarity index 100% rename from Zend/tests/defer_001.phpt rename to Zend/tests/defer/defer_001.phpt diff --git a/Zend/tests/defer_002.phpt b/Zend/tests/defer/defer_002.phpt similarity index 100% rename from Zend/tests/defer_002.phpt rename to Zend/tests/defer/defer_002.phpt diff --git a/Zend/tests/defer_003.phpt b/Zend/tests/defer/defer_003.phpt similarity index 100% rename from Zend/tests/defer_003.phpt rename to Zend/tests/defer/defer_003.phpt diff --git a/Zend/tests/defer_004.phpt b/Zend/tests/defer/defer_004.phpt similarity index 100% rename from Zend/tests/defer_004.phpt rename to Zend/tests/defer/defer_004.phpt diff --git a/Zend/tests/defer_005.phpt.skip b/Zend/tests/defer/defer_005.phpt similarity index 100% rename from Zend/tests/defer_005.phpt.skip rename to Zend/tests/defer/defer_005.phpt diff --git a/Zend/tests/defer/defer_006.phpt b/Zend/tests/defer/defer_006.phpt new file mode 100644 index 0000000000000..fb5f25cbe2339 --- /dev/null +++ b/Zend/tests/defer/defer_006.phpt @@ -0,0 +1,40 @@ +--TEST-- +Defer with loops and early return +--FILE-- + +--EXPECT-- +Test 1 start +Loop 0 +Loop 1 +Loop 2 +Defer for test 1 +Result: Early return from 1 +Test 2 start +Loop 0 +Loop 1 +Loop 2 +Defer for test 2 +Result: Early return from 2 diff --git a/Zend/tests/defer/defer_007.phpt b/Zend/tests/defer/defer_007.phpt new file mode 100644 index 0000000000000..fc2edea551e4a --- /dev/null +++ b/Zend/tests/defer/defer_007.phpt @@ -0,0 +1,34 @@ +--TEST-- +Defer with references and modifications +--FILE-- + +--EXPECT-- +Initial counter: 0 +Modified counter: 100 +Defer 2: counter = 5 +Defer 1: counter = 15 +Final counter: 15 diff --git a/Zend/tests/defer/defer_008.phpt b/Zend/tests/defer/defer_008.phpt new file mode 100644 index 0000000000000..7d6f2b91cbc83 --- /dev/null +++ b/Zend/tests/defer/defer_008.phpt @@ -0,0 +1,31 @@ +--TEST-- +Defer with closures and use variables +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +Opening Resource +Processing with value 100 +Closing Resource with value 100 +Caught: Error during processing diff --git a/Zend/tests/defer/defer_009.phpt b/Zend/tests/defer/defer_009.phpt new file mode 100644 index 0000000000000..e46d148a6c8ef --- /dev/null +++ b/Zend/tests/defer/defer_009.phpt @@ -0,0 +1,45 @@ +--TEST-- +Defer with mixed normal and exception paths +--FILE-- +getMessage() . "\n"; +} + +echo "All done\n"; +?> +--EXPECT-- +Success function start +Success function end +Success defer +Result: OK +Failure function start +Failure defer +Caught: Failed +All done diff --git a/Zend/tests/defer/defer_010.phpt b/Zend/tests/defer/defer_010.phpt new file mode 100644 index 0000000000000..cac0b6c2eba91 --- /dev/null +++ b/Zend/tests/defer/defer_010.phpt @@ -0,0 +1,34 @@ +--TEST-- +Defer with array operations and modifications +--FILE-- + []]; + + defer { + echo "Final data: " . json_encode($data) . "\n"; + } + + defer { + $data['items'][] = 'cleanup'; + echo "Added cleanup item\n"; + } + + $data['items'][] = 'first'; + $data['items'][] = 'second'; + echo "Current data: " . json_encode($data) . "\n"; + + throw new Exception("Test"); +} + +try { + test(); +} catch (Exception $e) { + echo "Caught: " . $e->getMessage() . "\n"; +} +?> +--EXPECT-- +Current data: {"items":["first","second"]} +Added cleanup item +Final data: {"items":["first","second","cleanup"]} +Caught: Test diff --git a/Zend/tests/defer/defer_011.phpt b/Zend/tests/defer/defer_011.phpt new file mode 100644 index 0000000000000..337e6ad1b39bd --- /dev/null +++ b/Zend/tests/defer/defer_011.phpt @@ -0,0 +1,54 @@ +--TEST-- +Defer with object cleanup +--FILE-- +name = $name; + $this->open(); + } + + public function open() { + echo "Opening resource: {$this->name}\n"; + $this->isOpen = true; + } + + public function close() { + echo "Closing resource: {$this->name}\n"; + $this->isOpen = false; + } +} + +function test() { + $resource1 = new Resource("Database"); + + defer { + $resource1->close(); + } + + $resource2 = new Resource("File"); + + defer { + $resource2->close(); + } + + echo "Using resources\n"; + throw new Exception("Error occurred"); +} + +try { + test(); +} catch (Exception $e) { + echo "Caught: " . $e->getMessage() . "\n"; +} +?> +--EXPECT-- +Opening resource: Database +Opening resource: File +Using resources +Closing resource: File +Closing resource: Database +Caught: Error occurred diff --git a/Zend/tests/defer/defer_012.phpt b/Zend/tests/defer/defer_012.phpt new file mode 100644 index 0000000000000..c5c1cdecc63d7 --- /dev/null +++ b/Zend/tests/defer/defer_012.phpt @@ -0,0 +1,41 @@ +--TEST-- +Defer with conditional execution and goto +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +Test start with shouldFail= +Normal path +Cleanup defer +Result: success +Test start with shouldFail=1 +Error path +Cleanup defer +Caught: Failed diff --git a/Zend/tests/defer/defer_013.phpt b/Zend/tests/defer/defer_013.phpt new file mode 100644 index 0000000000000..15e1bf6c19d7b --- /dev/null +++ b/Zend/tests/defer/defer_013.phpt @@ -0,0 +1,40 @@ +--TEST-- +Defer with recursive function calls +--FILE-- + +--EXPECT-- +factorial(4) start + factorial(3) start + factorial(2) start + factorial(1) start + factorial(1) base case + factorial(1) defer + factorial(2) = 2 + factorial(2) defer + factorial(3) = 6 + factorial(3) defer +factorial(4) = 24 +factorial(4) defer +Final result: 24 diff --git a/Zend/tests/defer/defer_014.phpt b/Zend/tests/defer/defer_014.phpt new file mode 100644 index 0000000000000..8690846eae589 --- /dev/null +++ b/Zend/tests/defer/defer_014.phpt @@ -0,0 +1,70 @@ +--TEST-- +Defer execution order with multiple returns +--FILE-- + +--EXPECT-- +=== Test -1 === +Test -1 start +Returning early for negative +Defer 2 for -1 +Defer 1 for -1 +Result: negative + +=== Test 0 === +Test 0 start +Returning early for zero +Defer 3 for 0 +Defer 2 for 0 +Defer 1 for 0 +Result: zero + +=== Test 1 === +Test 1 start +Normal return for positive +Defer 4 for 1 +Defer 3 for 1 +Defer 2 for 1 +Defer 1 for 1 +Result: positive diff --git a/Zend/tests/defer/defer_015.phpt b/Zend/tests/defer/defer_015.phpt new file mode 100644 index 0000000000000..2763bca6aeb5d --- /dev/null +++ b/Zend/tests/defer/defer_015.phpt @@ -0,0 +1,24 @@ +--TEST-- +Defer basic exception that propagates +--FILE-- + +--EXPECT-- +Start +Defer +Caught diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index ab5b01ee4df44..8eb7939e55f6a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -534,6 +534,7 @@ typedef struct _zend_defer_stack { uint32_t count; uint32_t capacity; zend_defer_entry *entries; + zend_object *unwinding_exception; } zend_defer_stack; struct _zend_op_array { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1922fc138138c..a6a860c5696b9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2967,6 +2967,12 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) SAVE_OPLINE(); #endif + if (UNEXPECTED(EX(defer_stack) != NULL)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + 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); @@ -8094,6 +8100,54 @@ ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY) ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_catch_offset, uint32_t op_num) { + if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && + EX(defer_stack) && EX(defer_stack)->count > 0) { + + zend_defer_stack *stack = EX(defer_stack); + + if (EG(exception) && !stack->unwinding_exception) { + stack->unwinding_exception = EG(exception); + } + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline < EX(func)->op_array.last && + defer_opline + defer_len <= EX(func)->op_array.last) { + + EG(exception) = NULL; + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline_num = op_num; + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } else { + if (stack->count > 0) { + EG(exception) = stack->unwinding_exception; + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); + ZEND_VM_CONTINUE(); + } else { + EG(exception) = stack->unwinding_exception; + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + } + } + + if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { + EG(exception) = EX(defer_stack)->unwinding_exception; + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + /* May be NULL during generator closing (only finally blocks are executed) */ zend_object *ex = EG(exception); @@ -8219,13 +8273,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) cleanup_unfinished_calls(execute_data, throw_op_num); - /* TODO: Execute defers before unwinding on exception */ - if (EX(defer_stack)) { - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; - } - if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: @@ -8371,6 +8418,7 @@ ZEND_VM_HANDLER(211, ZEND_DEFER_PUSH, CONST, ANY) EX(defer_stack)->count = 0; EX(defer_stack)->capacity = 4; EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + EX(defer_stack)->unwinding_exception = NULL; } zend_defer_stack *stack = EX(defer_stack); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8575979fe256b..46d14d1c9308f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1190,6 +1190,12 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV SAVE_OPLINE(); #endif + if (UNEXPECTED(EX(defer_stack) != NULL)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + 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); @@ -3307,6 +3313,54 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_N static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV_EX zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_EX uint32_t try_catch_offset, uint32_t op_num) { + if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && + EX(defer_stack) && EX(defer_stack)->count > 0) { + + zend_defer_stack *stack = EX(defer_stack); + + if (EG(exception) && !stack->unwinding_exception) { + stack->unwinding_exception = EG(exception); + } + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline < EX(func)->op_array.last && + defer_opline + defer_len <= EX(func)->op_array.last) { + + EG(exception) = NULL; + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline_num = op_num; + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } else { + if (stack->count > 0) { + EG(exception) = stack->unwinding_exception; + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); + ZEND_VM_CONTINUE(); + } else { + EG(exception) = stack->unwinding_exception; + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + } + } + + if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { + EG(exception) = EX(defer_stack)->unwinding_exception; + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + /* May be NULL during generator closing (only finally blocks are executed) */ zend_object *ex = EG(exception); @@ -3432,13 +3486,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_HANDLE_EXCEPT cleanup_unfinished_calls(execute_data, throw_op_num); - /* TODO: Execute defers before unwinding on exception */ - if (EX(defer_stack)) { - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; - } - if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: @@ -5960,6 +6007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DEFER_PUSH_SP EX(defer_stack)->count = 0; EX(defer_stack)->capacity = 4; EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + EX(defer_stack)->unwinding_exception = NULL; } zend_defer_stack *stack = EX(defer_stack); @@ -57053,6 +57101,12 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend SAVE_OPLINE(); #endif + if (UNEXPECTED(EX(defer_stack) != NULL)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + 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); @@ -59179,13 +59233,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HANDLE_EXCEPTION_S cleanup_unfinished_calls(execute_data, throw_op_num); - /* TODO: Execute defers before unwinding on exception */ - if (EX(defer_stack)) { - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; - } - if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) { switch (throw_op->opcode) { case ZEND_ADD_ARRAY_ELEMENT: @@ -61707,6 +61754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DEFER_PUSH_SPEC_CO EX(defer_stack)->count = 0; EX(defer_stack)->capacity = 4; EX(defer_stack)->entries = emalloc(sizeof(zend_defer_entry) * 4); + EX(defer_stack)->unwinding_exception = NULL; } zend_defer_stack *stack = EX(defer_stack); @@ -112407,6 +112455,54 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX z static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_EX uint32_t try_catch_offset, uint32_t op_num) { + if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && + EX(defer_stack) && EX(defer_stack)->count > 0) { + + zend_defer_stack *stack = EX(defer_stack); + + if (EG(exception) && !stack->unwinding_exception) { + stack->unwinding_exception = EG(exception); + } + + stack->count--; + zend_defer_entry *entry = &stack->entries[stack->count]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; + + if (defer_opline < EX(func)->op_array.last && + defer_opline + defer_len <= EX(func)->op_array.last) { + + EG(exception) = NULL; + + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + + uint32_t return_opline_num = op_num; + + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); + ZEND_VM_CONTINUE(); + } else { + if (stack->count > 0) { + EG(exception) = stack->unwinding_exception; + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); + ZEND_VM_CONTINUE(); + } else { + EG(exception) = stack->unwinding_exception; + efree(stack->entries); + efree(stack); + EX(defer_stack) = NULL; + } + } + } + + if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { + EG(exception) = EX(defer_stack)->unwinding_exception; + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + /* May be NULL during generator closing (only finally blocks are executed) */ zend_object *ex = EG(exception); @@ -116453,6 +116549,12 @@ ZEND_API void execute_ex(zend_execute_data *ex) SAVE_OPLINE(); #endif + if (UNEXPECTED(EX(defer_stack) != NULL)) { + efree(EX(defer_stack)->entries); + efree(EX(defer_stack)); + EX(defer_stack) = NULL; + } + 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 75c5b404882d66b9f0f65f1c68cd0fea4f275ca2 Mon Sep 17 00:00:00 2001 From: Khaled Alam Date: Sat, 27 Dec 2025 12:45:10 +0400 Subject: [PATCH 5/5] refactor: Fix defer exception unwinding with JMP chaining. --- Zend/tests/defer/defer_005.phpt | 18 ++-- Zend/tests/defer/defer_008.phpt | 29 +++---- Zend/tests/defer/defer_009.phpt | 39 +++------ Zend/tests/defer/defer_010.phpt | 19 +---- Zend/tests/defer/defer_011.phpt | 49 +++-------- Zend/tests/defer/defer_012.phpt | 35 ++------ Zend/tests/defer/defer_015.phpt | 28 +++--- Zend/zend_vm_def.h | 68 ++++++++------- Zend/zend_vm_execute.h | 145 ++++++++++++++++++-------------- 9 files changed, 191 insertions(+), 239 deletions(-) diff --git a/Zend/tests/defer/defer_005.phpt b/Zend/tests/defer/defer_005.phpt index 7c7d0d768b37f..bf097288a3112 100644 --- a/Zend/tests/defer/defer_005.phpt +++ b/Zend/tests/defer/defer_005.phpt @@ -2,25 +2,19 @@ Defer executes on exception --FILE-- getMessage() . "\n"; } ?> --EXPECT-- -Start -Before throw -Cleanup executed -Caught: Test +Defer executed +Caught: Test exception diff --git a/Zend/tests/defer/defer_008.phpt b/Zend/tests/defer/defer_008.phpt index 7d6f2b91cbc83..25b3c0a1c0fcf 100644 --- a/Zend/tests/defer/defer_008.phpt +++ b/Zend/tests/defer/defer_008.phpt @@ -1,21 +1,18 @@ --TEST-- -Defer with closures and use variables +Multiple defers execute on exception in LIFO order --FILE-- --EXPECT-- -Opening Resource -Processing with value 100 -Closing Resource with value 100 -Caught: Error during processing +Defer 3 +Defer 2 +Defer 1 +Caught: Test diff --git a/Zend/tests/defer/defer_009.phpt b/Zend/tests/defer/defer_009.phpt index e46d148a6c8ef..b53fe6fb71745 100644 --- a/Zend/tests/defer/defer_009.phpt +++ b/Zend/tests/defer/defer_009.phpt @@ -1,45 +1,28 @@ --TEST-- -Defer with mixed normal and exception paths +Defer with nested function calls and exceptions --FILE-- getMessage() . "\n"; } - -echo "All done\n"; ?> --EXPECT-- -Success function start -Success function end -Success defer -Result: OK -Failure function start -Failure defer -Caught: Failed -All done +Inner defer +Outer defer +Caught: Inner exception diff --git a/Zend/tests/defer/defer_010.phpt b/Zend/tests/defer/defer_010.phpt index cac0b6c2eba91..fd4746a331bba 100644 --- a/Zend/tests/defer/defer_010.phpt +++ b/Zend/tests/defer/defer_010.phpt @@ -1,23 +1,14 @@ --TEST-- -Defer with array operations and modifications +Defer can access exception variable --FILE-- []]; + $value = "test value"; defer { - echo "Final data: " . json_encode($data) . "\n"; + echo "Defer: $value\n"; } - defer { - $data['items'][] = 'cleanup'; - echo "Added cleanup item\n"; - } - - $data['items'][] = 'first'; - $data['items'][] = 'second'; - echo "Current data: " . json_encode($data) . "\n"; - throw new Exception("Test"); } @@ -28,7 +19,5 @@ try { } ?> --EXPECT-- -Current data: {"items":["first","second"]} -Added cleanup item -Final data: {"items":["first","second","cleanup"]} +Defer: test value Caught: Test diff --git a/Zend/tests/defer/defer_011.phpt b/Zend/tests/defer/defer_011.phpt index 337e6ad1b39bd..0e6e2d17e36b7 100644 --- a/Zend/tests/defer/defer_011.phpt +++ b/Zend/tests/defer/defer_011.phpt @@ -1,42 +1,18 @@ --TEST-- -Defer with object cleanup +Defer executes even when exception thrown in loop --FILE-- name = $name; - $this->open(); - } - - public function open() { - echo "Opening resource: {$this->name}\n"; - $this->isOpen = true; - } - - public function close() { - echo "Closing resource: {$this->name}\n"; - $this->isOpen = false; - } -} - function test() { - $resource1 = new Resource("Database"); - defer { - $resource1->close(); + echo "Defer executed\n"; } - $resource2 = new Resource("File"); - - defer { - $resource2->close(); + for ($i = 0; $i < 5; $i++) { + echo "Loop $i\n"; + if ($i == 2) { + throw new Exception("Loop exception"); + } } - - echo "Using resources\n"; - throw new Exception("Error occurred"); } try { @@ -46,9 +22,8 @@ try { } ?> --EXPECT-- -Opening resource: Database -Opening resource: File -Using resources -Closing resource: File -Closing resource: Database -Caught: Error occurred +Loop 0 +Loop 1 +Loop 2 +Defer executed +Caught: Loop exception diff --git a/Zend/tests/defer/defer_012.phpt b/Zend/tests/defer/defer_012.phpt index c5c1cdecc63d7..b7783cd329376 100644 --- a/Zend/tests/defer/defer_012.phpt +++ b/Zend/tests/defer/defer_012.phpt @@ -1,41 +1,22 @@ --TEST-- -Defer with conditional execution and goto +Exception in defer block replaces original exception --FILE-- getMessage() . "\n"; } ?> --EXPECT-- -Test start with shouldFail= -Normal path -Cleanup defer -Result: success -Test start with shouldFail=1 -Error path -Cleanup defer -Caught: Failed +Defer throwing new exception +Caught: Defer exception diff --git a/Zend/tests/defer/defer_015.phpt b/Zend/tests/defer/defer_015.phpt index 2763bca6aeb5d..f93c762dd6ba0 100644 --- a/Zend/tests/defer/defer_015.phpt +++ b/Zend/tests/defer/defer_015.phpt @@ -1,24 +1,30 @@ --TEST-- -Defer basic exception that propagates +Defer with conditional exception --FILE-- getMessage() . "\n"; } ?> --EXPECT-- -Start -Defer -Caught +Normal execution +Defer executed +--- +Defer executed +Caught: Conditional exception diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a6a860c5696b9..965656fe18e71 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2968,6 +2968,15 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) #endif if (UNEXPECTED(EX(defer_stack) != NULL)) { + if (EX(defer_stack)->unwinding_exception) { + if (EG(exception)) { + zend_exception_set_previous(EG(exception), EX(defer_stack)->unwinding_exception); + } else { + EG(exception) = EX(defer_stack)->unwinding_exception; + } + EX(defer_stack)->unwinding_exception = NULL; + } + efree(EX(defer_stack)->entries); efree(EX(defer_stack)); EX(defer_stack) = NULL; @@ -8101,51 +8110,48 @@ ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY) ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_catch_offset, uint32_t op_num) { if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && - EX(defer_stack) && EX(defer_stack)->count > 0) { + EX(defer_stack) && EX(defer_stack)->count > 0 && EG(exception)) { zend_defer_stack *stack = EX(defer_stack); + uint32_t count = stack->count; - if (EG(exception) && !stack->unwinding_exception) { - stack->unwinding_exception = EG(exception); - } + stack->count = 0; - stack->count--; - zend_defer_entry *entry = &stack->entries[stack->count]; - uint32_t defer_opline = entry->opline_num; - uint32_t defer_len = entry->length; + stack->unwinding_exception = EG(exception); + EG(exception) = NULL; - if (defer_opline < EX(func)->op_array.last && - defer_opline + defer_len <= EX(func)->op_array.last) { + uint32_t first_defer_opline = 0; - EG(exception) = NULL; + for (int32_t i = count - 1; i >= 0; i--) { + zend_defer_entry *entry = &stack->entries[i]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; - zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + continue; + } - uint32_t return_opline_num = op_num; + if (i == (int32_t)(count - 1)) { + first_defer_opline = defer_opline; + } - ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); - ZEND_VM_CONTINUE(); - } else { - if (stack->count > 0) { - EG(exception) = stack->unwinding_exception; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); - ZEND_VM_CONTINUE(); + if (i > 0) { + uint32_t next_defer_opline = stack->entries[i - 1].opline_num; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[next_defer_opline]); } else { - EG(exception) = stack->unwinding_exception; - efree(stack->entries); - efree(stack); - EX(defer_stack) = NULL; + uint32_t last_opline_num = EX(func)->op_array.last - 1; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[last_opline_num]); } } - } - if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { - EG(exception) = EX(defer_stack)->unwinding_exception; - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; + if (first_defer_opline > 0 && first_defer_opline < EX(func)->op_array.last) { + ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[first_defer_opline], 0); + } } /* May be NULL during generator closing (only finally blocks are executed) */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 46d14d1c9308f..c7154a14c8567 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1191,6 +1191,15 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV #endif if (UNEXPECTED(EX(defer_stack) != NULL)) { + if (EX(defer_stack)->unwinding_exception) { + if (EG(exception)) { + zend_exception_set_previous(EG(exception), EX(defer_stack)->unwinding_exception); + } else { + EG(exception) = EX(defer_stack)->unwinding_exception; + } + EX(defer_stack)->unwinding_exception = NULL; + } + efree(EX(defer_stack)->entries); efree(EX(defer_stack)); EX(defer_stack) = NULL; @@ -3314,51 +3323,48 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_N static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV_EX zend_dispatch_try_catch_finally_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_EX uint32_t try_catch_offset, uint32_t op_num) { if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && - EX(defer_stack) && EX(defer_stack)->count > 0) { + EX(defer_stack) && EX(defer_stack)->count > 0 && EG(exception)) { zend_defer_stack *stack = EX(defer_stack); + uint32_t count = stack->count; - if (EG(exception) && !stack->unwinding_exception) { - stack->unwinding_exception = EG(exception); - } + stack->count = 0; - stack->count--; - zend_defer_entry *entry = &stack->entries[stack->count]; - uint32_t defer_opline = entry->opline_num; - uint32_t defer_len = entry->length; + stack->unwinding_exception = EG(exception); + EG(exception) = NULL; - if (defer_opline < EX(func)->op_array.last && - defer_opline + defer_len <= EX(func)->op_array.last) { + uint32_t first_defer_opline = 0; - EG(exception) = NULL; + for (int32_t i = count - 1; i >= 0; i--) { + zend_defer_entry *entry = &stack->entries[i]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; - zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + continue; + } - uint32_t return_opline_num = op_num; + if (i == (int32_t)(count - 1)) { + first_defer_opline = defer_opline; + } - ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); - ZEND_VM_CONTINUE(); - } else { - if (stack->count > 0) { - EG(exception) = stack->unwinding_exception; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); - ZEND_VM_CONTINUE(); + if (i > 0) { + uint32_t next_defer_opline = stack->entries[i - 1].opline_num; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[next_defer_opline]); } else { - EG(exception) = stack->unwinding_exception; - efree(stack->entries); - efree(stack); - EX(defer_stack) = NULL; + uint32_t last_opline_num = EX(func)->op_array.last - 1; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[last_opline_num]); } } - } - if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { - EG(exception) = EX(defer_stack)->unwinding_exception; - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; + if (first_defer_opline > 0 && first_defer_opline < EX(func)->op_array.last) { + ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[first_defer_opline], 0); + } } /* May be NULL during generator closing (only finally blocks are executed) */ @@ -57102,6 +57108,15 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend #endif if (UNEXPECTED(EX(defer_stack) != NULL)) { + if (EX(defer_stack)->unwinding_exception) { + if (EG(exception)) { + zend_exception_set_previous(EG(exception), EX(defer_stack)->unwinding_exception); + } else { + EG(exception) = EX(defer_stack)->unwinding_exception; + } + EX(defer_stack)->unwinding_exception = NULL; + } + efree(EX(defer_stack)->entries); efree(EX(defer_stack)); EX(defer_stack) = NULL; @@ -112456,51 +112471,48 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX z static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX zend_dispatch_try_catch_finally_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_EX uint32_t try_catch_offset, uint32_t op_num) { if ((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_DEFER) && - EX(defer_stack) && EX(defer_stack)->count > 0) { + EX(defer_stack) && EX(defer_stack)->count > 0 && EG(exception)) { zend_defer_stack *stack = EX(defer_stack); + uint32_t count = stack->count; - if (EG(exception) && !stack->unwinding_exception) { - stack->unwinding_exception = EG(exception); - } + stack->count = 0; - stack->count--; - zend_defer_entry *entry = &stack->entries[stack->count]; - uint32_t defer_opline = entry->opline_num; - uint32_t defer_len = entry->length; + stack->unwinding_exception = EG(exception); + EG(exception) = NULL; - if (defer_opline < EX(func)->op_array.last && - defer_opline + defer_len <= EX(func)->op_array.last) { + uint32_t first_defer_opline = 0; - EG(exception) = NULL; + for (int32_t i = count - 1; i >= 0; i--) { + zend_defer_entry *entry = &stack->entries[i]; + uint32_t defer_opline = entry->opline_num; + uint32_t defer_len = entry->length; - zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; + if (defer_opline >= EX(func)->op_array.last || + defer_opline + defer_len > EX(func)->op_array.last) { + continue; + } - uint32_t return_opline_num = op_num; + if (i == (int32_t)(count - 1)) { + first_defer_opline = defer_opline; + } - ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, &EX(func)->op_array.opcodes[return_opline_num]); + zend_op *defer_exit_jmp = &EX(func)->op_array.opcodes[defer_opline + defer_len - 1]; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[defer_opline]); - ZEND_VM_CONTINUE(); - } else { - if (stack->count > 0) { - EG(exception) = stack->unwinding_exception; - ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[op_num]); - ZEND_VM_CONTINUE(); + if (i > 0) { + uint32_t next_defer_opline = stack->entries[i - 1].opline_num; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[next_defer_opline]); } else { - EG(exception) = stack->unwinding_exception; - efree(stack->entries); - efree(stack); - EX(defer_stack) = NULL; + uint32_t last_opline_num = EX(func)->op_array.last - 1; + ZEND_SET_OP_JMP_ADDR(defer_exit_jmp, defer_exit_jmp->op1, + &EX(func)->op_array.opcodes[last_opline_num]); } } - } - if (EX(defer_stack) && EX(defer_stack)->count == 0 && EX(defer_stack)->unwinding_exception) { - EG(exception) = EX(defer_stack)->unwinding_exception; - efree(EX(defer_stack)->entries); - efree(EX(defer_stack)); - EX(defer_stack) = NULL; + if (first_defer_opline > 0 && first_defer_opline < EX(func)->op_array.last) { + ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[first_defer_opline], 0); + } } /* May be NULL during generator closing (only finally blocks are executed) */ @@ -116550,6 +116562,15 @@ ZEND_API void execute_ex(zend_execute_data *ex) #endif if (UNEXPECTED(EX(defer_stack) != NULL)) { + if (EX(defer_stack)->unwinding_exception) { + if (EG(exception)) { + zend_exception_set_previous(EG(exception), EX(defer_stack)->unwinding_exception); + } else { + EG(exception) = EX(defer_stack)->unwinding_exception; + } + EX(defer_stack)->unwinding_exception = NULL; + } + efree(EX(defer_stack)->entries); efree(EX(defer_stack)); EX(defer_stack) = NULL;