Skip to content

Commit 59f19d8

Browse files
jensjohaCommit Queue
authored andcommitted
[parser] Shortcut common case in parseArgumentsRest
Observation: Often when about to call parseExpression in parseArgumentsRest we see either "<identifier> <comma>" (say, we're passing a variable) or "<identifier> <end parens>" (same case, but last argument). This CL allows us to shortcut such cases avoiding a lot of calls where we check if it's other cases which it isn't. pkg/analyzer/lib/src/dart/ast/ast.dart: JIT (tokens per microsecond): 5.5605% +/- 4.0086% (1.16 +/- 0.84) (20.94 -> 22.10) AOT (tokens per microsecond): 7.1788% +/- 2.5682% (2.04 +/- 0.73) (28.44 -> 30.48) Benchmarker (AOT): ``` msec task-clock:u: -4.4173% +/- 1.7793% (-124.29 +/- 50.07) (2813.81 -> 2689.52) page-faults:u: 0.1064% +/- 0.0131% (10.90 +/- 1.35) (10246.00 -> 10256.90) cycles:u: -4.4718% +/- 1.7882% (-546472914.30 +/- 218528412.28) (12220314431.60 -> 11673841517.30) instructions:u: -10.0011% +/- 0.0000% (-2704578213.40 +/- 1611.58) (27042820700.90 -> 24338242487.50) seconds time elapsed: -4.4160% +/- 1.7779% (-0.12 +/- 0.05) (2.82 -> 2.69) seconds user: -4.6324% +/- 1.8285% (-0.13 +/- 0.05) (2.80 -> 2.67) ``` pkg/front_end/lib/src/type_inference/inference_visitor.dart: JIT (tokens per microsecond): 10.1981% +/- 1.2476% (1.58 +/- 0.19) (15.46 -> 17.04) AOT (tokens per microsecond): 8.7843% +/- 1.5781% (1.79 +/- 0.32) (20.42 -> 22.22) Benchmarker (AOT): ``` msec task-clock:u: -5.9322% +/- 2.7532% (-181.01 +/- 84.01) (3051.38 -> 2870.37) page-faults:u: 0.0352% +/- 0.0261% (3.50 +/- 2.59) (9930.90 -> 9934.40) cycles:u: -6.0726% +/- 2.7273% (-805818237.40 +/- 361907438.70) (13269703092.60 -> 12463884855.20) instructions:u: -11.9540% +/- 0.0000% (-3561054138.90 +/- 1016.14) (29789745342.80 -> 26228691203.90) seconds time elapsed: -5.9310% +/- 2.7520% (-0.18 +/- 0.08) (3.05 -> 2.87) seconds user: -6.1531% +/- 2.7477% (-0.19 +/- 0.08) (3.03 -> 2.85) ``` Change-Id: Ia4fbdcbd438a38a0c07b3f4423812ef3507b626c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439880 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent d73f7bd commit 59f19d8

File tree

107 files changed

+786
-631
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+786
-631
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ class ClassMemberParser extends Parser {
2323
super.enableFeatureEnhancedParts,
2424
});
2525

26+
@override
27+
// This parser skips expressions so [parseExpression] has to be called.
28+
bool get allowedToShortcutParseExpression => false;
29+
2630
@override
2731
Token parseExpression(Token token) {
2832
return skipExpression(token);

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,12 @@ class Parser {
334334
/// Whether the `enhanced-parts` feature is enabled.
335335
final bool enableFeatureEnhancedParts;
336336

337+
/// Whether the parser is allowed to shortcut certain [parseExpression] calls.
338+
///
339+
/// Should be false if [parseExpression] is customized, e.g. if skipping
340+
/// expressions.
341+
bool get allowedToShortcutParseExpression => true;
342+
337343
Parser(
338344
this.listener, {
339345
this.useImplicitCreationExpression = true,
@@ -8927,7 +8933,32 @@ class Parser {
89278933
).next!;
89288934
colon = token;
89298935
}
8930-
token = parseExpression(token);
8936+
bool expressionHandled = false;
8937+
8938+
// For increased performance we'd prefer to shortcut common cases, but if
8939+
// a subclass of the parser has a special implementation of
8940+
// [parseExpression] (say, wanting to skip expressions) we can't do that.
8941+
if (allowedToShortcutParseExpression) {
8942+
Token next = token.next!;
8943+
// 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)) {
8948+
// Shortcut common cases:
8949+
// "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;
8955+
expressionHandled = true;
8956+
}
8957+
}
8958+
}
8959+
if (!expressionHandled) {
8960+
token = parseExpression(token);
8961+
}
89318962
next = token.next!;
89328963
if (colon != null) listener.handleNamedArgument(colon);
89338964
++argumentCount;

pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.intertwined.expect

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ parseUnit(f)
8686
parseArgumentsOpt(b)
8787
parseArguments(b)
8888
parseArgumentsRest(()
89+
allowedToShortcutParseExpression()
8990
parseExpression(()
9091
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
9192
parseUnaryExpression((, true, ConstantPatternContext.none)
@@ -121,6 +122,7 @@ parseUnit(f)
121122
parseArguments(b)
122123
parseArgumentsRest(()
123124
listener: beginArguments(()
125+
allowedToShortcutParseExpression()
124126
parseExpression(()
125127
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
126128
parseUnaryExpression((, true, ConstantPatternContext.none)

pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.intertwined.expect

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ parseUnit(var)
7979
parseArguments(addAll)
8080
parseArgumentsRest(()
8181
listener: beginArguments(()
82+
allowedToShortcutParseExpression()
8283
parseExpression(()
8384
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
8485
parseUnaryExpression((, true, ConstantPatternContext.none)
@@ -145,14 +146,7 @@ parseUnit(var)
145146
parseArgumentsOpt(e)
146147
parseArguments(e)
147148
parseArgumentsRest(()
148-
parseExpression(()
149-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
150-
parseUnaryExpression((, true, ConstantPatternContext.none)
151-
parsePrimary((, expression, ConstantPatternContext.none)
152-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
153-
parseSend((, expression, ConstantPatternContext.none)
154-
ensureIdentifier((, expression)
155-
parseArgumentsOpt(f)
149+
allowedToShortcutParseExpression()
156150
parseExpressionWithoutCascade(:)
157151
parsePrecedenceExpression(:, 1, false, ConstantPatternContext.none)
158152
parseUnaryExpression(:, false, ConstantPatternContext.none)
@@ -191,14 +185,7 @@ parseUnit(var)
191185
parseArgumentsOpt(e)
192186
parseArguments(e)
193187
parseArgumentsRest(()
194-
parseExpression(()
195-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
196-
parseUnaryExpression((, true, ConstantPatternContext.none)
197-
parsePrimary((, expression, ConstantPatternContext.none)
198-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
199-
parseSend((, expression, ConstantPatternContext.none)
200-
ensureIdentifier((, expression)
201-
parseArgumentsOpt(f)
188+
allowedToShortcutParseExpression()
202189
parseExpressionWithoutCascade(:)
203190
parsePrecedenceExpression(:, 1, false, ConstantPatternContext.none)
204191
parseUnaryExpression(:, false, ConstantPatternContext.none)
@@ -238,14 +225,7 @@ parseUnit(var)
238225
parseArgumentsOpt(e)
239226
parseArguments(e)
240227
parseArgumentsRest(()
241-
parseExpression(()
242-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
243-
parseUnaryExpression((, true, ConstantPatternContext.none)
244-
parsePrimary((, expression, ConstantPatternContext.none)
245-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
246-
parseSend((, expression, ConstantPatternContext.none)
247-
ensureIdentifier((, expression)
248-
parseArgumentsOpt(f)
228+
allowedToShortcutParseExpression()
249229
parseExpressionWithoutCascade(:)
250230
parsePrecedenceExpression(:, 1, false, ConstantPatternContext.none)
251231
parseUnaryExpression(:, false, ConstantPatternContext.none)
@@ -293,18 +273,11 @@ parseUnit(var)
293273
parseArguments(e)
294274
parseArgumentsRest(()
295275
listener: beginArguments(()
296-
parseExpression(()
297-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
298-
parseUnaryExpression((, true, ConstantPatternContext.none)
299-
parsePrimary((, expression, ConstantPatternContext.none)
300-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
301-
parseSend((, expression, ConstantPatternContext.none)
302-
ensureIdentifier((, expression)
303-
listener: handleIdentifier(f, expression)
304-
listener: handleNoTypeArguments())
305-
parseArgumentsOpt(f)
306-
listener: handleNoArguments())
307-
listener: handleSend(f, f)
276+
allowedToShortcutParseExpression()
277+
listener: handleIdentifier(f, expression)
278+
listener: handleNoTypeArguments())
279+
listener: handleNoArguments())
280+
listener: handleSend(f, f)
308281
listener: endArguments(1, (, ))
309282
listener: handleSend(e, ))
310283
listener: handleLiteralList(2, [, null, ])

pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.intertwined.expect

Lines changed: 20 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,11 @@ parseUnit(void)
6161
parseArguments(print)
6262
parseArgumentsRest(()
6363
listener: beginArguments(()
64-
parseExpression(()
65-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
66-
parseUnaryExpression((, true, ConstantPatternContext.none)
67-
parsePrimary((, expression, ConstantPatternContext.none)
68-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
69-
parseSend((, expression, ConstantPatternContext.none)
70-
ensureIdentifier((, expression)
71-
listener: handleIdentifier(x, expression)
72-
listener: handleNoTypeArguments())
73-
parseArgumentsOpt(x)
74-
listener: handleNoArguments())
75-
listener: handleSend(x, x)
64+
allowedToShortcutParseExpression()
65+
listener: handleIdentifier(x, expression)
66+
listener: handleNoTypeArguments())
67+
listener: handleNoArguments())
68+
listener: handleSend(x, x)
7669
listener: endArguments(1, (, ))
7770
listener: handleSend(print, ))
7871
ensureSemicolon())
@@ -138,18 +131,11 @@ parseUnit(void)
138131
parseArguments(print)
139132
parseArgumentsRest(()
140133
listener: beginArguments(()
141-
parseExpression(()
142-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
143-
parseUnaryExpression((, true, ConstantPatternContext.none)
144-
parsePrimary((, expression, ConstantPatternContext.none)
145-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
146-
parseSend((, expression, ConstantPatternContext.none)
147-
ensureIdentifier((, expression)
148-
listener: handleIdentifier(x, expression)
149-
listener: handleNoTypeArguments())
150-
parseArgumentsOpt(x)
151-
listener: handleNoArguments())
152-
listener: handleSend(x, x)
134+
allowedToShortcutParseExpression()
135+
listener: handleIdentifier(x, expression)
136+
listener: handleNoTypeArguments())
137+
listener: handleNoArguments())
138+
listener: handleSend(x, x)
153139
listener: endArguments(1, (, ))
154140
listener: handleSend(print, ))
155141
ensureSemicolon())
@@ -219,18 +205,11 @@ parseUnit(void)
219205
parseArguments(print)
220206
parseArgumentsRest(()
221207
listener: beginArguments(()
222-
parseExpression(()
223-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
224-
parseUnaryExpression((, true, ConstantPatternContext.none)
225-
parsePrimary((, expression, ConstantPatternContext.none)
226-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
227-
parseSend((, expression, ConstantPatternContext.none)
228-
ensureIdentifier((, expression)
229-
listener: handleIdentifier(x, expression)
230-
listener: handleNoTypeArguments())
231-
parseArgumentsOpt(x)
232-
listener: handleNoArguments())
233-
listener: handleSend(x, x)
208+
allowedToShortcutParseExpression()
209+
listener: handleIdentifier(x, expression)
210+
listener: handleNoTypeArguments())
211+
listener: handleNoArguments())
212+
listener: handleSend(x, x)
234213
listener: endArguments(1, (, ))
235214
listener: handleSend(print, ))
236215
ensureSemicolon())
@@ -325,18 +304,11 @@ parseUnit(void)
325304
parseArguments(print)
326305
parseArgumentsRest(()
327306
listener: beginArguments(()
328-
parseExpression(()
329-
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
330-
parseUnaryExpression((, true, ConstantPatternContext.none)
331-
parsePrimary((, expression, ConstantPatternContext.none)
332-
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
333-
parseSend((, expression, ConstantPatternContext.none)
334-
ensureIdentifier((, expression)
335-
listener: handleIdentifier(x, expression)
336-
listener: handleNoTypeArguments())
337-
parseArgumentsOpt(x)
338-
listener: handleNoArguments())
339-
listener: handleSend(x, x)
307+
allowedToShortcutParseExpression()
308+
listener: handleIdentifier(x, expression)
309+
listener: handleNoTypeArguments())
310+
listener: handleNoArguments())
311+
listener: handleSend(x, x)
340312
listener: endArguments(1, (, ))
341313
listener: handleSend(print, ))
342314
ensureSemicolon())

pkg/front_end/parser_testcases/coverage/interpolated_eof.dart.intertwined.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ parseUnit(UnmatchedToken(())
4545
parseArguments(print)
4646
parseArgumentsRest(()
4747
listener: beginArguments(()
48+
allowedToShortcutParseExpression()
4849
parseExpression(()
4950
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
5051
parseUnaryExpression((, true, ConstantPatternContext.none)

pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ parseUnit(enum)
105105
parseConstructorInvocationArguments(named)
106106
parseArgumentsRest(()
107107
listener: beginArguments(()
108+
allowedToShortcutParseExpression()
108109
parseExpression(()
109110
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
110111
parseUnaryExpression((, true, ConstantPatternContext.none)

0 commit comments

Comments
 (0)