Raku / old-issue-tracker

Tickets from RT
https://github.com/Raku/old-issue-tracker/issues
2 stars 1 forks source link

Null PMC access when assigning result from an empty given inside a do expression #450

Closed p6rt closed 15 years ago

p6rt commented 15 years ago

Migrated from rt.perl.org#61034 (status was 'resolved')

Searchable as RT61034$

p6rt commented 15 years ago

From @masak

Rakudo r33458​:

$ ./perl6 -e 'my $a = do given 5 {}' Null PMC access in isa() [...] Segmentation fault

As soon as the given block contains _something_ (when, default, or just about anything else), the error goes away.

p6rt commented 15 years ago

From @pmichaud

On Wed, Dec 03, 2008 at 03​:54​:16PM -0800, Carl Mäsak wrote​:

# New Ticket Created by "Carl Mäsak" # Please include the string​: [perl #​61034] # in the subject line of all future correspondence about this issue. # \<URL​: http://rt.perl.org/rt3/Ticket/Display.html?id=61034 >

Rakudo r33458​:

$ ./perl6 -e 'my $a = do given 5 {}' Null PMC access in isa() [...] Segmentation fault

As soon as the given block contains _something_ (when, default, or just about anything else), the error goes away.

Rakudo probably thinks the {} is an empty hash, and gets all confused from there.

Pm

p6rt commented 15 years ago

The RT System itself - Status changed from 'new' to 'open'

p6rt commented 15 years ago

From @jnthn

On Thu Dec 04 04​:35​:43 2008, pmichaud wrote​:

On Wed, Dec 03, 2008 at 03​:54​:16PM -0800, Carl Mäsak wrote​:

# New Ticket Created by "Carl Mäsak" # Please include the string​: [perl #​61034] # in the subject line of all future correspondence about this issue. # \<URL​: http://rt.perl.org/rt3/Ticket/Display.html?id=61034 >

Rakudo r33458​:

$ ./perl6 -e 'my $a = do given 5 {}' Null PMC access in isa() [...] Segmentation fault

As soon as the given block contains _something_ (when, default, or just about anything else), the error goes away.

Rakudo probably thinks the {} is an empty hash, and gets all confused from there.

Turns out not - the problem actually is that for empty blocks with no statements in, we emitted a​:

.return ()

Which meant that the thingy calling it got a Null PMC. infix​:= then did an isa on it, which then gave the error.

Where to fix this takes some care - since a block may get transformed into a hash composer, we can't just give every block that is empty an undef in somewhere like, say, the pblock action (well, we can, but only if it actually has a lambda). Anyway, I wrote a routine to do this and called it from xblock and in pblock if we have a lambda, which fixes the original bug, the following​:

my $x = -> {}; my $y = $x();

And no doubt a variety of other Null PMC accesses that could have happened. And of course, it passes the spectests. So, in as git 9a5c690, and assigning to moritz++ for tests.

Thanks,

Jonathan

p6rt commented 15 years ago

From @moritz

Tests added to Sending t/spec/S04-blocks-and-statements/pointy.t Sending t/spec/S04-statements/do.t

Cheers, Moritz

p6rt commented 15 years ago

@moritz - Status changed from 'open' to 'resolved'