Skip to content

Commit 78d2dfe

Browse files
committed
Re-introduce zend_interrupt() to reduce code size
1 parent 36a1c61 commit 78d2dfe

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

Zend/zend_vm_execute.h

Lines changed: 8 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Zend/zend_vm_gen.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,9 +1595,15 @@ function gen_halt_handler($f, $kind) {
15951595
}
15961596

15971597
function gen_interrupt_func($f, $kind, $spec) {
1598-
out($f, "static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS) {\n");
1598+
$cconv = $kind === ZEND_VM_KIND_TAILCALL ? 'ZEND_OPCODE_HANDLER_CCONV' : 'ZEND_OPCODE_HANDLER_FUNC_CCONV';
1599+
$variant = $kind === ZEND_VM_KIND_TAILCALL ? '_TAILCALL' : '';
1600+
out($f, "static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET {$cconv} zend_interrupt{$variant}(ZEND_OPCODE_HANDLER_ARGS) {\n");
15991601
out($f,"\tSAVE_OPLINE();\n");
1600-
out($f,"\tZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
1602+
if ($kind === ZEND_VM_KIND_TAILCALL) {
1603+
out($f,"\tZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
1604+
} else {
1605+
out($f, "\treturn &call_interrupt_op;\n");
1606+
}
16011607
out($f, "}\n");
16021608
}
16031609

@@ -1811,6 +1817,9 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
18111817
switch ($kind) {
18121818
case ZEND_VM_KIND_CALL:
18131819
gen_null_handler($f, $kind);
1820+
out($f, "#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n");
1821+
gen_interrupt_func($f, $kind, $spec);
1822+
out($f, "#endif\n");
18141823
break;
18151824
case ZEND_VM_KIND_TAILCALL:
18161825
gen_null_handler($f, $kind);
@@ -1853,7 +1862,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
18531862
out($f, "#pragma push_macro(\"ZEND_VM_INTERRUPT\")\n");
18541863
out($f, "#undef ZEND_VM_INTERRUPT\n");
18551864
out($f, "#define ZEND_VM_CONTINUE(handler) return opline\n");
1856-
out($f, "# define ZEND_VM_INTERRUPT() SAVE_OPLINE(); return &call_interrupt_op;\n");
1865+
out($f, "# define ZEND_VM_INTERRUPT() return zend_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)\n");
18571866
out($f, $delayed_helpers);
18581867
out($f, "#pragma pop_macro(\"ZEND_VM_INTERRUPT\")\n");
18591868
out($f, "#pragma pop_macro(\"ZEND_VM_CONTINUE\")\n");
@@ -2153,6 +2162,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21532162
out($f,"# define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
21542163
out($f,"\n");
21552164
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
2165+
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_interrupt(ZEND_OPCODE_HANDLER_ARGS);\n");
21562166
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
21572167
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_NULL_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
21582168
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HALT_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");

0 commit comments

Comments
 (0)