#804: Avoid entering inner runloop when catching a exception thrown from C with
a
pir handler
----------------------+-----------------------------------------------------
Reporter: NotFound | Owner: NotFound
Type: RFC | Status: assigned
Priority: normal | Milestone:
Component: core | Version: 1.3.0
Severity: high | Keywords:
Lang: | Patch: applied
Platform: all |
----------------------+-----------------------------------------------------
Comment(by fperrad):
With the following PIR code, I obtain a Segfault
{{{
$ cat add.pir
.HLL "lua"
.loadlib "lua_group"
.sub 'main'
push_eh _handler
'add'()
pop_eh
end
_handler:
.local pmc ex
.get_results (ex)
say 'catch'
$S0 = ex
say $S0
.local pmc bt
bt = ex.'backtrace'()
say 'bt'
.return ()
.end
.sub 'add'
$P0 = box 42
$P1 = new 'LuaNil'
$P2 = $P0 + $P1
.end
$ ./parrot add.pir
catch
attempt to perform arithmetic on a nil value
Segmentation fault
}}}
gdb gives :
{{{
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb6d0e8e0 (LWP 7086)]
0xb7d5c98f in clone_key_arg (interp=0x8dbd040, st=0xbf80b06c) at
src/call/pcc.c:1196
1196 if (key->vtable->base_type != enum_class_Key)
(gdb) bt
#0 0xb7d5c98f in clone_key_arg (interp=0x8dbd040, st=0xbf80b06c) at
src/call/pcc.c:1196
#1 0xb7d5ff46 in Parrot_convert_arg (interp=0x8dbd040, st=0xbf80b06c)
at src/call/pcc.c:1824
#2 0xb7d60c1d in Parrot_process_args (interp=0x8dbd040, st=0xbf80b06c,
param_or_result=PARROT_PASS_PARAMS) at src/call/pcc.c:1701
#3 0xb7d61198 in parrot_pass_args (interp=0x8dbd040, src_ctx=0x8e817b0,
dest_ctx=0x8e82e88, src_indexes=0x8e837a4, dest_indexes=0xbf80b18c,
param_or_result=PARROT_PASS_PARAMS) at src/call/pcc.c:1893
#4 0xb7eac624 in Parrot_Exception_nci_backtrace (interp=0x8dbd040,
pmc=0x8e1c278)
at
/home/user/checkout/parrot/tools/build/../../lib/Parrot/Pmc2c/PCCMETHOD.pm:442
#5 0xb7ebc560 in Parrot_NCI_invoke (interp=0x8dbd040, pmc=0x8e1c278,
next=0x8e837c8)
at ./src/pmc/nci.pmc:335
#6 0xb7cf322d in Parrot_callmethodcc_p_sc (cur_opcode=0x8e837bc,
interp=0x8dbd040)
at src/ops/object.ops:80
#7 0xb7d8c6b0 in runops_slow_core (interp=0x8dbd040, pc=0x8e837bc)
at src/runcore/cores.c:462
#8 0xb7d8b2ae in runops_int (interp=0x8dbd040, offset=16) at
src/runcore/main.c:987
#9 0xb7d64ae5 in runops (interp=0x8dbd040, offs=0) at src/call/ops.c:119
#10 0xb7d64f23 in runops_args (interp=0x8dbd040, sub=0x8e309a8,
obj=0x8e20298,
meth_unused=0x0, sig=0xb7fac73f "vP", ap=0xbf80b39c "x\t�\b��\200��9")
at src/call/ops.c:269
#11 0xb7d65de6 in Parrot_runops_fromc_args (interp=0x8dbd040,
sub=0x8e309a8,
sig=0xb7fac73f "vP") at src/call/ops.c:338
#12 0xb7d42a37 in Parrot_runcode (interp=0x8dbd040, argc=1,
argv=0xbf80b518)
at src/embed.c:1021
#13 0xb7f808ef in imcc_run_pbc (interp=0x8dbd040, obj_file=0,
output_file=0x0, argc=1,
argv=0xbf80b518) at compilers/imcc/main.c:801
#14 0xb7f814ec in imcc_run (interp=0x8dbd040,
sourcefile=0xbf80c68e "languages/lua/add.pir", argc=1,
argv=0xbf80b518)
at compilers/imcc/main.c:1092
#15 0x08048988 in main (argc=1, argv=0xbf80b518) at src/main.c:60
(gdb)
}}}
--
Ticket URL: <https://trac.parrot.org/parrot/ticket/804#comment:5>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets