[perl #129790] [OPTIMIZER] Giving a sub to a map fails
On Sat, 14 Oct 2017 18:38:47 -0700, alex.jakime...@gmail.com wrote: > Maybe it is worth noting that this is pretty much a regression (even > though an > old one, and caused by a non-optimizer change). > > (2016-08-09) > https://github.com/rakudo/rakudo/commit/328402599c16077e182bb38baf68e435b8bc1082 > > Output before and after: > https://gist.github.com/75b15f93438bd038cf0bec26c43eaa9f > > On 2016-10-03 01:32:09, barto...@gmx.de wrote: > > Playing around I found that the following change made your examples > > work as expected: > > > > diff --git a/src/Perl6/Optimizer.nqp b/src/Perl6/Optimizer.nqp > > index 12398ba..9102b7f 100644 > > --- a/src/Perl6/Optimizer.nqp > > +++ b/src/Perl6/Optimizer.nqp > > @@ -1082,7 +1082,8 @@ class Perl6::Optimizer { > > || nqp::istype($op[0][0], QAST::Stmts) && > > nqp::istype(($c1 := $op[0][0][0]), QAST::Op) > > && > > nqp::existskey(%range_bounds, $c1.name)) && > > - $!symbols.is_from_core($c1.name) { > > + $!symbols.is_from_core($c1.name) && > > + nqp::defined($op[0][1].ann('code_object')) { > > self.optimize_for_range($op, $op[0][1], $c1); > > self.visit_op_children($op); > > return $op; > > > > $ ./perl6 -e '^4 .map: {};' > > Cannot map a Range to a Hash. > > Did you mean to add a stub ({...}) or did you mean to .classify? > > in block at -e line 1 > > > > $ ./perl6 -e '^4 .map: 42;' > > Cannot resolve caller map(Range: Int); none of these signatures > > match: > > ($: Hash \h, *%_) > > (\SELF: █; :$label, :$item, *%_) > > (HyperIterable:D $: █; :$label, *%_) > > in block at -e line 1 > > > > $ ./perl6 -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' > > meow > > meow > > meow > > meow > > > > The original error came from the first two lines in 'method > > optimize_for_ranges' in src/Perl6/Optimizer.nqp. For some reason > > $callee.ann('code_object') did not return a code object as expected. > > > > method optimize_for_range($op, $callee, $c2) { > > my $code := $callee.ann('code_object'); > > my $count := $code.count; > > > > Now, I have no idea whether my change from above makes sense or > > whether the annotation for 'code_object' was wrong in the first > > place. Thank you for the report. This is now fixed in branch `post-release`. Fix: https://github.com/rakudo/rakudo/commit/f3efe5e6b4a9ee5 Test: https://github.com/rakudo/rakudo/commit/f3efe5e6b4a9ee5
[perl #129790] [OPTIMIZER] Giving a sub to a map fails
On Sat, 14 Oct 2017 18:38:47 -0700, alex.jakime...@gmail.com wrote: > Maybe it is worth noting that this is pretty much a regression (even > though an > old one, and caused by a non-optimizer change). > > (2016-08-09) > https://github.com/rakudo/rakudo/commit/328402599c16077e182bb38baf68e435b8bc1082 > > Output before and after: > https://gist.github.com/75b15f93438bd038cf0bec26c43eaa9f > > On 2016-10-03 01:32:09, barto...@gmx.de wrote: > > Playing around I found that the following change made your examples > > work as expected: > > > > diff --git a/src/Perl6/Optimizer.nqp b/src/Perl6/Optimizer.nqp > > index 12398ba..9102b7f 100644 > > --- a/src/Perl6/Optimizer.nqp > > +++ b/src/Perl6/Optimizer.nqp > > @@ -1082,7 +1082,8 @@ class Perl6::Optimizer { > > || nqp::istype($op[0][0], QAST::Stmts) && > > nqp::istype(($c1 := $op[0][0][0]), QAST::Op) > > && > > nqp::existskey(%range_bounds, $c1.name)) && > > - $!symbols.is_from_core($c1.name) { > > + $!symbols.is_from_core($c1.name) && > > + nqp::defined($op[0][1].ann('code_object')) { > > self.optimize_for_range($op, $op[0][1], $c1); > > self.visit_op_children($op); > > return $op; > > > > $ ./perl6 -e '^4 .map: {};' > > Cannot map a Range to a Hash. > > Did you mean to add a stub ({...}) or did you mean to .classify? > > in block at -e line 1 > > > > $ ./perl6 -e '^4 .map: 42;' > > Cannot resolve caller map(Range: Int); none of these signatures > > match: > > ($: Hash \h, *%_) > > (\SELF: █; :$label, :$item, *%_) > > (HyperIterable:D $: █; :$label, *%_) > > in block at -e line 1 > > > > $ ./perl6 -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' > > meow > > meow > > meow > > meow > > > > The original error came from the first two lines in 'method > > optimize_for_ranges' in src/Perl6/Optimizer.nqp. For some reason > > $callee.ann('code_object') did not return a code object as expected. > > > > method optimize_for_range($op, $callee, $c2) { > > my $code := $callee.ann('code_object'); > > my $count := $code.count; > > > > Now, I have no idea whether my change from above makes sense or > > whether the annotation for 'code_object' was wrong in the first > > place. Thank you for the report. This is now fixed in branch `post-release`. Fix: https://github.com/rakudo/rakudo/commit/f3efe5e6b4a9ee5 Test: https://github.com/rakudo/rakudo/commit/f3efe5e6b4a9ee5
[perl #129790] [OPTIMIZER] Giving a sub to a map fails
Maybe it is worth noting that this is pretty much a regression (even though an old one, and caused by a non-optimizer change). (2016-08-09) https://github.com/rakudo/rakudo/commit/328402599c16077e182bb38baf68e435b8bc1082 Output before and after: https://gist.github.com/75b15f93438bd038cf0bec26c43eaa9f On 2016-10-03 01:32:09, barto...@gmx.de wrote: > Playing around I found that the following change made your examples > work as expected: > > diff --git a/src/Perl6/Optimizer.nqp b/src/Perl6/Optimizer.nqp > index 12398ba..9102b7f 100644 > --- a/src/Perl6/Optimizer.nqp > +++ b/src/Perl6/Optimizer.nqp > @@ -1082,7 +1082,8 @@ class Perl6::Optimizer { > || nqp::istype($op[0][0], QAST::Stmts) && > nqp::istype(($c1 := $op[0][0][0]), QAST::Op) > && > nqp::existskey(%range_bounds, $c1.name)) && > - $!symbols.is_from_core($c1.name) { > + $!symbols.is_from_core($c1.name) && > + nqp::defined($op[0][1].ann('code_object')) { > self.optimize_for_range($op, $op[0][1], $c1); > self.visit_op_children($op); > return $op; > > $ ./perl6 -e '^4 .map: {};' > Cannot map a Range to a Hash. > Did you mean to add a stub ({...}) or did you mean to .classify? > in block at -e line 1 > > $ ./perl6 -e '^4 .map: 42;' > Cannot resolve caller map(Range: Int); none of these signatures match: > ($: Hash \h, *%_) > (\SELF: █; :$label, :$item, *%_) > (HyperIterable:D $: █; :$label, *%_) > in block at -e line 1 > > $ ./perl6 -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' > meow > meow > meow > meow > > The original error came from the first two lines in 'method > optimize_for_ranges' in src/Perl6/Optimizer.nqp. For some reason > $callee.ann('code_object') did not return a code object as expected. > > method optimize_for_range($op, $callee, $c2) { > my $code := $callee.ann('code_object'); > my $count := $code.count; > > Now, I have no idea whether my change from above makes sense or > whether the annotation for 'code_object' was wrong in the first place.
[perl #129790] [OPTIMIZER] Giving a sub to a map fails
Playing around I found that the following change made your examples work as expected: diff --git a/src/Perl6/Optimizer.nqp b/src/Perl6/Optimizer.nqp index 12398ba..9102b7f 100644 --- a/src/Perl6/Optimizer.nqp +++ b/src/Perl6/Optimizer.nqp @@ -1082,7 +1082,8 @@ class Perl6::Optimizer { || nqp::istype($op[0][0], QAST::Stmts) && nqp::istype(($c1 := $op[0][0][0]), QAST::Op) && nqp::existskey(%range_bounds, $c1.name)) && - $!symbols.is_from_core($c1.name) { + $!symbols.is_from_core($c1.name) && + nqp::defined($op[0][1].ann('code_object')) { self.optimize_for_range($op, $op[0][1], $c1); self.visit_op_children($op); return $op; $ ./perl6 -e '^4 .map: {};' Cannot map a Range to a Hash. Did you mean to add a stub ({...}) or did you mean to .classify? in block at -e line 1 $ ./perl6 -e '^4 .map: 42;' Cannot resolve caller map(Range: Int); none of these signatures match: ($: Hash \h, *%_) (\SELF: █; :$label, :$item, *%_) (HyperIterable:D $: █; :$label, *%_) in block at -e line 1 $ ./perl6 -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' meow meow meow meow The original error came from the first two lines in 'method optimize_for_ranges' in src/Perl6/Optimizer.nqp. For some reason $callee.ann('code_object') did not return a code object as expected. method optimize_for_range($op, $callee, $c2) { my $code:= $callee.ann('code_object'); my $count := $code.count; Now, I have no idea whether my change from above makes sense or whether the annotation for 'code_object' was wrong in the first place.
[perl #129790] [OPTIMIZER] Giving a sub to a map fails
# New Ticket Created by Zoffix Znet # Please include the string: [perl #129790] # in the subject line of all future correspondence about this issue. # https://rt.perl.org/Ticket/Display.html?id=129790 > Attempting to give a map some invalid arg or a sub gives an error: zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e '^4 .map: {};' ===SORRY!=== Cannot find method 'count' on object of type NQPMu zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e '^4 .map: 42;' ===SORRY!=== Cannot find method 'count' on object of type NQPMu zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' ===SORRY!=== Cannot find method 'count' on object of type NQPMu However, everything works fine, if we turn off the optimizer: zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 --optimize=off -e '^4 .map: {};' Cannot map a Range to a Hash. Did you mean to add a stub ({...}) or did you mean to .classify? in block at -e line 1 zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 --optimize=off -e '^4 .map: 42;' Cannot resolve caller map(Range: Int); none of these signatures match: ($: Hash \h, *%_) (\SELF: █; :$label, :$item, *%_) (HyperIterable:D $: █; :$label, *%_) in block at -e line 1 zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 --optimize=off -e 'sub foo ($) {say "meow"}; ^4 .map: &foo;' meow meow meow meow zoffix@VirtualBox:~/CPANPRC/rakudo$ Or, if we wrap the range into parenths: zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e '(^4).map: {};' Cannot map a Range to a Hash. Did you mean to add a stub ({...}) or did you mean to .classify? in block at -e line 1 zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e '(^4).map: 42;' Cannot resolve caller map(Range: Int); none of these signatures match: ($: Hash \h, *%_) (\SELF: █; :$label, :$item, *%_) (HyperIterable:D $: █; :$label, *%_) in block at -e line 1 zoffix@VirtualBox:~/CPANPRC/rakudo$ ./perl6 -e 'sub foo ($) {say "meow"}; (^4).map: &foo;' meow meow meow meow