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: &block;; :$label, :$item, *%_)
    (HyperIterable:D $: &block;; :$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.

Reply via email to