summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-13 07:12:07 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-13 07:12:07 +0000
commit26a11ae77107884ba53592d239a75c2028e244a0 (patch)
tree651dda8a296f997f831205a5f8802055d5d6d46a
parent8bc5c172f90b4ff1c5975f1345b0e3f6e2f47ccf (diff)
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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64730 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--mjit.h4
-rw-r--r--tool/ruby_vm/views/_mjit_compile_send.erb2
-rw-r--r--vm.c2
-rw-r--r--vm_insnhelper.h8
4 files changed, 9 insertions, 7 deletions
diff --git a/mjit.h b/mjit.h
index 17148fc..eee3a8b 100644
--- a/mjit.h
+++ b/mjit.h
@@ -89,7 +89,7 @@ mjit_target_iseq_p(struct rb_iseq_constant_body *body)
/* 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, int guard_except_p)
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)) {
diff --git a/tool/ruby_vm/views/_mjit_compile_send.erb b/tool/ruby_vm/views/_mjit_compile_send.erb
index 494a9af..1c737a1 100644
--- a/tool/ruby_vm/views/_mjit_compile_send.erb
+++ b/tool/ruby_vm/views/_mjit_compile_send.erb
@@ -60,7 +60,7 @@
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");
diff --git a/vm.c b/vm.c
index 0fb6295..da9afe2 100644
--- a/vm.c
+++ b/vm.c
@@ -1806,7 +1806,7 @@ vm_exec(rb_execution_context_t *ec, int mjit_enable_p)
_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 */
diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index f63ada0..b5f35df 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -144,7 +144,11 @@ enum vm_regan_acttype {
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 {
/* 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(); \
} \