From 78bad72dd15e02374bb0427868cb0146c4ac2f8b Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 17 May 2024 12:00:34 -0700 Subject: [PATCH] fix: handling of of keyword --- lib/lexer.wasm | Bin 8789 -> 8841 bytes src/lexer.c | 10 +++------- test/_unit.cjs | 14 +++++++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/lexer.wasm b/lib/lexer.wasm index fb17163730b476ca20c6e634571e08a2cba7f3f0..b902bf5a1d1612cdc1720d64accf54c3b053dc35 100755 GIT binary patch delta 279 zcmccW(&@T^iIHiV<7O5{A7;iIn*&)wS?ZY_m>e7#G??aaDKY9ZGAJ<%NW1bffJ7CT z9YeGDSQt1NnK`)?7#-`ffbx#oZoJGq90Xy!8pcU}gF zp$bfn^;sYjl~^>G7#taa5^zVo2P$J!0E&a{V&q{3x#usk-p$sWDtwGvCMSqL<4|C5 NtO5CDbGF1QP5>U$H6Q>0 delta 227 zcmeBlz3Q@oiIM4%!)6vnA7;k(&4DbTEcK2I8ccJzlo<6H8I+g>q+NL#m>fV*f!Q%M zi;snogNcEITY=HBE(@r_F(AwF|9|E}M=noZW*&BgxV9TF6Av4Luj|Ik$ivDFHs&vb z8!rRUI8Aq6Mv!ewxEvYu8E0@gGM8j&h%vDU$hd+PBg<{>;Z)&cyf}HI_%l^UMny&i l2FIE#B_@!PJDhI3Yzj;u_c95{^RhWI0Hv8W&zE?`2>^=hD%=17 diff --git a/src/lexer.c b/src/lexer.c index e88f5c9..202cc84 100755 --- a/src/lexer.c +++ b/src/lexer.c @@ -189,6 +189,7 @@ bool parse () { !(lastToken == '.' && (*(lastTokenPos - 1) >= '0' && *(lastTokenPos - 1) <= '9')) && !(lastToken == '+' && *(lastTokenPos - 1) == '+') && !(lastToken == '-' && *(lastTokenPos - 1) == '-') || lastToken == ')' && isParenKeyword(openTokenStack[openTokenDepth].pos) || + openTokenDepth > 0 && openTokenStack[openTokenDepth - 1].token == AnyParen && *(lastTokenPos) == 'f' && *(lastTokenPos - 1) == 'o' && isParenKeyword(openTokenStack[openTokenDepth - 1].pos) || lastToken == '}' && (isExpressionTerminator(openTokenStack[openTokenDepth].pos) || openTokenStack[openTokenDepth].token == ClassBrace) || isExpressionKeyword(lastTokenPos) || lastToken == '/' && lastSlashWasDivision || @@ -871,7 +872,7 @@ bool readPrecedingKeywordn (char16_t* pos, const char16_t* compare, size_t n) { } // Detects one of case, debugger, delete, do, else, in, instanceof, new, -// return, throw, typeof, void, yield ,await, of +// return, throw, typeof, void, yield ,await bool isExpressionKeyword (char16_t* pos) { switch (*pos) { case 'd': @@ -908,12 +909,7 @@ bool isExpressionKeyword (char16_t* pos) { return false; } case 'f': - if (*(pos - 1) != 'o') - return false; - // of - if (pos -2 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 2))) - return true; - if (*(pos - 2) != 'e') + if (*(pos - 1) != 'o' || *(pos - 2) != 'e') return false; switch (*(pos - 3)) { case 'c': diff --git a/test/_unit.cjs b/test/_unit.cjs index 00b2d54..727cbd4 100755 --- a/test/_unit.cjs +++ b/test/_unit.cjs @@ -39,6 +39,15 @@ function assertExportIs(source, actual, expected) { suite('Lexer', () => { beforeEach(async () => await init); + test(`Regex case`, () => { + const source = `for(let t of/[0-9]+/g.exec(e)){}` + parse(source); + }); + + test('keyword case', () => { + parse('const of=1;console.log(1+of/1)'); + }); + test('import types', () => { const input = ` // dynamic @@ -61,11 +70,6 @@ suite('Lexer', () => { assert.strictEqual(imports[5].t, 3); }); - test(`Regex case`, () => { - const source = `for(let t of/[0-9]+/g.exec(e)){}` - parse(source); - }); - test(`Source phase imports`, () => { const source = ` import source