@@ -96,6 +96,37 @@ Future nonAsyncNoStack1() async => await nonAsyncNoStack2();
9696
9797Future nonAsyncNoStack2 () async => Future .value (0 ).then ((_) => throwAsync ());
9898
99+ // ----
100+ // Scenario: async*:
101+ // ----
102+
103+ Future awaitEveryAsyncStarThrowSync () async {
104+ await for (Future v in asyncStarThrowSync ()) {
105+ await v;
106+ }
107+ }
108+
109+ Stream <Future > asyncStarThrowSync () async * {
110+ for (int i = 0 ; i < 2 ; i++ ) {
111+ await i;
112+ yield throwSync ();
113+ }
114+ }
115+
116+ Future awaitEveryAsyncStarThrowAsync () async {
117+ await for (Future v in asyncStarThrowAsync ()) {
118+ await v;
119+ }
120+ }
121+
122+ Stream <Future > asyncStarThrowAsync () async * {
123+ for (int i = 0 ; i < 2 ; i++ ) {
124+ await i;
125+ yield Future .value (i);
126+ await throwAsync ();
127+ }
128+ }
129+
99130// Helpers:
100131
101132void assertStack (List <String > expects, StackTrace stackTrace) {
@@ -354,6 +385,93 @@ Future<void> doTestsCausal() async {
354385 await doTestAwait (nonAsyncNoStack, nonAsyncNoStackExpected);
355386 await doTestAwaitThen (nonAsyncNoStack, nonAsyncNoStackExpected);
356387 await doTestAwaitCatchError (nonAsyncNoStack, nonAsyncNoStackExpected);
388+
389+ final asyncStarThrowSyncExpected = const < String > [
390+ r'^#0 throwSync \(.*/utils.dart:(16|16:3)\)$' ,
391+ r'^#1 asyncStarThrowSync \(.*/utils.dart:(112|112:11)\)$' ,
392+ r'^<asynchronous suspension>$' ,
393+ r'^#2 awaitEveryAsyncStarThrowSync \(.+\)$' ,
394+ ];
395+ await doTestAwait (
396+ awaitEveryAsyncStarThrowSync,
397+ asyncStarThrowSyncExpected +
398+ const < String > [
399+ r'^#3 doTestAwait \(.+\)$' ,
400+ r'^#4 doTestsCausal \(.+\)$' ,
401+ r'^<asynchronous suspension>$' ,
402+ r'^#5 main \(.+\)$' ,
403+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
404+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
405+ r'^$' ,
406+ ]);
407+ await doTestAwaitThen (
408+ awaitEveryAsyncStarThrowSync,
409+ asyncStarThrowSyncExpected +
410+ const < String > [
411+ r'^#3 doTestAwaitThen \(.+\)$' ,
412+ r'^#4 doTestsCausal \(.+\)$' ,
413+ r'^<asynchronous suspension>$' ,
414+ r'^#5 main \(.+\)$' ,
415+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
416+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
417+ r'^$' ,
418+ ]);
419+ await doTestAwaitCatchError (
420+ awaitEveryAsyncStarThrowSync,
421+ asyncStarThrowSyncExpected +
422+ const < String > [
423+ r'^#3 doTestAwaitCatchError \(.+\)$' ,
424+ r'^#4 doTestsCausal \(.+\)$' ,
425+ r'^<asynchronous suspension>$' ,
426+ r'^#5 main \(.+\)$' ,
427+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
428+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
429+ r'^$' ,
430+ ]);
431+
432+ final asyncStarThrowAsyncExpected = const < String > [
433+ r'^#0 throwAsync \(.*/utils.dart:(21|21:3)\)$' ,
434+ r'^<asynchronous suspension>$' ,
435+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:(126|126:11)\)$' ,
436+ r'^<asynchronous suspension>$' ,
437+ r'^#2 awaitEveryAsyncStarThrowAsync \(.+\)$' ,
438+ ];
439+ await doTestAwait (
440+ awaitEveryAsyncStarThrowAsync,
441+ asyncStarThrowAsyncExpected +
442+ const < String > [
443+ r'^#3 doTestAwait \(.+\)$' ,
444+ r'^#4 doTestsCausal \(.+\)$' ,
445+ r'^<asynchronous suspension>$' ,
446+ r'^#5 main \(.+\)$' ,
447+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
448+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
449+ r'^$' ,
450+ ]);
451+ await doTestAwaitThen (
452+ awaitEveryAsyncStarThrowAsync,
453+ asyncStarThrowAsyncExpected +
454+ const < String > [
455+ r'^#3 doTestAwaitThen \(.+\)$' ,
456+ r'^#4 doTestsCausal \(.+\)$' ,
457+ r'^<asynchronous suspension>$' ,
458+ r'^#5 main \(.+\)$' ,
459+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
460+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
461+ r'^$' ,
462+ ]);
463+ await doTestAwaitCatchError (
464+ awaitEveryAsyncStarThrowAsync,
465+ asyncStarThrowAsyncExpected +
466+ const < String > [
467+ r'^#3 doTestAwaitCatchError \(.+\)$' ,
468+ r'^#4 doTestsCausal \(.+\)$' ,
469+ r'^<asynchronous suspension>$' ,
470+ r'^#5 main \(.+\)$' ,
471+ r'^#6 _startIsolate.<anonymous closure> \(.+\)$' ,
472+ r'^#7 _RawReceivePortImpl._handleMessage \(.+\)$' ,
473+ r'^$' ,
474+ ]);
357475}
358476
359477// For: --no-causal-async-stacks
@@ -586,6 +704,47 @@ Future<void> doTestsNoCausal() async {
586704 await doTestAwait (nonAsyncNoStack, nonAsyncNoStackExpected);
587705 await doTestAwaitThen (nonAsyncNoStack, nonAsyncNoStackExpected);
588706 await doTestAwaitCatchError (nonAsyncNoStack, nonAsyncNoStackExpected);
707+
708+ final asyncStarThrowSyncExpected = const < String > [
709+ r'^#0 throwSync \(.+/utils.dart:(16|16:3)\)$' ,
710+ r'^#1 asyncStarThrowSync \(.+/utils.dart:(112|112:11)\)$' ,
711+ r'^#2 _RootZone.runUnary \(.+\)$' ,
712+ r'^#3 _FutureListener.handleValue \(.+\)$' ,
713+ r'^#4 Future._propagateToListeners.handleValueCallback \(.+\)$' ,
714+ r'^#5 Future._propagateToListeners \(.+\)$' ,
715+ // TODO(dart-vm): Figure out why this is inconsistent:
716+ r'^#6 Future.(_addListener|_prependListeners).<anonymous closure> \(.+\)$' ,
717+ r'^#7 _microtaskLoop \(.+\)$' ,
718+ r'^#8 _startMicrotaskLoop \(.+\)$' ,
719+ r'^#9 _runPendingImmediateCallback \(.+\)$' ,
720+ r'^#10 _RawReceivePortImpl._handleMessage \(.+\)$' ,
721+ r'^$' ,
722+ ];
723+ await doTestAwait (awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
724+ await doTestAwaitThen (
725+ awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
726+ await doTestAwaitCatchError (
727+ awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
728+
729+ final asyncStarThrowAsyncExpected = const < String > [
730+ r'^#0 throwAsync \(.*/utils.dart:(21|21:3)\)$' ,
731+ r'^#1 _RootZone.runUnary ' ,
732+ r'^#2 _FutureListener.handleValue ' ,
733+ r'^#3 Future._propagateToListeners.handleValueCallback ' ,
734+ r'^#4 Future._propagateToListeners ' ,
735+ // TODO(dart-vm): Figure out why this is inconsistent:
736+ r'^#5 Future.(_addListener|_prependListeners).<anonymous closure> ' ,
737+ r'^#6 _microtaskLoop ' ,
738+ r'^#7 _startMicrotaskLoop ' ,
739+ r'^#8 _runPendingImmediateCallback ' ,
740+ r'^#9 _RawReceivePortImpl._handleMessage ' ,
741+ r'^$' ,
742+ ];
743+ await doTestAwait (awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
744+ await doTestAwaitThen (
745+ awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
746+ await doTestAwaitCatchError (
747+ awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
589748}
590749
591750// For: --lazy-async-stacks
@@ -744,4 +903,32 @@ Future<void> doTestsLazy() async {
744903 const < String > [
745904 r'^$' ,
746905 ]);
906+
907+ final asyncStarThrowSyncExpected = const < String > [
908+ r'^#0 throwSync \(.+/utils.dart:(16|16:3)\)$' ,
909+ r'^#1 asyncStarThrowSync \(.+/utils.dart:(112|112:11)\)$' ,
910+ r'^<asynchronous suspension>$' ,
911+ // Non-visible _onData frame.
912+ r'^<asynchronous suspension>$' ,
913+ r'^$' ,
914+ ];
915+ await doTestAwait (awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
916+ await doTestAwaitThen (
917+ awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
918+ await doTestAwaitCatchError (
919+ awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
920+
921+ final asyncStarThrowAsyncExpected = const < String > [
922+ r'^#0 throwAsync \(.*/utils.dart:(21|21:3)\)$' ,
923+ r'^<asynchronous suspension>$' ,
924+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:(0|126|126:5)\)$' ,
925+ r'^<asynchronous suspension>$' ,
926+ // Non-visible _onData frame.
927+ r'^<asynchronous suspension>$' ,
928+ ];
929+ await doTestAwait (awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
930+ await doTestAwaitThen (
931+ awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
932+ await doTestAwaitCatchError (
933+ awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
747934}
0 commit comments