diff --git a/lib/Kernel.cs b/lib/Kernel.cs index 9ec8a2ed..99620323 100644 --- a/lib/Kernel.cs +++ b/lib/Kernel.cs @@ -500,7 +500,7 @@ public List superclasses k.subclasses.Remove(wr_this); } - private void Invalidate() { + public void Invalidate() { if (mro == null) return; List notify = new List(); @@ -547,7 +547,6 @@ public List superclasses public void AddMethod(string name, IP6 code) { local[name] = code; - Invalidate(); } public void AddPrivateMethod(string name, IP6 code) { @@ -1069,6 +1068,7 @@ public class Kernel { n.AddPrivateMethod(kv.Key, kv.Value); foreach (KeyValuePair kv in role.local) n.AddMethod(kv.Key, kv.Value); + n.Invalidate(); if (role.multiregex != null) foreach (KeyValuePair> kv in role.multiregex) @@ -1170,6 +1170,7 @@ class ExitRunloopException : Exception { } SubMO.OnInvoke = new DynMetaObject.InvokeHandler(SubInvoke); SubMO.FillProtoClass(new string[] { "outer", "info" }); SubMO.AddMethod("INVOKE", MakeSub(SubInvokeSubSI, null)); + SubMO.Invalidate(); ScalarMO = new DynMetaObject("Scalar"); ScalarMO.FillProtoClass(new string[] { "value" }); diff --git a/src/CLRTypes.pm b/src/CLRTypes.pm index 1d02cc67..686c84b7 100644 --- a/src/CLRTypes.pm +++ b/src/CLRTypes.pm @@ -27,6 +27,7 @@ my %typedata = ( HasMRO => [m => 'Boolean'], AddMultiRegex=> [m => 'Void'], AddMethod => [m => 'Void'], + Invalidate => [m => 'Void'], AddPrivateMethod => [m => 'Void'], GetPrivateMethod => [m => 'IP6'], typeObject => [f => 'IP6'], diff --git a/src/CSharpBackend.pm b/src/CSharpBackend.pm index c263a67e..409adece 100644 --- a/src/CSharpBackend.pm +++ b/src/CSharpBackend.pm @@ -284,6 +284,7 @@ sub pkg3 { CgOp::clr_string($m->name), CgOp::rawsget($unit->deref($m->body)->{peer}{ps})); } + push @thaw, CgOp::rawcall(CgOp::rawsget($p), 'Invalidate'); for my $k (sort keys %{ $_->multi_regex_lists }) { for my $b (@{ $_->multi_regex_lists->{$k} }) { push @thaw, CgOp::rawcall(CgOp::rawsget($p), 'AddMultiRegex', @@ -446,6 +447,7 @@ sub codegen_sub { CgOp::clr_string($m->[0]), CgOp::fetch(CgOp::scopedlex($m->[1]))); } + push @build, CgOp::rawcall(CgOp::letvar('!mo'), 'Invalidate'); for my $k (sort keys %{ $obj->multi_regex_lists }) { for my $b (@{ $obj->multi_regex_lists->{$k} }) { push @build, CgOp::rawcall(CgOp::letvar('!mo'),