Files
sdk/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
T
Alexander Aprelev e71bd048e5 [vm, kernel] Fix async stack code traversal in dart2.
With this change debugger requests yield(await) positions from kernel builder so it can confirm which frame handles what exceptions.
This also renames ':completer' to ':async_completer' in constructed kernel, so it is compliant with what VM expects to see(and updates test expectations accordingly).
Further it fixes async stack navigation for sync-async that became default in dart vm since first version went for the review((uses `future` getter, rather than property).
It also makes `future` getter non-debuggable to allow stepping-out of async methods.

Make Handle zone-scoped. Clean up frame counter var name.

Bug: https://github.com/dart-lang/sdk/issues/29056

Change-Id: Ia71f3c851a6b313655b57dad28c296f5dd081eda
Reviewed-on: https://dart-review.googlesource.com/54640
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
2018-05-22 00:27:01 +00:00

200 lines
7.4 KiB
Plaintext

library;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
static field core::List<core::String> stringList = <dynamic>["bar"];
static method asyncString() → asy::Future<core::String> /* originally async */ {
final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
asy::FutureOr<core::String> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
dynamic :async_op_error;
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L1:
{
:return_value = "foo";
break #L1;
}
:async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
asy::Future::microtask<dynamic>(:async_op);
return :async_completer.{asy::Completer::future};
}
static method asyncString2() → asy::Future<core::String> /* originally async */ {
final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
asy::FutureOr<core::String> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
dynamic :async_op_error;
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L2:
{
:return_value = self::asyncString();
break #L2;
}
:async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
asy::Future::microtask<dynamic>(:async_op);
return :async_completer.{asy::Completer::future};
}
static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
{
{
:iterator.{core::_SyncIterator::_current} = "foo";
[yield] true;
}
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
[yield] true;
}
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
[yield] true;
}
}
return false;
}
return new core::_SyncIterable::•<core::String>(:sync_op);
}
static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
{
{
:iterator.{core::_SyncIterator::_current} = "foo";
[yield] true;
}
}
return false;
}
return new core::_SyncIterable::•<core::String>(:sync_op);
}
static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
asy::_AsyncStarStreamController<core::String> :controller;
dynamic :async_stack_trace;
dynamic :async_op_then;
dynamic :async_op_error;
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
dynamic :saved_try_context_var0;
dynamic :saved_try_context_var1;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try
try {
#L3:
{
if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
return null;
else
[yield] null;
if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
return null;
else
[yield] null;
[yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
if(:controller.{asy::_AsyncStarStreamController::add}(:result))
return null;
else
[yield] null;
}
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
:controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
}
finally {
:controller.{asy::_AsyncStarStreamController::close}();
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
:controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
return :controller.{asy::_AsyncStarStreamController::stream};
}
static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
asy::_AsyncStarStreamController<core::String> :controller;
dynamic :async_stack_trace;
dynamic :async_op_then;
dynamic :async_op_error;
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
dynamic :saved_try_context_var0;
dynamic :saved_try_context_var1;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try
try {
#L4:
{
if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
return null;
else
[yield] null;
}
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
:controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
}
finally {
:controller.{asy::_AsyncStarStreamController::close}();
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
:controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
return :controller.{asy::_AsyncStarStreamController::stream};
}
static method main() → dynamic /* originally async */ {
final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
dynamic :async_op_error;
dynamic :await_jump_var = 0;
dynamic :await_ctx_var;
dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L5:
{
[yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
core::String str = :result;
}
:async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
:async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
asy::Future::microtask<dynamic>(:async_op);
return :async_completer.{asy::Completer::future};
}