Skip to content

Commit 056f183

Browse files
committed
First crack at giving NQP support for BEGIN blocks.
1 parent 0764869 commit 056f183

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

src/NQP/Actions.pm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,11 @@ class NQP::Actions is HLL::Actions {
348348
);
349349
}
350350

351+
method statement_prefix:sym<BEGIN>($/) {
352+
$*W.run_begin_block($<blorst>.ast);
353+
make PAST::Stmts.new();
354+
}
355+
351356
method statement_prefix:sym<INIT>($/) {
352357
$*W.cur_lexpad().push($<blorst>.ast);
353358
make PAST::Stmts.new();

src/NQP/Grammar.pm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ grammar NQP::Grammar is HLL::Grammar {
235235
}
236236

237237
proto token statement_prefix { <...> }
238-
token statement_prefix:sym<INIT> { <sym> <blorst> }
238+
token statement_prefix:sym<BEGIN> { <sym> <blorst> }
239+
token statement_prefix:sym<INIT> { <sym> <blorst> }
239240

240241
token statement_prefix:sym<try> {
241242
<sym>

src/NQP/World.pm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,36 @@ class NQP::World is HLL::World {
443443
}
444444
}
445445

446+
# Runs a block at BEGIN time.
447+
method run_begin_block($past) {
448+
# Create a wrapper that makes all outer symbols visible.
449+
my $wrapper := PAST::Block.new(
450+
PAST::Stmts.new(),
451+
$past
452+
);
453+
my %seen;
454+
my $i := +@!BLOCKS;
455+
while $i > 0 {
456+
$i := $i - 1;
457+
my %symbols := @!BLOCKS[$i].symtable();
458+
for %symbols {
459+
if !%seen{$_.key} && pir::exists($_.value, 'value') {
460+
try {
461+
$wrapper[0].push(PAST::Var.new(
462+
:name($_.key), :scope('lexical_6model'), :isdecl(1),
463+
:viviself(self.get_ref(($_.value)<value>))
464+
));
465+
};
466+
%seen{$_.key} := 1;
467+
}
468+
}
469+
}
470+
471+
# Compile and run it.
472+
my $code := self.create_code($wrapper, 'BEGIN block', 0);
473+
$code();
474+
}
475+
446476
# Sets NQP language defaults on a block for compilation.
447477
method set_nqp_language_defaults($block) {
448478
# Need to load the NQP dynops/dympmcs, plus any extras requested.

0 commit comments

Comments
 (0)