diff --git a/irtoc_scripts/interpreter_handlers.irt b/irtoc_scripts/interpreter_handlers.irt index f6e3d50beb0068363a104dc8349247c31ac2fc17..4d5cf40d8631ed565c4eddc128e3b7c202fe7251 100644 --- a/irtoc_scripts/interpreter_handlers.irt +++ b/irtoc_scripts/interpreter_handlers.irt @@ -34,6 +34,12 @@ macro(:ecma_intrinsic_check_setacc) do |sym, size, *args| acc := Phi(acc_eh, acc.u64).u64 end +macro(:handle_return_stackfull) do + save_acc_tag(acc_tag) + save_acc_value(acc) + Intrinsic(:INTERPRETER_RETURN).ptr.Terminator +end + macro(:ecma_intrinsic_invoke) do |sym, *args| Call(*args).Method(sym).any end diff --git a/irtoc_scripts/interpreter_main_loop.irt b/irtoc_scripts/interpreter_main_loop.irt index d48f1757253d75c4e2955de86761739284b1fedb..b24c2f363615bac16d188cfaefa12d4f3fef2883 100644 --- a/irtoc_scripts/interpreter_main_loop.irt +++ b/irtoc_scripts/interpreter_main_loop.irt @@ -310,7 +310,7 @@ ecma_intrinsic_setacc("CreateGeneratorObj", vreg_value(op[0]).any) when "ECMA_SUSPENDGENERATOR_PREF_V8" ecma_intrinsic_setacc("SuspendGeneratorInterp", vreg_value(op[0]).any, acc.any, ins_offset.u64) - handle_return() + handle_return_stackfull() when "ECMA_SETGENERATORSTATE_PREF_V8_IMM8" ecma_intrinsic_invoke("SetGeneratorState", vreg_value(op[0]).any, i8tou16(as_imm(op[1]))) when "ECMA_RESUMEGENERATOR_PREF_V8" @@ -328,7 +328,7 @@ ecma_intrinsic_setacc("AsyncGeneratorResolve", vreg_value(op[0]).any, acc.any) when "ECMA_SUSPENDASYNCGENERATOR_PREF_V8" ecma_intrinsic_setacc("SuspendAsyncGeneratorInterp", vreg_value(op[0]).any, acc.any, ins_offset.u64) - handle_return() + handle_return_stackfull() when "ECMA_ASYNCGENERATORREJECT_PREF_V8" ecma_intrinsic_setacc("AsyncGeneratorReject", vreg_value(op[0]).any, acc.any)