From 51a976326f7f07064c530a5840901cc478957b14 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 12:49:13 +0200 Subject: [PATCH 01/10] optimize some inner cases for tokenFromKeyword --- src/tokenizer.ts | 118 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 24 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index e535d06ffa..827cc833a0 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -191,20 +191,59 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.c: { - if (text == "case") return Token.CASE; - if (text == "catch") return Token.CATCH; - if (text == "class") return Token.CLASS; - if (text == "continue") return Token.CONTINUE; - if (text == "const") return Token.CONST; - if (text == "constructor") return Token.CONSTRUCTOR; + switch (text.charCodeAt(2)) { + case CharCode.s: { + if (text == "case") return Token.CASE; + break; + } + case CharCode.t: { + if (text == "catch") return Token.CATCH; + break; + } + case CharCode.n: { + if (text == "const") return Token.CONST; + break; + } + case CharCode.a: { + if (text == "class") return Token.CLASS; + break; + } + } + switch (text.charCodeAt(3)) { + case CharCode.t: { + if (text == "continue") return Token.CONTINUE; + break; + } + case CharCode.s: { + if (text == "constructor") return Token.CONSTRUCTOR; + break; + } + } break; } case CharCode.d: { - if (text == "debugger") return Token.DEBUGGER; - if (text == "declare") return Token.DECLARE; - if (text == "default") return Token.DEFAULT; - if (text == "delete") return Token.DELETE; - if (text == "do") return Token.DO; + if (text.length == 2) { + if (text == "do") return Token.DO; + break; + } + switch (text.charCodeAt(2)) { + case CharCode.b: { + if (text == "debugger") return Token.DEBUGGER; + break; + } + case CharCode.c: { + if (text == "declare") return Token.DECLARE; + break; + } + case CharCode.f: { + if (text == "default") return Token.DEFAULT; + break; + } + case CharCode.l: { + if (text == "delete") return Token.DELETE; + break; + } + } break; } case CharCode.e: { @@ -227,13 +266,30 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.i: { - if (text == "if") return Token.IF; - if (text == "implements") return Token.IMPLEMENTS; - if (text == "import") return Token.IMPORT; - if (text == "in") return Token.IN; - if (text == "instanceof") return Token.INSTANCEOF; - if (text == "interface") return Token.INTERFACE; - if (text == "is") return Token.IS; + if (text.length == 2) { + if (text == "if") return Token.IF; + if (text == "in") return Token.IN; + if (text == "is") return Token.IS; + break; + } + switch (text.charCodeAt(3)) { + case CharCode.l: { + if (text == "implements") return Token.IMPLEMENTS; + break; + } + case CharCode.o: { + if (text == "import") return Token.IMPORT; + break; + } + case CharCode.t: { + if (text == "instanceof") return Token.INSTANCEOF; + break; + } + case CharCode.e: { + if (text == "interface") return Token.INTERFACE; + break; + } + } break; } case CharCode.k: { @@ -278,12 +334,26 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.t: { - if (text == "this") return Token.THIS; - if (text == "throw") return Token.THROW; - if (text == "true") return Token.TRUE; - if (text == "try") return Token.TRY; - if (text == "type") return Token.TYPE; - if (text == "typeof") return Token.TYPEOF; + if (text.length == 4) { + if (text == "this") return Token.THIS; + if (text == "true") return Token.TRUE; + if (text == "type") return Token.TYPE; + break; + } + switch (text.charCodeAt(1)) { + case CharCode.r: { + if (text == "try") return Token.TRY; + break; + } + case CharCode.h: { + if (text == "throw") return Token.THROW; + break; + } + case CharCode.y: { + if (text == "typeof") return Token.TYPEOF; + break; + } + } break; } case CharCode.v: { From c484795646b61a726f4c3087ca73c0ad5dea8761 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 12:57:56 +0200 Subject: [PATCH 02/10] better --- src/tokenizer.ts | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 827cc833a0..cde8c8cec0 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -191,23 +191,15 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.c: { - switch (text.charCodeAt(2)) { - case CharCode.s: { - if (text == "case") return Token.CASE; - break; - } - case CharCode.t: { - if (text == "catch") return Token.CATCH; - break; - } - case CharCode.n: { - if (text == "const") return Token.CONST; - break; - } - case CharCode.a: { - if (text == "class") return Token.CLASS; - break; - } + if (text.length == 4) { + if (text == "case") return Token.CASE; + break; + } + if (text.length == 5) { + if (text == "const") return Token.CONST; + if (text == "class") return Token.CLASS; + if (text == "catch") return Token.CATCH; + break; } switch (text.charCodeAt(3)) { case CharCode.t: { From 8d2c3b5c556d3dac2ccc6a9c9eaba1c349fe1247 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 12:58:59 +0200 Subject: [PATCH 03/10] simpler --- src/tokenizer.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index cde8c8cec0..c3f80e0eb1 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -201,16 +201,8 @@ export function tokenFromKeyword(text: string): Token { if (text == "catch") return Token.CATCH; break; } - switch (text.charCodeAt(3)) { - case CharCode.t: { - if (text == "continue") return Token.CONTINUE; - break; - } - case CharCode.s: { - if (text == "constructor") return Token.CONSTRUCTOR; - break; - } - } + if (text == "continue") return Token.CONTINUE; + if (text == "constructor") return Token.CONSTRUCTOR; break; } case CharCode.d: { From b637d737323ac9779824d83a7a7932cf20d3affb Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 13:03:28 +0200 Subject: [PATCH 04/10] more differentiations by length --- src/tokenizer.ts | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index c3f80e0eb1..c46594aab5 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -177,13 +177,20 @@ export enum IdentifierHandling { } export function tokenFromKeyword(text: string): Token { - assert(text.length); + let len = text.length; + assert(len); switch (text.charCodeAt(0)) { case CharCode.a: { + if (len == 2) { + if (text == "as") return Token.AS; + break; + } + if (len == 5) { + if (text == "async") return Token.ASYNC; + if (text == "await") return Token.AWAIT; + break; + } if (text == "abstract") return Token.ABSTRACT; - if (text == "as") return Token.AS; - if (text == "async") return Token.ASYNC; - if (text == "await") return Token.AWAIT; break; } case CharCode.b: { @@ -191,11 +198,11 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.c: { - if (text.length == 4) { + if (len == 4) { if (text == "case") return Token.CASE; break; } - if (text.length == 5) { + if (len == 5) { if (text == "const") return Token.CONST; if (text == "class") return Token.CLASS; if (text == "catch") return Token.CATCH; @@ -206,7 +213,7 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.d: { - if (text.length == 2) { + if (len == 2) { if (text == "do") return Token.DO; break; } @@ -231,8 +238,11 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.e: { - if (text == "else") return Token.ELSE; - if (text == "enum") return Token.ENUM; + if (len == 4) { + if (text == "else") return Token.ELSE; + if (text == "enum") return Token.ENUM; + break; + } if (text == "export") return Token.EXPORT; if (text == "extends") return Token.EXTENDS; break; @@ -250,7 +260,7 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.i: { - if (text.length == 2) { + if (len == 2) { if (text == "if") return Token.IF; if (text == "in") return Token.IN; if (text == "is") return Token.IS; @@ -299,8 +309,11 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.p: { - if (text == "package") return Token.PACKAGE; - if (text == "private") return Token.PRIVATE; + if (len == 7) { + if (text == "package") return Token.PACKAGE; + if (text == "private") return Token.PRIVATE; + break; + } if (text == "protected") return Token.PROTECTED; if (text == "public") return Token.PUBLIC; break; @@ -311,14 +324,17 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.s: { + if (len == 6) { + if (text == "static") return Token.STATIC; + if (text == "switch") return Token.SWITCH; + break; + } if (text == "set") return Token.SET; - if (text == "static") return Token.STATIC; if (text == "super") return Token.SUPER; - if (text == "switch") return Token.SWITCH; break; } case CharCode.t: { - if (text.length == 4) { + if (len == 4) { if (text == "this") return Token.THIS; if (text == "true") return Token.TRUE; if (text == "type") return Token.TYPE; From 5359fb904a09958261257a6aa585f7fe97d1b33e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 13:14:31 +0200 Subject: [PATCH 05/10] simplify --- src/tokenizer.ts | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index c46594aab5..4afeb58d72 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -249,10 +249,10 @@ export function tokenFromKeyword(text: string): Token { } case CharCode.f: { if (text == "false") return Token.FALSE; - if (text == "finally") return Token.FINALLY; if (text == "for") return Token.FOR; - if (text == "from") return Token.FROM; if (text == "function") return Token.FUNCTION; + if (text == "from") return Token.FROM; + if (text == "finally") return Token.FINALLY; break; } case CharCode.g: { @@ -340,20 +340,9 @@ export function tokenFromKeyword(text: string): Token { if (text == "type") return Token.TYPE; break; } - switch (text.charCodeAt(1)) { - case CharCode.r: { - if (text == "try") return Token.TRY; - break; - } - case CharCode.h: { - if (text == "throw") return Token.THROW; - break; - } - case CharCode.y: { - if (text == "typeof") return Token.TYPEOF; - break; - } - } + if (text == "try") return Token.TRY; + if (text == "throw") return Token.THROW; + if (text == "typeof") return Token.TYPEOF; break; } case CharCode.v: { From 03e9cad5b1415e2719eac19a395b2d21a365febf Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 17:26:41 +0200 Subject: [PATCH 06/10] arrange by frequancy --- src/tokenizer.ts | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 4afeb58d72..9cd417cdd9 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -217,24 +217,13 @@ export function tokenFromKeyword(text: string): Token { if (text == "do") return Token.DO; break; } - switch (text.charCodeAt(2)) { - case CharCode.b: { - if (text == "debugger") return Token.DEBUGGER; - break; - } - case CharCode.c: { - if (text == "declare") return Token.DECLARE; - break; - } - case CharCode.f: { - if (text == "default") return Token.DEFAULT; - break; - } - case CharCode.l: { - if (text == "delete") return Token.DELETE; - break; - } + if (len == 7) { + if (text == "default") return Token.DEFAULT; + if (text == "declare") return Token.DECLARE; + break; } + if (text == "debugger") return Token.DEBUGGER; + if (text == "delete") return Token.DELETE; break; } case CharCode.e: { @@ -299,9 +288,9 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.n: { - if (text == "namespace") return Token.NAMESPACE; if (text == "new") return Token.NEW; if (text == "null") return Token.NULL; + if (text == "namespace") return Token.NAMESPACE; break; } case CharCode.o: { @@ -310,23 +299,23 @@ export function tokenFromKeyword(text: string): Token { } case CharCode.p: { if (len == 7) { - if (text == "package") return Token.PACKAGE; if (text == "private") return Token.PRIVATE; + if (text == "package") return Token.PACKAGE; break; } - if (text == "protected") return Token.PROTECTED; if (text == "public") return Token.PUBLIC; + if (text == "protected") return Token.PROTECTED; break; } case CharCode.r: { - if (text == "readonly") return Token.READONLY; if (text == "return") return Token.RETURN; + if (text == "readonly") return Token.READONLY; break; } case CharCode.s: { if (len == 6) { - if (text == "static") return Token.STATIC; if (text == "switch") return Token.SWITCH; + if (text == "static") return Token.STATIC; break; } if (text == "set") return Token.SET; @@ -335,8 +324,8 @@ export function tokenFromKeyword(text: string): Token { } case CharCode.t: { if (len == 4) { - if (text == "this") return Token.THIS; if (text == "true") return Token.TRUE; + if (text == "this") return Token.THIS; if (text == "type") return Token.TYPE; break; } From 6634558c1a81ff34f38fccd044b1174039443190 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 17:32:06 +0200 Subject: [PATCH 07/10] more --- src/tokenizer.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 9cd417cdd9..9bb63c906e 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -237,10 +237,13 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.f: { - if (text == "false") return Token.FALSE; - if (text == "for") return Token.FOR; + if (len <= 5) { + if (text == "false") return Token.FALSE; + if (text == "for") return Token.FOR; + if (text == "from") return Token.FROM; + break; + } if (text == "function") return Token.FUNCTION; - if (text == "from") return Token.FROM; if (text == "finally") return Token.FINALLY; break; } From caaf38dfc9cce434066f573e728113a0b4df2c74 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Thu, 4 Nov 2021 19:27:05 +0200 Subject: [PATCH 08/10] minor refactorings --- src/tokenizer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 9bb63c906e..bf8ffa7fa9 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -968,9 +968,9 @@ export class Tokenizer extends DiagnosticEmitter { if (identifierHandling != IdentifierHandling.ALWAYS) { let maybeKeywordToken = tokenFromKeyword(text.substring(posBefore, pos)); if ( - maybeKeywordToken !== Token.INVALID && + maybeKeywordToken != Token.INVALID && !( - identifierHandling === IdentifierHandling.PREFER && + identifierHandling == IdentifierHandling.PREFER && tokenIsAlsoIdentifier(maybeKeywordToken) ) ) { @@ -987,7 +987,7 @@ export class Tokenizer extends DiagnosticEmitter { let start = pos++; if ( // surrogate pair? (c & 0xFC00) == 0xD800 && pos < end && - ((text.charCodeAt(pos)) & 0xFC00) == 0xDC00 + (text.charCodeAt(pos) & 0xFC00) == 0xDC00 ) ++pos; this.error( DiagnosticCode.Invalid_character, From ee5c5e78bc233bb5ebaa3b8c2f8e3ae2bae1c227 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 5 Nov 2021 01:57:20 +0200 Subject: [PATCH 09/10] fix lint --- src/tokenizer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index bf8ffa7fa9..95382e5b76 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -987,7 +987,7 @@ export class Tokenizer extends DiagnosticEmitter { let start = pos++; if ( // surrogate pair? (c & 0xFC00) == 0xD800 && pos < end && - (text.charCodeAt(pos) & 0xFC00) == 0xDC00 + ((text.charCodeAt(pos)) & 0xFC00) == 0xDC00 ) ++pos; this.error( DiagnosticCode.Invalid_character, From ce1c3292240207fdd00294a9de5e6e9ef9203d72 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 10 Nov 2021 17:59:53 +0200 Subject: [PATCH 10/10] simplify --- src/tokenizer.ts | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 95382e5b76..5aec3bd243 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -181,15 +181,12 @@ export function tokenFromKeyword(text: string): Token { assert(len); switch (text.charCodeAt(0)) { case CharCode.a: { - if (len == 2) { - if (text == "as") return Token.AS; - break; - } if (len == 5) { if (text == "async") return Token.ASYNC; if (text == "await") return Token.AWAIT; break; } + if (text == "as") return Token.AS; if (text == "abstract") return Token.ABSTRACT; break; } @@ -198,32 +195,26 @@ export function tokenFromKeyword(text: string): Token { break; } case CharCode.c: { - if (len == 4) { - if (text == "case") return Token.CASE; - break; - } if (len == 5) { if (text == "const") return Token.CONST; if (text == "class") return Token.CLASS; if (text == "catch") return Token.CATCH; break; } + if (text == "case") return Token.CASE; if (text == "continue") return Token.CONTINUE; if (text == "constructor") return Token.CONSTRUCTOR; break; } case CharCode.d: { - if (len == 2) { - if (text == "do") return Token.DO; - break; - } if (len == 7) { if (text == "default") return Token.DEFAULT; if (text == "declare") return Token.DECLARE; break; } - if (text == "debugger") return Token.DEBUGGER; + if (text == "do") return Token.DO; if (text == "delete") return Token.DELETE; + if (text == "debugger") return Token.DEBUGGER; break; } case CharCode.e: {