On Sat, 09 Dec 2017 15:26:25 -0800, c...@zoffix.com wrote:
> On Sat, 09 Dec 2017 13:19:23 -0800, elizabeth wrote:
> > If that shouldn’t work, or work differently, it can be ripped
> > out / replaced.  If that should work, then we need to look at fixing
> > -put-.
> 
> IMO it should work, considering you can't nqp::unbox_n/nqp::unbox_i
> Junctions either, yet we don't have Junction-related explosions with
> numeric stuff.
> 
> I also found another issue: IO::Handle.print/put infiniloop in
> dispatch when given a Junction.
> 
> 
> > FWIW, I would also expect it to junct.
> 
> I started a fix down that path, but it kinda looks gross and dirty.
> Similar thing would be needed
> in src/core/io_operators.pm for subroutine versions. The Junctions go
> through the **@foo slurpy candidates
> and the explosions then happen inside optimizations, where we assume
> x.Str gives an unboxable Str.
> 
> Is there a better way? Here's my thing:
> 
> 2017.11.50 zoffix@VirtualBox~/CPANPRC/rakudo (master)$ gd
> diff --git a/src/core/IO/Handle.pm b/src/core/IO/Handle.pm
> index 55ff911..0303047 100644
> --- a/src/core/IO/Handle.pm
> +++ b/src/core/IO/Handle.pm
> @@ -652,6 +652,11 @@ my class IO::Handle {
>      multi method print(IO::Handle:D: **@list is raw --> True) { # is
> raw gives List, which is cheaper
>          self.print(@list.join);
>      }
> +    multi method print(IO::Handle:D: Junction \j --> True) {
> +        # junct the Junction. Without this candidate, we'd go through
> the
> +        # **@list slurpy candidate and dispatch infiniloop.
> +        -> Any \el { self.print: el }(j)
> +    }
> 
> proto method put(|) {*}
> multi method put(IO::Handle:D: Str:D \x --> True) {
> @@ -662,6 +667,11 @@ my class IO::Handle {
> multi method put(IO::Handle:D: **@list is raw --> True) { # is raw
> gives List, which is cheaper
>     self.put(@list.join);
> }
> +    multi method put(IO::Handle:D: Junction \j --> True) {
> +        # junct the Junction. Without this candidate, we'd go through
> the
> +        # **@list slurpy candidate and dispatch infiniloop.
> +        -> Any \el { self.put: el }(j)
> +    }
> 
> multi method say(IO::Handle:D: Str:D $x --> True) {
>     $!decoder or die X::IO::BinaryMode.new(:trying<say>);

Thank you for the report. lizmat++ fixed this.

Fix:  https://github.com/rakudo/rakudo/commit/8155c4b885
      https://github.com/rakudo/rakudo/commit/9de4a60efe
      https://github.com/rakudo/rakudo/commit/07616effd1
Test: https://github.com/perl6/roast/commit/97ceb93f40214cb7c

Reply via email to