On Friday 27 June 2008 22:18:22 Patrick R. Michaud wrote:
> I'm attaching this bug report to an existing ticket (RT#56184) because
> I believe they are in fact the same problem. But I think this
> description may make the problem more clear.
>
> Summary: Lexical access from immediate blocks in closures don't work.
>
> Consider the following Perl 6 code:
>
> sub foo() {
> my $a = 'hello';
> my sub bar($b) { say $a, $b; { say $a, $b; } }
> return &bar;
> }
>
> my $x = foo();
> $x('world');
>
> The C<foo> sub returns a C<bar> closure that is then invoked
> from main. Within C<bar> there is an immediate block, and this
> is where lexicals don't work.
>
> Here's a PIR translation of the above Perl 6:
>
> .sub 'main' :main
> .local pmc x
> x = 'foo'()
> x('world')
> .end
>
> .sub 'foo' :outer('main')
> .local pmc a, bar
> a = new 'String'
> a = 'hello '
> .lex '$a', a
> $P0 = get_global 'bar'
> bar = newclosure $P0
> .return (bar)
> .end
>
> .sub 'bar' :outer('foo')
> .param pmc b
> .lex '$b', b
> .local pmc a
> a = find_lex '$a'
> print a
> say b
> 'bar_inner'()
> .end
>
> .sub 'bar_inner' :outer('bar')
> .local pmc a, b
> a = find_lex '$a'
> b = find_lex '$b'
> print a
> say b
> .end
>
> When run, Parrot r28767 produces the following:
>
> $ ./parrot lex3.pir
> hello world
> hello Null PMC access in get_string()
> current instr.: 'bar_inner' pc -86686 ((unknown file):-1)
> called from Sub 'bar_inner' pc 85 (lex3.pir:43)
> called from Sub 'bar' pc 63 (lex3.pir:34)
> called from Sub 'main' pc 15 (lex3.pir:14)
> $
>
> As you can see, the first "say $a, $b" in the closure works fine,
> but the lexical accesses in the nested immediate block do not.
>
> Comments and suggestions welcomed.
Fixed (and test added) in 28939. Happy Birthday.
-- c