Skip to content

Commit ffde158

Browse files
Clement Skaucommit-bot@chromium.org
authored andcommitted
[VM] Removes types from reused temps in async.
When we detect that a temporary variable is being reused with a different type, we change the type of the temp to dynamic. This allows us to retain types for any non-reused temps. For any dynamic temps we still have type information available for use sites, which we can pass on via unsafeCast. One drawback of this approach is that we don't know ahead of time which temps are reused, and get turned into dynamic, so we have to unsafeCast all uses. This change is similar to what was done in: https://dart-review.googlesource.com/c/sdk/+/138500 TEST=Adds tests/language/vm/regress_flutter_85311_test.dart, updates relevant expect files. Bug: flutter/flutter#85311 Change-Id: I821c5266327892d5c3fd5bae1bebba7f3fe3931b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/205647 Commit-Queue: Clement Skau <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 284695f commit ffde158

16 files changed

+149
-61
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ static method main() → void /* originally async */ {
3636
core::int* :await_jump_var = 0;
3737
dynamic :await_ctx_var;
3838
dynamic :saved_try_context_var0;
39-
dynamic :async_temporary_0;
40-
dynamic :async_temporary_1;
41-
dynamic :async_temporary_2;
39+
self::Node* :async_temporary_0;
40+
self::Node* :async_temporary_1;
41+
self::Node* :async_temporary_2;
4242
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
4343
try {
4444
#L1:

pkg/front_end/testcases/general/await_complex.dart.weak.transformed.expect

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ static method staticMembers() → dynamic /* originally async */ {
6565
core::int* :await_jump_var = 0;
6666
dynamic :await_ctx_var;
6767
dynamic :saved_try_context_var0;
68-
dynamic :async_temporary_0;
69-
dynamic :async_temporary_1;
70-
dynamic :async_temporary_2;
71-
dynamic :async_temporary_3;
72-
dynamic :async_temporary_4;
73-
dynamic :async_temporary_5;
68+
core::int* :async_temporary_0;
69+
core::int* :async_temporary_1;
70+
core::int* :async_temporary_2;
71+
core::int* :async_temporary_3;
72+
core::int* :async_temporary_4;
73+
core::int* :async_temporary_5;
7474
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
7575
try {
7676
#L1:
@@ -121,11 +121,11 @@ static method topLevelMembers() → dynamic /* originally async */ {
121121
core::int* :await_jump_var = 0;
122122
dynamic :await_ctx_var;
123123
dynamic :saved_try_context_var0;
124-
dynamic :async_temporary_0;
125-
dynamic :async_temporary_1;
126-
dynamic :async_temporary_2;
127-
dynamic :async_temporary_3;
128-
dynamic :async_temporary_4;
124+
core::int* :async_temporary_0;
125+
core::int* :async_temporary_1;
126+
core::int* :async_temporary_2;
127+
core::int* :async_temporary_3;
128+
core::int* :async_temporary_4;
129129
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
130130
try {
131131
#L2:
@@ -172,11 +172,11 @@ static method instanceMembers() → dynamic /* originally async */ {
172172
core::int* :await_jump_var = 0;
173173
dynamic :await_ctx_var;
174174
dynamic :saved_try_context_var0;
175-
dynamic :async_temporary_0;
176-
dynamic :async_temporary_1;
177-
dynamic :async_temporary_2;
178-
dynamic :async_temporary_3;
179-
dynamic :async_temporary_4;
175+
core::int* :async_temporary_0;
176+
core::int* :async_temporary_1;
177+
core::int* :async_temporary_2;
178+
core::int* :async_temporary_3;
179+
core::int* :async_temporary_4;
180180
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
181181
try {
182182
#L3:
@@ -225,10 +225,10 @@ static method others() → dynamic /* originally async */ {
225225
dynamic :await_ctx_var;
226226
dynamic :saved_try_context_var0;
227227
dynamic :async_temporary_0;
228-
dynamic :async_temporary_1;
229-
dynamic :async_temporary_2;
230-
dynamic :async_temporary_3;
231-
dynamic :async_temporary_4;
228+
core::int* :async_temporary_1;
229+
core::int* :async_temporary_2;
230+
core::List<core::int*>* :async_temporary_3;
231+
core::int* :async_temporary_4;
232232
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
233233
try {
234234
#L4:
@@ -288,13 +288,13 @@ static method conditionals() → dynamic /* originally async */ {
288288
core::bool* a = false;
289289
core::bool* b = true;
290290
:async_temporary_0 = (a || b) =={core::Object::==}{(core::Object) → core::bool} true;
291-
if(:async_temporary_0)
291+
if(_in::unsafeCast<core::bool*>(:async_temporary_0))
292292
;
293293
else {
294294
[yield] let dynamic #t22 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
295295
:async_temporary_0 = :result as{TypeError,ForDynamic} core::bool* =={core::Object::==}{(core::Object) → core::bool} true;
296296
}
297-
core::bool* c = :async_temporary_0;
297+
core::bool* c = _in::unsafeCast<core::bool*>(:async_temporary_0);
298298
self::expect(true, c);
299299
if(a || b) {
300300
:async_temporary_1 = a;
@@ -426,8 +426,8 @@ static method controlFlow() → dynamic /* originally async */ {
426426
dynamic :saved_try_context_var3;
427427
dynamic :exception0;
428428
dynamic :stack_trace0;
429-
dynamic :async_temporary_0;
430-
dynamic :async_temporary_1;
429+
core::List<dynamic>* :async_temporary_0;
430+
core::List<dynamic>* :async_temporary_1;
431431
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
432432
try {
433433
#L7:

pkg/front_end/testcases/general/bug33206.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ static method foo() → asy::Future<self::X*>* /* originally async */ {
105105
core::int* :await_jump_var = 0;
106106
dynamic :await_ctx_var;
107107
dynamic :saved_try_context_var0;
108-
dynamic :async_temporary_0;
108+
self::Y* :async_temporary_0;
109109
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
110110
try {
111111
#L3:

pkg/front_end/testcases/general/issue40662.dart.weak.transformed.expect

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ static method foo(core::int* x) → dynamic /* originally async */ {
1717
core::int* :await_jump_var = 0;
1818
dynamic :await_ctx_var;
1919
dynamic :saved_try_context_var0;
20-
dynamic :async_temporary_0;
21-
dynamic :async_temporary_1;
20+
core::int* :async_temporary_0;
21+
core::int* :async_temporary_1;
2222
core::List<core::int*>* :async_temporary_2;
23-
dynamic :async_temporary_3;
23+
core::int* :async_temporary_3;
2424
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
2525
try {
2626
#L1:
@@ -35,7 +35,7 @@ static method foo(core::int* x) → dynamic /* originally async */ {
3535
else {
3636
:async_temporary_2 = null;
3737
}
38-
:return_value = self::bar(_in::unsafeCast<core::int*>(:async_temporary_3), :async_temporary_2);
38+
:return_value = self::bar(_in::unsafeCast<core::int*>(:async_temporary_3), _in::unsafeCast<core::List<core::int*>*>(:async_temporary_2));
3939
break #L1;
4040
}
4141
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
@@ -88,4 +88,4 @@ static method expect(dynamic expected, dynamic actual) → dynamic {
8888
Extra constant evaluation status:
8989
Evaluated: InstanceInvocation @ org-dartlang-testcase:///issue40662.dart:8:10 -> IntConstant(-1)
9090
Evaluated: InstanceInvocation @ org-dartlang-testcase:///issue40662.dart:9:10 -> IntConstant(-1)
91-
Extra constant evaluation: evaluated: 93, effectively constant: 2
91+
Extra constant evaluation: evaluated: 94, effectively constant: 2

pkg/front_end/testcases/general/regression_flutter51828.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static method main() → dynamic /* originally async */ {
9191
core::int* :await_jump_var = 0;
9292
dynamic :await_ctx_var;
9393
dynamic :saved_try_context_var0;
94-
dynamic :async_temporary_0;
94+
self::B* :async_temporary_0;
9595
dynamic :async_temporary_1;
9696
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
9797
try {

pkg/front_end/testcases/inference/future_then_conditional.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static method test() → void {
5656
[yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
5757
:async_temporary_0 = _in::unsafeCast<core::int*>(:result);
5858
}
59-
:return_value = :async_temporary_0;
59+
:return_value = _in::unsafeCast<core::int*>(:async_temporary_0);
6060
break #L1;
6161
}
6262
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);

pkg/front_end/testcases/inference/future_then_conditional_2.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static method test() → void {
5656
[yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
5757
:async_temporary_0 = _in::unsafeCast<core::int*>(:result);
5858
}
59-
:return_value = :async_temporary_0;
59+
:return_value = _in::unsafeCast<core::int*>(:async_temporary_0);
6060
break #L1;
6161
}
6262
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);

pkg/front_end/testcases/inference/future_then_conditional_3.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static method test() → void {
5656
[yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
5757
:async_temporary_0 = _in::unsafeCast<core::int*>(:result);
5858
}
59-
:return_value = :async_temporary_0;
59+
:return_value = _in::unsafeCast<core::int*>(:async_temporary_0);
6060
break #L1;
6161
}
6262
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);

pkg/front_end/testcases/inference/future_then_conditional_4.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static method test() → void {
5656
[yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
5757
:async_temporary_0 = _in::unsafeCast<core::int*>(:result);
5858
}
59-
:return_value = :async_temporary_0;
59+
:return_value = _in::unsafeCast<core::int*>(:async_temporary_0);
6060
break #L1;
6161
}
6262
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);

pkg/front_end/testcases/inference/future_then_conditional_5.dart.weak.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static method test() → void {
5656
[yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
5757
:async_temporary_0 = _in::unsafeCast<core::int*>(:result);
5858
}
59-
:return_value = :async_temporary_0;
59+
:return_value = _in::unsafeCast<core::int*>(:async_temporary_0);
6060
break #L1;
6161
}
6262
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);

0 commit comments

Comments
 (0)