Revert "Reland "[VM] Adds Future.then and Future.catchError stack unwinding.""
This reverts commit 9978a246c10c6c6297bc8ac52fd34d3423f6071c.
Reason for revert: VM crashes in google3, b/177506826
Original change's description:
> Reland "[VM] Adds Future.then and Future.catchError stack unwinding."
>
> This reverts commit 978b838461ea9757a4ed7d413f85f542e1157861.
>
> Reason for revert: Fix: https://dart-review.googlesource.com/c/sdk/+/179762
>
> TEST=Various 'causal' tests updated below.
>
> Original change's description:
> > Revert "[VM] Adds Future.then and Future.catchError stack unwinding."
> >
> > This reverts commit 8f2c47f24b6910ad01f7456eb913ca2aa17151a1.
> >
> > Reason for revert: We suspect this is causing VM crashes: http://b/177506826
> >
> > Original change's description:
> > > [VM] Adds Future.then and Future.catchError stack unwinding.
> > >
> > > TEST=Various 'causal' tests updated below.
> > >
> > > Bug: https://github.com/dart-lang/sdk/issues/40815, https://github.com/dart-lang/sdk/issues/37953
> > > Change-Id: I1420d6163ac2e3b22e0971f7b0ad516895dded70
> > > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/176662
> > > Commit-Queue: Clement Skau <cskau@google.com>
> > > Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
> >
> > TBR=vegorov@google.com,cskau@google.com
> >
> > # Not skipping CQ checks because original CL landed > 1 day ago.
> >
> > Bug: https://github.com/dart-lang/sdk/issues/40815
> > Bug: https://github.com/dart-lang/sdk/issues/37953
> > Change-Id: I870f0202f43588f71a5d2b0f82338978b5a5dda9
> > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/178998
> > Reviewed-by: Michal Terepeta <michalt@google.com>
> > Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
> > Commit-Queue: Michal Terepeta <michalt@google.com>
>
> TBR=vegorov@google.com,cskau@google.com,michalt@google.com
>
> # Not skipping CQ checks because original CL landed > 1 day ago.
>
> Bug: https://github.com/dart-lang/sdk/issues/40815
> Bug: https://github.com/dart-lang/sdk/issues/37953
> Change-Id: I8a1eb6679b01571b850499cac2dadc5bf9ef2dcd
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/179763
> Reviewed-by: Clement Skau <cskau@google.com>
> Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
> Commit-Queue: Clement Skau <cskau@google.com>
TBR=vegorov@google.com,cskau@google.com,michalt@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: https://github.com/dart-lang/sdk/issues/40815
Bug: https://github.com/dart-lang/sdk/issues/37953
Change-Id: I1274bcb375bf6f9cb0609d372b0b451d51eb99c4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/180147
Reviewed-by: David Morgan <davidmorgan@google.com>
Commit-Queue: David Morgan <davidmorgan@google.com>
diff --git a/pkg/vm_service/test/get_stack_test.dart b/pkg/vm_service/test/get_stack_test.dart
index 28c5001..f1ba6f1 100644
--- a/pkg/vm_service/test/get_stack_test.dart
+++ b/pkg/vm_service/test/get_stack_test.dart
@@ -52,12 +52,11 @@
// Before the first await.
hasStoppedAtBreakpoint,
stoppedAtLine(LINE_A),
- // At LINE_A we're still running sync. so no asyncCausalFrames.
(VmService service, IsolateRef isolateRef) async {
final result = await service.getStack(isolateRef.id!);
expect(result.frames, hasLength(16));
- expect(result.asyncCausalFrames, isNull);
+ expect(result.asyncCausalFrames, hasLength(16));
expect(result.awaiterFrames, hasLength(16));
expectFrames(result.frames, [
@@ -74,6 +73,20 @@
[equals('Regular'), endsWith(' testMain')],
]);
+ expectFrames(result.asyncCausalFrames, [
+ [equals('Regular'), endsWith(' func10')],
+ [equals('Regular'), endsWith(' func9')],
+ [equals('Regular'), endsWith(' func8')],
+ [equals('Regular'), endsWith(' func7')],
+ [equals('Regular'), endsWith(' func6')],
+ [equals('Regular'), endsWith(' func5')],
+ [equals('Regular'), endsWith(' func4')],
+ [equals('Regular'), endsWith(' func3')],
+ [equals('Regular'), endsWith(' func2')],
+ [equals('Regular'), endsWith(' func1')],
+ [equals('Regular'), endsWith(' testMain')],
+ ]);
+
expectFrames(result.awaiterFrames, [
[equals('AsyncActivation'), endsWith(' func10')],
[equals('AsyncActivation'), endsWith(' func9')],
@@ -88,10 +101,10 @@
[equals('AsyncActivation'), endsWith(' testMain')],
]);
},
+ // After resuming the continuation - i.e. running async.
resumeIsolate,
hasStoppedAtBreakpoint,
stoppedAtLine(LINE_B),
- // After resuming the continuation - i.e. running async.
(VmService service, IsolateRef isolateRef) async {
final result = await service.getStack(isolateRef.id!);
diff --git a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
index 01331cd..3a90e4a 100644
--- a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
@@ -11,8 +11,8 @@
import 'test_helper.dart';
const LINE_C = 19;
-const LINE_A = 25;
-const LINE_B = 31;
+const LINE_A = 24;
+const LINE_B = 30;
foobar() {
debugger();
@@ -20,7 +20,6 @@
}
helper() async {
- await 0; // Yield. The rest will run async.
debugger();
print('helper'); // LINE_A.
foobar();
@@ -37,7 +36,6 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- // Async function hasn't yielded yet.
expect(stack['asyncCausalFrames'], isNull);
},
resumeIsolate,
@@ -45,7 +43,7 @@
stoppedAtLine(LINE_A),
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
- // Async function has yielded once, so it's now running async.
+ // Has causal frames (we are inside an async function)
expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
index 9b605cb..4d3e448 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
@@ -39,7 +39,7 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- expect(stack['asyncCausalFrames'], isNull);
+ expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
hasStoppedAtBreakpoint,
diff --git a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
index cd9ef6a..f52f4a1 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
@@ -11,8 +11,8 @@
import 'test_helper.dart';
const LINE_C = 19;
-const LINE_A = 25;
-const LINE_B = 31;
+const LINE_A = 24;
+const LINE_B = 30;
foobar() {
debugger();
@@ -20,7 +20,6 @@
}
helper() async {
- await 0; // Yield. The rest will run async.
debugger();
print('helper'); // LINE_A.
foobar();
diff --git a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
index 8acf40d..7fb385a 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
@@ -39,7 +39,7 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- expect(stack['asyncCausalFrames'], isNull);
+ expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
hasStoppedAtBreakpoint,
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 8b75f98..73ffe1d 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -178,22 +178,12 @@
return Future.sync(throwAsync).whenComplete(() => 'nop');
}
-// ----
-// Scenario: Future.then:
-// ----
-
-Future futureThen() {
- return Future.value(0).then((value) {
- throwSync();
- });
-}
-
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
final _lineRE = RegExp(r'^(?:#(?<number>\d+)|<asynchronous suspension>)');
-Future<void> assertStack(List<String> expects, StackTrace stackTrace,
+void assertStack(List<String> expects, StackTrace stackTrace,
[String? debugInfoFilename]) async {
final original = await Stream.value(stackTrace.toString())
.transform(const LineSplitter())
@@ -263,7 +253,7 @@
await f();
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -277,7 +267,7 @@
await f().then((e) => Expect.fail('No exception thrown!'));
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -288,7 +278,7 @@
await f().catchError((e, s) {
stackTrace = s;
});
- return assertStack(expectedStack, stackTrace, debugInfoFilename);
+ assertStack(expectedStack, stackTrace, debugInfoFilename);
}
// ----
@@ -337,32 +327,39 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
+ r'^#16 doTestAwaitCatchError ',
r'^#17 _RootZone.runUnary ',
r'^#18 _FutureListener.handleValue ',
r'^#19 Future._propagateToListeners.handleValueCallback ',
r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#21 Future._completeError ',
+ r'^#22 _completeOnAsyncError ',
+ r'^#23 allYield ',
+ r'^#24 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#25 _RootZone.runBinary ',
+ r'^#26 _FutureListener.handleError ',
+ r'^#27 Future._propagateToListeners.handleError ',
+ r'^#28 Future._propagateToListeners ',
+ r'^#29 Future._completeError ',
+ r'^#30 _completeOnAsyncError ',
+ r'^#31 allYield2 ',
+ r'^#32 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#33 _RootZone.runBinary ',
+ r'^#34 _FutureListener.handleError ',
+ r'^#35 Future._propagateToListeners.handleError ',
+ r'^#36 Future._propagateToListeners ',
+ r'^#37 Future._completeError ',
+ r'^#38 _completeOnAsyncError ',
+ r'^#39 allYield3 ',
+ r'^#40 _RootZone.runUnary ',
+ r'^#41 _FutureListener.handleValue ',
+ r'^#42 Future._propagateToListeners.handleValueCallback ',
+ r'^#43 Future._propagateToListeners ',
+ r'^#44 Future._addListener.<anonymous closure> ',
+ r'^#45 _microtaskLoop ',
+ r'^#46 _startMicrotaskLoop ',
+ r'^#47 _runPendingImmediateCallback ',
+ r'^#48 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitThen(
@@ -378,32 +375,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwait ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitCatchError(
@@ -419,32 +418,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwaitThen ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
@@ -641,497 +642,329 @@
await doTestAwaitCatchError(
futureSyncWhenComplete, expected, debugInfoFilename);
}
-
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> \(.*/utils.dart:187(:5)?\)$',
- r'^#2 _RootZone.runUnary ',
- r'^#3 _FutureListener.handleValue ',
- r'^#4 Future._propagateToListeners.handleValueCallback ',
- r'^#5 Future._propagateToListeners ',
- r'^#6 Future._completeWithValue ',
- r'^#7 Future._asyncCompleteWithValue.<anonymous closure> ',
- r'^#8 _microtaskLoop ',
- r'^#9 _startMicrotaskLoop ',
- r'^#10 _runPendingImmediateCallback ',
- r'^#11 _RawReceivePortImpl._handleMessage ',
- ];
- await doTestAwait(futureThen, expected, debugInfoFilename);
- await doTestAwaitThen(futureThen, expected, debugInfoFilename);
- await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
- }
}
// For: --lazy-async-stacks
Future<void> doTestsLazy([String? debugInfoFilename]) async {
- // allYield
- {
- final allYieldExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final allYieldExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
- // noYields
- {
- final noYieldsExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
- r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
- r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
- ];
- await doTestAwait(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final noYieldsExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
+ r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
+ r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
+ ];
+ await doTestAwait(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitCatchError ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
- // mixedYields
- {
- final mixedYieldsExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final mixedYieldsExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ mixedYields, mixedYieldsExpected, debugInfoFilename);
- // syncSuffix
- {
- final syncSuffixExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final syncSuffixExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ syncSuffix, syncSuffixExpected, debugInfoFilename);
- // nonAsyncNoStack
- {
- final nonAsyncNoStackExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final nonAsyncNoStackExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowSync
- {
- final asyncStarThrowSyncExpected = const <String>[
- r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
- r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowSyncExpected = const <String>[
+ r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
+ r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowAsync
- {
- final asyncStarThrowAsyncExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowAsyncExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected, debugInfoFilename);
- // listenAsyncStarThrowAsync
- {
- final listenAsyncStartExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitThen(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- }
+ final listenAsyncStartExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- // customErrorZone
- {
- final customErrorZoneExpected = const <String>[
- r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
- r'<asynchronous suspension>$',
- ];
- await doTestAwait(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitThen(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- }
+ final customErrorZoneExpected = const <String>[
+ r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
+ r'<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
- // awaitTimeout
- {
- final awaitTimeoutExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitTimeout ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitTimeoutExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitTimeout ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitTimeout, awaitTimeoutExpected, debugInfoFilename);
- // awaitWait
- {
- final awaitWaitExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitWait ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitWait, awaitWaitExpected, debugInfoFilename);
- // futureSyncWhenComplete
{
final expected = const <String>[
r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1153,70 +986,11 @@
futureSyncWhenComplete,
expected +
const <String>[
- r'^#1 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
+ r'^#1 doTestAwaitThen.<anonymous closure> ',
r'^<asynchronous suspension>$',
],
debugInfoFilename);
await doTestAwaitCatchError(
- futureSyncWhenComplete,
- expected +
- const <String>[
- r'^#1 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
-
- // futureThen
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
+ futureSyncWhenComplete, expected, debugInfoFilename);
}
}
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index b7c4e02..192984f 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -178,22 +178,12 @@
return Future.sync(throwAsync).whenComplete(() => 'nop');
}
-// ----
-// Scenario: Future.then:
-// ----
-
-Future futureThen() {
- return Future.value(0).then((value) {
- throwSync();
- });
-}
-
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
final _lineRE = RegExp(r'^(?:#(?<number>\d+)|<asynchronous suspension>)');
-Future<void> assertStack(List<String> expects, StackTrace stackTrace,
+void assertStack(List<String> expects, StackTrace stackTrace,
[String debugInfoFilename]) async {
final original = await Stream.value(stackTrace.toString())
.transform(const LineSplitter())
@@ -263,7 +253,7 @@
await f();
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -277,7 +267,7 @@
await f().then((e) => Expect.fail('No exception thrown!'));
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -288,7 +278,7 @@
await f().catchError((e, s) {
stackTrace = s;
});
- return assertStack(expectedStack, stackTrace, debugInfoFilename);
+ assertStack(expectedStack, stackTrace, debugInfoFilename);
}
// ----
@@ -337,32 +327,39 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
+ r'^#16 doTestAwaitCatchError ',
r'^#17 _RootZone.runUnary ',
r'^#18 _FutureListener.handleValue ',
r'^#19 Future._propagateToListeners.handleValueCallback ',
r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#21 Future._completeError ',
+ r'^#22 _completeOnAsyncError ',
+ r'^#23 allYield ',
+ r'^#24 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#25 _RootZone.runBinary ',
+ r'^#26 _FutureListener.handleError ',
+ r'^#27 Future._propagateToListeners.handleError ',
+ r'^#28 Future._propagateToListeners ',
+ r'^#29 Future._completeError ',
+ r'^#30 _completeOnAsyncError ',
+ r'^#31 allYield2 ',
+ r'^#32 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#33 _RootZone.runBinary ',
+ r'^#34 _FutureListener.handleError ',
+ r'^#35 Future._propagateToListeners.handleError ',
+ r'^#36 Future._propagateToListeners ',
+ r'^#37 Future._completeError ',
+ r'^#38 _completeOnAsyncError ',
+ r'^#39 allYield3 ',
+ r'^#40 _RootZone.runUnary ',
+ r'^#41 _FutureListener.handleValue ',
+ r'^#42 Future._propagateToListeners.handleValueCallback ',
+ r'^#43 Future._propagateToListeners ',
+ r'^#44 Future._addListener.<anonymous closure> ',
+ r'^#45 _microtaskLoop ',
+ r'^#46 _startMicrotaskLoop ',
+ r'^#47 _runPendingImmediateCallback ',
+ r'^#48 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitThen(
@@ -378,32 +375,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwait ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitCatchError(
@@ -419,32 +418,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwaitThen ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
@@ -641,505 +642,337 @@
await doTestAwaitCatchError(
futureSyncWhenComplete, expected, debugInfoFilename);
}
-
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> \(.*/utils.dart:187(:5)?\)$',
- r'^#2 _RootZone.runUnary ',
- r'^#3 _FutureListener.handleValue ',
- r'^#4 Future._propagateToListeners.handleValueCallback ',
- r'^#5 Future._propagateToListeners ',
- r'^#6 Future._completeWithValue ',
- r'^#7 Future._asyncCompleteWithValue.<anonymous closure> ',
- r'^#8 _microtaskLoop ',
- r'^#9 _startMicrotaskLoop ',
- r'^#10 _runPendingImmediateCallback ',
- r'^#11 _RawReceivePortImpl._handleMessage ',
- ];
- await doTestAwait(futureThen, expected, debugInfoFilename);
- await doTestAwaitThen(futureThen, expected, debugInfoFilename);
- await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
- }
}
// For: --lazy-async-stacks
Future<void> doTestsLazy([String debugInfoFilename]) async {
- // allYield
- {
- final allYieldExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final allYieldExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
- // noYields
- {
- final noYieldsExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
- r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
- r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
- ];
- await doTestAwait(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final noYieldsExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
+ r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
+ r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
+ ];
+ await doTestAwait(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitCatchError ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
- // mixedYields
- {
- final mixedYieldsExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final mixedYieldsExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ mixedYields, mixedYieldsExpected, debugInfoFilename);
- // syncSuffix
- {
- final syncSuffixExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final syncSuffixExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ syncSuffix, syncSuffixExpected, debugInfoFilename);
- // nonAsyncNoStack
- {
- final nonAsyncNoStackExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final nonAsyncNoStackExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowSync
- {
- final asyncStarThrowSyncExpected = const <String>[
- r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
- r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowSyncExpected = const <String>[
+ r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
+ r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowAsync
- {
- final asyncStarThrowAsyncExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowAsyncExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected, debugInfoFilename);
- // listenAsyncStarThrowAsync
- {
- final listenAsyncStartExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitThen(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- }
+ final listenAsyncStartExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- // customErrorZone
- {
- final customErrorZoneExpected = const <String>[
- r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
- r'<asynchronous suspension>$',
- ];
- await doTestAwait(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitThen(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- }
+ final customErrorZoneExpected = const <String>[
+ r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
+ r'<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
- // awaitTimeout
- {
- final awaitTimeoutExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitTimeout ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitTimeoutExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitTimeout ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitTimeout, awaitTimeoutExpected, debugInfoFilename);
- // awaitWait
- {
- final awaitWaitExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitWait ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitWait, awaitWaitExpected, debugInfoFilename);
- // futureSyncWhenComplete
{
- final expected = const <String>[
+ final expect = const <String>[
r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
r'^<asynchronous suspension>$',
];
await doTestAwait(
futureSyncWhenComplete,
- expected +
+ expect +
const <String>[
r'^#1 doTestAwait ',
r'^<asynchronous suspension>$',
@@ -1151,72 +984,13 @@
debugInfoFilename);
await doTestAwaitThen(
futureSyncWhenComplete,
- expected +
+ expect +
const <String>[
- r'^#1 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
+ r'^#1 doTestAwaitThen.<anonymous closure> ',
r'^<asynchronous suspension>$',
],
debugInfoFilename);
await doTestAwaitCatchError(
- futureSyncWhenComplete,
- expected +
- const <String>[
- r'^#1 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
-
- // futureThen
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
+ futureSyncWhenComplete, expect, debugInfoFilename);
}
}
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 6822001..185af0a 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -196,8 +196,6 @@
V(_Utf8Decoder, _scan, Utf8DecoderScan, 0xb35ced99) \
V(_Future, timeout, FutureTimeout, 0x6ad7d1ef) \
V(Future, wait, FutureWait, 0x264aacc2) \
- V(_RootZone, runUnary, RootZoneRunUnary, 0x76e41d34) \
- V(_FutureListener, handleValue, FutureListenerHandleValue, 0x73894d16) \
// List of intrinsics:
// (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 51975f3..7f6775d 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1848,7 +1848,7 @@
/*skip_frames=*/0, &on_sync_frame,
&has_async);
- // If the entire stack is sync, return no (async) trace.
+ // If the entire stack is sync, return no trace.
if (!has_async) {
return nullptr;
}
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 96ad60d..5a6c5a9 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -528,19 +528,6 @@
frames_.Unpoison();
}
-StackFrameIterator::StackFrameIterator(const StackFrameIterator& orig)
- : validate_(orig.validate_),
- entry_(orig.thread_),
- exit_(orig.thread_),
- frames_(orig.thread_),
- current_frame_(nullptr),
- thread_(orig.thread_) {
- frames_.fp_ = orig.frames_.fp_;
- frames_.sp_ = orig.frames_.sp_;
- frames_.pc_ = orig.frames_.pc_;
- frames_.Unpoison();
-}
-
StackFrame* StackFrameIterator::NextFrame() {
// When we are at the start of iteration after having created an
// iterator object, current_frame_ will be NULL as we haven't seen
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 6969642..92f864f 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -236,8 +236,6 @@
Thread* thread,
CrossThreadPolicy cross_thread_policy);
- StackFrameIterator(const StackFrameIterator& orig);
-
// Checks if a next frame exists.
bool HasNextFrame() const { return frames_.fp_ != 0; }
@@ -302,6 +300,7 @@
Thread* thread_;
friend class ProfilerDartStackWalker;
+ DISALLOW_COPY_AND_ASSIGN(StackFrameIterator);
};
// Iterator for iterating over all dart frames (skips over exit frames,
@@ -340,8 +339,6 @@
thread,
cross_thread_policy) {}
- DartFrameIterator(const DartFrameIterator& orig) : frames_(orig.frames_) {}
-
// Get next dart frame.
StackFrame* NextFrame() {
StackFrame* frame = frames_.NextFrame();
@@ -353,6 +350,8 @@
private:
StackFrameIterator frames_;
+
+ DISALLOW_COPY_AND_ASSIGN(DartFrameIterator);
};
// Iterator for iterating over all inlined dart functions in an optimized
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index a231568..ae8849a 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -10,18 +10,11 @@
namespace dart {
-// Keep in sync with:
-// - sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
+// Keep in sync with
+// sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
const intptr_t k_StreamController__STATE_SUBSCRIBED = 1;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateThen.
-const intptr_t k_FutureListener_stateThen = 1;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateCatchError.
-const intptr_t k_FutureListener_stateCatchError = 2;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateWhenComplete.
-const intptr_t k_FutureListener_stateWhenComplete = 8;
-
-// Keep in sync with sdk/lib/async/future_impl.dart:_FutureListener.handleValue.
-const intptr_t kNumArgsFutureListenerHandleValue = 1;
+// sdk/lib/async/future_impl.dart:_FutureListener.stateWhencomplete.
+const intptr_t k_FutureListener_stateWhencomplete = 8;
// Find current yield index from async closure.
// Async closures contains a variable, :await_jump_var that holds the index into
@@ -147,19 +140,21 @@
ASSERT(!future.IsNull());
ASSERT(future.GetClassId() == future_impl_class.id());
- // Since this function is recursive, we have to keep a local ref.
- auto& listener = Object::Handle(
- Instance::Cast(future).GetField(future_result_or_listeners_field));
- if (listener.GetClassId() != future_listener_class.id()) {
+ listener_ = Instance::Cast(future).GetField(future_result_or_listeners_field);
+ if (listener_.GetClassId() != future_listener_class.id()) {
return Closure::null();
}
- callback_ = GetCallerInFutureListener(listener);
- if (callback_.IsInstance() && !callback_.IsNull()) {
- return Closure::Cast(callback_).ptr();
+ // If the _FutureListener is a whenComplete listener, follow the Future being
+ // completed, `result`, instead of the dangling whenComplete `callback`.
+ state_ = Instance::Cast(listener_).GetField(future_listener_state_field);
+ ASSERT(state_.IsSmi());
+ if (Smi::Cast(state_).Value() == k_FutureListener_stateWhencomplete) {
+ future_ = Instance::Cast(listener_).GetField(future_listener_result_field);
+ return GetCallerInFutureImpl(future_);
}
- callback_ = Instance::Cast(listener).GetField(callback_field);
+ callback_ = Instance::Cast(listener_).GetField(callback_field);
// This happens for e.g.: await f().catchError(..);
if (callback_.IsNull()) {
return Closure::null();
@@ -226,46 +221,22 @@
UNREACHABLE(); // If no onData is found we have a bug.
}
-ClosurePtr CallerClosureFinder::GetCallerInFutureListener(
- const Object& future_listener) {
- ASSERT(future_listener.GetClassId() == future_listener_class.id());
-
- state_ =
- Instance::Cast(future_listener).GetField(future_listener_state_field);
-
- auto value = Smi::Cast(state_).Value();
- // If the _FutureListener is a `then`, `catchError`, or `whenComplete`
- // listener, follow the Future being completed, `result`, instead of the
- // dangling whenComplete `callback`.
- if (value == k_FutureListener_stateThen ||
- value == k_FutureListener_stateCatchError ||
- value == k_FutureListener_stateWhenComplete) {
- future_ =
- Instance::Cast(future_listener).GetField(future_listener_result_field);
- return GetCallerInFutureImpl(future_);
- }
-
- return Closure::null();
-}
-
ClosurePtr CallerClosureFinder::FindCaller(const Closure& receiver_closure) {
receiver_function_ = receiver_closure.function();
receiver_context_ = receiver_closure.context();
if (receiver_function_.IsAsyncClosure()) {
return FindCallerInAsyncClosure(receiver_context_);
- }
- if (receiver_function_.IsAsyncGenClosure()) {
+ } else if (receiver_function_.IsAsyncGenClosure()) {
return FindCallerInAsyncGenClosure(receiver_context_);
- }
- if (receiver_function_.IsLocalFunction()) {
+ } else if (receiver_function_.IsLocalFunction()) {
parent_function_ = receiver_function_.parent_function();
if (parent_function_.recognized_kind() ==
MethodRecognizer::kFutureTimeout) {
context_entry_ = receiver_context_.At(Context::kFutureTimeoutFutureIndex);
return GetCallerInFutureImpl(context_entry_);
- }
- if (parent_function_.recognized_kind() == MethodRecognizer::kFutureWait) {
+ } else if (parent_function_.recognized_kind() ==
+ MethodRecognizer::kFutureWait) {
receiver_context_ = receiver_context_.parent();
ASSERT(!receiver_context_.IsNull());
context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
@@ -329,114 +300,6 @@
UNREACHABLE();
}
-ClosurePtr StackTraceUtils::ClosureFromFrameFunction(
- Zone* zone,
- CallerClosureFinder* caller_closure_finder,
- const DartFrameIterator& frames,
- StackFrame* frame,
- bool* skip_frame,
- bool* is_async) {
- auto& closure = Closure::Handle(zone);
- auto& function = Function::Handle(zone);
-
- function = frame->LookupDartFunction();
- if (function.IsNull()) {
- return Closure::null();
- }
-
- if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
- {
- NoSafepointScope nsp;
-
- // Next, look up caller's closure on the stack and walk backwards
- // through the yields.
- ObjectPtr* last_caller_obj =
- reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
- closure = FindClosureInFrame(last_caller_obj, function);
-
- // If this async function hasn't yielded yet, we're still dealing with a
- // normal stack. Continue to next frame as usual.
- if (!caller_closure_finder->IsRunningAsync(closure)) {
- return Closure::null();
- }
- }
-
- *is_async = true;
-
- // Skip: Already handled this as a sync. frame.
- return caller_closure_finder->FindCaller(closure);
- }
-
- // May have been called from `_FutureListener.handleValue`, which means its
- // receiver holds the Future chain.
- if (function.recognized_kind() == MethodRecognizer::kRootZoneRunUnary) {
- DartFrameIterator future_frames(frames);
- frame = future_frames.NextFrame();
- function = frame->LookupDartFunction();
- if (function.recognized_kind() !=
- MethodRecognizer::kFutureListenerHandleValue) {
- return Closure::null();
- }
- }
- if (function.recognized_kind() ==
- MethodRecognizer::kFutureListenerHandleValue) {
- *is_async = true;
- *skip_frame = true;
-
- // The _FutureListener receiver is at the top of the previous frame, right
- // before the arguments to the call.
- Object& receiver =
- Object::Handle(*(reinterpret_cast<ObjectPtr*>(frame->GetCallerSp()) +
- kNumArgsFutureListenerHandleValue));
-
- return caller_closure_finder->GetCallerInFutureListener(receiver);
- }
-
- return Closure::null();
-}
-
-void StackTraceUtils::UnwindAwaiterChain(
- Zone* zone,
- const GrowableObjectArray& code_array,
- const GrowableObjectArray& pc_offset_array,
- CallerClosureFinder* caller_closure_finder,
- ClosurePtr leaf_closure) {
- auto& code = Code::Handle(zone);
- auto& function = Function::Handle(zone);
- auto& closure = Closure::Handle(zone, leaf_closure);
- auto& pc_descs = PcDescriptors::Handle(zone);
- auto& offset = Smi::Handle(zone);
-
- // Inject async suspension marker.
- code_array.Add(StubCode::AsynchronousGapMarker());
- offset = Smi::New(0);
- pc_offset_array.Add(offset);
-
- // Traverse the trail of async futures all the way up.
- for (; !closure.IsNull();
- closure = caller_closure_finder->FindCaller(closure)) {
- function = closure.function();
- if (function.IsNull()) {
- continue;
- }
- // In hot-reload-test-mode we sometimes have to do this:
- code = function.EnsureHasCode();
- RELEASE_ASSERT(!code.IsNull());
- code_array.Add(code);
- pc_descs = code.pc_descriptors();
- offset = Smi::New(FindPcOffset(pc_descs, GetYieldIndex(closure)));
- // Unlike other sources of PC offsets, the offset may be 0 here if we
- // reach a non-async closure receiving the yielded value.
- ASSERT(offset.Value() >= 0);
- pc_offset_array.Add(offset);
-
- // Inject async suspension marker.
- code_array.Add(StubCode::AsynchronousGapMarker());
- offset = Smi::New(0);
- pc_offset_array.Add(offset);
- }
-}
-
void StackTraceUtils::CollectFramesLazy(
Thread* thread,
const GrowableObjectArray& code_array,
@@ -457,10 +320,13 @@
return;
}
+ auto& function = Function::Handle(zone);
auto& code = Code::Handle(zone);
auto& offset = Smi::Handle(zone);
+ auto& closure = Closure::Handle(zone);
CallerClosureFinder caller_closure_finder(zone);
+ auto& pc_descs = PcDescriptors::Handle();
// Start by traversing the sync. part of the stack.
for (; frame != nullptr; frame = frames.NextFrame()) {
@@ -469,36 +335,79 @@
continue;
}
- // If we encounter a known part of the async/Future mechanism, unwind the
- // awaiter chain from the closures.
- bool skip_frame = false;
- bool is_async = false;
- auto closure_ptr = ClosureFromFrameFunction(
- zone, &caller_closure_finder, frames, frame, &skip_frame, &is_async);
+ function = frame->LookupDartFunction();
- // This isn't a special (async) frame we should skip.
- if (!skip_frame) {
- // Add the current synchronous frame.
- code = frame->LookupDartCode();
- code_array.Add(code);
- const intptr_t pc_offset = frame->pc() - code.PayloadStart();
- ASSERT(pc_offset > 0 && pc_offset <= code.Size());
- offset = Smi::New(pc_offset);
- pc_offset_array.Add(offset);
- // Callback for sync frame.
- if (on_sync_frames != nullptr) {
- (*on_sync_frames)(frame);
- }
+ // Add the current synchronous frame.
+ code = frame->LookupDartCode();
+ ASSERT(function.ptr() == code.function());
+ code_array.Add(code);
+ const intptr_t pc_offset = frame->pc() - code.PayloadStart();
+ ASSERT(pc_offset > 0 && pc_offset <= code.Size());
+ offset = Smi::New(pc_offset);
+ pc_offset_array.Add(offset);
+ if (on_sync_frames != nullptr) {
+ (*on_sync_frames)(frame);
}
- // This frame is running async.
- // Note: The closure might still be null in case it's an unawaited future.
- if (is_async) {
- UnwindAwaiterChain(zone, code_array, pc_offset_array,
- &caller_closure_finder, closure_ptr);
+ // Either continue the loop (sync-async case) or find all await'ers and
+ // return.
+ if (!function.IsNull() &&
+ (function.IsAsyncClosure() || function.IsAsyncGenClosure())) {
if (has_async != nullptr) {
*has_async = true;
}
+
+ {
+ NoSafepointScope nsp;
+
+ // Next, look up caller's closure on the stack and walk backwards
+ // through the yields.
+ ObjectPtr* last_caller_obj =
+ reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
+ closure = FindClosureInFrame(last_caller_obj, function);
+
+ // If this async function hasn't yielded yet, we're still dealing with a
+ // normal stack. Continue to next frame as usual.
+ if (!caller_closure_finder.IsRunningAsync(closure)) {
+ continue;
+ }
+ }
+
+ // Inject async suspension marker.
+ code_array.Add(StubCode::AsynchronousGapMarker());
+ offset = Smi::New(0);
+ pc_offset_array.Add(offset);
+
+ // Skip: Already handled this frame's function above.
+ closure = caller_closure_finder.FindCaller(closure);
+
+ // Traverse the trail of async futures all the way up.
+ for (; !closure.IsNull();
+ closure = caller_closure_finder.FindCaller(closure)) {
+ function = closure.function();
+ // In hot-reload-test-mode we sometimes have to do this:
+ if (!function.HasCode()) {
+ function.EnsureHasCode();
+ }
+ if (function.HasCode()) {
+ code = function.CurrentCode();
+ code_array.Add(code);
+ pc_descs = code.pc_descriptors();
+ offset = Smi::New(FindPcOffset(pc_descs, GetYieldIndex(closure)));
+ } else {
+ UNREACHABLE();
+ }
+ // Unlike other sources of PC offsets, the offset may be 0 here if we
+ // reach a non-async closure receiving the yielded value.
+ ASSERT(offset.Value() >= 0);
+ pc_offset_array.Add(offset);
+
+ // Inject async suspension marker.
+ code_array.Add(StubCode::AsynchronousGapMarker());
+ offset = Smi::New(0);
+ pc_offset_array.Add(offset);
+ }
+
// Ignore the rest of the stack; already unwound all async calls.
return;
}
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index 75ba724..215da83 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -21,8 +21,6 @@
ClosurePtr GetCallerInFutureImpl(const Object& future_);
- ClosurePtr GetCallerInFutureListener(const Object& future_listener);
-
ClosurePtr FindCallerInAsyncClosure(const Context& receiver_context);
ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context);
@@ -63,8 +61,6 @@
Field& state_field;
Field& on_data_field;
Field& state_data_field;
-
- DISALLOW_COPY_AND_ASSIGN(CallerClosureFinder);
};
class StackTraceUtils : public AllStatic {
@@ -73,20 +69,6 @@
static ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
const Function& function);
- static ClosurePtr ClosureFromFrameFunction(
- Zone* zone,
- CallerClosureFinder* caller_closure_finder,
- const DartFrameIterator& frames,
- StackFrame* frame,
- bool* skip_frame,
- bool* is_async);
-
- static void UnwindAwaiterChain(Zone* zone,
- const GrowableObjectArray& code_array,
- const GrowableObjectArray& pc_offset_array,
- CallerClosureFinder* caller_closure_finder,
- ClosurePtr leaf_closure);
-
/// Collects all frames on the current stack until an async/async* frame is
/// hit which has yielded before (i.e. is not in sync-async case).
///
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index a9f2b80..df8a347 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -63,19 +63,18 @@
}
class _FutureListener<S, T> {
- // Keep in sync with sdk/runtime/vm/stack_trace.cc.
static const int maskValue = 1;
static const int maskError = 2;
static const int maskTestError = 4;
- static const int maskWhenComplete = 8;
+ static const int maskWhencomplete = 8;
static const int stateChain = 0;
static const int stateThen = maskValue;
static const int stateThenOnerror = maskValue | maskError;
- static const int stateCatchError = maskError;
- static const int stateCatchErrorTest = maskError | maskTestError;
- static const int stateWhenComplete = maskWhenComplete;
+ static const int stateCatcherror = maskError;
+ static const int stateCatcherrorTest = maskError | maskTestError;
+ static const int stateWhencomplete = maskWhencomplete;
static const int maskType =
- maskValue | maskError | maskTestError | maskWhenComplete;
+ maskValue | maskError | maskTestError | maskWhencomplete;
static const int stateIsAwait = 16;
// Listeners on the same future are linked through this link.
@@ -110,18 +109,18 @@
stateIsAwait;
_FutureListener.catchError(this.result, this.errorCallback, this.callback)
- : state = (callback == null) ? stateCatchError : stateCatchErrorTest;
+ : state = (callback == null) ? stateCatcherror : stateCatcherrorTest;
_FutureListener.whenComplete(this.result, this.callback)
: errorCallback = null,
- state = stateWhenComplete;
+ state = stateWhencomplete;
_Zone get _zone => result._zone;
bool get handlesValue => (state & maskValue != 0);
bool get handlesError => (state & maskError != 0);
- bool get hasErrorTest => (state & maskType == stateCatchErrorTest);
- bool get handlesComplete => (state & maskType == stateWhenComplete);
+ bool get hasErrorTest => (state & maskType == stateCatcherrorTest);
+ bool get handlesComplete => (state & maskType == stateWhencomplete);
bool get isAwait => (state & stateIsAwait != 0);
FutureOr<T> Function(S) get _onValue {
@@ -149,8 +148,6 @@
return _onError != null;
}
- @pragma("vm:recognized", "other")
- @pragma("vm:never-inline")
FutureOr<T> handleValue(S sourceResult) {
return _zone.runUnary<FutureOr<T>, S>(_onValue, sourceResult);
}
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 5400814..4f0873d 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -1608,7 +1608,6 @@
return _rootRun(null, null, this, f);
}
- @pragma("vm:recognized", "other")
R runUnary<R, T>(R f(T arg), T arg) {
if (identical(Zone._current, _rootZone)) return f(arg);
return _rootRunUnary(null, null, this, f, arg);