[change function pointer representation so the GC can tell whether to follow pointers.
John Meacham <john@repetae.net>**20080308014755] hunk ./data/jhc_rts.c 40
-#if !_JHC_BOEHM_GC
+#if _JHC_GC == _JHC_GC_NONE
hunk ./data/jhc_rts2.c 3
-#define DETAG(x)     ((uintptr_t)(x) & ~0x1)
+#define DETAG(x)     ((uintptr_t)(x) & ~0x3)
hunk ./data/jhc_rts2.c 10
-#define EVALTAG(fn)  (assert(((uintptr_t)(fn) & 0x3) == 0),(sptr_t)((uintptr_t)(fn) | P_LAZY))
-#define EVALTAGC(fn) ((sptr_t)((void *)(fn) + P_LAZY))
+#define EVALTAG(fn)  (assert(((uintptr_t)(fn) & 0x3) == 0),(sptr_t)((uintptr_t)(fn) | P_FUNC))
+#define EVALTAGC(fn) ((sptr_t)((void *)(fn) + P_FUNC))
hunk ./data/jhc_rts2.c 18
-#define P_VALUE 0x2
hunk ./data/jhc_rts2.c 20
+#define P_VALUE 0x2
+#define P_FUNC  0x3
hunk ./data/jhc_rts2.c 26
-/* a value may be one of the following and is represented by a sptr_t
+/*
+ * smart pointers take on a general form as follows:
+ *
+ * -------------------------
+ * |    payload        | GL|
+ * -------------------------
+ *
+ *   G - if set, then the garbage collector should not treat value as a pointer to be followed
+ *   L - lazy, this bit being set means the value is somehow lazy
+ *
+ * a value may be one of the following and is represented by a sptr_t
hunk ./data/jhc_rts2.c 67
- * |    code pointer   | 01|
+ * |    code pointer   | 11|
hunk ./data/jhc_rts2.c 100
-typedef unsigned       what_t;
+typedef uintptr_t      what_t;
hunk ./data/jhc_rts2.c 140
-                assert(GETTAG(ds->head) == P_LAZY);
+                assert(GETTAG(ds->head) == P_FUNC);
hunk ./data/jhc_rts_alloc.c 2
-#if   _JHC_BOEHM_GC
+#if _JHC_GC == _JHC_GC_BOEHM
hunk ./data/jhc_rts_alloc.c 85
-#endif // USE_BOEHM_GC
+#endif
hunk ./data/jhc_rts_header.h 20
-#ifndef _JHC_BOEHM_GC
-#define _JHC_BOEHM_GC 0
+#define _JHC_GC_NONE  0
+#define _JHC_GC_JUDY  1
+#define _JHC_GC_BOEHM 2
+
+
+#ifndef _JHC_GC
+#define _JHC_GC _JHC_GC_NONE