From 3fd815c2d31babd7713e635edf3c2d6b7a51a79d Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Wed, 25 May 2011 14:16:28 -0700 Subject: [PATCH] Partial revert of low-ranking optimization that broke build --- Makefile | 7 +++++-- lib/CLRBackend.cs | 9 +++++++++ src/niecza | 16 +++++++++++++--- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 18924593..cf89a3b9 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,7 @@ clean: @rm -f run/*.dll.so @rm -fr *~ -reboot: all +half_reboot: all # setup a clean build area rm -rf stage2/ stage3/ mkdir -p stage2/obj stage2/run stage2/boot stage2/boot/obj \ @@ -90,7 +90,10 @@ reboot: all stage2/boot/obj cp -a lib run stage2/boot cd stage2 && $(RUN_CLR) boot/run/Niecza.exe -C CORE JSYNC - cd stage2 && $(MAKE) + cp test.pl stage2/ + cd stage2 && $(MAKE) test + +reboot: half_reboot # verify that the new Niecza can build itself correctly cp stage2/obj/Kernel.dll stage2/obj/CrossDomainReceiver.dll \ stage2/obj/CLRBackend.exe stage3/boot/obj diff --git a/lib/CLRBackend.cs b/lib/CLRBackend.cs index 628404d3..ecefc69e 100644 --- a/lib/CLRBackend.cs +++ b/lib/CLRBackend.cs @@ -3503,6 +3503,15 @@ class NamProcessor { JScalar.I(z[4]) * RxFrame.IC_PASS_CAP), th.Scan(z[5]))); }; + handlers["rxincorp"] = delegate(NamProcessor th, object[] z) { + CpsOp strs = th.sub.unit.StringListConst(JScalar.SA(0,z[1])); + + return + CpsOp.MethodCall(Tokens.RxFrame.GetMethod("IncorporateChild"), + CpsOp.RxFrame(), strs, + CpsOp.BoolLiteral(JScalar.B(z[2])), + th.Scan(z[3])); + }; handlers["rxbprim"] = delegate(NamProcessor th, object[] z) { CpsOp[] args = new CpsOp[z.Length - 1]; for(int i = 0; i < z.Length - 2; i++) diff --git a/src/niecza b/src/niecza index 496164dc..1f611206 100644 --- a/src/niecza +++ b/src/niecza @@ -82,7 +82,6 @@ augment class RxOp::Subrule { #OK exist my $callf = $!regex ?? $!regex.cgop($body) !! CgOp.methodcall(CgOp.rxcall("MakeCursorV"), $!method); - my @code; if $!selfcut { @@ -91,9 +90,19 @@ augment class RxOp::Subrule { #OK exist } else { my $bt = self.label; - push @code, CgOp.rxcall("InitCursorList", $callf); + my $updatef = CgOp.rxincorp($.captures, +?$!passcap, CgOp.letvar("k")); + $updatef = CgOp.prog() if $!zerowidth; + + push @code, CgOp.rxcall("SetCursorList", CgOp.vvarlist_new_singleton($callf)); push @code, CgOp.label($bt); - push @code, CgOp.rxincorpshift($.captures, +?$!passcap, $bt); + push @code, CgOp.ncgoto("backtrack", CgOp.iter_hasflat( + CgOp.rxcall("GetCursorIter"))); + push @code, CgOp.letn( + "kv", CgOp.vvarlist_shift(CgOp.rxcall("GetCursorIter")), + "k", CgOp.fetch(CgOp.letvar("kv")), + CgOp.rxpushb("SUBRULE", $bt), + $updatef); + push @code, CgOp.rxcall("SetCursorList", CgOp.null("var")); } @code; @@ -151,6 +160,7 @@ method methodcall($obj, $name, *@args) { my ($sig, $aout) = CgOp._process_arglist(@args); CgOp._cgop('methodcall', $name, $sig, $obj, @$aout); } +method rxincorp($caps,$pc,$match) { self._cgop("rxincorp",$caps,$pc,$match) } method rxincorpcut($caps,$zw,$ng,$pc,$call) { self._cgop("rxincorpcut",$caps,$zw,$ng,$pc,$call) } method rxincorpshift($caps,$pc,$label) { self._cgop("rxincorpshift",$caps,$pc,$label) } method boxlist($mo,$obj) { self._cgop("boxlist", $mo, $obj) }