@@ -21260,12 +21260,10 @@ static __exception int js_parse_object_literal(JSParseState *s)
21260
21260
#define PF_IN_ACCEPTED (1 << 0)
21261
21261
/* allow function calls parsing in js_parse_postfix_expr() */
21262
21262
#define PF_POSTFIX_CALL (1 << 1)
21263
- /* allow arrow functions parsing in js_parse_postfix_expr() */
21264
- #define PF_ARROW_FUNC (1 << 2)
21265
21263
/* allow the exponentiation operator in js_parse_unary() */
21266
- #define PF_POW_ALLOWED (1 << 3 )
21264
+ #define PF_POW_ALLOWED (1 << 2 )
21267
21265
/* forbid the exponentiation operator in js_parse_unary() */
21268
- #define PF_POW_FORBIDDEN (1 << 4 )
21266
+ #define PF_POW_FORBIDDEN (1 << 3 )
21269
21267
21270
21268
static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags);
21271
21269
@@ -22925,7 +22923,7 @@ static void optional_chain_test(JSParseState *s, int *poptional_chaining_label,
22925
22923
emit_label(s, label_next);
22926
22924
}
22927
22925
22928
- /* allowed parse_flags: PF_POSTFIX_CALL, PF_ARROW_FUNC */
22926
+ /* allowed parse_flags: PF_POSTFIX_CALL */
22929
22927
static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
22930
22928
{
22931
22929
FuncCallType call_type;
@@ -23003,18 +23001,8 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
23003
23001
}
23004
23002
break;
23005
23003
case '(':
23006
- if ((parse_flags & PF_ARROW_FUNC) &&
23007
- js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) {
23008
- if (js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
23009
- JS_FUNC_NORMAL, JS_ATOM_NULL,
23010
- s->token.ptr,
23011
- s->token.line_num,
23012
- s->token.col_num))
23013
- return -1;
23014
- } else {
23015
- if (js_parse_expr_paren(s))
23016
- return -1;
23017
- }
23004
+ if (js_parse_expr_paren(s))
23005
+ return -1;
23018
23006
break;
23019
23007
case TOK_FUNCTION:
23020
23008
if (js_parse_function_decl(s, JS_PARSE_FUNC_EXPR,
@@ -23056,16 +23044,8 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
23056
23044
if (s->token.u.ident.is_reserved) {
23057
23045
return js_parse_error_reserved_identifier(s);
23058
23046
}
23059
- if ((parse_flags & PF_ARROW_FUNC) &&
23060
- peek_token(s, TRUE) == TOK_ARROW) {
23061
- if (js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
23062
- JS_FUNC_NORMAL, JS_ATOM_NULL,
23063
- s->token.ptr,
23064
- s->token.line_num,
23065
- s->token.col_num))
23066
- return -1;
23067
- } else if (token_is_pseudo_keyword(s, JS_ATOM_async) &&
23068
- peek_token(s, TRUE) != '\n') {
23047
+ if (token_is_pseudo_keyword(s, JS_ATOM_async) &&
23048
+ peek_token(s, TRUE) != '\n') {
23069
23049
const uint8_t *source_ptr;
23070
23050
int source_line_num;
23071
23051
int source_col_num;
@@ -23082,17 +23062,6 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
23082
23062
source_line_num,
23083
23063
source_col_num))
23084
23064
return -1;
23085
- } else if ((parse_flags & PF_ARROW_FUNC) &&
23086
- ((s->token.val == '(' &&
23087
- js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) ||
23088
- (s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved &&
23089
- peek_token(s, TRUE) == TOK_ARROW))) {
23090
- if (js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
23091
- JS_FUNC_ASYNC, JS_ATOM_NULL,
23092
- source_ptr,
23093
- source_line_num,
23094
- source_col_num))
23095
- return -1;
23096
23065
} else {
23097
23066
name = JS_DupAtom(s->ctx, JS_ATOM_async);
23098
23067
goto do_get_var;
@@ -23104,8 +23073,10 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
23104
23073
return -1;
23105
23074
}
23106
23075
name = JS_DupAtom(s->ctx, s->token.u.ident.atom);
23107
- if (next_token(s)) /* update line number before emitting code */
23076
+ if (next_token(s)) { /* update line number before emitting code */
23077
+ JS_FreeAtom(s->ctx, name);
23108
23078
return -1;
23079
+ }
23109
23080
do_get_var:
23110
23081
emit_op(s, OP_scope_get_var);
23111
23082
emit_u32(s, name);
@@ -23587,7 +23558,7 @@ static __exception int js_parse_delete(JSParseState *s)
23587
23558
return 0;
23588
23559
}
23589
23560
23590
- /* allowed parse_flags: PF_ARROW_FUNC, PF_POW_ALLOWED, PF_POW_FORBIDDEN */
23561
+ /* allowed parse_flags: PF_POW_ALLOWED, PF_POW_FORBIDDEN */
23591
23562
static __exception int js_parse_unary(JSParseState *s, int parse_flags)
23592
23563
{
23593
23564
int op;
@@ -23677,8 +23648,7 @@ static __exception int js_parse_unary(JSParseState *s, int parse_flags)
23677
23648
parse_flags = 0;
23678
23649
break;
23679
23650
default:
23680
- if (js_parse_postfix_expr(s, (parse_flags & PF_ARROW_FUNC) |
23681
- PF_POSTFIX_CALL))
23651
+ if (js_parse_postfix_expr(s, PF_POSTFIX_CALL))
23682
23652
return -1;
23683
23653
if (!s->got_lf &&
23684
23654
(s->token.val == TOK_DEC || s->token.val == TOK_INC)) {
@@ -23714,15 +23684,14 @@ static __exception int js_parse_unary(JSParseState *s, int parse_flags)
23714
23684
return 0;
23715
23685
}
23716
23686
23717
- /* allowed parse_flags: PF_ARROW_FUNC, PF_IN_ACCEPTED */
23687
+ /* allowed parse_flags: PF_IN_ACCEPTED */
23718
23688
static __exception int js_parse_expr_binary(JSParseState *s, int level,
23719
23689
int parse_flags)
23720
23690
{
23721
23691
int op, opcode;
23722
23692
23723
23693
if (level == 0) {
23724
- return js_parse_unary(s, (parse_flags & PF_ARROW_FUNC) |
23725
- PF_POW_ALLOWED);
23694
+ return js_parse_unary(s, PF_POW_ALLOWED);
23726
23695
}
23727
23696
if (js_parse_expr_binary(s, level - 1, parse_flags))
23728
23697
return -1;
@@ -23849,14 +23818,14 @@ static __exception int js_parse_expr_binary(JSParseState *s, int level,
23849
23818
}
23850
23819
if (next_token(s))
23851
23820
return -1;
23852
- if (js_parse_expr_binary(s, level - 1, parse_flags & ~PF_ARROW_FUNC ))
23821
+ if (js_parse_expr_binary(s, level - 1, parse_flags))
23853
23822
return -1;
23854
23823
emit_op(s, opcode);
23855
23824
}
23856
23825
return 0;
23857
23826
}
23858
23827
23859
- /* allowed parse_flags: PF_ARROW_FUNC, PF_IN_ACCEPTED */
23828
+ /* allowed parse_flags: PF_IN_ACCEPTED */
23860
23829
static __exception int js_parse_logical_and_or(JSParseState *s, int op,
23861
23830
int parse_flags)
23862
23831
{
@@ -23880,11 +23849,10 @@ static __exception int js_parse_logical_and_or(JSParseState *s, int op,
23880
23849
emit_op(s, OP_drop);
23881
23850
23882
23851
if (op == TOK_LAND) {
23883
- if (js_parse_expr_binary(s, 8, parse_flags & ~PF_ARROW_FUNC ))
23852
+ if (js_parse_expr_binary(s, 8, parse_flags))
23884
23853
return -1;
23885
23854
} else {
23886
- if (js_parse_logical_and_or(s, TOK_LAND,
23887
- parse_flags & ~PF_ARROW_FUNC))
23855
+ if (js_parse_logical_and_or(s, TOK_LAND, parse_flags))
23888
23856
return -1;
23889
23857
}
23890
23858
if (s->token.val != op) {
@@ -23916,7 +23884,7 @@ static __exception int js_parse_coalesce_expr(JSParseState *s, int parse_flags)
23916
23884
emit_goto(s, OP_if_false, label1);
23917
23885
emit_op(s, OP_drop);
23918
23886
23919
- if (js_parse_expr_binary(s, 8, parse_flags & ~PF_ARROW_FUNC ))
23887
+ if (js_parse_expr_binary(s, 8, parse_flags))
23920
23888
return -1;
23921
23889
if (s->token.val != TOK_DOUBLE_QUESTION_MARK)
23922
23890
break;
@@ -23926,7 +23894,7 @@ static __exception int js_parse_coalesce_expr(JSParseState *s, int parse_flags)
23926
23894
return 0;
23927
23895
}
23928
23896
23929
- /* allowed parse_flags: PF_ARROW_FUNC, PF_IN_ACCEPTED */
23897
+ /* allowed parse_flags: PF_IN_ACCEPTED */
23930
23898
static __exception int js_parse_cond_expr(JSParseState *s, int parse_flags)
23931
23899
{
23932
23900
int label1, label2;
@@ -24105,12 +24073,54 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
24105
24073
emit_label(s, label_next);
24106
24074
}
24107
24075
return 0;
24076
+ } else if (s->token.val == '(' &&
24077
+ js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) {
24078
+ return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
24079
+ JS_FUNC_NORMAL, JS_ATOM_NULL,
24080
+ s->token.ptr, s->token.line_num,
24081
+ s->token.col_num);
24082
+ } else if (token_is_pseudo_keyword(s, JS_ATOM_async)) {
24083
+ const uint8_t *source_ptr;
24084
+ int tok, source_line_num, source_col_num;
24085
+ JSParsePos pos;
24086
+
24087
+ /* fast test */
24088
+ tok = peek_token(s, TRUE);
24089
+ if (tok == TOK_FUNCTION || tok == '\n')
24090
+ goto next;
24091
+
24092
+ source_ptr = s->token.ptr;
24093
+ source_line_num = s->token.line_num;
24094
+ source_col_num = s->token.col_num;
24095
+ js_parse_get_pos(s, &pos);
24096
+ if (next_token(s))
24097
+ return -1;
24098
+ if ((s->token.val == '(' &&
24099
+ js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) ||
24100
+ (s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved &&
24101
+ peek_token(s, TRUE) == TOK_ARROW)) {
24102
+ return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
24103
+ JS_FUNC_ASYNC, JS_ATOM_NULL,
24104
+ source_ptr, source_line_num,
24105
+ source_col_num);
24106
+ } else {
24107
+ /* undo the token parsing */
24108
+ if (js_parse_seek_token(s, &pos))
24109
+ return -1;
24110
+ }
24111
+ } else if (s->token.val == TOK_IDENT &&
24112
+ peek_token(s, TRUE) == TOK_ARROW) {
24113
+ return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
24114
+ JS_FUNC_NORMAL, JS_ATOM_NULL,
24115
+ s->token.ptr, s->token.line_num,
24116
+ s->token.col_num);
24108
24117
}
24118
+ next:
24109
24119
if (s->token.val == TOK_IDENT) {
24110
24120
/* name0 is used to check for OP_set_name pattern, not duplicated */
24111
24121
name0 = s->token.u.ident.atom;
24112
24122
}
24113
- if (js_parse_cond_expr(s, parse_flags | PF_ARROW_FUNC ))
24123
+ if (js_parse_cond_expr(s, parse_flags))
24114
24124
return -1;
24115
24125
24116
24126
op = s->token.val;
0 commit comments