Skip to content

Commit

Permalink
Implement more fine-grained deconting of exported symbols
Browse files Browse the repository at this point in the history
The problem with containerized exports has been narrowed down to EXPORT
sub using hash for declaring exports where all values are getting
wrapped into Scalars. To fix that method import on World got a named
parameter :need-decont which signals that imported symbols need to be
checked for their sigils. Unless a sigil is $ or & the symbol value is
nqp::decont'ed.

This commit works for both #2979 and #3012.
  • Loading branch information
vrurg committed Jun 22, 2019
1 parent 3979acc commit 93f2087
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/Perl6/World.nqp
Expand Up @@ -1068,7 +1068,7 @@ class Perl6::World is HLL::World {
my $Map := self.find_symbol(['Map'], :setting-only);
if nqp::istype($result, $Map) {
my $storage := $result.hash.FLATTENABLE_HASH();
self.import($/, $storage, $package_source_name);
self.import($/, $storage, $package_source_name, :need-decont);
# $/.check_LANG_oopsies("do_import");
}
else {
Expand Down Expand Up @@ -1478,7 +1478,7 @@ class Perl6::World is HLL::World {
}

# Imports symbols from the specified stash into the current lexical scope.
method import($/, %stash, $source_package_name) {
method import($/, %stash, $source_package_name, :$need-decont = 0) {
# What follows is a two-pass thing for historical reasons.
my $target := self.cur_lexpad();

Expand All @@ -1489,6 +1489,9 @@ class Perl6::World is HLL::World {
my @clash_onlystar;
for sorted_keys(%stash) -> $key {
my $value := %stash{$key};
if $need-decont && nqp::islt_i(nqp::index('$&', nqp::substr($key,0,1)),0) {
$value := nqp::decont($value);
}
if $target.symbol($key) -> %sym {
# There's already a symbol. However, we may be able to merge
# if both are multis and have onlystar dispatchers.
Expand Down

0 comments on commit 93f2087

Please sign in to comment.