From 1d70b25b432e01ce52d40045b9b0a4bdb68bf2f2 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sat, 29 Aug 2026 02:15:36 +0200 Subject: [PATCH] perf: skip class checks for unrelated identifiers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a 3,629,072-code-unit corpus, seven alternating trials improved parse time from 13,161.06 to 12,783.68 µs on Node 24.20.0 (V8 13.6). A fresh process measured 13,399.06 to 13,041.79 µs. --- lexer.js | 3 ++- test/_unit.js | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lexer.js b/lexer.js index 1614fd9..aa06c38 100755 --- a/lexer.js +++ b/lexer.js @@ -158,7 +158,8 @@ function parseSource (cjsSource) { } break; case 99/*c*/: - if (keywordStart(pos) && source.startsWith('lass', pos + 1) && isBrOrWs(source.charCodeAt(pos + 5))) + if (source.charCodeAt(pos + 1) === 108/*l*/ && keywordStart(pos) && + source.startsWith('ass', pos + 2) && isBrOrWs(source.charCodeAt(pos + 5))) nextBraceIsClass = true; break; case 109/*m*/: diff --git a/test/_unit.js b/test/_unit.js index 0458f17..fdf9996 100755 --- a/test/_unit.js +++ b/test/_unit.js @@ -478,6 +478,23 @@ suite('Lexer', () => { `); }); + test('Class keyword detection', () => { + for (const whitespace of ['\t', '\n', '\v', '\f', '\r', ' ', '\u00a0']) { + const result = parse(`class${whitespace}Example {}/regex/.test('regex'); exports.value = 1`); + assert.deepStrictEqual(result.exports, ['value']); + assert.deepStrictEqual(result.reexports, []); + } + for (const source of [ + 'const className = {} / 2; exports.value = className', + 'const close = {} / 2; exports.value = close', + 'const value = {}; value.class = {} / 2; exports.value = value' + ]) { + const result = parse(source); + assert.deepStrictEqual(result.exports, ['value']); + assert.deepStrictEqual(result.reexports, []); + } + }); + test('Regexp division', () => { parse(`\nconst x = num / /'/.exec(l)[0].slice(1, -1)//'"`); });