# New Ticket Created by  Christian Bartolomaeus 
# Please include the string:  [perl #128320]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=128320 >


The following code (tested in S32-array/delete.t) started to fail with rakudo-j 
recently:

$ perl6-j -e 'my @a = 0..1; @a[0]:delete; map { 1 }, @a'
java.lang.NullPointerException
  in block <unit> at -e line 1

$ perl6-j --ll-exception -e 'my @a = 0..1; @a[0]:delete; map { 1 }, @a'
java.lang.NullPointerException
  in add_to_cache (gen/jvm/BOOTSTRAP.nqp:1512)
  in  (gen/jvm/BOOTSTRAP.nqp:1516)
  in push (gen/jvm/CORE.setting:1828)
  in push-all (gen/jvm/CORE.setting:14627)
  in push-until-lazy (gen/jvm/CORE.setting:2401)
  in  (gen/jvm/CORE.setting:14308)
  in  (gen/jvm/CORE.setting:14306)
  in reify-until-lazy (gen/jvm/CORE.setting:14304)
  in is-lazy (gen/jvm/CORE.setting:14892)
  in map (gen/jvm/CORE.setting:5366)
  in map (gen/jvm/CORE.setting:5365)
  in <unit> (-e:1)
  in <unit-outer> (-e:1)
  in eval (gen/jvm/stage2/NQPHLL.nqp:1198)
  in eval (src/Perl6/Compiler.nqp:171)
  in  (gen/jvm/stage2/NQPHLL.nqp:1288)
  in command_eval (gen/jvm/stage2/NQPHLL.nqp:1285)
  in command_eval (src/Perl6/Compiler.nqp:29)
  in command_line (gen/jvm/stage2/NQPHLL.nqp:1269)
  in MAIN (gen/jvm/main.nqp:37)
  in <mainline> (gen/jvm/main.nqp:33)
  in  (gen/jvm/main.nqp)

I think, the error first appeared with Rakudo commit beb3c986.

The following patch makes the NPE go away (and has no spectest fallout). But 
I'm not sure if it is the right thing to insert Nil when nqp::atpos returns 
null.

====

diff --git a/src/core/List.pm b/src/core/List.pm
index 0c65a6f..ddc8607 100644
--- a/src/core/List.pm
+++ b/src/core/List.pm
@@ -476,7 +476,7 @@ my class List does Iterable does Positional { # declared in 
BOOTSTRAP
                 method push-all($target) {
                     my int $elems = nqp::elems($!reified);
                     my $no-sink;
-                    $no-sink := $target.push(nqp::atpos($!reified,$!i))
+                    $no-sink := 
$target.push(nqp::ifnull(nqp::atpos($!reified,$!i),Nil))
                       while nqp::islt_i($!i = nqp::add_i($!i,1),$elems);
                     IterationEnd
                 }

Reply via email to