Skip to content

Commit c2362f4

Browse files
committed
Don't walk whole setting symbol table on load.
This should help avoid some deserialization work, or at least get rid of one more thing that forces a bunch of it.
1 parent a5f15a2 commit c2362f4

File tree

3 files changed

+24
-19
lines changed

3 files changed

+24
-19
lines changed

src/HLL/Actions.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class HLL::Actions {
5555
unless $block.symbol($key) {
5656
my $lextype := nqp::lexprimspec($pad, $key);
5757
if $lextype == 0 {
58-
$block.symbol($key, :scope<lexical>, :value(nqp::atkey($pad, $key)));
58+
$block.symbol($key, :scope<lexical>, :lazy_value_from($pad));
5959
}
6060
elsif $lextype == 1 {
6161
$block.symbol($key, :scope<lexical>, :value(nqp::atkey_i($pad, $key)), :type(int));

src/NQP/Optimizer.nqp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,11 @@ class NQP::Optimizer {
431431

432432
method find_sym($name) {
433433
my %sym := self.find_lex($name);
434-
if !(%sym =:= NQPMu) && nqp::existskey(%sym, 'value') {
435-
return %sym<value>;
434+
if nqp::ishash(%sym) && nqp::existskey(%sym, 'value') {
435+
%sym<value>;
436+
}
437+
elsif nqp::ishash(%sym) && nqp::existskey(%sym, 'lazy_value_from') {
438+
%sym<value> := nqp::atkey(nqp::atkey(%sym, 'lazy_value_from'), $name)
436439
}
437440
else {
438441
nqp::die("No compile-time value for $name");

src/NQP/World.nqp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,8 @@ class NQP::World is HLL::World {
445445
$i := $i - 1;
446446
my %symbols := @!BLOCKS[$i].symtable();
447447
for %symbols {
448-
if !%seen{$_.key} && nqp::existskey($_.value, 'value') {
449-
my $value := ($_.value)<value>;
448+
if !%seen{$_.key} && nqp::existskey($_.value, 'value') || nqp::existskey($_.value, 'lazy_value_from') {
449+
my $value := self.force_value($_.value, $_.key, 0);
450450
unless nqp::isnull(nqp::getobjsc($value)) {
451451
$wrapper[0].push(QAST::Op.new(
452452
:op('bind'),
@@ -612,12 +612,7 @@ class NQP::World is HLL::World {
612612
$i := $i - 1;
613613
my %sym := @!BLOCKS[$i].symbol($final_name);
614614
if %sym {
615-
if nqp::existskey(%sym, 'value') {
616-
return %sym<value>;
617-
}
618-
else {
619-
nqp::die("No compile-time value for $final_name");
620-
}
615+
return self.force_value(%sym, $final_name, 1);
621616
}
622617
}
623618
}
@@ -633,14 +628,9 @@ class NQP::World is HLL::World {
633628
$i := $i - 1;
634629
my %sym := @!BLOCKS[$i].symbol($first);
635630
if +%sym {
636-
if nqp::existskey(%sym, 'value') {
637-
$result := %sym<value>;
638-
@name.shift();
639-
$i := 0;
640-
}
641-
else {
642-
nqp::die("No compile-time value for $first");
643-
}
631+
$result := self.force_value(%sym, $first, 1);
632+
@name.shift();
633+
$i := 0;
644634
}
645635
}
646636
}
@@ -658,4 +648,16 @@ class NQP::World is HLL::World {
658648

659649
$result;
660650
}
651+
652+
method force_value(%sym, $key, int $die) {
653+
if nqp::existskey(%sym, 'value') {
654+
%sym<value>
655+
}
656+
elsif nqp::existskey(%sym, 'lazy_value_from') {
657+
%sym<value> := nqp::atkey(nqp::atkey(%sym, 'lazy_value_from'), $key)
658+
}
659+
else {
660+
$die ?? nqp::die("No compile-time value for $key") !! NQPMu
661+
}
662+
}
661663
}

0 commit comments

Comments
 (0)