lookup: Borrow keyword and dictionary entries
76d18fbc5ee8806637f860263954a1edf158e0b845b91b1d44a1f821de000b9e
Lookup loops only read entry fields. Borrow entries to avoid copying records on each keyword comparison and dictionary probe. Assisted-by: Codex:gpt-6-astra
1 parent
a7dcdcfb
lib/std/collections/dict.rad
+2 -2
| 34 | 34 | export fn insert(m: *mut Dict, key: *[u8], value: i32) { |
|
| 35 | 35 | let mask = m.entries.len - 1; |
|
| 36 | 36 | let mut idx = hash(key) & mask; |
|
| 37 | 37 | ||
| 38 | 38 | loop { |
|
| 39 | - | let entry = m.entries[idx]; |
|
| 39 | + | let entry = &m.entries[idx]; |
|
| 40 | 40 | if entry.key.len == 0 { |
|
| 41 | 41 | assert m.count < m.entries.len / 2, "dict::insert: table full"; |
|
| 42 | 42 | set m.entries[idx] = Entry { key, value }; |
|
| 43 | 43 | set m.count += 1; |
|
| 44 | 44 | return; |
| 55 | 55 | export fn get(m: *Dict, key: *[u8]) -> ?i32 { |
|
| 56 | 56 | let mask = m.entries.len - 1; |
|
| 57 | 57 | let mut idx = hash(key) & mask; |
|
| 58 | 58 | ||
| 59 | 59 | loop { |
|
| 60 | - | let entry = m.entries[idx]; |
|
| 60 | + | let entry = &m.entries[idx]; |
|
| 61 | 61 | if entry.key.len == 0 { |
|
| 62 | 62 | return nil; |
|
| 63 | 63 | } |
|
| 64 | 64 | if mem::eq(entry.key, key) { |
|
| 65 | 65 | return entry.value; |
lib/std/lang/scanner.rad
+1 -1
| 386 | 386 | let mut left: u32 = 0; |
|
| 387 | 387 | let mut right: u32 = KEYWORDS.len; |
|
| 388 | 388 | ||
| 389 | 389 | while left < right { |
|
| 390 | 390 | let mid = left + ((right - left) / 2); |
|
| 391 | - | let kw = KEYWORDS[mid]; |
|
| 391 | + | let kw = &KEYWORDS[mid]; |
|
| 392 | 392 | let cmp = mem::cmp(src, kw.name); |
|
| 393 | 393 | ||
| 394 | 394 | match cmp { |
|
| 395 | 395 | case -1 => set right = mid, |
|
| 396 | 396 | case 1 => set left = mid + 1, |