You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
perf(parser): use range checks for is_any_keyword() and is_number() (#14410)
## Summary
Replace multi-function calls and multiple enum variant checks with simple range checks, reducing assembly instructions in hot paths.
## Changes
### `is_any_keyword()`
**Before**: Called 4 separate functions checking 70+ enum variants:
- `is_reserved_keyword()` - 38 variants
- `is_contextual_keyword()` - 39 variants
- `is_strict_mode_contextual_keyword()` - 8 variants
- `is_future_reserved_keyword()` - 7 variants
**After**: Single range check `Await..=Yield` since all keywords are contiguous in the enum
### `is_number()`
**Before**: Matched 11 separate enum variants
**After**: Single range check `Decimal..=HexBigInt` since numeric literals are contiguous
## Assembly Analysis
### Before (with scattered checks)
```asm
mov x8, #992 ; Load bitmask constant
movk x8, #992, lsl #16 ; More bitmask setup
movk x8, #240, lsl #32 ; Even more bitmask setup
lsr x8, x8, x0 ; Shift by kind value
and w0, w8, #0x1 ; Extract result bit
```
**5 instructions** with complex constant loading
### After (with range check)
```asm
and w8, w0, #0xff ; Extract byte
sub w8, w8, #5 ; Subtract range start
cmp w8, #39 ; Compare to range size
cset w0, lo ; Set result
```
**4 instructions** with simple arithmetic
## Performance Impact
- **20% fewer instructions** (5 → 4)
- **Simpler logic** = better CPU pipeline utilization
- **No complex constants** = smaller code size
- **Better branch prediction** with single comparison
This is particularly important because:
- `is_any_keyword()` is called from `advance()` on **every single token**
- This is one of the hottest code paths in the entire parser
## Testing
Added unit tests to verify that:
- All keywords remain contiguous in the enum (`Await..=Yield`)
- All numeric literals remain contiguous (`Decimal..=HexBigInt`)
These tests will catch any future enum reordering that would break the optimization.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
0 commit comments