@@ -309,37 +309,35 @@ typedef struct
309
309
* Keyword defines
310
310
*/
311
311
#define LEXER_KEYWORD (name , type ) { (const uint8_t *) (name), (type) }
312
- #define LEXER_KEYWORD_END () { (const uint8_t *) NULL, LEXER_EOS }
312
+ #define LEXER_KEYWORD_LIST_LENGTH ( name ) (const uint8_t) (sizeof ((name)) / sizeof ((name)[0]))
313
313
/** @} */
314
314
315
315
/**
316
316
* Keywords with 2 characters.
317
317
*/
318
- static const keyword_string_t keyword_length_2 [ 4 ] =
318
+ static const keyword_string_t keywords_with_length_2 [ ] =
319
319
{
320
320
LEXER_KEYWORD ("do" , LEXER_KEYW_DO ),
321
321
LEXER_KEYWORD ("if" , LEXER_KEYW_IF ),
322
322
LEXER_KEYWORD ("in" , LEXER_KEYW_IN ),
323
- LEXER_KEYWORD_END ()
324
323
};
325
324
326
325
/**
327
326
* Keywords with 3 characters.
328
327
*/
329
- static const keyword_string_t keyword_length_3 [ 6 ] =
328
+ static const keyword_string_t keywords_with_length_3 [ ] =
330
329
{
331
330
LEXER_KEYWORD ("for" , LEXER_KEYW_FOR ),
332
331
LEXER_KEYWORD ("let" , LEXER_KEYW_LET ),
333
332
LEXER_KEYWORD ("new" , LEXER_KEYW_NEW ),
334
333
LEXER_KEYWORD ("try" , LEXER_KEYW_TRY ),
335
334
LEXER_KEYWORD ("var" , LEXER_KEYW_VAR ),
336
- LEXER_KEYWORD_END ()
337
335
};
338
336
339
337
/**
340
338
* Keywords with 4 characters.
341
339
*/
342
- static const keyword_string_t keyword_length_4 [ 9 ] =
340
+ static const keyword_string_t keywords_with_length_4 [ ] =
343
341
{
344
342
LEXER_KEYWORD ("case" , LEXER_KEYW_CASE ),
345
343
LEXER_KEYWORD ("else" , LEXER_KEYW_ELSE ),
@@ -349,22 +347,12 @@ static const keyword_string_t keyword_length_4[9] =
349
347
LEXER_KEYWORD ("true" , LEXER_LIT_TRUE ),
350
348
LEXER_KEYWORD ("void" , LEXER_KEYW_VOID ),
351
349
LEXER_KEYWORD ("with" , LEXER_KEYW_WITH ),
352
- LEXER_KEYWORD_END ()
353
350
};
354
351
355
- #ifndef CONFIG_DISABLE_ES2015
356
- /**
357
- * Number of keywords with 5 characters.
358
- */
359
- #define KEYWORD_LENGTH_COUNT 11
360
- #else /* CONFIG_DISABLE_ES2015 */
361
- #define KEYWORD_LENGTH_COUNT 10
362
- #endif /* !CONFIG_DISABLE_ES2015 */
363
-
364
352
/**
365
353
* Keywords with 5 characters.
366
354
*/
367
- static const keyword_string_t keyword_length_5 [ KEYWORD_LENGTH_COUNT ] =
355
+ static const keyword_string_t keywords_with_length_5 [ ] =
368
356
{
369
357
#ifndef CONFIG_DISABLE_ES2015
370
358
LEXER_KEYWORD ("await" , LEXER_KEYW_AWAIT ),
@@ -378,13 +366,12 @@ static const keyword_string_t keyword_length_5[KEYWORD_LENGTH_COUNT] =
378
366
LEXER_KEYWORD ("throw" , LEXER_KEYW_THROW ),
379
367
LEXER_KEYWORD ("while" , LEXER_KEYW_WHILE ),
380
368
LEXER_KEYWORD ("yield" , LEXER_KEYW_YIELD ),
381
- LEXER_KEYWORD_END ()
382
369
};
383
370
384
371
/**
385
372
* Keywords with 6 characters.
386
373
*/
387
- static const keyword_string_t keyword_length_6 [ 9 ] =
374
+ static const keyword_string_t keywords_with_length_6 [ ] =
388
375
{
389
376
LEXER_KEYWORD ("delete" , LEXER_KEYW_DELETE ),
390
377
LEXER_KEYWORD ("export" , LEXER_KEYW_EXPORT ),
@@ -394,71 +381,82 @@ static const keyword_string_t keyword_length_6[9] =
394
381
LEXER_KEYWORD ("static" , LEXER_KEYW_STATIC ),
395
382
LEXER_KEYWORD ("switch" , LEXER_KEYW_SWITCH ),
396
383
LEXER_KEYWORD ("typeof" , LEXER_KEYW_TYPEOF ),
397
- LEXER_KEYWORD_END ()
398
384
};
399
385
400
386
/**
401
387
* Keywords with 7 characters.
402
388
*/
403
- static const keyword_string_t keyword_length_7 [ 6 ] =
389
+ static const keyword_string_t keywords_with_length_7 [ ] =
404
390
{
405
391
LEXER_KEYWORD ("default" , LEXER_KEYW_DEFAULT ),
406
392
LEXER_KEYWORD ("extends" , LEXER_KEYW_EXTENDS ),
407
393
LEXER_KEYWORD ("finally" , LEXER_KEYW_FINALLY ),
408
394
LEXER_KEYWORD ("package" , LEXER_KEYW_PACKAGE ),
409
395
LEXER_KEYWORD ("private" , LEXER_KEYW_PRIVATE ),
410
- LEXER_KEYWORD_END ()
411
396
};
412
397
413
398
/**
414
399
* Keywords with 8 characters.
415
400
*/
416
- static const keyword_string_t keyword_length_8 [ 4 ] =
401
+ static const keyword_string_t keywords_with_length_8 [ ] =
417
402
{
418
403
LEXER_KEYWORD ("continue" , LEXER_KEYW_CONTINUE ),
419
404
LEXER_KEYWORD ("debugger" , LEXER_KEYW_DEBUGGER ),
420
405
LEXER_KEYWORD ("function" , LEXER_KEYW_FUNCTION ),
421
- LEXER_KEYWORD_END ()
422
406
};
423
407
424
408
/**
425
409
* Keywords with 9 characters.
426
410
*/
427
- static const keyword_string_t keyword_length_9 [ 3 ] =
411
+ static const keyword_string_t keywords_with_length_9 [ ] =
428
412
{
429
413
LEXER_KEYWORD ("interface" , LEXER_KEYW_INTERFACE ),
430
414
LEXER_KEYWORD ("protected" , LEXER_KEYW_PROTECTED ),
431
- LEXER_KEYWORD_END ()
432
415
};
433
416
434
417
/**
435
418
* Keywords with 10 characters.
436
419
*/
437
- static const keyword_string_t keyword_length_10 [ 3 ] =
420
+ static const keyword_string_t keywords_with_length_10 [ ] =
438
421
{
439
422
LEXER_KEYWORD ("implements" , LEXER_KEYW_IMPLEMENTS ),
440
423
LEXER_KEYWORD ("instanceof" , LEXER_KEYW_INSTANCEOF ),
441
- LEXER_KEYWORD_END ()
442
424
};
443
425
444
426
/**
445
- * List to the keywords.
427
+ * List of the keyword groups.
428
+ */
429
+ static const keyword_string_t * const keyword_strings_list [] =
430
+ {
431
+ keywords_with_length_2 ,
432
+ keywords_with_length_3 ,
433
+ keywords_with_length_4 ,
434
+ keywords_with_length_5 ,
435
+ keywords_with_length_6 ,
436
+ keywords_with_length_7 ,
437
+ keywords_with_length_8 ,
438
+ keywords_with_length_9 ,
439
+ keywords_with_length_10
440
+ };
441
+
442
+ /**
443
+ * List of the keyword groups length.
446
444
*/
447
- static const keyword_string_t * const keyword_string_list [ 9 ] =
445
+ static const uint8_t keyword_lengths_list [ ] =
448
446
{
449
- keyword_length_2 ,
450
- keyword_length_3 ,
451
- keyword_length_4 ,
452
- keyword_length_5 ,
453
- keyword_length_6 ,
454
- keyword_length_7 ,
455
- keyword_length_8 ,
456
- keyword_length_9 ,
457
- keyword_length_10
447
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_2 ) ,
448
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_3 ) ,
449
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_4 ) ,
450
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_5 ) ,
451
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_6 ) ,
452
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_7 ) ,
453
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_8 ) ,
454
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_9 ) ,
455
+ LEXER_KEYWORD_LIST_LENGTH ( keywords_with_length_10 )
458
456
};
459
457
460
458
#undef LEXER_KEYWORD
461
- #undef LEXER_KEYWORD_END
459
+ #undef LEXER_KEYWORD_LIST_LENGTH
462
460
463
461
/**
464
462
* Parse identifier.
@@ -551,31 +549,52 @@ lexer_parse_identifier (parser_context_t *context_p, /**< context */
551
549
&& !context_p -> token .lit_location .has_escape
552
550
&& (length >= 2 && length <= 10 ))
553
551
{
554
- const keyword_string_t * keyword_p = keyword_string_list [length - 2 ];
552
+ const keyword_string_t * keyword_list_p = keyword_strings_list [length - 2 ];
553
+
554
+ int start = 0 ;
555
+ int end = keyword_lengths_list [length - 2 ];
556
+ int middle = end / 2 ;
555
557
556
558
do
557
559
{
558
- if (ident_start_p [0 ] == keyword_p -> keyword_p [0 ]
559
- && ident_start_p [1 ] == keyword_p -> keyword_p [1 ]
560
- && memcmp (ident_start_p , keyword_p -> keyword_p , length ) == 0 )
560
+ const keyword_string_t * keyword_p = keyword_list_p + middle ;
561
+ int compare_result = ident_start_p [0 ] - keyword_p -> keyword_p [0 ];
562
+
563
+ if (compare_result == 0 )
561
564
{
562
- if (keyword_p -> type >= LEXER_FIRST_FUTURE_STRICT_RESERVED_WORD )
565
+ compare_result = memcmp (ident_start_p , keyword_p -> keyword_p , length );
566
+
567
+ if (compare_result == 0 )
563
568
{
564
- if (context_p -> status_flags & PARSER_IS_STRICT )
569
+ if (JERRY_UNLIKELY ( keyword_p -> type >= LEXER_FIRST_FUTURE_STRICT_RESERVED_WORD ) )
565
570
{
566
- parser_raise_error (context_p , PARSER_ERR_STRICT_IDENT_NOT_ALLOWED );
571
+ if (context_p -> status_flags & PARSER_IS_STRICT )
572
+ {
573
+ parser_raise_error (context_p , PARSER_ERR_STRICT_IDENT_NOT_ALLOWED );
574
+ }
575
+
576
+ context_p -> token .literal_is_reserved = true;
577
+ break ;
567
578
}
568
579
569
- context_p -> token .literal_is_reserved = true ;
580
+ context_p -> token .type = ( uint8_t ) keyword_p -> type ;
570
581
break ;
571
582
}
583
+ }
572
584
573
- context_p -> token .type = (uint8_t ) keyword_p -> type ;
574
- break ;
585
+ if (compare_result > 0 )
586
+ {
587
+ start = middle + 1 ;
588
+ }
589
+ else
590
+ {
591
+ JERRY_ASSERT (compare_result < 0 );
592
+ end = middle ;
575
593
}
576
- keyword_p ++ ;
594
+
595
+ middle = (start + end ) / 2 ;
577
596
}
578
- while (keyword_p -> type != LEXER_EOS );
597
+ while (start < end );
579
598
}
580
599
581
600
if (context_p -> token .type == LEXER_LITERAL )
0 commit comments