Skip to content

Commit

Permalink
[vm] New implementation of sync* based on suspend/resume stubs
Browse files Browse the repository at this point in the history
Issue: #48378
Change-Id: I7f4b6b56d914a617dfd7ac724cd4414532073b4c
TEST=ci
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/249141
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
  • Loading branch information
alexmarkov authored and Commit Bot committed Jun 27, 2022
1 parent ee86c92 commit 77ea982
Show file tree
Hide file tree
Showing 53 changed files with 3,601 additions and 3,160 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,7 @@ extension Extension on core::int {
method asyncStarMethod = self::Extension|asyncStarMethod;
tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
}
static method Extension|syncStarMethod(lowered final core::int #this) → dynamic /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
core::int :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
}
static method Extension|syncStarMethod(lowered final core::int #this) → dynamic sync* {}
static method Extension|get#syncStarMethod(lowered final core::int #this) → () → dynamic
return () → dynamic => self::Extension|syncStarMethod(#this);
static method Extension|asyncMethod(lowered final core::int #this) → dynamic async /* futureValueType= dynamic */ {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,47 +12,13 @@ static method asyncString() → asy::Future<core::String> async /* futureValueTy
static method asyncString2() → asy::Future<core::String> async /* futureValueType= core::String */ {
return self::asyncString();
}
static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
core::int :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → 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 :sync_op;
}
return new core::_SyncIterable::•<core::String>(:sync_op_gen);
static method syncStarString() → core::Iterable<core::String> sync* {
yield "foo";
yield* self::syncStarString2();
yield* self::stringList;
}
static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
core::int :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = "foo";
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::String>(:sync_op_gen);
static method syncStarString2() → core::Iterable<core::String> sync* {
yield "foo";
}
static method asyncStarString() → asy::Stream<core::String> async* {
yield "foo";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,12 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

static method getElements() → core::Iterable<core::int> /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
core::int :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
core::Iterable<core::int> elements;
elements = (() → core::Iterable<core::int> /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
core::int :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = 7;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::int>(:sync_op_gen);
})(){() → core::Iterable<core::int>};
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = elements;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::int>(:sync_op_gen);
static method getElements() → core::Iterable<core::int> sync* {
core::Iterable<core::int> elements;
elements = (() → core::Iterable<core::int> sync* {
yield 7;
})(){() → core::Iterable<core::int>};
yield* elements;
}
static method main() → dynamic
return core::print(self::getElements());
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,8 @@ import self as self;
import "dart:core" as core;

static method main() → dynamic {
() →* core::Iterable<Null>* f = () → core::Iterable<Null>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = null;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<Null>(:sync_op_gen);
() →* core::Iterable<Null>* f = () → core::Iterable<Null>* sync* {
yield null;
};
core::Iterable<dynamic>* y = f(){() →* core::Iterable<Null>*};
core::Iterable<core::String*>* z = f(){() →* core::Iterable<Null>*};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,9 @@ import self as self;
import "dart:core" as core;

static method test() → dynamic {
() →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = 1;
[yield] true;
}
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::_literal2<core::num*>(3, 4.0);
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::num*>(:sync_op_gen);
() →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* sync* {
yield 1;
yield* core::_GrowableList::_literal2<core::num*>(3, 4.0);
};
core::Iterable<core::num*>* g = f(){() →* core::Iterable<core::num*>*};
core::Iterable<core::int*>* h = f(){() →* core::Iterable<core::num*>*} as{TypeError} core::Iterable<core::int*>*;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,42 +97,19 @@ static method foo() → asy::Stream<core::List<core::int*>*>* async* {
^" in core::_GrowableList::•<dynamic>(0) as{TypeError} asy::Stream<core::List<core::int*>*>*;
yield* self::MyStream::•<core::List<core::int*>*>();
}
static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = core::Map::•<core::int*, core::int*>();
[yield] true;
}
{
:iterator.{core::_SyncIterator::_current} = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:63: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* sync* {
yield core::Map::•<core::int*, core::int*>();
yield invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:63: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
- 'List' is from 'dart:core'.
- 'Map' is from 'dart:core'.
yield /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
^" in core::_GrowableList::•<dynamic>(0) as{TypeError} core::Map<core::int*, core::int*>*;
[yield] true;
}
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
yield* invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
- 'Map' is from 'dart:core'.
- 'Iterable' is from 'dart:core'.
yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int*, core::int*>*>*;
[yield] true;
}
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<core::Map<core::int*, core::int*>*>(0);
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::Map<core::int*, core::int*>*>(:sync_op_gen);
yield* core::_GrowableList::•<core::Map<core::int*, core::int*>*>(0);
}
static method main() → dynamic {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,8 @@ static method test() → dynamic {
function f3() → asy::Future<core::int*>* async /* futureValueType= core::int* */ {
return 42;
}
function f4() → core::Iterable<core::int*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = 42;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<core::int*>(:sync_op_gen);
function f4() → core::Iterable<core::int*>* sync* {
yield 42;
}
function f5() → asy::Stream<core::int*>* async* {
yield 42;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,39 +24,11 @@ static method main() → dynamic {
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
}
function c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
function c() → core::Iterable<(core::int*) →* core::int*>* sync* {
yield(core::int* x) → core::int* => x;
}
function d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x);
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
function d() → core::Iterable<(core::int*) →* core::int*>* sync* {
yield* core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x);
}
function e() → asy::Stream<(core::int*) →* core::int*>* async* {
yield(core::int* x) → core::int* => x;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,11 @@ static method b() → asy::Future<(core::int*) →* core::int*>* async /* future
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
}
static method c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
static method c() → core::Iterable<(core::int*) →* core::int*>* sync* {
yield(core::int* x) → core::int* => x;
}
static method d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
{
{
:iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x);
[yield] true;
}
}
return false;
}
return :sync_op;
}
return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
static method d() → core::Iterable<(core::int*) →* core::int*>* sync* {
yield* core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x);
}
static method e() → asy::Stream<(core::int*) →* core::int*>* async* {
yield(core::int* x) → core::int* => x;
Expand Down
Loading

0 comments on commit 77ea982

Please sign in to comment.