@@ -1595,9 +1595,15 @@ function gen_halt_handler($f, $kind) {
15951595}
15961596
15971597function 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