From fe88724d9232ca5d09681628d1acb3c361da0183 Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Sun, 17 Jul 2011 20:54:44 -0700 Subject: [PATCH] Hack BEGIN { @*INC.push: ... } to DTRT --- lib/CORE.setting | 1 + src/NieczaCompiler.pm6 | 1 + src/NieczaPathSearch.pm6 | 8 +++++--- src/niecza | 23 +++++++++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/CORE.setting b/lib/CORE.setting index 32bd2cd4..008c531c 100644 --- a/lib/CORE.setting +++ b/lib/CORE.setting @@ -1880,6 +1880,7 @@ INIT { $PROCESS::EXECUTABLE_NAME ::= Q:CgOp { (sysquery (i 2)) }; $PROCESS::PROGRAM_NAME ::= Q:CgOp { (sysquery (i 1)) }; $PROCESS::BASE_DIRECTORY ::= Q:CgOp { (sysquery (i 3)) }; + @GLOBAL::INC = (); } # }}} diff --git a/src/NieczaCompiler.pm6 b/src/NieczaCompiler.pm6 index 70d6bbff..156a5a53 100644 --- a/src/NieczaCompiler.pm6 +++ b/src/NieczaCompiler.pm6 @@ -22,6 +22,7 @@ method !compile($unitname, $filename, $modtime, $source, $main, $run, $end, $eva my $*compiler = self; my $*verbose = $.verbose; my $*in_repl = $repl; + my @*INC; my $ast; my @steps = ( diff --git a/src/NieczaPathSearch.pm6 b/src/NieczaPathSearch.pm6 index e4d9202b..7f5ebcff 100644 --- a/src/NieczaPathSearch.pm6 +++ b/src/NieczaPathSearch.pm6 @@ -1,12 +1,14 @@ class NieczaPathSearch; -has $.path; +has @.path; # Given Foo::Bar, find ($?FILE, $modtime, $text) method load_module($name) { my $sub = "".IO.combine($name.split('::')); - for @$.path -> $pe { + my @path = @*INC, @!path; + + for @path -> $pe { for -> $ext { my $fn = $pe.IO.append($sub).but-extension($ext); if $fn.f { @@ -18,7 +20,7 @@ method load_module($name) { } } - die "Unable to locate module $name in @$.path"; + die "Unable to locate module $name in @path"; } method load_file($name) { diff --git a/src/niecza b/src/niecza index 6566cbc1..ad04681f 100644 --- a/src/niecza +++ b/src/niecza @@ -24,6 +24,28 @@ use Sig; use STD; augment class NieczaActions { +method statement_prefix:BEGIN ($/) { + $.ast.is_phaser = 2; + $*CURLEX.create_static_pad; + make ::Op::StatementList.new; + + # MAJOR HACK - allows test code like BEGIN { @*INC.push: ... } to work + repeat while False { + my $c = $.ast.code; + + last unless $c ~~ Op::StatementList; + last unless $c.children == 1; + my $d = $c.children.[0]; + last unless $d ~~ Op::CallMethod; + last unless $d.receiver ~~ Op::ContextVar; + last unless $d.receiver.name eq '@*INC'; + last if $d.private || $d.ismeta; + last unless $d.name eq any ; + last unless +$d.getargs == 1; + last unless defined my $str = self.trivial_eval($/, $d.getargs.[0]); + @*INC."$d.name()"($str); + } +} } CgOp._register_ops: < @@ -84,6 +106,7 @@ GetOptions(:!permute, "help|h" => sub { say $usage; exit 0 }, ); +my @*INC; my $backend; if $bcnd eq 'nam' { $backend = NieczaBackendNAM.new(obj_dir => $odir);