The attached test case fails in rev 10317 as follows:

    [EMAIL PROTECTED]> ./parrot -o lex-test-2-sub.pbc lex-test-2-sub.pir
    [EMAIL PROTECTED]> ./parrot lex-test-2-main.pir
    parrot: src/hash.c:243: hash_thaw: Assertion `info->extra_flags == 
EXTRA_IS_COUNT' failed.
    Aborted
    [EMAIL PROTECTED]> 

The essential feature is that lex-test-2-sub.pir has a sub that is
lexically contained within another sub (it was adapted from the 'closure
3' test case, FWIW), which is called from a different compilation unit,
where it is loaded as byte code.  If "lex-test-2-sub.pbc" is changed to
"lex-test-2-sub.pir" in lex-test-2-main.pir, then the code runs as
expected:

    [EMAIL PROTECTED]> ./parrot lex-test-2-main.pir
    [loaded.]
    8
    16
    [EMAIL PROTECTED]> 

The upshot is that separate compilation no longer works for code with
lexical variables.  I'm hoping this is straightforward to fix/finish for
someone who understands the code.  If not, I'd love to help, but this
corner of Parrot is new to me, and so I would need a few clues.  TIA,

                                        -- Bob Rogers
                                           http://rgrjr.dyndns.org/


.sub _foo
    .param pmc arg
    .local pmc n
    .lex '$n', n
    n = arg
    .const .Sub anon = "anon"
    $P0 = newclosure anon
    .return ($P0)
.end

.sub anon :outer(_foo)
    .param pmc arg
    $P0 = find_lex '$n'
    # in practice we need copying the arg but as it is passed
    # as native int, we already have a fresh pmc
    $P0 += arg
    .return ($P0)
.end
.sub main :main
        load_bytecode "lex-test-2-sub.pbc"
        print "[loaded.]\n"
        .local pmc f
        f = _foo(5)
        $P0 = f(3)
        print $P0
        print "\n"
        $P0 = f(8)
        print $P0
        print "\n"
.end

Reply via email to