# New Ticket Created by Christoph Otto
# Please include the string: [perl #60556]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=60556 >
If an exception handler catches an exception from a MULTI function implemented
in C, passing that exception from the handler to a sub causes a segfault.
Doing the same thing with a subclass of Integer with a PIR divide sub works as
expected.
The attached code demonstrates this. If p is an Integer, the parrot dies. If
it's a MyInteger, it doesn't.
#! parrot
.sub main :main
.local pmc p, q, int_class, myint_class
int_class = get_class 'Integer'
myint_class = subclass int_class, 'MyInteger'
p = new 'Integer'
set p, "0"
push_eh handler
#throw an exception from a C-level MULTI function
q = p / p
goto end
pop_eh
goto end
handler:
.local pmc exception
.local string message
.get_results (exception)
message = exception['message']
cause_sf(message)
end:
.end
.sub cause_sf
.param string message
say message
end:
.end
.namespace ['MyInteger']
.sub divide :multi(MyInteger, MyInteger)
.param pmc self
.param pmc right
.param pmc dest
.local pmc ex
ex = new 'Exception'
ex['message'] = "don't feel like dividing"
throw ex
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 filetype=pir: