summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2021-01-29 14:31:18 -0800
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:28 -0400
commit863ff14997b8ffd3d3cbf52cf62d671788420c12 (patch)
treee464b7f346dde76878b8156501bbc806e7707222
parent05c72d40b7ee907f62701948e1249891a1d008b0 (diff)
Add a callback in to microjit when a BOP is redefined
This commit adds a callback `rb_ujit_bop_redefined` when a basic operation is redefined.
-rw-r--r--ujit.h1
-rw-r--r--ujit_iface.c7
-rw-r--r--vm.c2
3 files changed, 10 insertions, 0 deletions
diff --git a/ujit.h b/ujit.h
index 9186714387..51ce80b304 100644
--- a/ujit.h
+++ b/ujit.h
@@ -52,5 +52,6 @@ void rb_ujit_collect_vm_usage_insn(int insn);
void rb_ujit_method_lookup_change(VALUE cme_or_cc);
void rb_ujit_compile_iseq(const rb_iseq_t *iseq);
void rb_ujit_init(struct rb_ujit_options *options);
+void rb_ujit_bop_redefined(VALUE klass, const rb_method_entry_t *me);
#endif // #ifndef UJIT_H
diff --git a/ujit_iface.c b/ujit_iface.c
index 9acc05181d..e9c617e351 100644
--- a/ujit_iface.c
+++ b/ujit_iface.c
@@ -413,6 +413,13 @@ iseq_end_index(VALUE self)
return INT2NUM(block->end_idx);
}
+/* Called when a basic operation is redefined */
+void
+rb_ujit_bop_redefined(VALUE klass, const rb_method_entry_t *me)
+{
+ //fprintf(stderr, "bop redefined\n");
+}
+
#if HAVE_LIBCAPSTONE
static const rb_data_type_t ujit_disasm_type = {
"UJIT/Disasm",
diff --git a/vm.c b/vm.c
index 1fb366f882..f8041eab9a 100644
--- a/vm.c
+++ b/vm.c
@@ -1856,6 +1856,8 @@ rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me, VALUE klass)
if (vm_redefinition_check_method_type(me->def)) {
if (st_lookup(vm_opt_method_def_table, (st_data_t)me->def, &bop)) {
int flag = vm_redefinition_check_flag(klass);
+ rb_ujit_bop_redefined(klass, me);
+
ruby_vm_redefined_flag[bop] |= flag;
}
}