summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2021-01-11 07:40:37 +0000
committerNARUSE, Yui <naruse@airemix.jp>2021-01-13 17:07:56 +0900
commit303533d23c5f566c0277c86c83f826c5e52f0c1a (patch)
tree29a8b594a92801a0b7ce313e8955b78c9a250739 /tool
parent98ca667b9835fed7709ef192eac966aca98bf50d (diff)
Avoid re-entering opt_invokebuiltin_delegate_leave
on interruption. The cancellation code was originally written for leave insn, but re-entering opt_invokebuiltin_delegate_leave insn on a cancellation is not safe, because a builtin function is executed twice.
Diffstat (limited to 'tool')
-rw-r--r--tool/ruby_vm/views/mjit_compile.inc.erb3
1 files changed, 1 insertions, 2 deletions
diff --git a/tool/ruby_vm/views/mjit_compile.inc.erb b/tool/ruby_vm/views/mjit_compile.inc.erb
index 937cb4a6d0..5820f81770 100644
--- a/tool/ruby_vm/views/mjit_compile.inc.erb
+++ b/tool/ruby_vm/views/mjit_compile.inc.erb
@@ -84,8 +84,7 @@ switch (insn) {
fprintf(f, " if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(ec))) {\n");
fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
- fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_leave);\n");
- fprintf(f, " goto cancel;\n");
+ fprintf(f, " rb_threadptr_execute_interrupts(rb_ec_thread_ptr(ec), 0);\n");
fprintf(f, " }\n");
fprintf(f, " ec->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(reg_cfp);\n"); // vm_pop_frame
}