# New Ticket Created by Patrick R. Michaud # Please include the string: [perl #37546] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=37546 >
--- osname= linux osvers= 2.4.21-27.0.2.elsmp arch= i386-linux-thread-multi cc= gcc 4.0.0 20050516 (Red Hat 4.0.0-6) --- Flags: category=core severity=high ack=no --- This may be related to #37537 ("coroutine segfaults") but it's different enough that I'm submitting a separate ticket for it and some new test diagnostics to evoke the bug. Parrot seems to have trouble with subs compiled and loaded using the C<compreg> op. My test involves three files: sf8-sub.pir contains a simple subroutine called "outer" in the "XYZ" namespace. .sub outer .param pmc mob .local pmc corou .return (mob) .end Both sf8-include.pir and sf8-compreg.pir have a main subroutine that simply looks up "outer" in the "XYZ" namespace, and then enters an infinite loop calling the outer subroutine. The difference is that sf8-include.pir uses an C< .include "sf8-sub.pir" > directive to compile the code, while the sf8-compreg.pir version loads sf8-sub.pir into a string register, then uses the C<compreg> op to compile and load the code. The sf8-include.pir program (using ".include") appears to work just fine. The sf8-compreg.pir program (using "compreg" op) aborts after ~1100 iterations: [EMAIL PROTECTED] trunk]$ ./parrot sf8-compreg.pir | wc -l No code segment to switch to 1112 [EMAIL PROTECTED] trunk]$ Turning on tracing causes it to fail after just 14 iterations, and no longer produces the "No code segment to switch to" message (although it still aborts): [EMAIL PROTECTED] trunk]$ ./parrot -t sf8-compreg.pir 2>xxx | wc -l 14 [EMAIL PROTECTED] trunk]$ The last thing in the trace output is a "DOD / GC" pair. Pm --- Summary of my parrot 0.3.0 (r9586) configuration: configdate='Thu Oct 27 00:50:23 2005' Platform: osname=linux, archname=i386-linux-thread-multi jitcapable=1, jitarchname=i386-linux, jitosname=LINUX, jitcpuarch=i386 execcapable=1 perl=/usr/bin/perl Compiler: cc='gcc', ccflags='-D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm', Linker and Libraries: ld='gcc', ldflags=' -L/usr/local/lib', cc_ldflags='', libs='-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lrt -lgmp' Dynamic Linking: share_ext='.so', ld_share_flags='-shared -L/usr/local/lib -fPIC', load_ext='.so', ld_load_flags='-shared -L/usr/local/lib -fPIC' Types: iv=long, intvalsize=4, intsize=4, opcode_t=long, opcode_t_size=4, ptrsize=4, ptr_alignment=1 byteorder=1234, nv=double, numvalsize=8, doublesize=8 --- Environment: HOME LANG LANGUAGE LD_LIBRARY_PATH LOGDIR PATH SHELL
.sub main :main $P0 = open "sf8-sub.pir", "<" $S0 = read $P0, 65535 $P1 = compreg "PIR" $P1($S0) $P0 = find_global "XYZ", "outer" loop: $P1 = $P0("abc") print $P1 print "\n" goto loop .end
.sub main :main $P0 = find_global "XYZ", "outer" loop: $P1 = $P0("abc") print $P1 print "\n" goto loop .end .include "sf8-sub.pir"
.namespace [ "XYZ" ] .sub outer .param pmc mob .local pmc corou .return (mob) .end