On my system, allowing Parrot GC to run during the Lua tests makes a lot of 
segfaults during DOD, specifically when trying to destroy PMCs which already 
have their vtable pointers invalidated.  (This invalidation occurs when 
freeing a PMC.)

The main culprit seems to be a PMC of type 82, which corresponds to the 
LuaTable PMC.

With the attached patch (for troubleshooting, not for application) disabling 
freeing LuaTable PMCs, most of the Lua tests pass.  This makes me wonder if 
there's a LuaTable PMC somewhere not getting marked properly.  Of course, 
tracking it down is more work.

Note also that the -t flag doesn't work with the command line:

        ../../parrot -t lua.pbc t/some_lua_test_number.lua

It would be super nice if it did.

-- c
=== src/gc/dod.c
==================================================================
--- src/gc/dod.c	(revision 6305)
+++ src/gc/dod.c	(local)
@@ -304,6 +304,8 @@
     /* mark the root_namespace */
     pobject_lives(interp, (PObj *)interp->root_namespace);
 
+    pobject_lives(interp, (PObj *)interp->HLL_namespace);
+
     /* s. packfile.c */
     mark_const_subs(interp);
 
@@ -646,9 +648,10 @@
                 }
 
                 assert(dod_object);
-                dod_object(interp, pool, b);
-
-                pool->add_free_object(interp, pool, b);
+                if (PObj_is_PMC_TEST(b) && ((PMC *)b)->vtable->base_type != 82){
+                    dod_object(interp, pool, b);
+                    pool->add_free_object(interp, pool, b);
+                }
             }
 next:
             b = (Buffer *)((char *)b + object_size);

Reply via email to