ruby-changes:52508
From: k0kubun <ko1@a...>
Date: Thu, 13 Sep 2018 16:12:12 +0900 (JST)
Subject: [ruby-changes:52508] k0kubun:r64730 (trunk): Revert "vm_insnhelper.h: simplify EXEC_EC_CFP implementation"
k0kubun 2018-09-13 16:12:07 +0900 (Thu, 13 Sep 2018) New Revision: 64730 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64730 Log: Revert "vm_insnhelper.h: simplify EXEC_EC_CFP implementation" This reverts commit r64711, because EXEC_EC_CFP on JIT-ed code does not call jit_func with the patch when catch_except_p is true. It wasn't intentional. Modified files: trunk/mjit.h trunk/tool/ruby_vm/views/_mjit_compile_send.erb trunk/vm.c trunk/vm_insnhelper.h Index: tool/ruby_vm/views/_mjit_compile_send.erb =================================================================== --- tool/ruby_vm/views/_mjit_compile_send.erb (revision 64729) +++ tool/ruby_vm/views/_mjit_compile_send.erb (revision 64730) @@ -60,7 +60,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_send.erb#L60 fprintf(f, " v = vm_exec(ec, TRUE);\n"); } else { - fprintf(f, " if ((v = mjit_exec(ec, FALSE)) == Qundef) {\n"); + fprintf(f, " if ((v = mjit_exec(ec)) == Qundef) {\n"); fprintf(f, " VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH);\n"); /* This is vm_call0_body's code after vm_call_iseq_setup */ fprintf(f, " v = vm_exec(ec, FALSE);\n"); fprintf(f, " }\n"); Index: mjit.h =================================================================== --- mjit.h (revision 64729) +++ mjit.h (revision 64730) @@ -89,7 +89,7 @@ mjit_target_iseq_p(struct rb_iseq_consta https://github.com/ruby/ruby/blob/trunk/mjit.h#L89 /* Try to execute the current iseq in ec. Use JIT code if it is ready. If it is not, add ISEQ to the compilation queue and return Qundef. */ static inline VALUE -mjit_exec(rb_execution_context_t *ec, int guard_except_p) +mjit_exec(rb_execution_context_t *ec) { const rb_iseq_t *iseq; struct rb_iseq_constant_body *body; @@ -102,8 +102,6 @@ mjit_exec(rb_execution_context_t *ec, in https://github.com/ruby/ruby/blob/trunk/mjit.h#L102 iseq = ec->cfp->iseq; body = iseq->body; total_calls = ++body->total_calls; - if (guard_except_p && body->catch_except_p) - return Qundef; func = body->jit_func; if (UNLIKELY((uintptr_t)func <= (uintptr_t)LAST_JIT_ISEQ_FUNC)) { Index: vm_insnhelper.h =================================================================== --- vm_insnhelper.h (revision 64729) +++ vm_insnhelper.h (revision 64730) @@ -144,7 +144,11 @@ enum vm_regan_acttype { https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.h#L144 the caller frame may have stack values in the local variables and the cancelling the caller frame will purge them. But directly calling mjit_exec is faster... */ #define EXEC_EC_CFP(val) do { \ - if ((val = mjit_exec(ec, TRUE)) == Qundef) { \ + if (ec->cfp->iseq->body->catch_except_p) { \ + VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH); \ + val = vm_exec(ec, TRUE); \ + } \ + else if ((val = mjit_exec(ec)) == Qundef) { \ VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH); \ val = vm_exec(ec, FALSE); \ } \ @@ -153,7 +157,7 @@ enum vm_regan_acttype { https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.h#L157 /* When calling from VM, longjmp in the callee won't purge any JIT-ed caller frames. So it's safe to directly call mjit_exec. */ #define EXEC_EC_CFP(val) do { \ - if ((val = mjit_exec(ec, FALSE)) == Qundef) { \ + if ((val = mjit_exec(ec)) == Qundef) { \ RESTORE_REGS(); \ NEXT_INSN(); \ } \ Index: vm.c =================================================================== --- vm.c (revision 64729) +++ vm.c (revision 64730) @@ -1806,7 +1806,7 @@ vm_exec(rb_execution_context_t *ec, int https://github.com/ruby/ruby/blob/trunk/vm.c#L1806 _tag.retval = Qnil; if ((state = EC_EXEC_TAG()) == TAG_NONE) { - if (!mjit_enable_p || (result = mjit_exec(ec, FALSE)) == Qundef) { + if (!mjit_enable_p || (result = mjit_exec(ec)) == Qundef) { result = vm_exec_core(ec, initial); } goto vm_loop_start; /* fallback to the VM */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/