> Sorry, the example was unnecessarily long.
> 
> > After a quick reading of this, I'd have expected the value of "f" at the indicated 
> > point to be 1, but instead it's 2.
> 
> .local int f
> .sub _main
>         .local int x
>         .sub _foo1
>                 f=1
>                 x=2
>                 call _foo2
>                 end
>         .end
>         .sub _foo2
>                 print "f is 1: "
>                 print f
>                 print "\n"
>                 ret
>         .end
> .end

Yeah, I don't think you can use .local across subs like that.  I think
.local means "local to this sub" and *inner subs aren't closures*.  In
fact, I don't think inner subs are useful for much of anything at all.

If you're a compiler, what you probably want to do is set up a some
scratchpads and put f and x in them.  So the perl code:

my $f;
{
    my $x;
    foo1();
    
    sub foo1 { ($f, $x) = (1, 2); foo2() }
    sub foo2 { print "f is 1: $f\n"; print "x is 2: $x\n" }
}

Is roughly equivalent to:

# Main, unlabeled program
.sub _main
    .local PerlInt f
    f = new PerlInt
    new_pad 0
    store_lex -1, "f", f
    call _anon1
    end
.end

# Outermost { }
.sub _anon1
    .local PerlInt x
    x = new PerlInt
    new_pad 1
    store_lex -1, "x", x
    call _foo1
    ret
.end

.sub _foo1
    .local PerlInt f
    .local PerlInt x
    f = new PerlInt
    x = new PerlInt
    f = 1
    x = 2
    store_lex "f", f
    store_lex "x", x
    call _foo2
    ret
.end

.sub _foo2
    .local PerlInt f
    .local PerlInt x
    find_lex f, "f"
    print "f is 1: "
    print f
    print "\n"
    find_lex x, "x"
    print "x is 2: "
    print x
    print "\n"
    ret
.end

, Unfortunately.

Reply via email to