diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2009-11-16 09:26:53 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2009-11-16 09:26:53 -0800 |
commit | fb2f0af8bd14283524e5842b43461ea3fc7701ca (patch) | |
tree | acdf6396d5ebf9b9d65ea85f70cafd7fffdb8991 /lib.h | |
parent | 0dd8652385533322d41b30fbd9375e6de9903548 (diff) | |
download | txr-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.h | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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; |