mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Clear JIT code when tracepoints get enabled
Clear out any JIT code on iseqs when tracepoints get enabled. We can't handle tracepoints right now, so we'll just try to recompile later.
This commit is contained in:
parent
e8617d0e7e
commit
71cef74432
2 changed files with 53 additions and 0 deletions
|
@ -1,3 +1,45 @@
|
|||
# Check that global tracepoints work
|
||||
assert_equal 'true', %q{
|
||||
def foo
|
||||
1
|
||||
end
|
||||
|
||||
foo
|
||||
foo
|
||||
foo
|
||||
|
||||
called = false
|
||||
|
||||
tp = TracePoint.new(:return) { |event|
|
||||
if event.method_id == :foo
|
||||
called = true
|
||||
end
|
||||
}
|
||||
tp.enable
|
||||
foo
|
||||
tp.disable
|
||||
called
|
||||
}
|
||||
|
||||
# Check that local tracepoints work
|
||||
assert_equal 'true', %q{
|
||||
def foo
|
||||
1
|
||||
end
|
||||
|
||||
foo
|
||||
foo
|
||||
foo
|
||||
|
||||
called = false
|
||||
|
||||
tp = TracePoint.new(:return) { |_| called = true }
|
||||
tp.enable(target: method(:foo))
|
||||
foo
|
||||
tp.disable
|
||||
called
|
||||
}
|
||||
|
||||
# Make sure that optional param methods return the correct value
|
||||
assert_equal '1', %q{
|
||||
def m(ary = [])
|
||||
|
|
11
iseq.c
11
iseq.c
|
@ -3293,6 +3293,8 @@ rb_iseq_trace_flag_cleared(const rb_iseq_t *iseq, size_t pos)
|
|||
encoded_iseq_trace_instrument(&iseq_encoded[pos], 0, false);
|
||||
}
|
||||
|
||||
typedef VALUE (*jit_func_t)(struct rb_execution_context_struct *, struct rb_control_frame_struct *);
|
||||
|
||||
static int
|
||||
iseq_add_local_tracepoint(const rb_iseq_t *iseq, rb_event_flag_t turnon_events, VALUE tpval, unsigned int target_line)
|
||||
{
|
||||
|
@ -3303,6 +3305,11 @@ iseq_add_local_tracepoint(const rb_iseq_t *iseq, rb_event_flag_t turnon_events,
|
|||
|
||||
VM_ASSERT(ISEQ_EXECUTABLE_P(iseq));
|
||||
|
||||
#if USE_MJIT
|
||||
// Force write the jit function to NULL
|
||||
*((jit_func_t *)(&body->jit_func)) = 0;
|
||||
#endif
|
||||
|
||||
for (pc=0; pc<body->iseq_size;) {
|
||||
const struct iseq_insn_info_entry *entry = get_insn_info(iseq, pc);
|
||||
rb_event_flag_t pc_events = entry->events;
|
||||
|
@ -3438,6 +3445,10 @@ rb_iseq_trace_set(const rb_iseq_t *iseq, rb_event_flag_t turnon_events)
|
|||
rb_event_flag_t pc_events = rb_iseq_event_flags(iseq, pc);
|
||||
pc += encoded_iseq_trace_instrument(&iseq_encoded[pc], pc_events & enabled_events, true);
|
||||
}
|
||||
#if USE_MJIT
|
||||
// Force write the jit function to NULL
|
||||
*((jit_func_t *)(&body->jit_func)) = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue