| Index: runtime/lib/core_patch.dart
|
| ===================================================================
|
| --- runtime/lib/core_patch.dart (revision 43515)
|
| +++ runtime/lib/core_patch.dart (working copy)
|
| @@ -21,3 +21,54 @@
|
| static const List<String> _enum_names = null;
|
| String toString() => _enum_names[index];
|
| }
|
| +
|
| +typedef bool SyncGeneratorCallback(Iterator iterator);
|
| +
|
| +// _SyncIterable and _syncIterator are used by the compiler to
|
| +// implement sync* generator functions. A sync* generator allocates
|
| +// and returns a new _SyncIterable object.
|
| +class _SyncIterable extends IterableBase {
|
| + // moveNextFn is the closurized body of the generator function.
|
| + final SyncGeneratorCallback moveNextFn;
|
| +
|
| + const _SyncIterable(this.moveNextFn);
|
| +
|
| + get iterator {
|
| + return new _SyncIterator(moveNextFn._clone());
|
| + }
|
| +}
|
| +
|
| +class _SyncIterator implements Iterator {
|
| + bool isYieldEach; // Set by generated code for the yield* statement.
|
| + Iterator yieldEachIterator;
|
| + var current; // Set by generated code for the yield and yield* statement.
|
| + SyncGeneratorCallback moveNextFn;
|
| +
|
| + _SyncIterator(this.moveNextFn);
|
| +
|
| + bool moveNext() {
|
| + if (moveNextFn == null) {
|
| + return false;
|
| + }
|
| + while(true) {
|
| + if (yieldEachIterator != null) {
|
| + if (yieldEachIterator.moveNext()) {
|
| + current = yieldEachIterator.current;
|
| + return true;
|
| + }
|
| + yieldEachIterator = null;
|
| + }
|
| + isYieldEach = false;
|
| + if (!moveNextFn(this)) {
|
| + moveNextFn = null;
|
| + current = null;
|
| + return false;
|
| + }
|
| + if (isYieldEach && (current is Iterable)) {
|
| + yieldEachIterator = current.iterator;
|
| + continue;
|
| + }
|
| + return true;
|
| + }
|
| + }
|
| +}
|
|
|