@@ -37,8 +37,8 @@ const TAG_HEADER2: u16 = BASE_TYPE | 0x0002; // [110] 2 byte header. 4 byte data
37
37
const TAG_HEADER3 : u16 = BASE_TYPE | 0x0003 ; // [011] 3 byte header. 3 byte data.
38
38
const TAG_HEADER4 : u16 = BASE_TYPE | 0x0004 ; // [100] 4 byte header. 2 byte data.
39
39
const TAG_HEADER5 : u16 = BASE_TYPE | 0x0005 ; // [101] 5 byte header. 1 byte data.
40
- const TAG_INLINE_STRING : u16 = BASE_TYPE | 0x006 ; // [110] Inline string up to 5 ascii chars inline.
41
- const TAG_INLINE_BITSET : u16 = BASE_TYPE | 0x007 ; // [111] Inline bitset.
40
+ const TAG_INLINE_STRING : u16 = BASE_TYPE | 0x0006 ; // [110] Inline string up to 5 ascii chars inline.
41
+ const TAG_INLINE_BITSET : u16 = BASE_TYPE | 0x0007 ; // [111] Inline bitset.
42
42
43
43
const TYPE_HEADER0 : u64 = @as (u64 , TAG_HEADER0 ) << 48 ;
44
44
const TYPE_HEADER1 : u64 = @as (u64 , TAG_HEADER1 ) << 48 ;
@@ -77,13 +77,6 @@ pub const AST_STRING: u8 = 0x21; // 0x22 = '"'
77
77
pub const AST_IDENTIFIER : u8 = 0x41 ; // 0x41 = 'A'
78
78
pub const AST_COMMENT : u8 = 0x27 ; // 0x27 = '/'
79
79
80
- pub fn getTypeTag (val : u64 ) u64 {
81
- return val & MASK_TYPE ;
82
- }
83
-
84
- fn isPrimitiveType (comptime pattern : u64 , val : u64 ) bool {
85
- return (val & pattern ) == pattern ;
86
- }
87
80
88
81
pub fn getHeader (val : u64 ) u64 {
89
82
const header = switch (val & MASK_TYPE ) {
@@ -109,6 +102,18 @@ pub fn getPayload(val: u64) u64 {
109
102
return payload ;
110
103
}
111
104
105
+ pub fn getHeader2 (val : u64 ) u16 {
106
+ return @truncate (u16 , (val & MASK_HIGH16 ) >> 32 );
107
+ }
108
+
109
+ pub fn getTypeTag (val : u64 ) u64 {
110
+ return val & MASK_TYPE ;
111
+ }
112
+
113
+ fn isPrimitiveType (comptime pattern : u64 , val : u64 ) bool {
114
+ return (val & pattern ) == pattern ;
115
+ }
116
+
112
117
pub fn isNan (val : u64 ) bool {
113
118
// Any NaN - quiet or signaling - either positive or negative.
114
119
return isPrimitiveType (UNSIGNED_ANY_NAN , val );
@@ -123,6 +128,14 @@ pub fn isInlineString(val: u64) bool {
123
128
return isPrimitiveType (TYPE_INLINE_STRING , val );
124
129
}
125
130
131
+ pub fn createHeader2 (header : u16 , payload : u32 ) u64 {
132
+ return TYPE_HEADER2 | (@as (u64 , header ) << 32 ) | @as (u64 , payload );
133
+ }
134
+
135
+ pub fn createHeader1 (header : u8 , payload : u40 ) u64 {
136
+ return TYPE_HEADER1 | (@as (u64 , header ) << 40 ) | @as (u64 , payload );
137
+ }
138
+
126
139
pub fn createInlineString (str : []const u8 ) u64 {
127
140
// Inline small strings of up to 6 bytes.
128
141
// The representation does reverse the order of bytes.
@@ -141,12 +154,16 @@ pub fn decodeInlineString(val: u64, out: *[8]u8) void {
141
154
142
155
pub fn createKeyword (opcode : u8 , precedence : u16 ) u64 {
143
156
// Create a left-associative keyword
144
- return TYPE_HEADER1 | @as ( u64 , opcode ) << 40 | ( @as ( u64 , precedence ) );
157
+ return createHeader1 ( opcode , precedence );
145
158
}
146
159
147
160
pub fn createKeywordRight (opcode : u8 , precedence : u16 ) u64 {
148
161
// Create a right-associative keyword. Top bit of precedence header is 1.
149
- return TYPE_HEADER1 | @as (u64 , opcode ) << 40 | (@as (u64 , precedence | 0x1000 ));
162
+ return createHeader1 (opcode , precedence | 0x1000 );
163
+ }
164
+
165
+ pub fn isKeyword (value : u64 ) bool {
166
+ return isPrimitiveType (TYPE_HEADER1 , value );
150
167
}
151
168
152
169
pub fn getPrecedence (tok : u64 ) u16 {
@@ -161,12 +178,8 @@ pub fn isLeftAssociative(tok: u64) bool {
161
178
return ((tok ) & 0x1000 ) == 0 ;
162
179
}
163
180
164
- pub fn createHeader2 (header : u16 , payload : u32 ) u64 {
165
- return TYPE_HEADER2 | (@as (u64 , header ) << 32 ) | @as (u64 , payload );
166
- }
167
-
168
- pub fn createReference (header : u16 , payload : u32 ) u64 {
169
- return createHeader2 (header , payload );
181
+ pub fn createReference (header : u8 , payload : u40 ) u64 {
182
+ return createHeader1 (header , payload );
170
183
}
171
184
172
185
pub const OP_ADD : u8 = 0 ;
0 commit comments