On 4/22/07, chromatic <[EMAIL PROTECTED]> wrote:
It came in just before the release and it touched a lot of files, so I
(speaking only for myself) let it sit for a couple of days. Unfortunately,
it also came in after Steve Peters's "No C++ Keywords" patch, so it didn't
apply cleanly.
Thanks. I should've checked that.
That's as far as I've been able to trace however. The tests do pass if I
revert the patch. Any ideas?
I think the patch exposed either a GC or SMOP bug. Here's the smallest I could
get the test case and still have it segfault without gdb's help:
.sub _main :main
load_bytecode 'library/Test/More.pir'
# import test routines
.local pmc exports, curr_namespace, test_namespace
curr_namespace = get_namespace
test_namespace = get_namespace [ "Test::More" ]
exports = split " ", "plan ok is isa_ok"
test_namespace.export_to(curr_namespace, exports)
plan( 9 )
$P0 = new 'SMOP_Attribute'
isa_ok ($P0, 'SMOP_Attribute')
$S1 = $P0.'name'()
is ($S1, 'TestClass1', 'test the SMOP_Attribute name method')
$P0 = new 'SMOP_Attribute'
$S0 = $P0.'type'("TestTypeClass1")
is ($S0, 'TestTypeClass1', 'test the SMOP_Attribute name method')
$S1 = $P0.'type'()
is ($S1, 'TestTypeClass1', 'test the SMOP_Attribute name method')
.end
However, we can make it segfault earlier using gdb, because the problem only
shows up when a DOD run is triggered. We can test whether the memory has been
corrupted yet from anywhere in Parrot by issuing this:
call (*interp->arena_base->pmc_pool->more_objects)(interp,
interp->arena_base->pmc_pool)
If it runs and exits, no problem. If it segfaults, problem. I was able to
track the cause down to smop_init() in src/pmc/smop_attribute.pmc. Running the
aforementioned command before the call to mem_sys_allocate_zeroed() exits
cleanly, but running it afterwards causes a segfault, so
mem_sys_allocate_zeroed() (and the calloc() inside it) corrupts something.
That's as far as I can get for now - looking at the code immediately preceding
the segfault doesn't help any.
The exact same thing happens without the patch, but for some reason the test
case above doesn't trigger a DOD run on an unpatched parrot, so it doesn't show
up unless you use gdb. At least it's Not My Fault(TM), but this one looks like
a doozy to fix. Someone more familiar with the garbage collector than I needs
to sort this out. Should we start a new ticket?
--
Alek Storm