# New Ticket Created by  Patrick R. Michaud 
# Please include the string:  [perl #56398]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=56398 >


Earlier today Jonathan was able to implement the :lexid proposal
discussed in RT#56274.  We've now run into another problem or bug.

I'll demonstrate with code.  First, here's the Perl 6 version
of what we're trying to do:

     foo('try 1');
     foo('try 2');
     foo('try 3');

     sub foo($x) {
         say "outer foo $x";
         {
             say "inner foo $x";
             $x := 'BOGUS!';
         }
     }

The C<foo> subroutine contains a nested immediate block that
prints the contents of C<$x> from its outer scope, then rebinds
<$x> to a new value.

Here's the PIR version of the above:

    .sub 'main' :main
        foo('try 1')
        foo('try 2')
        foo('try 3')
    .end
    
    
    .sub 'foo' :lexid('foo')
        .param pmc x
        .lex '$x', x
        print "outer foo "
        say x
        'inner'()
    .end
    
    
    .sub 'inner' :outer('foo')
        .local pmc x
        x = find_lex '$x'
        print "inner foo "
        say x
        $P0 = new 'String'
        $P0 = 'BOGUS!'
        store_lex '$x', $P0
    .end

And here's what happens when we run it:

    $ ./parrot badlex.pir
    outer foo try 1
    inner foo try 1
    outer foo try 2
    inner foo BOGUS!
    outer foo try 3
    inner foo BOGUS!
    $

The first call to foo() works.  In the second and subsequent
calls to foo(), execution of the inner-scoped immediate block 
still refers to the lexpad that was established during the 
first call to C<foo>, as opposed to the lexpads creating for
the later calls.

Pm

Reply via email to