Skip to content

Commit 34f52c7

Browse files
authored
Optimize some inner cases for tokenFromKeyword (AssemblyScript#2116)
1 parent 1cbe393 commit 34f52c7

File tree

1 file changed

+79
-37
lines changed

1 file changed

+79
-37
lines changed

src/tokenizer.ts

Lines changed: 79 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -177,63 +177,96 @@ export enum IdentifierHandling {
177177
}
178178

179179
export function tokenFromKeyword(text: string): Token {
180-
assert(text.length);
180+
let len = text.length;
181+
assert(len);
181182
switch (text.charCodeAt(0)) {
182183
case CharCode.a: {
183-
if (text == "abstract") return Token.ABSTRACT;
184+
if (len == 5) {
185+
if (text == "async") return Token.ASYNC;
186+
if (text == "await") return Token.AWAIT;
187+
break;
188+
}
184189
if (text == "as") return Token.AS;
185-
if (text == "async") return Token.ASYNC;
186-
if (text == "await") return Token.AWAIT;
190+
if (text == "abstract") return Token.ABSTRACT;
187191
break;
188192
}
189193
case CharCode.b: {
190194
if (text == "break") return Token.BREAK;
191195
break;
192196
}
193197
case CharCode.c: {
198+
if (len == 5) {
199+
if (text == "const") return Token.CONST;
200+
if (text == "class") return Token.CLASS;
201+
if (text == "catch") return Token.CATCH;
202+
break;
203+
}
194204
if (text == "case") return Token.CASE;
195-
if (text == "catch") return Token.CATCH;
196-
if (text == "class") return Token.CLASS;
197205
if (text == "continue") return Token.CONTINUE;
198-
if (text == "const") return Token.CONST;
199206
if (text == "constructor") return Token.CONSTRUCTOR;
200207
break;
201208
}
202209
case CharCode.d: {
203-
if (text == "debugger") return Token.DEBUGGER;
204-
if (text == "declare") return Token.DECLARE;
205-
if (text == "default") return Token.DEFAULT;
206-
if (text == "delete") return Token.DELETE;
210+
if (len == 7) {
211+
if (text == "default") return Token.DEFAULT;
212+
if (text == "declare") return Token.DECLARE;
213+
break;
214+
}
207215
if (text == "do") return Token.DO;
216+
if (text == "delete") return Token.DELETE;
217+
if (text == "debugger") return Token.DEBUGGER;
208218
break;
209219
}
210220
case CharCode.e: {
211-
if (text == "else") return Token.ELSE;
212-
if (text == "enum") return Token.ENUM;
221+
if (len == 4) {
222+
if (text == "else") return Token.ELSE;
223+
if (text == "enum") return Token.ENUM;
224+
break;
225+
}
213226
if (text == "export") return Token.EXPORT;
214227
if (text == "extends") return Token.EXTENDS;
215228
break;
216229
}
217230
case CharCode.f: {
218-
if (text == "false") return Token.FALSE;
219-
if (text == "finally") return Token.FINALLY;
220-
if (text == "for") return Token.FOR;
221-
if (text == "from") return Token.FROM;
231+
if (len <= 5) {
232+
if (text == "false") return Token.FALSE;
233+
if (text == "for") return Token.FOR;
234+
if (text == "from") return Token.FROM;
235+
break;
236+
}
222237
if (text == "function") return Token.FUNCTION;
238+
if (text == "finally") return Token.FINALLY;
223239
break;
224240
}
225241
case CharCode.g: {
226242
if (text == "get") return Token.GET;
227243
break;
228244
}
229245
case CharCode.i: {
230-
if (text == "if") return Token.IF;
231-
if (text == "implements") return Token.IMPLEMENTS;
232-
if (text == "import") return Token.IMPORT;
233-
if (text == "in") return Token.IN;
234-
if (text == "instanceof") return Token.INSTANCEOF;
235-
if (text == "interface") return Token.INTERFACE;
236-
if (text == "is") return Token.IS;
246+
if (len == 2) {
247+
if (text == "if") return Token.IF;
248+
if (text == "in") return Token.IN;
249+
if (text == "is") return Token.IS;
250+
break;
251+
}
252+
switch (text.charCodeAt(3)) {
253+
case CharCode.l: {
254+
if (text == "implements") return Token.IMPLEMENTS;
255+
break;
256+
}
257+
case CharCode.o: {
258+
if (text == "import") return Token.IMPORT;
259+
break;
260+
}
261+
case CharCode.t: {
262+
if (text == "instanceof") return Token.INSTANCEOF;
263+
break;
264+
}
265+
case CharCode.e: {
266+
if (text == "interface") return Token.INTERFACE;
267+
break;
268+
}
269+
}
237270
break;
238271
}
239272
case CharCode.k: {
@@ -249,40 +282,49 @@ export function tokenFromKeyword(text: string): Token {
249282
break;
250283
}
251284
case CharCode.n: {
252-
if (text == "namespace") return Token.NAMESPACE;
253285
if (text == "new") return Token.NEW;
254286
if (text == "null") return Token.NULL;
287+
if (text == "namespace") return Token.NAMESPACE;
255288
break;
256289
}
257290
case CharCode.o: {
258291
if (text == "of") return Token.OF;
259292
break;
260293
}
261294
case CharCode.p: {
262-
if (text == "package") return Token.PACKAGE;
263-
if (text == "private") return Token.PRIVATE;
264-
if (text == "protected") return Token.PROTECTED;
295+
if (len == 7) {
296+
if (text == "private") return Token.PRIVATE;
297+
if (text == "package") return Token.PACKAGE;
298+
break;
299+
}
265300
if (text == "public") return Token.PUBLIC;
301+
if (text == "protected") return Token.PROTECTED;
266302
break;
267303
}
268304
case CharCode.r: {
269-
if (text == "readonly") return Token.READONLY;
270305
if (text == "return") return Token.RETURN;
306+
if (text == "readonly") return Token.READONLY;
271307
break;
272308
}
273309
case CharCode.s: {
310+
if (len == 6) {
311+
if (text == "switch") return Token.SWITCH;
312+
if (text == "static") return Token.STATIC;
313+
break;
314+
}
274315
if (text == "set") return Token.SET;
275-
if (text == "static") return Token.STATIC;
276316
if (text == "super") return Token.SUPER;
277-
if (text == "switch") return Token.SWITCH;
278317
break;
279318
}
280319
case CharCode.t: {
281-
if (text == "this") return Token.THIS;
282-
if (text == "throw") return Token.THROW;
283-
if (text == "true") return Token.TRUE;
320+
if (len == 4) {
321+
if (text == "true") return Token.TRUE;
322+
if (text == "this") return Token.THIS;
323+
if (text == "type") return Token.TYPE;
324+
break;
325+
}
284326
if (text == "try") return Token.TRY;
285-
if (text == "type") return Token.TYPE;
327+
if (text == "throw") return Token.THROW;
286328
if (text == "typeof") return Token.TYPEOF;
287329
break;
288330
}
@@ -917,9 +959,9 @@ export class Tokenizer extends DiagnosticEmitter {
917959
if (identifierHandling != IdentifierHandling.ALWAYS) {
918960
let maybeKeywordToken = tokenFromKeyword(text.substring(posBefore, pos));
919961
if (
920-
maybeKeywordToken !== Token.INVALID &&
962+
maybeKeywordToken != Token.INVALID &&
921963
!(
922-
identifierHandling === IdentifierHandling.PREFER &&
964+
identifierHandling == IdentifierHandling.PREFER &&
923965
tokenIsAlsoIdentifier(maybeKeywordToken)
924966
)
925967
) {

0 commit comments

Comments
 (0)