[clean up GC code, make distinction of pointers more type safe to catch errors
John Meacham <john@repetae.net>**20100407190943
 Ignore-this: 67d16aa85baf00d4ce7fcaa6111bac84
] hunk ./src/C/FromGrin2.hs 634
-        def = text "#define c" <> tshow i <+> text "((sptr_t)&_c" <> tshow i <> text ")"
+        def = text "#define c" <> tshow i <+> text "(TO_SPTR_C(P_WHNF, (sptr_t)&_c" <> tshow i <> text "))"
hunk ./src/C/FromGrin2.hs 878
-        update =  f_update (cast sptr_t (variable aname)) rvar
-        addroot =  if isCAF && fopts FO.Jgc then f_gc_add_root rvar else emptyExpression
-        body' = if not isCAF && fopts FO.Jgc then subBlock (gc_roots [variable aname] & rest) else rest
+        update =  f_update (variable aname) rvar
+        addroot =  if isCAF && fopts FO.Jgc then f_gc_add_root (cast sptr_t rvar) else emptyExpression
+        body' = if not isCAF && fopts FO.Jgc then subBlock (gc_roots [f_MKLAZY(variable aname)] & rest) else rest
hunk ./src/data/rts/jhc_jgc.c 24
-#define SHOULD_FOLLOW(w)  IS_PTR(w)
-#define TO_GCPTR(x) (void *)((uintptr_t)FROM_SPTR(x) - sizeof(entry_t))
+#define TO_GCPTR(x) (entry_t *)(FROM_SPTR(x))
hunk ./src/data/rts/jhc_jgc.c 27
-        void * ptrs[0];
+        sptr_t ptrs[0];
hunk ./src/data/rts/jhc_jgc.c 32
-gc_check_heap(void *s)
+gc_check_heap(entry_t *s)
hunk ./src/data/rts/jhc_jgc.c 39
-gc_add_root(gc_t gc, void *root)
+gc_add_root(gc_t gc, sptr_t root)
hunk ./src/data/rts/jhc_jgc.c 41
-        if(SHOULD_FOLLOW(root)) {
-                void * nroot = TO_GCPTR(root);
-                if(gc_check_heap((void *)nroot)) {
+        if(IS_PTR(root)) {
+                entry_t *nroot = TO_GCPTR(root);
+                if(gc_check_heap(nroot)) {
hunk ./src/data/rts/jhc_jgc.c 52
-        uintptr_t *stack;
+        entry_t * *stack;
hunk ./src/data/rts/jhc_jgc.c 72
-gc_add_grey(struct stack *stack, void *s)
+gc_add_grey(struct stack *stack, entry_t *s)
hunk ./src/data/rts/jhc_jgc.c 75
-                stack->stack[stack->ptr++] = (uintptr_t)s;
+                stack->stack[stack->ptr++] = s;
hunk ./src/data/rts/jhc_jgc.c 98
-                gc_add_grey(&stack, (void *)ix);
+                gc_add_grey(&stack, (entry_t *)ix);
hunk ./src/data/rts/jhc_jgc.c 120
-                        if(__predict_false(!SHOULD_FOLLOW(ptr))) {
+                        if(__predict_false(!IS_PTR(ptr))) {
hunk ./src/data/rts/jhc_jgc.c 137
-                if(P_LAZY == GET_PTYPE(ptr)) {
+                if(1 && (IS_LAZY(ptr))) {
hunk ./src/data/rts/jhc_jgc.c 147
-                if(__predict_false(!SHOULD_FOLLOW(ptr))) {
+                if(__predict_false(!IS_PTR(ptr))) {
hunk ./src/data/rts/jhc_jgc.c 160
-                entry_t *e = (entry_t *)stack.stack[--stack.ptr];
+                entry_t *e = stack.stack[--stack.ptr];
hunk ./src/data/rts/jhc_jgc.c 167
-                        if(P_LAZY == GET_PTYPE(e->ptrs[i])) {
+                        if(1 && (P_LAZY == GET_PTYPE(e->ptrs[i]))) {
hunk ./src/data/rts/jhc_jgc.c 171
-                                        e->ptrs[i] = GETHEAD(FROM_SPTR(e->ptrs[i]));
+                                        e->ptrs[i] = (sptr_t)GETHEAD(FROM_SPTR(e->ptrs[i]));
hunk ./src/data/rts/jhc_jgc.c 174
-                        if(__predict_true(SHOULD_FOLLOW(e->ptrs[i]))) {
+                        if(__predict_true(IS_PTR(e->ptrs[i]))) {
hunk ./src/data/rts/jhc_rts2.c 148
-#define FETCH_TAG(x)      (IS_RAW_TAG(x) ? FETCH_RAW_TAG(x) : FETCH_MEM_TAG(x))
-#define IS_RAW_TAG(x)     ((bool)((uintptr_t)(x) & 0x2))
+#define FETCH_TAG(x)      (IS_PTR(x) ? FETCH_MEM_TAG(x) : FETCH_RAW_TAG(x))
hunk ./src/data/rts/jhc_rts2.c 151
-#if 0 && _JHC_GC == _JHC_GC_JGC
-#define FETCH_MEM_TAG(x)  (gc_tag(x))
-#define SET_MEM_TAG(x,v)  (gc_tag(x) = (v))
-#else
hunk ./src/data/rts/jhc_rts2.c 153
-#endif
-
hunk ./src/data/rts/jhc_rts2.c 156
-#define BLACK_HOLE ((fptr_t)0xDEADBEEF)
+#define BLACK_HOLE TO_FPTR(0xDEADBEE0)
hunk ./src/data/rts/jhc_rts2.c 158
+struct sptr {};
+struct wptr {};
+struct fptr {};
hunk ./src/data/rts/jhc_rts2.c 274
-                assert(h != BLACK_HOLE);
+                assert((fptr_t)h != BLACK_HOLE);
hunk ./src/data/rts/jhc_rts2.c 298
-static inline void A_STD A_UNUSED A_HOT
-update(sptr_t thunk, wptr_t new)
+static void A_STD A_UNUSED A_HOT
+update(void * thunk, wptr_t new)
hunk ./src/data/rts/slub.c 200
+/*
hunk ./src/data/rts/slub.c 212
+*/