@@ -42,6 +42,9 @@ typedef enum
42
42
SCAN_MODE_PRIMARY_EXPRESSION_END , /**< scanning primary expression end */
43
43
SCAN_MODE_STATEMENT , /**< scanning statement */
44
44
SCAN_MODE_FUNCTION_ARGUMENTS , /**< scanning function arguments */
45
+ #if ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER )
46
+ SCAN_MODE_CONTINUE_FUNCTION_ARGUMENTS , /**< continue scanning function arguments */
47
+ #endif /* ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER) */
45
48
SCAN_MODE_PROPERTY_NAME , /**< scanning property name */
46
49
#if ENABLED (JERRY_ES2015_CLASS )
47
50
SCAN_MODE_CLASS_DECLARATION , /**< scanning class declaration */
@@ -55,21 +58,22 @@ typedef enum
55
58
typedef enum
56
59
{
57
60
SCAN_STACK_HEAD , /**< head */
61
+ SCAN_STACK_BLOCK_STATEMENT , /**< block statement group */
62
+ SCAN_STACK_FUNCTION_STATEMENT , /**< function statement */
63
+ SCAN_STACK_FUNCTION_EXPRESSION , /**< function expression */
64
+ SCAN_STACK_FUNCTION_PROPERTY , /**< function expression in an object literal or class */
65
+ SCAN_STACK_SWITCH_BLOCK , /**< block part of "switch" statement */
58
66
SCAN_STACK_PAREN_EXPRESSION , /**< parent expression group */
59
67
SCAN_STACK_PAREN_STATEMENT , /**< parent statement group */
60
68
SCAN_STACK_WHILE_START , /**< start of "while" iterator */
61
69
SCAN_STACK_FOR_START , /**< start of "for" iterator */
62
70
SCAN_STACK_FOR_CONDITION , /**< condition part of "for" iterator */
63
71
SCAN_STACK_FOR_EXPRESSION , /**< expression part of "for" iterator */
64
72
SCAN_STACK_SWITCH_EXPRESSION , /**< expression part of "switch" statement */
65
- SCAN_STACK_SWITCH_BLOCK , /**< block part of "switch" statement */
66
73
SCAN_STACK_COLON_EXPRESSION , /**< colon expression group */
67
74
SCAN_STACK_CASE_STATEMENT , /**< colon statement group */
68
75
SCAN_STACK_SQUARE_BRACKETED_EXPRESSION , /**< square bracketed expression group */
69
76
SCAN_STACK_OBJECT_LITERAL , /**< object literal group */
70
- SCAN_STACK_BLOCK_STATEMENT , /**< block statement group */
71
- SCAN_STACK_BLOCK_EXPRESSION , /**< block expression group */
72
- SCAN_STACK_BLOCK_PROPERTY , /**< block property group */
73
77
#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER )
74
78
SCAN_STACK_COMPUTED_PROPERTY , /**< computed property name */
75
79
#endif /* ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) */
@@ -80,7 +84,8 @@ typedef enum
80
84
SCAN_STACK_ARROW_EXPRESSION , /**< (possible) arrow function */
81
85
#endif /* ENABLED (JERRY_ES2015_ARROW_FUNCTION) */
82
86
#if ENABLED (JERRY_ES2015_CLASS )
83
- SCAN_STACK_CLASS_FUNCTION , /**< class function expression */
87
+ SCAN_STACK_CLASS_STATEMENT , /**< class statement */
88
+ SCAN_STACK_CLASS_EXPRESSION , /**< class expression */
84
89
SCAN_STACK_CLASS_EXTENDS , /**< class extends expression */
85
90
#endif /* ENABLED (JERRY_ES2015_CLASS) */
86
91
#if ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER )
@@ -187,7 +192,7 @@ scanner_scan_primary_expression (parser_context_t *context_p, /**< context */
187
192
lexer_next_token (context_p );
188
193
}
189
194
190
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_EXPRESSION );
195
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_EXPRESSION );
191
196
scanner_context_p -> mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
192
197
return true;
193
198
}
@@ -253,7 +258,7 @@ scanner_scan_primary_expression (parser_context_t *context_p, /**< context */
253
258
#if ENABLED (JERRY_ES2015_CLASS )
254
259
case LEXER_KEYW_CLASS :
255
260
{
256
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_EXPRESSION );
261
+ parser_stack_push_uint8 (context_p , SCAN_STACK_CLASS_EXPRESSION );
257
262
scanner_context_p -> mode = SCAN_MODE_CLASS_DECLARATION ;
258
263
break ;
259
264
}
@@ -389,10 +394,25 @@ scanner_scan_primary_expression_end (parser_context_t *context_p, /**< context *
389
394
}
390
395
case LEXER_COMMA :
391
396
{
392
- if (stack_top == SCAN_STACK_OBJECT_LITERAL )
397
+ switch (stack_top )
393
398
{
394
- scanner_context_p -> mode = SCAN_MODE_PROPERTY_NAME ;
395
- return true;
399
+ case SCAN_STACK_OBJECT_LITERAL :
400
+ {
401
+ scanner_context_p -> mode = SCAN_MODE_PROPERTY_NAME ;
402
+ return true;
403
+ }
404
+ #if ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER )
405
+ case SCAN_STACK_FUNCTION_PARAMETERS :
406
+ {
407
+ scanner_context_p -> mode = SCAN_MODE_CONTINUE_FUNCTION_ARGUMENTS ;
408
+ parser_stack_pop_uint8 (context_p );
409
+ return false;
410
+ }
411
+ #endif /* ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER) */
412
+ default :
413
+ {
414
+ break ;
415
+ }
396
416
}
397
417
scanner_context_p -> mode = SCAN_MODE_PRIMARY_EXPRESSION ;
398
418
return false;
@@ -443,13 +463,11 @@ scanner_scan_primary_expression_end (parser_context_t *context_p, /**< context *
443
463
switch (stack_top )
444
464
{
445
465
case SCAN_STACK_HEAD :
446
- case SCAN_STACK_SWITCH_BLOCK :
447
466
case SCAN_STACK_BLOCK_STATEMENT :
448
- case SCAN_STACK_BLOCK_EXPRESSION :
449
- case SCAN_STACK_BLOCK_PROPERTY :
450
- #if ENABLED (JERRY_ES2015_CLASS )
451
- case SCAN_STACK_CLASS_FUNCTION :
452
- #endif /* ENABLED (JERRY_ES2015_CLASS) */
467
+ case SCAN_STACK_FUNCTION_STATEMENT :
468
+ case SCAN_STACK_FUNCTION_EXPRESSION :
469
+ case SCAN_STACK_FUNCTION_PROPERTY :
470
+ case SCAN_STACK_SWITCH_BLOCK :
453
471
{
454
472
scanner_context_p -> mode = SCAN_MODE_STATEMENT ;
455
473
@@ -691,8 +709,7 @@ scanner_scan_primary_expression_end (parser_context_t *context_p, /**< context *
691
709
parser_stack_pop_uint8 (context_p );
692
710
stack_top = (scan_stack_modes_t ) context_p -> stack_top_uint8 ;
693
711
694
- if (stack_top == SCAN_STACK_BLOCK_PROPERTY
695
- || stack_top == SCAN_STACK_CLASS_FUNCTION )
712
+ if (stack_top == SCAN_STACK_FUNCTION_PROPERTY )
696
713
{
697
714
scanner_context_p -> mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
698
715
return true;
@@ -702,7 +719,7 @@ scanner_scan_primary_expression_end (parser_context_t *context_p, /**< context *
702
719
703
720
if (context_p -> token .type == LEXER_LEFT_PAREN )
704
721
{
705
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_PROPERTY );
722
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_PROPERTY );
706
723
scanner_context_p -> mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
707
724
return true;
708
725
}
@@ -772,16 +789,9 @@ scanner_scan_primary_expression_end (parser_context_t *context_p, /**< context *
772
789
break ;
773
790
}
774
791
775
- lexer_next_token (context_p );
776
-
777
- if (context_p -> token .type != LEXER_LEFT_BRACE )
778
- {
779
- scanner_raise_error (context_p );
780
- }
781
-
782
- scanner_context_p -> mode = SCAN_MODE_STATEMENT ;
792
+ scanner_context_p -> mode = SCAN_MODE_CONTINUE_FUNCTION_ARGUMENTS ;
783
793
parser_stack_pop_uint8 (context_p );
784
- return false ;
794
+ return true ;
785
795
}
786
796
#endif /* ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER) */
787
797
default :
@@ -949,52 +959,76 @@ scanner_scan_statement (parser_context_t *context_p, /**< context */
949
959
{
950
960
switch (stack_top )
951
961
{
952
- case SCAN_STACK_SWITCH_BLOCK :
953
- {
954
- scanner_switch_statement_t switch_statement ;
955
-
956
- parser_stack_pop_uint8 (context_p );
957
- parser_stack_pop (context_p , & switch_statement , sizeof (scanner_switch_statement_t ));
958
-
959
- scanner_context_p -> active_switch_statement = switch_statement ;
960
-
961
- JERRY_ASSERT (scanner_context_p -> mode == SCAN_MODE_STATEMENT );
962
- return false;
963
- }
964
962
case SCAN_STACK_BLOCK_STATEMENT :
963
+ case SCAN_STACK_FUNCTION_STATEMENT :
965
964
{
966
965
JERRY_ASSERT (scanner_context_p -> mode == SCAN_MODE_STATEMENT );
967
966
break ;
968
967
}
969
- case SCAN_STACK_BLOCK_EXPRESSION :
968
+ case SCAN_STACK_FUNCTION_EXPRESSION :
970
969
{
971
970
scanner_context_p -> mode = SCAN_MODE_POST_PRIMARY_EXPRESSION ;
972
971
break ;
973
972
}
974
- case SCAN_STACK_BLOCK_PROPERTY :
973
+ case SCAN_STACK_FUNCTION_PROPERTY :
975
974
{
975
+ parser_stack_pop_uint8 (context_p );
976
+
977
+ #if ENABLED (JERRY_ES2015_CLASS )
978
+ if (context_p -> stack_top_uint8 == SCAN_STACK_CLASS_STATEMENT
979
+ || context_p -> stack_top_uint8 == SCAN_STACK_CLASS_EXPRESSION )
980
+ {
981
+ scanner_context_p -> mode = SCAN_MODE_CLASS_METHOD ;
982
+ return true;
983
+ }
984
+ #endif /* ENABLED (JERRY_ES2015_CLASS) */
985
+
986
+ JERRY_ASSERT (context_p -> stack_top_uint8 == SCAN_STACK_OBJECT_LITERAL );
987
+
976
988
lexer_next_token (context_p );
977
- if (context_p -> token .type != LEXER_COMMA
978
- && context_p -> token .type != LEXER_RIGHT_BRACE )
989
+
990
+ if (context_p -> token .type == LEXER_RIGHT_BRACE )
991
+ {
992
+ scanner_context_p -> mode = SCAN_MODE_PRIMARY_EXPRESSION_END ;
993
+ return true;
994
+ }
995
+
996
+ if (context_p -> token .type != LEXER_COMMA )
979
997
{
980
998
scanner_raise_error (context_p );
981
999
}
982
1000
983
- scanner_context_p -> mode = SCAN_MODE_POST_PRIMARY_EXPRESSION ;
984
- parser_stack_pop_uint8 (context_p );
1001
+ scanner_context_p -> mode = SCAN_MODE_PROPERTY_NAME ;
985
1002
return true;
986
1003
}
987
- #if ENABLED (JERRY_ES2015_CLASS )
988
- case SCAN_STACK_CLASS_FUNCTION :
1004
+ case SCAN_STACK_SWITCH_BLOCK :
989
1005
{
990
- scanner_context_p -> mode = SCAN_MODE_CLASS_METHOD ;
1006
+ scanner_switch_statement_t switch_statement ;
1007
+
991
1008
parser_stack_pop_uint8 (context_p );
992
- return true;
1009
+ parser_stack_pop (context_p , & switch_statement , sizeof (scanner_switch_statement_t ));
1010
+
1011
+ scanner_context_p -> active_switch_statement = switch_statement ;
1012
+
1013
+ JERRY_ASSERT (scanner_context_p -> mode == SCAN_MODE_STATEMENT );
1014
+ return false;
1015
+ }
1016
+ #if ENABLED (JERRY_ES2015_CLASS )
1017
+ case SCAN_STACK_CLASS_STATEMENT :
1018
+ {
1019
+ JERRY_ASSERT (scanner_context_p -> mode == SCAN_MODE_STATEMENT );
1020
+ break ;
1021
+ }
1022
+ case SCAN_STACK_CLASS_EXPRESSION :
1023
+ {
1024
+ scanner_context_p -> mode = SCAN_MODE_POST_PRIMARY_EXPRESSION ;
1025
+ break ;
993
1026
}
994
1027
#endif /* ENABLED (JERRY_ES2015_CLASS) */
995
1028
default :
996
1029
{
997
1030
scanner_raise_error (context_p );
1031
+ break ;
998
1032
}
999
1033
}
1000
1034
@@ -1015,14 +1049,14 @@ scanner_scan_statement (parser_context_t *context_p, /**< context */
1015
1049
scanner_raise_error (context_p );
1016
1050
}
1017
1051
1018
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_STATEMENT );
1052
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_STATEMENT );
1019
1053
scanner_context_p -> mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
1020
1054
return false;
1021
1055
}
1022
1056
#if ENABLED (JERRY_ES2015_CLASS )
1023
1057
case LEXER_KEYW_CLASS :
1024
1058
{
1025
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_STATEMENT );
1059
+ parser_stack_push_uint8 (context_p , SCAN_STACK_CLASS_STATEMENT );
1026
1060
scanner_context_p -> mode = SCAN_MODE_CLASS_DECLARATION ;
1027
1061
return false;
1028
1062
}
@@ -1163,7 +1197,7 @@ scanner_scan_statement (parser_context_t *context_p, /**< context */
1163
1197
lexer_next_token (context_p );
1164
1198
}
1165
1199
1166
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_EXPRESSION );
1200
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_STATEMENT );
1167
1201
scanner_context_p -> mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
1168
1202
return true;
1169
1203
}
@@ -1368,7 +1402,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1368
1402
}
1369
1403
case SCAN_MODE_CLASS_METHOD :
1370
1404
{
1371
- JERRY_ASSERT (stack_top == SCAN_STACK_BLOCK_STATEMENT || stack_top == SCAN_STACK_BLOCK_EXPRESSION );
1405
+ JERRY_ASSERT (stack_top == SCAN_STACK_CLASS_STATEMENT || stack_top == SCAN_STACK_CLASS_EXPRESSION );
1372
1406
1373
1407
lexer_scan_identifier (context_p , LEXER_SCAN_CLASS_PROPERTY );
1374
1408
@@ -1379,7 +1413,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1379
1413
1380
1414
if (context_p -> token .type == LEXER_RIGHT_BRACE )
1381
1415
{
1382
- scanner_context .mode = (stack_top == SCAN_STACK_BLOCK_EXPRESSION ? SCAN_MODE_PRIMARY_EXPRESSION_END
1416
+ scanner_context .mode = (stack_top == SCAN_STACK_CLASS_EXPRESSION ? SCAN_MODE_PRIMARY_EXPRESSION_END
1383
1417
: SCAN_MODE_STATEMENT );
1384
1418
parser_stack_pop_uint8 (context_p );
1385
1419
break ;
@@ -1390,7 +1424,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1390
1424
lexer_scan_identifier (context_p , LEXER_SCAN_CLASS_PROPERTY );
1391
1425
}
1392
1426
1393
- parser_stack_push_uint8 (context_p , SCAN_STACK_CLASS_FUNCTION );
1427
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_PROPERTY );
1394
1428
scanner_context .mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
1395
1429
1396
1430
if (lexer_compare_literal_to_identifier (context_p , "get" , 3 )
@@ -1426,7 +1460,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1426
1460
1427
1461
if (context_p -> token .type == LEXER_LEFT_BRACE )
1428
1462
{
1429
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_EXPRESSION );
1463
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_EXPRESSION );
1430
1464
scanner_context .mode = SCAN_MODE_STATEMENT ;
1431
1465
}
1432
1466
else
@@ -1466,23 +1500,23 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1466
1500
}
1467
1501
case SCAN_MODE_FUNCTION_ARGUMENTS :
1468
1502
{
1469
- #if ENABLED (JERRY_ES2015_CLASS )
1470
- JERRY_ASSERT (stack_top == SCAN_STACK_BLOCK_STATEMENT
1471
- || stack_top == SCAN_STACK_BLOCK_EXPRESSION
1472
- || stack_top == SCAN_STACK_CLASS_FUNCTION
1473
- || stack_top == SCAN_STACK_BLOCK_PROPERTY );
1474
- #else /* !ENABLED (JERRY_ES2015_CLASS) */
1475
- JERRY_ASSERT (stack_top == SCAN_STACK_BLOCK_STATEMENT
1476
- || stack_top == SCAN_STACK_BLOCK_EXPRESSION
1477
- || stack_top == SCAN_STACK_BLOCK_PROPERTY );
1478
- #endif /* ENABLED (JERRY_ES2015_CLASS) */
1503
+ JERRY_ASSERT (stack_top == SCAN_STACK_FUNCTION_STATEMENT
1504
+ || stack_top == SCAN_STACK_FUNCTION_EXPRESSION
1505
+ || stack_top == SCAN_STACK_FUNCTION_PROPERTY );
1479
1506
1480
1507
if (type != LEXER_LEFT_PAREN )
1481
1508
{
1482
1509
scanner_raise_error (context_p );
1483
1510
}
1484
1511
lexer_next_token (context_p );
1485
1512
1513
+ #if ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER )
1514
+ /* FALLTHRU */
1515
+ }
1516
+ case SCAN_MODE_CONTINUE_FUNCTION_ARGUMENTS :
1517
+ {
1518
+ #endif /* ENABLED (JERRY_ES2015_FUNCTION_PARAMETER_INITIALIZER) */
1519
+
1486
1520
if (context_p -> token .type != LEXER_RIGHT_PAREN )
1487
1521
{
1488
1522
while (true)
@@ -1559,7 +1593,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1559
1593
{
1560
1594
lexer_scan_identifier (context_p , LEXER_SCAN_IDENT_PROPERTY | LEXER_SCAN_IDENT_NO_KEYW );
1561
1595
1562
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_PROPERTY );
1596
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_PROPERTY );
1563
1597
1564
1598
#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER )
1565
1599
if (context_p -> token .type == LEXER_LEFT_SQUARE )
@@ -1584,7 +1618,7 @@ scanner_scan_all (parser_context_t *context_p) /**< context */
1584
1618
#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER )
1585
1619
if (context_p -> token .type == LEXER_LEFT_PAREN )
1586
1620
{
1587
- parser_stack_push_uint8 (context_p , SCAN_STACK_BLOCK_PROPERTY );
1621
+ parser_stack_push_uint8 (context_p , SCAN_STACK_FUNCTION_PROPERTY );
1588
1622
scanner_context .mode = SCAN_MODE_FUNCTION_ARGUMENTS ;
1589
1623
continue ;
1590
1624
}
0 commit comments