Skip to content

Commit c4a7c34

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[vm/async] Make async transformer use typed variables, make async patch use function types
This gets rid of a slow AssertAssignable (function type test) in _asyncThenWrapperHelper/_awaitHelper, which currently falls back to the slow table search: AssertAssignable ^--> TypeTestingStub ^--> SlowTypeTestStub ^--> Subtype6TestCacheStub Issue #37668 Change-Id: I3b6517b7e348e39619e8096d6ac2a4b179bb3242 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142022 Commit-Queue: Martin Kustermann <[email protected]> Reviewed-by: Alexander Markov <[email protected]> Reviewed-by: Clement Skau <[email protected]>
1 parent 72e4d14 commit c4a7c34

File tree

101 files changed

+1349
-1303
lines changed

Some content is hidden

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

101 files changed

+1349
-1303
lines changed

pkg/front_end/lib/src/fasta/source/source_loader.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,8 @@ class _AsyncAwaitCompleter implements Completer {
13861386
complete([value]) {}
13871387
13881388
completeError(error, [stackTrace]) {}
1389+
1390+
void start(void Function() f) {}
13891391
}
13901392
13911393
class Stream {}

pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ static method main() → dynamic /* originally async */ {
1818
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
1919
asy::FutureOr<dynamic>* :return_value;
2020
dynamic :async_stack_trace;
21-
dynamic :async_op_then;
22-
dynamic :async_op_error;
21+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
22+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
2323
core::int* :await_jump_var = 0;
2424
dynamic :await_ctx_var;
2525
dynamic :saved_try_context_var0;
@@ -41,13 +41,13 @@ static method main() → dynamic /* originally async */ {
4141
asy::_completeOnAsyncReturn(:async_completer, :return_value);
4242
return;
4343
}
44-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
44+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
4545
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
4646
}
4747
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
4848
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
4949
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
50-
:async_completer.start(:async_op);
50+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
5151
return :async_completer.{asy::Completer::future};
5252
}
5353
static method expect(dynamic expected, dynamic actual) → dynamic {

pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ static method main() → dynamic /* originally async */ {
1010
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
1111
asy::FutureOr<dynamic>* :return_value;
1212
dynamic :async_stack_trace;
13-
dynamic :async_op_then;
14-
dynamic :async_op_error;
13+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
14+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
1515
core::int* :await_jump_var = 0;
1616
dynamic :await_ctx_var;
1717
dynamic :saved_try_context_var0;
@@ -32,13 +32,13 @@ static method main() → dynamic /* originally async */ {
3232
asy::_completeOnAsyncReturn(:async_completer, :return_value);
3333
return;
3434
}
35-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
35+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
3636
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
3737
}
3838
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
3939
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
4040
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
41-
:async_completer.start(:async_op);
41+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
4242
return :async_completer.{asy::Completer::future};
4343
}
4444
static method expect(dynamic expected, dynamic actual) → dynamic {

pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ static method asyncString() → asy::Future<core::String*>* /* originally async
1111
final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
1212
asy::FutureOr<core::String*>* :return_value;
1313
dynamic :async_stack_trace;
14-
dynamic :async_op_then;
15-
dynamic :async_op_error;
14+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
15+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
1616
core::int* :await_jump_var = 0;
1717
dynamic :await_ctx_var;
1818
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
@@ -25,21 +25,21 @@ static method asyncString() → asy::Future<core::String*>* /* originally async
2525
asy::_completeOnAsyncReturn(:async_completer, :return_value);
2626
return;
2727
}
28-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
28+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
2929
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
3030
}
3131
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
3232
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
3333
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
34-
:async_completer.start(:async_op);
34+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
3535
return :async_completer.{asy::Completer::future};
3636
}
3737
static method asyncString2() → asy::Future<core::String*>* /* originally async */ {
3838
final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
3939
asy::FutureOr<core::String*>* :return_value;
4040
dynamic :async_stack_trace;
41-
dynamic :async_op_then;
42-
dynamic :async_op_error;
41+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
42+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
4343
core::int* :await_jump_var = 0;
4444
dynamic :await_ctx_var;
4545
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
@@ -52,13 +52,13 @@ static method asyncString2() → asy::Future<core::String*>* /* originally async
5252
asy::_completeOnAsyncReturn(:async_completer, :return_value);
5353
return;
5454
}
55-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
55+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
5656
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
5757
}
5858
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
5959
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
6060
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
61-
:async_completer.start(:async_op);
61+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
6262
return :async_completer.{asy::Completer::future};
6363
}
6464
static method syncStarString() → core::Iterable<core::String*>* /* originally sync* */ {
@@ -101,8 +101,8 @@ static method asyncStarString() → asy::Stream<core::String*>* /* originally as
101101
asy::_AsyncStarStreamController<core::String*>* :controller;
102102
dynamic :controller_stream;
103103
dynamic :async_stack_trace;
104-
dynamic :async_op_then;
105-
dynamic :async_op_error;
104+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
105+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
106106
core::int* :await_jump_var = 0;
107107
dynamic :await_ctx_var;
108108
dynamic :saved_try_context_var0;
@@ -128,7 +128,7 @@ static method asyncStarString() → asy::Stream<core::String*>* /* originally as
128128
}
129129
return;
130130
}
131-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
131+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
132132
:controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
133133
}
134134
finally {
@@ -145,8 +145,8 @@ static method asyncStarString2() → asy::Stream<core::String*>* /* originally a
145145
asy::_AsyncStarStreamController<core::String*>* :controller;
146146
dynamic :controller_stream;
147147
dynamic :async_stack_trace;
148-
dynamic :async_op_then;
149-
dynamic :async_op_error;
148+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
149+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
150150
core::int* :await_jump_var = 0;
151151
dynamic :await_ctx_var;
152152
dynamic :saved_try_context_var0;
@@ -163,7 +163,7 @@ static method asyncStarString2() → asy::Stream<core::String*>* /* originally a
163163
}
164164
return;
165165
}
166-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
166+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
167167
:controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
168168
}
169169
finally {
@@ -180,8 +180,8 @@ static method main() → dynamic /* originally async */ {
180180
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
181181
asy::FutureOr<dynamic>* :return_value;
182182
dynamic :async_stack_trace;
183-
dynamic :async_op_then;
184-
dynamic :async_op_error;
183+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
184+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
185185
core::int* :await_jump_var = 0;
186186
dynamic :await_ctx_var;
187187
dynamic :saved_try_context_var0;
@@ -195,12 +195,12 @@ static method main() → dynamic /* originally async */ {
195195
asy::_completeOnAsyncReturn(:async_completer, :return_value);
196196
return;
197197
}
198-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
198+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
199199
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
200200
}
201201
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
202202
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
203203
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
204-
:async_completer.start(:async_op);
204+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
205205
return :async_completer.{asy::Completer::future};
206206
}

pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ static method main() → void /* originally async */ {
2222
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
2323
asy::FutureOr<dynamic>* :return_value;
2424
dynamic :async_stack_trace;
25-
dynamic :async_op_then;
26-
dynamic :async_op_error;
25+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
26+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
2727
core::int* :await_jump_var = 0;
2828
dynamic :await_ctx_var;
2929
dynamic :saved_try_context_var0;
@@ -56,13 +56,13 @@ static method main() → void /* originally async */ {
5656
asy::_completeOnAsyncReturn(:async_completer, :return_value);
5757
return;
5858
}
59-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
59+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
6060
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
6161
}
6262
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
6363
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
6464
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
65-
:async_completer.start(:async_op);
65+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
6666
return :async_completer.{asy::Completer::future};
6767
}
6868

pkg/front_end/testcases/general/await.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ static method main() → dynamic /* originally async */ {
88
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
99
asy::FutureOr<dynamic>* :return_value;
1010
dynamic :async_stack_trace;
11-
dynamic :async_op_then;
12-
dynamic :async_op_error;
11+
(dynamic) →* asy::FutureOr<dynamic>* :async_op_then;
12+
(core::Object*, core::StackTrace*) →* dynamic :async_op_error;
1313
core::int* :await_jump_var = 0;
1414
dynamic :await_ctx_var;
1515
dynamic :saved_try_context_var0;
@@ -23,12 +23,12 @@ static method main() → dynamic /* originally async */ {
2323
asy::_completeOnAsyncReturn(:async_completer, :return_value);
2424
return;
2525
}
26-
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
26+
on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
2727
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
2828
}
2929
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
3030
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
3131
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
32-
:async_completer.start(:async_op);
32+
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
3333
return :async_completer.{asy::Completer::future};
3434
}

0 commit comments

Comments
 (0)