In theory, this patch should apply and run cleanly.  It doesn't.

Thus, something somewhere pokes into memory it shouldn't.

Any ideas?  Alternately, any comments on this analysis?

-- c

=== include/parrot/pobj.h
==================================================================
--- include/parrot/pobj.h	(revision 4520)
+++ include/parrot/pobj.h	(local)
@@ -139,6 +139,7 @@
 #define PMC_DATA_IN_EXT 1
 
 struct PMC {
+    size_t sentinel;
     pobj_t obj;
     VTABLE *vtable;
     PMC *real_self;
@@ -183,7 +184,7 @@
 #ifdef NDEBUG
 #  define PMC_ext_checked(pmc)             (pmc)->pmc_ext
 #else
-#  define PMC_ext_checked(pmc)             (assert((pmc)->pmc_ext), (pmc)->pmc_ext)
+#  define PMC_ext_checked(pmc)             (assert((pmc)->pmc_ext && (pmc)->sentinel == 0xbeefbeef), (pmc)->pmc_ext)
 #endif /* NDEBUG */
 #if PMC_DATA_IN_EXT
 #  define PMC_data(pmc)                   PMC_ext_checked(pmc)->data
=== src/headers.c
==================================================================
--- src/headers.c	(revision 4520)
+++ src/headers.c	(local)
@@ -249,6 +249,7 @@
             ? interp->arena_base->constant_pmc_pool
             : interp->arena_base->pmc_pool;
     PMC * const pmc = (PMC *)pool->get_free_object(interp, pool);
+    pmc->sentinel = 0xbeefbeef;
 
     /* clear flags, set is_PMC_FLAG */
     if (flags & PObj_is_PMC_EXT_FLAG) {
=== src/pmc/hash.pmc
==================================================================
--- src/pmc/hash.pmc	(revision 4520)
+++ src/pmc/hash.pmc	(local)
@@ -526,6 +531,9 @@
 */
 
     PMC* get_pmc_keyed_str(STRING *key) {
+        if (!PMC_struct_val(SELF))
+            return PMCNULL;
+
         HashBucket * const b =
             parrot_hash_get_bucket(INTERP, (Hash*) PMC_struct_val(SELF), key);
 
=== src/pmc.c
==================================================================
--- src/pmc.c	(revision 4520)
+++ src/pmc.c	(local)
@@ -199,6 +199,7 @@
             pmc->real_self = pmc;
             VTABLE_set_pointer(interp, pmc, pmc);
         }
+        pmc->sentinel = 0xdeadbeef;
         return pmc;
     }
     if (vtable->flags & VTABLE_IS_CONST_PMC_FLAG) {
@@ -245,6 +246,7 @@
         fprintf(stderr, "\t=> new %p type %d\n", pmc, (int)base_type);
     }
 #endif
+    pmc->sentinel = 0xbeefbeef;
     return pmc;
 }
 

Reply via email to