On Sat, 14 Jan 2017 03:06:52 -0800, elizabeth wrote:
> Hopefully fixed in 00c3551c86 .  Cannot check because building JVM
> backend fails on MacOS.

As discussed on #perl6-dev [1] this didn't fix the issue, unfortunately.

I think, I've found the underlying reason for the breakage. This is a golf of 
the error (the following evaluations are run on commit 502fc77a68):

$ ./perl6-j --version
This is Rakudo version 2016.12-320-g502fc77 built on JVM
implementing Perl 6.c.

$ ./perl6-j -e 'say Rakudo::Internals.ListsFromSeq( (2,3), combinations(2,0))'
java.lang.RuntimeException: No such attribute '$!reified' for this object
  in method pull-one at gen/jvm/CORE.setting line 2931
  in method push-exactly at gen/jvm/CORE.setting line 2734
  in method push-at-least at gen/jvm/CORE.setting line 2753
  in method reify-at-least at gen/jvm/CORE.setting line 18753
  in method pull-one at gen/jvm/CORE.setting line 19246
  in method pull-one at gen/jvm/CORE.setting line 6730
  in method join at gen/jvm/CORE.setting line 17261
  in method gist at gen/jvm/CORE.setting line 19448
  in method gist at gen/jvm/CORE.setting line 17240
  in sub say at gen/jvm/CORE.setting line 36238
  in block <unit> at -e line 1

Now 'combinations(2,0)' is nothing else than 
'Seq.new(Rakudo::Iterator.Combinations(2,0,0))'

At first glance the following looks ok:

$ ./perl6-j -e 'dd combinations(2,0)'   # same output as on perl6-m
((),).Seq

But this looks wrong:

$ ./perl6-j -e 'dd combinations(2,0)[0..1]'
((), Mu)

Compare to perl6-m:

$ ./perl6-m -e 'dd combinations(2,0)[0..1]'
((), Nil)

And calling 'Seq.new(Rakudo::Iterator.Combinations(2,0,0))' reveals the problem:

$ ./perl6-j -e 'say Seq.new(Rakudo::Iterator.Combinations(2,0,0))'
(() (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) ...)

Under the hood Rakudo::Iterator.OneValue is called like so:

$ ./perl6-j -e 'say Seq.new(Rakudo::Iterator.OneValue(List.new))'
(() (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) (Mu) 
(Mu) (Mu) (Mu) (Mu) ...)

And within Rakudo::Iterator.OneValue we execute something like this (same bug 
as in https://rt.perl.org/Ticket/Display.html?id=130532):

$ ./perl6-j -e 'use nqp; class A { has Mu $!foo; method bar () { $!foo := 
nqp::null; say nqp::isnull($!foo) ?? "null" !! $!foo } }.new.bar'
(Mu)

So, as far as I understand Rakudo::Iterator.OneValue does not work correctly on 
rakudo-j, and that surfaces at different points due to lizmat's refactoring.

[1] https://irclog.perlgeek.de/perl6-dev/2017-01-14#i_13920333

Reply via email to