id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc	lang	patch	platform
154	subclassed ExceptionHandlers can't handle exceptions	cotto	whiteknight	"Trying to use a subclassed ExceptionHandler causes a segfault.  From the backtrace it looks like something's getting stuck in an infinite loop:
{{{
#1  0xb7b1939a in Parrot_vsprintf_s (interp=0x804f040, pat=0x81502e8, args=0xbf6b3f40 ""�_�,\213\b\b�6m�\002"") at src/misc.c:69
#2  0xb7b194f3 in Parrot_vsprintf_c (interp=0x804f040, pat=0xb7e25af8 ""%s() not implemented in class '%Ss'"", 
    args=0xbf6b3f40 ""�_�,\213\b\b�6m�\002"") at src/misc.c:91
#3  0xb7af32d6 in build_exception_from_args (interp=0x804f040, ex_type=37, format=0xb7e25af8 ""%s() not implemented in class '%Ss'"", 
    arglist=0xbf6b3f40 ""�_�,\213\b\b�6m�\002"") at src/exceptions.c:265
#4  0xb7af39bc in Parrot_ex_throw_from_c_args (interp=0x804f040, ret_addr_unused=0x0, exitcode=37, 
    format=0xb7e25af8 ""%s() not implemented in class '%Ss'"") at src/exceptions.c:401
#5  0xb7c6fbe4 in cant_do_method (interp=0x804f040, pmc=0x80e8588, methname=0xb7e25fc3 ""elements"") at ./src/pmc/default.pmc:65
#6  0xb7c7115e in Parrot_default_elements (interp=0x804f040, pmc=0x80e8588) at ./src/pmc/default.c:824
#7  0xb7d41c62 in Parrot_ExceptionHandler_nci_can_handle (interp=0x804f040, pmc=0x80c4888) at ./src/pmc/exceptionhandler.pmc:201
#8  0xb7cb6fb2 in Parrot_NCI_invoke (interp=0x804f040, pmc=0x80c4888, next=0x0) at ./src/pmc/nci.pmc:321
#9  0xb7b0a596 in Parrot_PCCINVOKE (interp=0x804f040, pmc=0x80e79a0, method_name=0x807ad20, signature=0xb7e20df7 ""P->I"")
    at src/inter_call.c:2709
#10 0xb7b5b1c5 in Parrot_cx_find_handler_local (interp=0x804f040, task=0xb66d36e0) at src/scheduler.c:795
#11 0xb7af36d8 in Parrot_ex_throw_from_c (interp=0x804f040, exception=0xb66d36e0) at src/exceptions.c:299
#12 0xb7af39d1 in Parrot_ex_throw_from_c_args (interp=0x804f040, ret_addr_unused=0x0, exitcode=37, 
    format=0xb7e25af8 ""%s() not implemented in class '%Ss'"") at src/exceptions.c:404
#13 0xb7c6fbe4 in cant_do_method (interp=0x804f040, pmc=0x80e8588, methname=0xb7e25fc3 ""elements"") at ./src/pmc/default.pmc:65
#14 0xb7c7115e in Parrot_default_elements (interp=0x804f040, pmc=0x80e8588) at ./src/pmc/default.c:824

<snip>

#7524 0xb7af39d1 in Parrot_ex_throw_from_c_args (interp=0x804f040, ret_addr_unused=0x0, exitcode=37,
    format=0xb7e25af8 ""%s() not implemented in class '%Ss'"") at src/exceptions.c:404
#7525 0xb7c6fbe4 in cant_do_method (interp=0x804f040, pmc=0x80e8588, methname=0xb7e25fc3 ""elements"") at ./src/pmc/default.pmc:65
#7526 0xb7c7115e in Parrot_default_elements (interp=0x804f040, pmc=0x80e8588) at ./src/pmc/default.c:824
#7527 0xb7d41c62 in Parrot_ExceptionHandler_nci_can_handle (interp=0x804f040, pmc=0x80c4888) at ./src/pmc/exceptionhandler.pmc:201
#7528 0xb7cb6fb2 in Parrot_NCI_invoke (interp=0x804f040, pmc=0x80c4888, next=0x0) at ./src/pmc/nci.pmc:321
#7529 0xb7b0a596 in Parrot_PCCINVOKE (interp=0x804f040, pmc=0x80e79a0, method_name=0x807ad20, signature=0xb7e20df7 ""P->I"")
    at src/inter_call.c:2709
#7530 0xb7b5b1c5 in Parrot_cx_find_handler_local (interp=0x804f040, task=0x80e74c0) at src/scheduler.c:795
#7531 0xb7af36d8 in Parrot_ex_throw_from_c (interp=0x804f040, exception=0x80e74c0) at src/exceptions.c:299
#7532 0xb7af39d1 in Parrot_ex_throw_from_c_args (interp=0x804f040, ret_addr_unused=0x0, exitcode=37,
    format=0xb7e25af8 ""%s() not implemented in class '%Ss'"") at src/exceptions.c:404
#7533 0xb7c6fbe4 in cant_do_method (interp=0x804f040, pmc=0x80e8588, methname=0xb7e25fc3 ""elements"") at ./src/pmc/default.pmc:65
#7534 0xb7c7115e in Parrot_default_elements (interp=0x804f040, pmc=0x80e8588) at ./src/pmc/default.c:824
#7535 0xb7d41c62 in Parrot_ExceptionHandler_nci_can_handle (interp=0x804f040, pmc=0x80c4888) at ./src/pmc/exceptionhandler.pmc:201
#7536 0xb7cb6fb2 in Parrot_NCI_invoke (interp=0x804f040, pmc=0x80c4888, next=0x0) at ./src/pmc/nci.pmc:321
#7537 0xb7b0a596 in Parrot_PCCINVOKE (interp=0x804f040, pmc=0x80e79a0, method_name=0x807ad20, signature=0xb7e20df7 ""P->I"")
    at src/inter_call.c:2709
#7538 0xb7b5b1c5 in Parrot_cx_find_handler_local (interp=0x804f040, task=0x80e7628) at src/scheduler.c:795
#7539 0xb7af3a58 in Parrot_ex_throw_from_op (interp=0x804f040, exception=0x80e7628, dest=0x812eb8c) at src/exceptions.c:198
#7540 0xb7abc77c in Parrot_throw_p (cur_opcode=0x812eb84, interp=0x804f040) at src/ops/core.ops:853
#7541 0xb7b5ac80 in runops_slow_core (interp=0x804f040, pc=0x812eb84) at src/runops_cores.c:228
#7542 0xb7b10769 in runops_int (interp=0x804f040, offset=0) at src/interpreter.c:984
#7543 0xb7b11151 in runops (interp=0x804f040, offs=0) at src/inter_run.c:108
#7544 0xb7b11541 in runops_args (interp=0x804f040, sub=0x80e8ba0, obj=0x80bdcf0, meth_unused=0x0, sig=0xb7e1b973 ""vP"",
    ap=0xbfeb1f0c ""\210\213\016\bX\037�@<���\004\b�\213\016\b\210\213\016\b\b|�X\037뿬\003߷@�\004\b\001"") at src/inter_run.c:248
#7545 0xb7b12406 in Parrot_runops_fromc_args (interp=0x804f040, sub=0x80e8ba0, sig=0xb7e1b973 ""vP"") at src/inter_run.c:315
#7546 0xb7aefd67 in Parrot_runcode (interp=0x804f040, argc=1, argv=0xbfeb2088) at src/embed.c:984
#7547 0xb7df03ac in imcc_run_pbc (interp=0x804f040, obj_file=0, output_file=0x0, argc=1, argv=0xbfeb2088) at compilers/imcc/main.c:824
#7548 0xb7df0fc5 in imcc_run (interp=0x804f040, sourcefile=0xbfeb3347 ""subclass_eh_sf.pir"", argc=1, argv=0xbfeb2088)
    at compilers/imcc/main.c:1116
#7549 0x08048988 in main (argc=1, argv=0xbfeb2088) at src/main.c:61
}}}

The code to duplicate the behavior is very simple.  I just pared down t/pmc/exceptionhandler.t, which already had a note about the bug.  
{{{
.sub main :main

    .local pmc myhandler, myeh

    myhandler = subclass ['ExceptionHandler'], ['MyHandler']
    #myhandler = get_class ['ExceptionHandler']

    new myeh, myhandler
    set_addr myeh, subclassed_handler
    push_eh myeh

    $P0 = new ['Exception']
    throw $P0

  subclassed_handler:
    say ""caught an ex""
.end
}}}"	bug	closed	major		core	trunk	medium	fixed	exception, subclass, exceptionhandler				all
