From 1b00e6425ec3029515e62c38d0211d40eda8cc85 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 19:56:04 +0200 Subject: [PATCH 1/8] note end of module loading in debug mode --- src/Perl6/ModuleLoader.pm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index 1a7962172bb..2ff1c782e28 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -126,6 +126,7 @@ class Perl6::ModuleLoader { my $*MAIN_CTX; pir::load_bytecode(%chosen); %modules_loaded{%chosen} := $module_ctx := $*MAIN_CTX; + DEBUG("done loading ", %chosen) if $DEBUG; } else { # Read source file. @@ -143,6 +144,8 @@ class Perl6::ModuleLoader { my $*MAIN_CTX; $eval(); %modules_loaded{%chosen} := $module_ctx := $*MAIN_CTX; + DEBUG("done loading ", %chosen) if $DEBUG; + } pir::set_hll_global__vsP('GLOBAL', $preserve_global); } From 339771a1a842b3f09bb0750b1dbc7b9e64406dec Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 20:23:39 +0200 Subject: [PATCH 2/8] start to trace module loading in a dynamic variable --- src/Perl6/ModuleLoader.pm | 10 ++++++++++ src/main.nqp | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index 2ff1c782e28..007900da1c3 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -118,8 +118,13 @@ class Perl6::ModuleLoader { $module_ctx := %modules_loaded{%chosen}; } else { + my %trace := nqp::hash(); + %trace := $module_name; + %trace := %chosen; my $preserve_global := pir::get_hll_global__Ps('GLOBAL'); + nqp::push(@*MODULES, %trace); if %chosen { + %trace := %chosen; DEBUG("loading ", %chosen) if $DEBUG; my %*COMPILING := {}; my $*CTXSAVE := self; @@ -147,7 +152,12 @@ class Perl6::ModuleLoader { DEBUG("done loading ", %chosen) if $DEBUG; } + nqp::pop(@*MODULES); pir::set_hll_global__vsP('GLOBAL', $preserve_global); + CATCH { + nqp::pop(@*MODULES); + nqp::rethrow($_); + } } # Provided we have a mainline and need to do global merging... diff --git a/src/main.nqp b/src/main.nqp index 46b1c21030e..ca1927c1acd 100644 --- a/src/main.nqp +++ b/src/main.nqp @@ -27,6 +27,9 @@ sub MAIN(@ARGS) { @clo.push('c'); @clo.push('I=s'); @clo.push('M=s'); + + # Set up module loading trace + my @*MODULES := []; # Set up END block list, which we'll run at exit. my @*END_PHASERS := []; From b5d0d37b759601a7dc366be99276f43705e798b7 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 20:45:16 +0200 Subject: [PATCH 3/8] enable basic module traces in X::Comp --- src/Perl6/World.pm | 7 ++++++- src/core/Exception.pm | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Perl6/World.pm b/src/Perl6/World.pm index 1e5c3bf9ca0..60a5e78d297 100644 --- a/src/Perl6/World.pm +++ b/src/Perl6/World.pm @@ -1899,7 +1899,12 @@ class Perl6::World is HLL::World { }; if $type_found { - %opts := HLL::Compiler.lineof($/.orig, $/.from); + %opts := HLL::Compiler.lineof($/.orig, $/.from); + my @modules := []; + for @*MODULES { + nqp::push(@modules, pir::perl6ize_type__PP($_)); + } + %opts := @modules; for %opts -> $p { if pir::does($p.value, 'array') { my @a := []; diff --git a/src/core/Exception.pm b/src/core/Exception.pm index 2484694036b..74773f00dd3 100644 --- a/src/core/Exception.pm +++ b/src/core/Exception.pm @@ -280,8 +280,11 @@ my role X::Comp is Exception { has $.filename; has $.line; has $.column; + has @.modules; multi method gist(::?CLASS:D:) { - "===SORRY!===\n$.message\nat $.filename():$.line"; + my $r = "===SORRY!===\n$.message\nat $.filename():$.line"; + $r ~= "\n from module $_" for @.modules.reverse; + $r; } } From f97e562eee99014848079767595110ed6f32c651 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 21:33:36 +0200 Subject: [PATCH 4/8] restore GLOBAL if module loading failed --- src/Perl6/ModuleLoader.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index 007900da1c3..9980e6269c0 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -155,6 +155,7 @@ class Perl6::ModuleLoader { nqp::pop(@*MODULES); pir::set_hll_global__vsP('GLOBAL', $preserve_global); CATCH { + pir::set_hll_global__vsP('GLOBAL', $preserve_global); nqp::pop(@*MODULES); nqp::rethrow($_); } From 3d9fa49592b15000867067882628c7fd0cd5faed Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 22:57:21 +0200 Subject: [PATCH 5/8] pass the line number to the module loader --- src/Perl6/ModuleLoader.pm | 2 +- src/Perl6/World.pm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index 9980e6269c0..ff72e59486c 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -99,7 +99,7 @@ class Perl6::ModuleLoader { @candidates } - method load_module($module_name, *@GLOBALish) { + method load_module($module_name, *@GLOBALish, :$line) { # Locate all the things that we potentially could load. Choose # the first one for now (XXX need to filter by version and auth). my @prefixes := self.search_path(); diff --git a/src/Perl6/World.pm b/src/Perl6/World.pm index 60a5e78d297..124743f082c 100644 --- a/src/Perl6/World.pm +++ b/src/Perl6/World.pm @@ -174,7 +174,8 @@ class Perl6::World is HLL::World { # during the deserialization. method load_module($/, $module_name, $cur_GLOBALish) { # Immediate loading. - my $module := Perl6::ModuleLoader.load_module($module_name, $cur_GLOBALish); + my $line := HLL::Compiler.lineof($/.orig, $/.from); + my $module := Perl6::ModuleLoader.load_module($module_name, $cur_GLOBALish, :$line); # During deserialization, ensure that we get this module loaded. if self.is_precompilation_mode() { @@ -183,7 +184,7 @@ class Perl6::World is HLL::World { PAST::Op.new( :pasttype('callmethod'), :name('load_module'), PAST::Var.new( :name('ModuleLoader'), :namespace([]), :scope('package') ), - $module_name + $module_name, PAST::Val.new(:value($line), :named('line')) )))); } From 22f512dc24aa506b7a10b0ad03b9af4e8ebc5b26 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Mon, 11 Jun 2012 23:12:22 +0200 Subject: [PATCH 6/8] add line numbers where module loading occurs --- src/Perl6/ModuleLoader.pm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index ff72e59486c..1ddc341aac9 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -118,6 +118,15 @@ class Perl6::ModuleLoader { $module_ctx := %modules_loaded{%chosen}; } else { + if @*MODULES { + @*MODULES[-1] := $line; + } + else { + my %prev := nqp::hash(); + %prev := $line; + %prev := pir::find_caller_lex__ps('$?FILES'); + @*MODULES[0] := %prev; + } my %trace := nqp::hash(); %trace := $module_name; %trace := %chosen; From 7812723944b1cd77eb4e4bc1802d5b1d4ea677f0 Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Tue, 12 Jun 2012 00:25:31 +0200 Subject: [PATCH 7/8] p6ize module trace in World and pass it to the exception it almost works, but the hashes seem to get flattend out --- src/Perl6/ModuleLoader.pm | 8 ++++---- src/Perl6/World.pm | 26 ++++++++++++++++++++------ src/core/Exception.pm | 7 ++++++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/Perl6/ModuleLoader.pm b/src/Perl6/ModuleLoader.pm index 1ddc341aac9..3e77ddb1bb7 100644 --- a/src/Perl6/ModuleLoader.pm +++ b/src/Perl6/ModuleLoader.pm @@ -118,15 +118,15 @@ class Perl6::ModuleLoader { $module_ctx := %modules_loaded{%chosen}; } else { - if @*MODULES { - @*MODULES[-1] := $line; - } - else { + if +@*MODULES == 0 { my %prev := nqp::hash(); %prev := $line; %prev := pir::find_caller_lex__ps('$?FILES'); @*MODULES[0] := %prev; } + else { + @*MODULES[-1] := $line; + } my %trace := nqp::hash(); %trace := $module_name; %trace := %chosen; diff --git a/src/Perl6/World.pm b/src/Perl6/World.pm index 124743f082c..4b9216b95ab 100644 --- a/src/Perl6/World.pm +++ b/src/Perl6/World.pm @@ -28,6 +28,24 @@ my $SIG_ELEM_NATIVE_INT_VALUE := 2097152; my $SIG_ELEM_NATIVE_NUM_VALUE := 4194304; my $SIG_ELEM_NATIVE_STR_VALUE := 8388608; +sub p6ize_recursive($x) { + if nqp::islist($x) { + my @copy := []; + for $x { + nqp::push(@copy, p6ize_recursive($_)); + } + return pir::perl6ize_type__PP(@copy); + } + elsif pir::isa($x, 'Hash') { + my %copy := nqp::hash(); + for $x { + %copy{$_.key} := p6ize_recursive($_.value); + } + return pir::perl6ize_type__PP(%copy); + } + pir::perl6ize_type__PP($x); +} + # This builds upon the SerializationContextBuilder to add the specifics # needed by Rakudo Perl 6. class Perl6::World is HLL::World { @@ -1900,12 +1918,8 @@ class Perl6::World is HLL::World { }; if $type_found { - %opts := HLL::Compiler.lineof($/.orig, $/.from); - my @modules := []; - for @*MODULES { - nqp::push(@modules, pir::perl6ize_type__PP($_)); - } - %opts := @modules; + %opts := HLL::Compiler.lineof($/.orig, $/.from); + %opts := p6ize_recursive(@*MODULES); for %opts -> $p { if pir::does($p.value, 'array') { my @a := []; diff --git a/src/core/Exception.pm b/src/core/Exception.pm index 74773f00dd3..61359875a5d 100644 --- a/src/core/Exception.pm +++ b/src/core/Exception.pm @@ -282,8 +282,13 @@ my role X::Comp is Exception { has $.column; has @.modules; multi method gist(::?CLASS:D:) { + say @.modules.perl; my $r = "===SORRY!===\n$.message\nat $.filename():$.line"; - $r ~= "\n from module $_" for @.modules.reverse; + for @.modules.reverse[1..*] { + $r ~= $_.defined + ?? "\n from module $_ file $_:$_" + !! "\n from $_:$_"; + } $r; } } From d53986b1735e142aab43223e9d63e6951fdb0c9b Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Tue, 12 Jun 2012 00:54:03 +0200 Subject: [PATCH 8/8] itemize hashes in p6ize_recursive; remove debugging output Now the output looks like I wanted it --- src/Perl6/World.pm | 2 +- src/core/Exception.pm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Perl6/World.pm b/src/Perl6/World.pm index 4b9216b95ab..5822c4f8a2d 100644 --- a/src/Perl6/World.pm +++ b/src/Perl6/World.pm @@ -41,7 +41,7 @@ sub p6ize_recursive($x) { for $x { %copy{$_.key} := p6ize_recursive($_.value); } - return pir::perl6ize_type__PP(%copy); + return pir::perl6ize_type__PP(%copy).item; } pir::perl6ize_type__PP($x); } diff --git a/src/core/Exception.pm b/src/core/Exception.pm index 61359875a5d..a2c16285ddc 100644 --- a/src/core/Exception.pm +++ b/src/core/Exception.pm @@ -282,7 +282,6 @@ my role X::Comp is Exception { has $.column; has @.modules; multi method gist(::?CLASS:D:) { - say @.modules.perl; my $r = "===SORRY!===\n$.message\nat $.filename():$.line"; for @.modules.reverse[1..*] { $r ~= $_.defined