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 <unit> 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 <unit> 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.