summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-10-19 09:47:39 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:25 -0400
commit93f6ac39f20f64a879507db98a16177530e9f3d4 (patch)
treee637f031469ce2c2ed3697c3f43fed3956f2d372 /iseq.c
parentba45aff16b1246a3c6b31e9cebb0096fb4e1fcae (diff)
MicroJIT: Don't compile trace instructions
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/iseq.c b/iseq.c
index 971f1c54c7..6b8f3d0e2c 100644
--- a/iseq.c
+++ b/iseq.c
@@ -3232,6 +3232,25 @@ rb_vm_insn_addr2insn(const void *addr)
rb_bug("rb_vm_insn_addr2insn: invalid insn address: %p", addr);
}
+// Unlike rb_vm_insn_addr2insn, this function can return trace opcode variants.
+int
+rb_vm_insn_addr2opcode(const void *addr)
+{
+ st_data_t key = (st_data_t)addr;
+ st_data_t val;
+
+ if (st_lookup(rb_encoded_insn_data, key, &val)) {
+ insn_data_t *e = (insn_data_t *)val;
+ int opcode = e->insn;
+ if (addr == e->trace_encoded_insn) {
+ opcode += VM_INSTRUCTION_SIZE/2;
+ }
+ return opcode;
+ }
+
+ rb_bug("rb_vm_insn_addr2opcode: invalid insn address: %p", addr);
+}
+
// Decode `iseq->body->iseq_encoded[i]` to an insn.
int
rb_vm_insn_decode(const VALUE encoded)