summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2009-11-16 09:26:53 -0800
committerKaz Kylheku <kaz@kylheku.com>2009-11-16 09:26:53 -0800
commitfb2f0af8bd14283524e5842b43461ea3fc7701ca (patch)
treeacdf6396d5ebf9b9d65ea85f70cafd7fffdb8991 /lib.h
parent0dd8652385533322d41b30fbd9375e6de9903548 (diff)
downloadtxr-fb2f0af8bd14283524e5842b43461ea3fc7701ca.tar.gz
txr-fb2f0af8bd14283524e5842b43461ea3fc7701ca.tar.bz2
txr-fb2f0af8bd14283524e5842b43461ea3fc7701ca.zip
Use the 11 tag bit pattern to denote a new type: LIT. This is a
pointer to a C static string, intended for literals. We can now treat literal strings as light-weight objects.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib.h b/lib.h
index 0d075b2f..4db6ebf8 100644
--- a/lib.h
+++ b/lib.h
@@ -25,15 +25,17 @@
*/
#define TAG_SHIFT 2
-#define TAG_MASK ((1 << TAG_SHIFT) - 1)
+#define TAG_MASK ((1L << TAG_SHIFT) - 1)
#define TAG_PTR 0
#define TAG_NUM 1
#define TAG_CHR 2
+#define TAG_LIT 3
#define NUM_MAX (LONG_MAX/4)
#define NUM_MIN (LONG_MIN/4)
typedef enum type {
- NUM = TAG_NUM, CHR = TAG_CHR, CONS, STR, SYM, FUN, VEC, LCONS, LSTR, COBJ
+ NUM = TAG_NUM, CHR = TAG_CHR, LIT = TAG_LIT, CONS,
+ STR, SYM, FUN, VEC, LCONS, LSTR, COBJ
} type_t;
typedef enum functype
@@ -47,7 +49,10 @@ typedef enum functype
#define is_ptr(obj) ((obj) && (tag(obj) == TAG_PTR))
#define is_num(obj) (tag(obj) == TAG_NUM)
#define is_chr(obj) (tag(obj) == TAG_CHR)
-#define type(obj) (tag(obj) ? ((type_t) tag(obj)) : obj->t.type)
+#define is_lit(obj) (tag(obj) == TAG_LIT)
+#define type(obj) (tag(obj) ? ((type_t) tag(obj)) : (obj)->t.type)
+#define lit(strlit) ((obj_t *) ((long) (L ## strlit) | TAG_LIT))
+#define litptr(obj) ((wchar_t *) ((long) obj & ~TAG_MASK))
typedef union obj obj_t;