summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-06-23 23:41:57 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2020-06-23 23:42:38 -0700
commit3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 (patch)
treeeee79b71a547956ea23d19cc5799fee46938d12c /iseq.c
parentfbb32b1f483925987d225b4dc08efd197775bcae (diff)
Trace :return of builtin methods
using opt_invokebuiltin_delegate_leave insn. Since Ruby 2.7, :return of methods using builtin have not been traced properly.
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/iseq.c b/iseq.c
index 086f6e2be4..2f25e187bf 100644
--- a/iseq.c
+++ b/iseq.c
@@ -3125,8 +3125,12 @@ 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 = 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(insn + VM_INSTRUCTION_SIZE/2);
+ st_data_t key2 = (st_data_t)INSN_CODE(traced_insn + VM_INSTRUCTION_SIZE/2);
insn_data[insn].insn = (int)insn;
insn_data[insn].insn_len = insn_len(insn);