fix GC handling of cpointers with offsets

This commit is contained in:
Matthew Flatt 2010-11-25 10:30:55 -07:00
parent bd7ffb282f
commit 0540359965
2 changed files with 13 additions and 35 deletions

View File

@ -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) {

View File

@ -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 {