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


Parrot segfaults when C functions invoke PIR functions that
perform tailcalls.  Here's a demo test:

Here's a demo test:

    .sub 'main' :main
        .local pmc array
        array = new 'ResizablePMCArray'
        push array, 4
        push array, 5
        push array, 3
        push array, 2
        push array, 5
        push array, 1
    
        $S0 = join ' ', array
        say $S0

        ##  sort using a non-tailcall function    
        $P0 = get_global 'cmp_normal'
        $P1 = clone array
        $P1.sort($P0)
        $S0 = join ' ', $P1
        say $S0

        ##  sort using a tailcall function
        $P0 = get_global 'cmp_tailcall'
        $P1 = clone array
        $P1.sort($P0)
        $S0 = join ' ', $P1
        say $S0
    .end
    
    .sub 'cmp_func'
        .param pmc a
        .param pmc b
        $I0 = cmp a, b
        .return ($I0)
    .end
    
    .sub 'cmp_normal'
        .param pmc a
        .param pmc b
        $P0 = 'cmp_func'(a, b)
        .return ($P0)
    .end
    
    .sub 'cmp_tailcall'
        .param pmc a
        .param pmc b
        .return 'cmp_func'(a, b)
    .end

Here, we perform a sort using Parrot's built-in sort method for
PMC arrays, using either 'cmp_normal' or 'cmp_tailcall' as
the comparison function.  The only difference between the two
functions is the use of a tailcall in the return statement.  
The output when the above is run is:

    $ ./parrot tc.pir
    4 5 3 2 5 1
    1 2 3 4 5 5
    Segmentation fault

This segmentation fault seems to occur anytime a PIR subroutine
that performs a tailcall is called from C -- in particular,
PIR methods marked with :vtable segfault whenever they return
a value via a tailcall.

Pm

Reply via email to