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