diff options
author | Justus Winter <[email protected]> | 2017-01-30 14:45:13 +0000 |
---|---|---|
committer | Justus Winter <[email protected]> | 2017-01-30 16:09:41 +0000 |
commit | e343984fc50e87830905614dc87f83f810551ad1 (patch) | |
tree | 585a7486bfe9b1a7963988dc9bd0c29f806038a0 /tests/gpgscm/scheme.c | |
parent | gpgscm: Fix setting the line of the first gc reservation. (diff) | |
download | gnupg-e343984fc50e87830905614dc87f83f810551ad1.tar.gz gnupg-e343984fc50e87830905614dc87f83f810551ad1.zip |
gpgscm: Provide framework for immediate values.
* tests/gpgscm/scheme.c (IMMEDIATE_TAG): New macro.
({is,set,clr}_immediate): Likewise.
(enum scheme_types): Make type tags disjoint from immediate values.
(TYPE_BITS): We need one more bit now.
(ADJ,T_MASKTYPE): Compute values.
--
Immediate values are disjoint from all type tags and pointers,
allowing us to store immediate values in all memory locations.
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | tests/gpgscm/scheme.c | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c index 311f6062f..32d8032f0 100644 --- a/tests/gpgscm/scheme.c +++ b/tests/gpgscm/scheme.c @@ -111,27 +111,43 @@ static const char *strlwr(char *s) { # define FIRST_CELLSEGS 3 #endif + + +/* Support for immediate values. + * + * Immediate values are tagged with IMMEDIATE_TAG, which is neither + * used in types, nor in pointer values. + * + * XXX: Currently, we only use this to tag pointers in vectors. */ +#define IMMEDIATE_TAG 1 +#define is_immediate(p) ((pointer) ((uintptr_t) (p) & IMMEDIATE_TAG)) +#define set_immediate(p) ((pointer) ((uintptr_t) (p) | IMMEDIATE_TAG)) +#define clr_immediate(p) ((pointer) ((uintptr_t) (p) & ~IMMEDIATE_TAG)) + + + enum scheme_types { - T_STRING=1, - T_NUMBER=2, - T_SYMBOL=3, - T_PROC=4, - T_PAIR=5, - T_CLOSURE=6, - T_CONTINUATION=7, - T_FOREIGN=8, - T_CHARACTER=9, - T_PORT=10, - T_VECTOR=11, - T_MACRO=12, - T_PROMISE=13, - T_ENVIRONMENT=14, - T_FOREIGN_OBJECT=15, - T_BOOLEAN=16, - T_NIL=17, - T_EOF_OBJ=18, - T_SINK=19, - T_LAST_SYSTEM_TYPE=19 + T_STRING=1 << 1, /* Do not use the lsb, it is used for + * immediate values. */ + T_NUMBER=2 << 1, + T_SYMBOL=3 << 1, + T_PROC=4 << 1, + T_PAIR=5 << 1, + T_CLOSURE=6 << 1, + T_CONTINUATION=7 << 1, + T_FOREIGN=8 << 1, + T_CHARACTER=9 << 1, + T_PORT=10 << 1, + T_VECTOR=11 << 1, + T_MACRO=12 << 1, + T_PROMISE=13 << 1, + T_ENVIRONMENT=14 << 1, + T_FOREIGN_OBJECT=15 << 1, + T_BOOLEAN=16 << 1, + T_NIL=17 << 1, + T_EOF_OBJ=18 << 1, + T_SINK=19 << 1, + T_LAST_SYSTEM_TYPE=19 << 1 }; static const char * @@ -163,9 +179,9 @@ type_to_string (enum scheme_types typ) } /* ADJ is enough slack to align cells in a TYPE_BITS-bit boundary */ -#define ADJ 32 -#define TYPE_BITS 5 -#define T_MASKTYPE 31 /* 0000000000011111 */ +#define TYPE_BITS 6 +#define ADJ (1 << TYPE_BITS) +#define T_MASKTYPE (ADJ - 1) #define T_TAGGED 1024 /* 0000010000000000 */ #define T_FINALIZE 2048 /* 0000100000000000 */ #define T_SYNTAX 4096 /* 0001000000000000 */ |