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

Reply via email to