Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Avoid walking whole setting scope at startup.
This should deal with another thing that forces deserialization of all
things in the setting whether they're needed or not. Helps a little,
but probably there are further "leaks" that could be cleared up.
  • Loading branch information
jnthn committed Aug 14, 2014
1 parent 758974b commit 570de40
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 68 deletions.
2 changes: 1 addition & 1 deletion src/Perl6/Actions.nqp
Expand Up @@ -2519,7 +2519,7 @@ class Perl6::Actions is HLL::Actions does STDActions {
# Do we have a proto in the current scope?
my $proto;
if $outer.symbol($name) {
$proto := $outer.symbol($name)<value>;
$proto := $*W.force_value($outer.symbol($name), $name, 0);
}
else {
unless $*SCOPE eq '' || $*SCOPE eq 'my' {
Expand Down
10 changes: 5 additions & 5 deletions src/Perl6/Grammar.nqp
Expand Up @@ -959,7 +959,7 @@ grammar Perl6::Grammar is HLL::Grammar does STD {
$*GLOBALish := %*COMPILING<%?OPTIONS><global>;
}
elsif $have_outer && $*UNIT_OUTER.symbol('GLOBALish') {
$*GLOBALish := $*UNIT_OUTER.symbol('GLOBALish')<value>;
$*GLOBALish := $*W.force_value($*UNIT_OUTER.symbol('GLOBALish'), 'GLOBALish', 1);
}
else {
$*GLOBALish := $*W.pkg_create_mo($/, %*HOW<package>, :name('GLOBAL'));
Expand All @@ -968,7 +968,7 @@ grammar Perl6::Grammar is HLL::Grammar does STD {

# Create or pull in existing EXPORT.
if $have_outer && $*UNIT_OUTER.symbol('EXPORT') {
$*EXPORT := $*UNIT_OUTER.symbol('EXPORT')<value>;
$*EXPORT := $*W.force_value($*UNIT_OUTER.symbol('EXPORT'), 'EXPORT', 1);
}
else {
$*EXPORT := $*W.pkg_create_mo($/, %*HOW<package>, :name('EXPORT'));
Expand All @@ -983,7 +983,7 @@ grammar Perl6::Grammar is HLL::Grammar does STD {
# Take current package from outer context if any, otherwise for a
# fresh compilation unit we start in GLOBAL.
if $have_outer && $*UNIT_OUTER.symbol('$?PACKAGE') {
$*PACKAGE := $*UNIT_OUTER.symbol('$?PACKAGE')<value>;
$*PACKAGE := $*W.force_value($*UNIT_OUTER.symbol('$?PACKAGE'), '$?PACKAGE', 1);
}
else {
$*PACKAGE := $*GLOBALish;
Expand All @@ -992,12 +992,12 @@ grammar Perl6::Grammar is HLL::Grammar does STD {
# If we're eval'ing in the context of a %?LANG, set up our own
# %*LANG based on it.
if $have_outer && $*UNIT_OUTER.symbol('%?LANG') {
for $*UNIT_OUTER.symbol('%?LANG')<value>.FLATTENABLE_HASH() {
for $*W.force_value($*UNIT_OUTER.symbol('%?LANG'), '%?LANG', 1).FLATTENABLE_HASH() {
%*LANG{$_.key} := $_.value;
}
}
if $have_outer && $*UNIT_OUTER.symbol('$*MAIN') {
$*MAIN := $*UNIT_OUTER.symbol('$*MAIN')<value>;
$*MAIN := $*W.force_value($*UNIT_OUTER.symbol('$*MAIN'), '$*MAIN', 1);
}

# Install unless we've no setting, in which case we've likely no
Expand Down
47 changes: 20 additions & 27 deletions src/Perl6/Optimizer.nqp
Expand Up @@ -120,12 +120,7 @@ my class Symbols {
$i := $i - 1;
my %sym := @!block_stack[$i].symbol($final_name);
if +%sym {
if nqp::existskey(%sym, 'value') {
return %sym<value>;
}
else {
nqp::die("No compile-time value for $final_name");
}
return self.force_value(%sym, $final_name, 1);
}
}
}
Expand All @@ -141,15 +136,10 @@ my class Symbols {
$i := $i - 1;
my %sym := @!block_stack[$i].symbol($first);
if +%sym {
if nqp::existskey(%sym, 'value') {
$result := %sym<value>;
@name := nqp::clone(@name);
@name.shift();
$i := 0;
}
else {
nqp::die("No compile-time value for $first");
}
$result := self.force_value(%sym, $first, 1);
@name := nqp::clone(@name);
@name.shift();
$i := 0;
}
}
}
Expand Down Expand Up @@ -177,12 +167,7 @@ my class Symbols {
my $block := @!block_stack[$i];
my %sym := $block.symbol($name);
if +%sym {
if nqp::existskey(%sym, 'value') {
return %sym<value>;
}
else {
nqp::die("Optimizer: No lexical compile time value for $name");
}
return self.force_value(%sym, $name, 1);
}
}
nqp::die("Optimizer: No lexical $name found");
Expand All @@ -203,6 +188,19 @@ my class Symbols {
0
}

# Forces a value to be made available.
method force_value(%sym, $key, int $die) {
if nqp::existskey(%sym, 'value') {
%sym<value>
}
elsif nqp::existskey(%sym, 'lazy_value_from') {
%sym<value> := nqp::atkey(nqp::atkey(%sym, 'lazy_value_from'), $key)
}
else {
$die ?? nqp::die("No compile-time value for $key") !! NQPMu
}
}

# Works out how many scopes in from the outermost a given name is. A 0
# from this means the nearest declaration is from the setting; a 1 means
# it is in the mainline, etc.
Expand Down Expand Up @@ -257,12 +255,7 @@ my class Symbols {
}
my %sym := $!SETTING.symbol($symbol);
if +%sym {
if nqp::existskey(%sym, 'value') {
%!SETTING_CACHE{$symbol} := %sym<value>;
return %sym<value>;
} else {
nqp::die("Optimizer: cannot find $symbol in SETTING.");
}
return %!SETTING_CACHE{$symbol} := self.force_value(%sym, $symbol, 1);
}
}
}
Expand Down
75 changes: 41 additions & 34 deletions src/Perl6/World.nqp
Expand Up @@ -1279,21 +1279,24 @@ class Perl6::World is HLL::World {
while $cur_block {
my %symbols := $cur_block.symtable();
for %symbols {
unless %seen{$_.key} {
my str $name := $_.key;
unless %seen{$name} {
# Add symbol.
my %sym := $_.value;
my $value := nqp::existskey(%sym, 'value') ?? %sym<value> !! $mu;
my %sym := $_.value;
my $value := nqp::existskey(%sym, 'value') || nqp::existskey(%sym, 'lazy_value_from')
?? self.force_value(%sym, $name, 0)
!! $mu;
if nqp::isnull(nqp::getobjsc($value)) {
$value := self.try_add_to_sc($value, $mu);
}
$wrapper[0].push(QAST::Var.new(
:name($_.key), :scope('lexical'),
:name($name), :scope('lexical'),
:decl(%sym<state> ?? 'statevar' !! 'static'), :$value
));
$wrapper.symbol($_.key, :scope('lexical'));
$wrapper.symbol($name, :scope('lexical'));

}
%seen{$_.key} := 1;
%seen{$name} := 1;
}
$cur_block := $cur_block.ann('outer');
}
Expand Down Expand Up @@ -2170,22 +2173,24 @@ class Perl6::World is HLL::World {
# Checks if a symbol has already been declared in the current
# scope, and thus may not be redeclared.
method already_declared($scope, $curpackage, $curpad, @name) {
my str $first_name := ~@name[0];
if $scope eq 'my' && +@name == 1 {
my %sym := $curpad.symbol(@name[0]);
my %sym := $curpad.symbol($first_name);
if %sym {
return %sym<value>.HOW.HOW.name(%sym<value>.HOW) ne 'Perl6::Metamodel::PackageHOW';
my $value := self.force_value(%sym, $first_name, 0);
return $value.HOW.HOW.name($value.HOW) ne 'Perl6::Metamodel::PackageHOW';
}
return 0;
}
else {
# Does the current lexpad or package declare the first
# part of the name? If not, we're in the clear.
my $first_sym;
if $curpad.symbol(@name[0]) {
$first_sym := $curpad.symbol(@name[0])<value>;
if $curpad.symbol($first_name) {
$first_sym := self.force_value($curpad.symbol($first_name), $first_name, 0);
}
elsif nqp::existskey($curpackage.WHO, @name[0]) {
$first_sym := ($curpackage.WHO){@name[0]};
elsif nqp::existskey($curpackage.WHO, $first_name) {
$first_sym := ($curpackage.WHO){$first_name};
}
else {
return 0;
Expand Down Expand Up @@ -2220,13 +2225,11 @@ class Perl6::World is HLL::World {
sub walk_block($block) {
my %symtable := $block.symtable();
for %symtable -> $symp {
if nqp::existskey($symp.value, 'value') {
my $val := $symp.value<value>;
if (try nqp::istype($val, QAST::Block)) {
return 0 if walk_block($val) == 0;
} else {
return 0 if $code($symp.key, $val, $symp.value) == 0;
}
my $key := $symp.key;
my %sym := $symp.value;
if nqp::existskey(%sym, 'value') || nqp::existskey(%sym, 'lazy_value_from') {
my $val := self.force_value(%sym, $key, 0);
return 0 if $code($key, $val, %sym) == 0;
}
}
1;
Expand Down Expand Up @@ -2261,12 +2264,7 @@ class Perl6::World is HLL::World {
$i := $i - 1;
my %sym := @!BLOCKS[$i].symbol($final_name);
if +%sym {
if nqp::existskey(%sym, 'value') {
return %sym<value>;
}
else {
nqp::die("No compile-time value for $final_name");
}
return self.force_value(%sym, $final_name, 1);
}
}
}
Expand All @@ -2282,15 +2280,10 @@ class Perl6::World is HLL::World {
$i := $i - 1;
my %sym := @!BLOCKS[$i].symbol($first);
if +%sym {
if nqp::existskey(%sym, 'value') {
$result := %sym<value>;
@name := nqp::clone(@name);
@name.shift();
$i := 0;
}
else {
nqp::die("No compile-time value for $first");
}
$result := self.force_value(%sym, $first, 1);
@name := nqp::clone(@name);
@name.shift();
$i := 0;
}
}
}
Expand Down Expand Up @@ -2493,13 +2486,27 @@ class Perl6::World is HLL::World {
my %symbols := $cur_block.symtable();
if nqp::existskey(%symbols, $name) {
my %sym := %symbols{$name};
self.force_value(%sym, $name, 0);
return nqp::existskey(%sym, 'value') &&
!nqp::isconcrete(%sym<value>) ?? 2 !! 1;
}
$cur_block := $cur_block.ann('outer');
}
}

# Forces a value to be made available.
method force_value(%sym, $key, int $die) {
if nqp::existskey(%sym, 'value') {
%sym<value>
}
elsif nqp::existskey(%sym, 'lazy_value_from') {
%sym<value> := nqp::atkey(nqp::atkey(%sym, 'lazy_value_from'), $key)
}
else {
$die ?? nqp::die("No compile-time value for $key") !! NQPMu
}
}

# Adds various bits of initialization that must always be done early on.
method add_initializations() {
if self.is_precompilation_mode() {
Expand Down
2 changes: 1 addition & 1 deletion tools/build/NQP_REVISION
@@ -1 +1 @@
2014.07-80-g4cf7f13
2014.07-82-gc2362f4

0 comments on commit 570de40

Please sign in to comment.