From 0540359965fd1836fea319fbaadeb2090300ce64 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 25 Nov 2010 10:30:55 -0700 Subject: [PATCH] fix GC handling of cpointers with offsets --- src/racket/src/mzmark.c | 41 ++++++++++---------------------------- src/racket/src/mzmarksrc.c | 7 +++---- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/racket/src/mzmark.c b/src/racket/src/mzmark.c index 835c6d69f7..a9ce6020f5 100644 --- a/src/racket/src/mzmark.c +++ b/src/racket/src/mzmark.c @@ -152,7 +152,9 @@ static int quotesyntax_obj_FIXUP(void *p, struct NewGC *gc) { static int cpointer_obj_SIZE(void *p, struct NewGC *gc) { return - gcBYTES_TO_WORDS(sizeof(Scheme_Cptr)); + (SCHEME_CPTR_HAS_OFFSET(p) + ? gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)) + : gcBYTES_TO_WORDS(sizeof(Scheme_Cptr))); } static int cpointer_obj_MARK(void *p, struct NewGC *gc) { @@ -161,7 +163,9 @@ static int cpointer_obj_MARK(void *p, struct NewGC *gc) { } gcMARK2(SCHEME_CPTR_TYPE(p), gc); return - gcBYTES_TO_WORDS(sizeof(Scheme_Cptr)); + (SCHEME_CPTR_HAS_OFFSET(p) + ? gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)) + : gcBYTES_TO_WORDS(sizeof(Scheme_Cptr))); } static int cpointer_obj_FIXUP(void *p, struct NewGC *gc) { @@ -170,38 +174,13 @@ static int cpointer_obj_FIXUP(void *p, struct NewGC *gc) { } gcFIXUP2(SCHEME_CPTR_TYPE(p), gc); return - gcBYTES_TO_WORDS(sizeof(Scheme_Cptr)); + (SCHEME_CPTR_HAS_OFFSET(p) + ? gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)) + : gcBYTES_TO_WORDS(sizeof(Scheme_Cptr))); } #define cpointer_obj_IS_ATOMIC 0 -#define cpointer_obj_IS_CONST_SIZE 1 - - -static int offset_cpointer_obj_SIZE(void *p, struct NewGC *gc) { - return - gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)); -} - -static int offset_cpointer_obj_MARK(void *p, struct NewGC *gc) { - if (!(SCHEME_CPTR_FLAGS(p) & 0x1)) { - gcMARK2(SCHEME_CPTR_VAL(p), gc); - } - gcMARK2(SCHEME_CPTR_TYPE(p), gc); - return - gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)); -} - -static int offset_cpointer_obj_FIXUP(void *p, struct NewGC *gc) { - if (!(SCHEME_CPTR_FLAGS(p) & 0x1)) { - gcFIXUP2(SCHEME_CPTR_VAL(p), gc); - } - gcFIXUP2(SCHEME_CPTR_TYPE(p), gc); - return - gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)); -} - -#define offset_cpointer_obj_IS_ATOMIC 0 -#define offset_cpointer_obj_IS_CONST_SIZE 1 +#define cpointer_obj_IS_CONST_SIZE 0 static int twoptr_obj_SIZE(void *p, struct NewGC *gc) { diff --git a/src/racket/src/mzmarksrc.c b/src/racket/src/mzmarksrc.c index 30135283cb..eeb1a32bca 100644 --- a/src/racket/src/mzmarksrc.c +++ b/src/racket/src/mzmarksrc.c @@ -61,10 +61,9 @@ cpointer_obj { } gcMARK2(SCHEME_CPTR_TYPE(p), gc); size: - if (SCHEME_CPTR_HAS_OFFSET(p)) - return gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)); - else - return gcBYTES_TO_WORDS(sizeof(Scheme_Cptr)); + (SCHEME_CPTR_HAS_OFFSET(p) + ? gcBYTES_TO_WORDS(sizeof(Scheme_Offset_Cptr)) + : gcBYTES_TO_WORDS(sizeof(Scheme_Cptr))); } twoptr_obj {