summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-06-26 10:21:56 +0900
committerGitHub <noreply@github.com>2020-06-26 10:21:56 +0900
commit8070cb56db18966b7186255d46eef869e7fdd9cb (patch)
tree367b593b0fa77d93530136c6d0f626c0c7257a44 /iseq.c
parent289a28e68f30e879760fd000833b512d506a0805 (diff)
fix return event and opt_invokebuiltin_delegate_leave (#3256)
If :return event is specified for a opt_invokebuiltin_delegate_leave and leave combination, the instructions should be opt_invokebuiltin_delegate trace_return instructions. To make it, opt_invokebuiltin_delegate_leave instruction will be changed to opt_invokebuiltin_delegate even if it is not an event target instruction.
Notes
Notes: Merged-By: ko1 <ko1@atdot.net>
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/iseq.c b/iseq.c
index aa7e62a28a..956bd2a697 100644
--- a/iseq.c
+++ b/iseq.c
@@ -3125,17 +3125,20 @@ rb_vm_encoded_insn_data_table_init(void)
encoded_insn_data = st_init_numtable_with_size(VM_INSTRUCTION_SIZE / 2);
for (insn = 0; insn < VM_INSTRUCTION_SIZE/2; insn++) {
- int traced_insn = (int)insn;
- if (traced_insn == BIN(opt_invokebuiltin_delegate_leave)) {
- traced_insn = BIN(opt_invokebuiltin_delegate); // to dispatch :return from leave
- }
st_data_t key1 = (st_data_t)INSN_CODE(insn);
- st_data_t key2 = (st_data_t)INSN_CODE((st_data_t)traced_insn + VM_INSTRUCTION_SIZE/2);
+ st_data_t key2 = (st_data_t)INSN_CODE(insn + VM_INSTRUCTION_SIZE/2);
insn_data[insn].insn = (int)insn;
insn_data[insn].insn_len = insn_len(insn);
- insn_data[insn].notrace_encoded_insn = (void *) key1;
- insn_data[insn].trace_encoded_insn = (void *) key2;
+
+ if (insn != BIN(opt_invokebuiltin_delegate_leave)) {
+ insn_data[insn].notrace_encoded_insn = (void *) key1;
+ insn_data[insn].trace_encoded_insn = (void *) key2;
+ }
+ else {
+ insn_data[insn].notrace_encoded_insn = (void *) INSN_CODE(BIN(opt_invokebuiltin_delegate));
+ insn_data[insn].trace_encoded_insn = (void *) INSN_CODE(BIN(opt_invokebuiltin_delegate) + VM_INSTRUCTION_SIZE/2);
+ }
st_add_direct(encoded_insn_data, key1, (st_data_t)&insn_data[insn]);
st_add_direct(encoded_insn_data, key2, (st_data_t)&insn_data[insn]);