Skip to content

Commit 750bdfb

Browse files
author
Charlie Somerville
committed
add a constant/method cache invalidation callback
1 parent 0e75de1 commit 750bdfb

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

vm.c

+29
Original file line numberDiff line numberDiff line change
@@ -2084,6 +2084,21 @@ ruby_vm_method_state_version()
20842084
return ULONG2NUM(ruby_method_global_state_version);
20852085
}
20862086

2087+
static VALUE constant_invalidation_proc = Qnil;
2088+
static VALUE method_invalidation_proc = Qnil;
2089+
2090+
static VALUE
2091+
on_constant_invalidation()
2092+
{
2093+
return constant_invalidation_proc = rb_block_proc();
2094+
}
2095+
2096+
static VALUE
2097+
on_method_invalidation()
2098+
{
2099+
return method_invalidation_proc = rb_block_proc();
2100+
}
2101+
20872102
void
20882103
Init_VM(void)
20892104
{
@@ -2100,6 +2115,12 @@ Init_VM(void)
21002115
rb_define_singleton_method(rb_cRubyVM, "constant_state_version", ruby_vm_constant_state_version, 0);
21012116
rb_define_singleton_method(rb_cRubyVM, "method_state_version", ruby_vm_method_state_version, 0);
21022117

2118+
rb_define_singleton_method(rb_cRubyVM, "on_constant_invalidation", on_constant_invalidation, 0);
2119+
rb_define_singleton_method(rb_cRubyVM, "on_method_invalidation", on_method_invalidation, 0);
2120+
2121+
rb_global_variable(&constant_invalidation_proc);
2122+
rb_global_variable(&method_invalidation_proc);
2123+
21032124
/* ::VM::FrozenCore */
21042125
fcore = rb_class_new(rb_cBasicObject);
21052126
RBASIC(fcore)->flags = T_ICLASS;
@@ -2308,6 +2329,10 @@ void
23082329
rb_inc_method_state_version()
23092330
{
23102331
ruby_method_global_state_version++;
2332+
2333+
if(method_invalidation_proc != Qnil) {
2334+
rb_proc_call(method_invalidation_proc, rb_ary_new());
2335+
}
23112336
}
23122337

23132338
uint64_t
@@ -2320,5 +2345,9 @@ void
23202345
rb_inc_constant_state_version()
23212346
{
23222347
ruby_constant_global_state_version++;
2348+
2349+
if(constant_invalidation_proc != Qnil) {
2350+
rb_proc_call(constant_invalidation_proc, rb_ary_new());
2351+
}
23232352
}
23242353

0 commit comments

Comments
 (0)