summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/vm.c b/vm.c
index 9a4147aba6..8c0f05b0a9 100644
--- a/vm.c
+++ b/vm.c
@@ -1557,6 +1557,7 @@ rb_iter_break_value(VALUE val)
/* optimization: redefine management */
static st_table *vm_opt_method_table = 0;
+static st_table *vm_opt_mid_table = 0;
static int
vm_redefinition_check_flag(VALUE klass)
@@ -1576,6 +1577,16 @@ vm_redefinition_check_flag(VALUE klass)
return 0;
}
+int
+rb_vm_check_optimizable_mid(VALUE mid)
+{
+ if (!vm_opt_mid_table) {
+ return FALSE;
+ }
+
+ return st_lookup(vm_opt_mid_table, mid, NULL);
+}
+
static int
vm_redefinition_check_method_type(const rb_method_definition_t *def)
{
@@ -1630,6 +1641,7 @@ add_opt_method(VALUE klass, ID mid, VALUE bop)
if (me && vm_redefinition_check_method_type(me->def)) {
st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
+ st_insert(vm_opt_mid_table, (st_data_t)mid, (st_data_t)Qtrue);
}
else {
rb_bug("undefined optimized method: %s", rb_id2name(mid));
@@ -1643,6 +1655,7 @@ vm_init_redefined_flag(void)
VALUE bop;
vm_opt_method_table = st_init_numtable();
+ vm_opt_mid_table = st_init_numtable();
#define OP(mid_, bop_) (mid = id##mid_, bop = BOP_##bop_, ruby_vm_redefined_flag[bop] = 0)
#define C(k) add_opt_method(rb_c##k, mid, bop)