Skip to content

Commit 04096b9

Browse files
jensjohaCommit Queue
authored andcommitted
[parser] Shortcut more common cases in parseArgumentsRest
A few more common cases: "<identifier> <period> <identifier> <comma>", "<identifier> <period> <identifier> <end parens>", "<string> <comma"> and "<string> <end parens>". pkg/analyzer/lib/src/dart/ast/ast.dart: JIT (tokens per microsecond): 4.8482% +/- 1.4622% (1.11 +/- 0.34) (22.92 -> 24.03) AOT (tokens per microsecond): 4.5974% +/- 1.6421% (1.40 +/- 0.50) (30.53 -> 31.94) Benchmarker (AOT): ``` msec task-clock:u: -4.7108% +/- 2.0520% (-124.92 +/- 54.41) (2651.72 -> 2526.80) cycles:u: -4.7512% +/- 2.0346% (-546787446.10 +/- 234152251.09) (11508497283.00 -> 10961709836.90) instructions:u: -4.5849% +/- 0.0000% (-1115885935.90 +/- 1109.34) (24338242436.20 -> 23222356500.30) seconds time elapsed: -4.7090% +/- 2.0523% (-0.12 +/- 0.05) (2.65 -> 2.53) seconds user: -4.8217% +/- 2.0991% (-0.13 +/- 0.06) (2.63 -> 2.51) ``` pkg/front_end/lib/src/type_inference/inference_visitor.dart: JIT (tokens per microsecond): 11.5950% +/- 3.4217% (1.96 +/- 0.58) (16.91 -> 18.87) AOT (tokens per microsecond): 11.7128% +/- 1.4863% (2.61 +/- 0.33) (22.32 -> 24.94) Benchmarker (AOT): ``` msec task-clock:u: -8.9523% +/- 0.8309% (-244.45 +/- 22.69) (2730.57 -> 2486.12) page-faults:u: 0.0503% +/- 0.0216% (5.00 +/- 2.14) (9933.10 -> 9938.10) cycles:u: -9.0605% +/- 0.8306% (-1075717286.20 +/- 98615789.63) (11872662784.50 -> 10796945498.30) instructions:u: -13.7568% +/- 0.0000% (-3608232664.50 +/- 836.10) (26228691068.30 -> 22620458403.80) branch-misses:u: 6.9875% +/- 4.6549% (2539140.50 +/- 1691509.92) (36338407.60 -> 38877548.10) seconds time elapsed: -8.9450% +/- 0.8300% (-0.24 +/- 0.02) (2.73 -> 2.49) seconds user: -8.9919% +/- 0.8899% (-0.24 +/- 0.02) (2.71 -> 2.47) ``` Change-Id: I207a35d8107ba1604646e387e590aa19a4ccd996 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439900 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent 59f19d8 commit 04096b9

30 files changed

+254
-800
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8939,19 +8939,53 @@ class Parser {
89398939
// a subclass of the parser has a special implementation of
89408940
// [parseExpression] (say, wanting to skip expressions) we can't do that.
89418941
if (allowedToShortcutParseExpression) {
8942-
Token next = token.next!;
8942+
Token next1 = token.next!;
89438943
// TODO(jensj): Possibly also for STRING CLOSE_PAREN / STRING COMMA?
8944-
if (next.isA(TokenType.IDENTIFIER)) {
8945-
Token nextNext = next.next!;
8946-
if (nextNext.isA(TokenType.COMMA) ||
8947-
nextNext.isA(TokenType.CLOSE_PAREN)) {
8944+
if (next1.isA(TokenType.IDENTIFIER)) {
8945+
Token next2 = next1.next!;
8946+
if (next2.isA(TokenType.COMMA) || next2.isA(TokenType.CLOSE_PAREN)) {
89488947
// Shortcut common cases:
89498948
// "IDENTIFIER COMMA" and "IDENTIFIER CLOSE_PAREN"
8950-
listener.handleIdentifier(next, IdentifierContext.expression);
8951-
listener.handleNoTypeArguments(nextNext);
8952-
listener.handleNoArguments(nextNext);
8953-
listener.handleSend(next, next);
8954-
token = next;
8949+
listener.handleIdentifier(next1, IdentifierContext.expression);
8950+
listener.handleNoTypeArguments(next2);
8951+
listener.handleNoArguments(next2);
8952+
listener.handleSend(next1, next1);
8953+
token = next1;
8954+
expressionHandled = true;
8955+
} else if (next2.isA(TokenType.PERIOD)) {
8956+
Token next3 = next2.next!;
8957+
if (next3.isA(TokenType.IDENTIFIER)) {
8958+
Token next4 = next3.next!;
8959+
if (next4.isA(TokenType.COMMA) ||
8960+
next4.isA(TokenType.CLOSE_PAREN)) {
8961+
// Shortcut common cases:
8962+
// "IDENTIFIER DOT IDENTIFIER COMMA" and
8963+
// "IDENTIFIER DOT IDENTIFIER CLOSE_PAREN"
8964+
listener.handleIdentifier(next1, IdentifierContext.expression);
8965+
listener.handleNoTypeArguments(next2);
8966+
listener.handleNoArguments(next2);
8967+
listener.handleSend(next1, next1);
8968+
listener.handleIdentifier(
8969+
next3,
8970+
IdentifierContext.expressionContinuation,
8971+
);
8972+
listener.handleNoTypeArguments(next4);
8973+
listener.handleNoArguments(next4);
8974+
listener.handleSend(next3, next3);
8975+
listener.handleEndingBinaryExpression(next2, next3);
8976+
token = next3;
8977+
expressionHandled = true;
8978+
}
8979+
}
8980+
}
8981+
} else if (next1.isA(TokenType.STRING)) {
8982+
Token next2 = next1.next!;
8983+
if (next2.isA(TokenType.COMMA) || next2.isA(TokenType.CLOSE_PAREN)) {
8984+
// Shortcut common cases:
8985+
// "STRING COMMA" and "STRING CLOSE_PAREN"
8986+
listener.beginLiteralString(next1);
8987+
listener.endLiteralString(0, next2);
8988+
token = next1;
89558989
expressionHandled = true;
89568990
}
89578991
}

pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,8 @@ parseUnit(enum)
8383
parseArgumentsRest(()
8484
listener: beginArguments(()
8585
allowedToShortcutParseExpression()
86-
parseExpression(()
87-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
88-
parseUnaryExpression((, true, ConstantPatternContext.none)
89-
parsePrimary((, expression, ConstantPatternContext.none)
90-
parseLiteralString(()
91-
parseSingleLiteralString(()
92-
listener: beginLiteralString("hello")
93-
listener: endLiteralString(0, ))
86+
listener: beginLiteralString("hello")
87+
listener: endLiteralString(0, ))
9488
listener: endArguments(1, (, ))
9589
listener: handleSend(print, ))
9690
ensureSemicolon())

pkg/front_end/parser_testcases/error_recovery/issue_49477.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,8 @@ parseUnit(import)
108108
parseArgumentsRest(()
109109
listener: beginArguments(()
110110
allowedToShortcutParseExpression()
111-
parseExpression(()
112-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
113-
parseUnaryExpression((, true, ConstantPatternContext.none)
114-
parsePrimary((, expression, ConstantPatternContext.none)
115-
parseLiteralString(()
116-
parseSingleLiteralString(()
117-
listener: beginLiteralString('')
118-
listener: endLiteralString(0, ,)
111+
listener: beginLiteralString('')
112+
listener: endLiteralString(0, ,)
119113
allowedToShortcutParseExpression()
120114
parseExpression(,)
121115
parsePrecedenceExpression(,, 1, true, ConstantPatternContext.none)

pkg/front_end/parser_testcases/error_recovery/issue_49477_prime.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,8 @@ parseUnit(import)
108108
parseArgumentsRest(()
109109
listener: beginArguments(()
110110
allowedToShortcutParseExpression()
111-
parseExpression(()
112-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
113-
parseUnaryExpression((, true, ConstantPatternContext.none)
114-
parsePrimary((, expression, ConstantPatternContext.none)
115-
parseLiteralString(()
116-
parseSingleLiteralString(()
117-
listener: beginLiteralString('')
118-
listener: endLiteralString(0, ,)
111+
listener: beginLiteralString('')
112+
listener: endLiteralString(0, ,)
119113
allowedToShortcutParseExpression()
120114
parseExpression(,)
121115
parsePrecedenceExpression(,, 1, true, ConstantPatternContext.none)

pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,14 +2279,8 @@ parseUnit(EncodingErrorToken())
22792279
parseArgumentsRest(()
22802280
listener: beginArguments(()
22812281
allowedToShortcutParseExpression()
2282-
parseExpression(()
2283-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
2284-
parseUnaryExpression((, true, ConstantPatternContext.none)
2285-
parsePrimary((, expression, ConstantPatternContext.none)
2286-
parseLiteralString(()
2287-
parseSingleLiteralString(()
2288-
listener: beginLiteralString("Hello, world!")
2289-
listener: endLiteralString(0, ))
2282+
listener: beginLiteralString("Hello, world!")
2283+
listener: endLiteralString(0, ))
22902284
listener: endArguments(1, (, ))
22912285
listener: handleSend(t, ))
22922286
ensureSemicolon())

pkg/front_end/parser_testcases/error_recovery/with_outline/typing_09.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,8 @@ parseUnit(UnmatchedToken({))
120120
parseArgumentsRest(()
121121
listener: beginArguments(()
122122
allowedToShortcutParseExpression()
123-
parseExpression(()
124-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
125-
parseUnaryExpression((, true, ConstantPatternContext.none)
126-
parsePrimary((, expression, ConstantPatternContext.none)
127-
parseLiteralString(()
128-
parseSingleLiteralString(()
129-
listener: beginLiteralString("2!")
130-
listener: endLiteralString(0, ))
123+
listener: beginLiteralString("2!")
124+
listener: endLiteralString(0, ))
131125
listener: endArguments(1, (, ))
132126
listener: handleSend(print, ))
133127
ensureSemicolon())

pkg/front_end/parser_testcases/error_recovery/with_outline/typing_10.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,8 @@ parseUnit(UnmatchedToken({))
120120
parseArgumentsRest(()
121121
listener: beginArguments(()
122122
allowedToShortcutParseExpression()
123-
parseExpression(()
124-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
125-
parseUnaryExpression((, true, ConstantPatternContext.none)
126-
parsePrimary((, expression, ConstantPatternContext.none)
127-
parseLiteralString(()
128-
parseSingleLiteralString(()
129-
listener: beginLiteralString("2!")
130-
listener: endLiteralString(0, ))
123+
listener: beginLiteralString("2!")
124+
listener: endLiteralString(0, ))
131125
listener: endArguments(1, (, ))
132126
listener: handleSend(print, ))
133127
ensureSemicolon())

pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,8 @@ parseUnit(void)
150150
parseArgumentsRest(()
151151
listener: beginArguments(()
152152
allowedToShortcutParseExpression()
153-
parseExpression(()
154-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
155-
parseUnaryExpression((, true, ConstantPatternContext.none)
156-
parsePrimary((, expression, ConstantPatternContext.none)
157-
parseLiteralString(()
158-
parseSingleLiteralString(()
159-
listener: beginLiteralString("")
160-
listener: endLiteralString(0, ))
153+
listener: beginLiteralString("")
154+
listener: endLiteralString(0, ))
161155
listener: endArguments(1, (, ))
162156
listener: handleSend(onX, ))
163157
ensureSemicolon())
Binary file not shown.

pkg/front_end/parser_testcases/general/issue_60785.crash_dart.intertwined.expect

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,8 @@ parseUnit(UnmatchedToken({))
136136
parseArgumentsRest(()
137137
listener: beginArguments(()
138138
allowedToShortcutParseExpression()
139-
parseExpression(()
140-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
141-
parseUnaryExpression((, true, ConstantPatternContext.none)
142-
parsePrimary((, expression, ConstantPatternContext.none)
143-
parseLiteralString(()
144-
parseSingleLiteralString(()
145-
listener: beginLiteralString('foo')
146-
listener: endLiteralString(0, ))
139+
listener: beginLiteralString('foo')
140+
listener: endLiteralString(0, ))
147141
listener: endArguments(1, (, ))
148142
listener: handleSend(print, ))
149143
ensureSemicolon())
@@ -206,14 +200,8 @@ parseUnit(UnmatchedToken({))
206200
parseArgumentsRest(()
207201
listener: beginArguments(()
208202
allowedToShortcutParseExpression()
209-
parseExpression(()
210-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
211-
parseUnaryExpression((, true, ConstantPatternContext.none)
212-
parsePrimary((, expression, ConstantPatternContext.none)
213-
parseLiteralString(()
214-
parseSingleLiteralString(()
215-
listener: beginLiteralString('bar')
216-
listener: endLiteralString(0, ))
203+
listener: beginLiteralString('bar')
204+
listener: endLiteralString(0, ))
217205
listener: endArguments(1, (, ))
218206
listener: handleSend(print, ))
219207
ensureSemicolon())

0 commit comments

Comments
 (0)