Skip to content

Commit c1e9bdf

Browse files
authored
chore: make TokenFlags fields booleans (#67)
1 parent c61a4e0 commit c1e9bdf

File tree

3 files changed

+99
-117
lines changed

3 files changed

+99
-117
lines changed

src/_table_generation/make_tables.nr

Lines changed: 69 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -359,94 +359,94 @@ unconstrained fn make_process_raw_transcript_table() -> [Field; 1024] {
359359
}
360360

361361
unconstrained fn generate_token_flags_table() -> [Field; NUM_TOKENS * 2] {
362-
let mut flags: [TokenFlags; NUM_TOKENS * 2] = [TokenFlags::default(); NUM_TOKENS * 2];
362+
let mut flags: [TokenFlags; NUM_TOKENS * 2] = std::mem::zeroed();
363363

364364
let mut no_token_flags: TokenFlags = TokenFlags {
365-
create_json_entry: 0,
366-
is_end_of_object_or_array: 0,
367-
is_start_of_object_or_array: 0,
368-
new_context: OBJECT_LAYER as Field,
369-
is_key_token: 0,
370-
is_value_token: 0,
371-
preserve_num_entries: 1,
365+
create_json_entry: false,
366+
is_end_of_object_or_array: false,
367+
is_start_of_object_or_array: false,
368+
new_context: OBJECT_LAYER != 0,
369+
is_key_token: false,
370+
is_value_token: false,
371+
preserve_num_entries: true,
372372
};
373373
let mut key_token_flags: TokenFlags = TokenFlags {
374-
create_json_entry: 0,
375-
is_end_of_object_or_array: 0,
376-
is_start_of_object_or_array: 0,
377-
new_context: OBJECT_LAYER as Field,
378-
is_key_token: 1,
379-
is_value_token: 0,
380-
preserve_num_entries: 1,
374+
create_json_entry: false,
375+
is_end_of_object_or_array: false,
376+
is_start_of_object_or_array: false,
377+
new_context: OBJECT_LAYER != 0,
378+
is_key_token: true,
379+
is_value_token: false,
380+
preserve_num_entries: true,
381381
};
382382
let begin_object_flags = TokenFlags {
383-
create_json_entry: 0,
384-
is_end_of_object_or_array: 0,
385-
is_start_of_object_or_array: 1,
386-
new_context: OBJECT_LAYER as Field,
387-
is_key_token: 0,
388-
is_value_token: 0,
389-
preserve_num_entries: 0,
383+
create_json_entry: false,
384+
is_end_of_object_or_array: false,
385+
is_start_of_object_or_array: true,
386+
new_context: OBJECT_LAYER != 0,
387+
is_key_token: false,
388+
is_value_token: false,
389+
preserve_num_entries: false,
390390
};
391391

392392
let begin_array_flags = TokenFlags {
393-
create_json_entry: 0,
394-
is_end_of_object_or_array: 0,
395-
is_start_of_object_or_array: 1,
396-
new_context: ARRAY_LAYER as Field,
397-
is_key_token: 0,
398-
is_value_token: 0,
399-
preserve_num_entries: 0,
393+
create_json_entry: false,
394+
is_end_of_object_or_array: false,
395+
is_start_of_object_or_array: true,
396+
new_context: ARRAY_LAYER != 0,
397+
is_key_token: false,
398+
is_value_token: false,
399+
preserve_num_entries: false,
400400
};
401401

402402
let mut end_object_flags = TokenFlags {
403-
create_json_entry: 1,
404-
is_end_of_object_or_array: 1,
405-
is_start_of_object_or_array: 0,
406-
new_context: 0,
407-
is_key_token: 0,
408-
is_value_token: 0,
409-
preserve_num_entries: 0,
403+
create_json_entry: true,
404+
is_end_of_object_or_array: true,
405+
is_start_of_object_or_array: false,
406+
new_context: false,
407+
is_key_token: false,
408+
is_value_token: false,
409+
preserve_num_entries: false,
410410
};
411411

412412
let mut end_array_flags = TokenFlags {
413-
create_json_entry: 1,
414-
is_end_of_object_or_array: 1,
415-
is_start_of_object_or_array: 0,
416-
new_context: 0,
417-
is_key_token: 0,
418-
is_value_token: 0,
419-
preserve_num_entries: 0,
413+
create_json_entry: true,
414+
is_end_of_object_or_array: true,
415+
is_start_of_object_or_array: false,
416+
new_context: false,
417+
is_key_token: false,
418+
is_value_token: false,
419+
preserve_num_entries: false,
420420
};
421421

422422
let mut string_flags = TokenFlags {
423-
create_json_entry: 1,
424-
is_end_of_object_or_array: 0,
425-
is_start_of_object_or_array: 0,
426-
new_context: OBJECT_LAYER as Field,
427-
is_key_token: 0,
428-
is_value_token: 1,
429-
preserve_num_entries: 1,
423+
create_json_entry: true,
424+
is_end_of_object_or_array: false,
425+
is_start_of_object_or_array: false,
426+
new_context: OBJECT_LAYER != 0,
427+
is_key_token: false,
428+
is_value_token: true,
429+
preserve_num_entries: true,
430430
};
431431

432432
let mut numeric_flags = TokenFlags {
433-
create_json_entry: 1,
434-
is_end_of_object_or_array: 0,
435-
is_start_of_object_or_array: 0,
436-
new_context: OBJECT_LAYER as Field,
437-
is_key_token: 0,
438-
is_value_token: 1,
439-
preserve_num_entries: 1,
433+
create_json_entry: true,
434+
is_end_of_object_or_array: false,
435+
is_start_of_object_or_array: false,
436+
new_context: OBJECT_LAYER != 0,
437+
is_key_token: false,
438+
is_value_token: true,
439+
preserve_num_entries: true,
440440
};
441441

442442
let mut literal_flags = TokenFlags {
443-
create_json_entry: 1,
444-
is_end_of_object_or_array: 0,
445-
is_start_of_object_or_array: 0,
446-
new_context: OBJECT_LAYER as Field,
447-
is_key_token: 0,
448-
is_value_token: 1,
449-
preserve_num_entries: 1,
443+
create_json_entry: true,
444+
is_end_of_object_or_array: false,
445+
is_start_of_object_or_array: false,
446+
new_context: OBJECT_LAYER != 0,
447+
is_key_token: false,
448+
is_value_token: true,
449+
preserve_num_entries: true,
450450
};
451451

452452
flags[NO_TOKEN] = no_token_flags;
@@ -461,11 +461,11 @@ unconstrained fn generate_token_flags_table() -> [Field; NUM_TOKENS * 2] {
461461
flags[LITERAL_TOKEN] = literal_flags;
462462
flags[KEY_TOKEN] = key_token_flags;
463463

464-
no_token_flags.new_context = ARRAY_LAYER as Field;
465-
key_token_flags.new_context = ARRAY_LAYER as Field;
466-
string_flags.new_context = ARRAY_LAYER as Field;
467-
numeric_flags.new_context = ARRAY_LAYER as Field;
468-
literal_flags.new_context = ARRAY_LAYER as Field;
464+
no_token_flags.new_context = ARRAY_LAYER != 0;
465+
key_token_flags.new_context = ARRAY_LAYER != 0;
466+
string_flags.new_context = ARRAY_LAYER != 0;
467+
numeric_flags.new_context = ARRAY_LAYER != 0;
468+
literal_flags.new_context = ARRAY_LAYER != 0;
469469

470470
flags[NUM_TOKENS + NO_TOKEN] = no_token_flags;
471471
flags[NUM_TOKENS + BEGIN_OBJECT_TOKEN] = begin_object_flags;

src/json.nr

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,15 @@ impl<let NumBytes: u32, let NumPackedFields: u32, let MaxNumTokens: u32, let Max
276276
TOKEN_FLAGS_TABLE[cast_num_to_u32(token) + context * NUM_TOKENS],
277277
);
278278

279+
// We convert these booleans into Fields so that we can use them in arithmetic operations.
280+
let create_json_entry = create_json_entry as Field;
281+
let is_end_of_object_or_array = is_end_of_object_or_array as Field;
282+
let is_start_of_object_or_array = is_start_of_object_or_array as Field;
283+
let new_context = new_context as Field;
284+
let update_key = update_key as Field;
285+
let is_value_token = is_value_token as Field;
286+
let preserve_num_entries = preserve_num_entries as Field;
287+
279288
// 2 gates
280289
let diff = (index + length * 0x10000) - current_key_index_and_length;
281290
std::as_witness(diff);

src/token_flags.nr

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
pub(crate) struct TokenFlags {
2-
pub(crate) create_json_entry: Field,
3-
pub(crate) is_end_of_object_or_array: Field,
4-
pub(crate) is_start_of_object_or_array: Field,
5-
pub(crate) new_context: Field,
6-
pub(crate) is_key_token: Field,
7-
pub(crate) is_value_token: Field,
8-
pub(crate) preserve_num_entries: Field,
2+
pub(crate) create_json_entry: bool,
3+
pub(crate) is_end_of_object_or_array: bool,
4+
pub(crate) is_start_of_object_or_array: bool,
5+
pub(crate) new_context: bool,
6+
pub(crate) is_key_token: bool,
7+
pub(crate) is_value_token: bool,
8+
pub(crate) preserve_num_entries: bool,
99
}
1010

1111
impl TokenFlags {
1212

1313
unconstrained fn __from_field(f: Field) -> Self {
1414
let bytes: [u8; 7] = f.to_be_bytes();
15-
let create_json_entry = bytes[0] as Field;
16-
let is_end_of_object_or_array = bytes[1] as Field;
17-
let is_start_of_object_or_array = bytes[2] as Field;
18-
let new_context = bytes[3] as Field;
19-
let is_key_token = bytes[4] as Field;
20-
let is_value_token = bytes[5] as Field;
21-
let preserve_num_entries = bytes[6] as Field;
15+
let create_json_entry = bytes[0] != 0;
16+
let is_end_of_object_or_array = bytes[1] != 0;
17+
let is_start_of_object_or_array = bytes[2] != 0;
18+
let new_context = bytes[3] != 0;
19+
let is_key_token = bytes[4] != 0;
20+
let is_value_token = bytes[5] != 0;
21+
let preserve_num_entries = bytes[6] != 0;
2222

2323
TokenFlags {
2424
create_json_entry,
@@ -36,46 +36,19 @@ impl TokenFlags {
3636
// Safety: check the comments below
3737
let r = unsafe { TokenFlags::__from_field(f) };
3838

39-
// checks that the flags are binary
40-
assert(r.create_json_entry * r.create_json_entry == r.create_json_entry);
41-
assert(
42-
r.is_end_of_object_or_array * r.is_end_of_object_or_array
43-
== r.is_end_of_object_or_array,
44-
);
45-
assert(
46-
r.is_start_of_object_or_array * r.is_start_of_object_or_array
47-
== r.is_start_of_object_or_array,
48-
);
49-
assert(r.new_context * r.new_context == r.new_context);
50-
assert(r.is_key_token * r.is_key_token == r.is_key_token);
51-
assert(r.is_value_token * r.is_value_token == r.is_value_token);
52-
assert(r.preserve_num_entries * r.preserve_num_entries == r.preserve_num_entries);
53-
5439
// asserts the relation of r and f
5540
assert(r.to_field() == f);
5641
r
5742
}
5843

5944
// 4 gates
6045
pub(crate) fn to_field(self) -> Field {
61-
self.preserve_num_entries
62-
+ self.is_value_token * 0x100
63-
+ self.is_key_token * 0x10000
64-
+ self.new_context * 0x1000000
65-
+ self.is_start_of_object_or_array * 0x100000000
66-
+ self.is_end_of_object_or_array * 0x10000000000
67-
+ self.create_json_entry * 0x1000000000000
68-
}
69-
70-
pub(crate) fn default() -> Self {
71-
TokenFlags {
72-
create_json_entry: 0,
73-
is_end_of_object_or_array: 0,
74-
is_start_of_object_or_array: 0,
75-
new_context: 0,
76-
is_key_token: 0,
77-
preserve_num_entries: 0,
78-
is_value_token: 0,
79-
}
46+
(self.preserve_num_entries as Field)
47+
+ (self.is_value_token as Field) * 0x100
48+
+ (self.is_key_token as Field) * 0x10000
49+
+ (self.new_context as Field) * 0x1000000
50+
+ (self.is_start_of_object_or_array as Field) * 0x100000000
51+
+ (self.is_end_of_object_or_array as Field) * 0x10000000000
52+
+ (self.create_json_entry as Field) * 0x1000000000000
8053
}
8154
}

0 commit comments

Comments
 (0)