# New Ticket Created by  NotFound 
# Please include the string:  [perl #56678]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=56678 >


The DOD_registry member of the interpreter is initialized and checked
from several places, and there is a XXX in the code about what to do
if not initialized when unregistering a pmc.

This patch solves the issue by initializing it at interpreter
creation, and asserting that it is initialized in all usages. Also
deletes the Parrot_get_dod_registry funtion, because is never used
and, given that exposes an internal detail, I suppose it must never be
used.

-- 
Salu2
Index: src/gc/dod.c
===================================================================
--- src/gc/dod.c	(revisión: 29127)
+++ src/gc/dod.c	(copia de trabajo)
@@ -315,9 +315,9 @@
     /* Now mark the class hash */
     pobject_lives(interp, (PObj *)interp->class_hash);
 
-    /* Mark the registry if any */
-    if (interp->DOD_registry)
-        pobject_lives(interp, (PObj *)interp->DOD_registry);
+    /* Mark the registry */
+    PARROT_ASSERT(interp->DOD_registry);
+    pobject_lives(interp, (PObj *)interp->DOD_registry);
 
     /* Mark the transaction log */
     /* XXX do this more generically? */
Index: src/pmc.c
===================================================================
--- src/pmc.c	(revisión: 29127)
+++ src/pmc.c	(copia de trabajo)
@@ -600,8 +600,7 @@
     /* Better not trigger a DOD run with a potentially unanchored PMC */
     Parrot_block_GC_mark(interp);
 
-    if (!interp->DOD_registry)
-        interp->DOD_registry = pmc_new(interp, enum_class_AddrRegistry);
+    PARROT_ASSERT(interp->DOD_registry);
 
     VTABLE_set_pmc_keyed(interp, interp->DOD_registry, pmc, PMCNULL);
     Parrot_unblock_GC_mark(interp);
@@ -620,9 +619,7 @@
 void
 dod_unregister_pmc(PARROT_INTERP, ARGIN(PMC* pmc))
 {
-    /* XXX or signal exception? */
-    if (!interp->DOD_registry)
-        return;
+    PARROT_ASSERT(interp->DOD_registry);
 
     VTABLE_delete_keyed(interp, interp->DOD_registry, pmc);
 }
Index: src/inter_create.c
===================================================================
--- src/inter_create.c	(revisión: 29127)
+++ src/inter_create.c	(copia de trabajo)
@@ -223,8 +223,8 @@
     interp->code            = NULL;
     interp->profile         = NULL;
 
-    /* null out the root set registry */
-    interp->DOD_registry    = NULL;
+    /* create the root set registry */
+    interp->DOD_registry    = pmc_new(interp, enum_class_AddrRegistry);
 
     /* create exceptions list */
     interp->current_runloop_id    = 0;
Index: src/extend.c
===================================================================
--- src/extend.c	(revisión: 29127)
+++ src/extend.c	(copia de trabajo)
@@ -1176,31 +1176,6 @@
 
 /*
 
-=item C<Parrot_PMC Parrot_get_dod_registry>
-
-Return Parrot's internal DOD registry PMC.
-See also: F<src/pmc/addrregistry.pmc>.
-
-=cut
-
-*/
-
-PARROT_API
-Parrot_PMC
-Parrot_get_dod_registry(PARROT_INTERP)
-{
-    PMC *registry = interp->DOD_registry;
-    PARROT_CALLIN_START(interp);
-    if (!registry) {
-        registry = interp->DOD_registry =
-            pmc_new(interp, enum_class_AddrRegistry);
-    }
-    PARROT_CALLIN_END(interp);
-    return registry;
-}
-
-/*
-
 =item C<void Parrot_PMC_set_vtable>
 
 Replaces the vtable of the PMC.
Index: include/parrot/extend.h
===================================================================
--- include/parrot/extend.h	(revisión: 29127)
+++ include/parrot/extend.h	(copia de trabajo)
@@ -124,10 +124,6 @@
 void Parrot_free_cstring(ARGIN_NULLOK(char *string));
 
 PARROT_API
-Parrot_PMC Parrot_get_dod_registry(PARROT_INTERP)
-        __attribute__nonnull__(1);
-
-PARROT_API
 Parrot_Int Parrot_get_intreg(PARROT_INTERP, Parrot_Int regnum)
         __attribute__nonnull__(1);
 

Reply via email to