2487c76886
R=srdjan@google.com Review URL: https://codereview.chromium.org//888463004 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43516 260f80e4-7a28-3924-810f-c04153c831b5
75 lines
2.3 KiB
Dart
75 lines
2.3 KiB
Dart
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import "dart:math";
|
|
import "dart:typed_data";
|
|
|
|
// We need to pass the exception and stack trace objects as second and third
|
|
// parameter to the continuation. See vm/ast_transformer.cc for usage.
|
|
void _asyncCatchHelper(catchFunction, continuation) {
|
|
catchFunction((e, s) => continuation(null, e, s));
|
|
}
|
|
|
|
// The members of this class are cloned and added to each class that
|
|
// represents an enum type.
|
|
class _EnumHelper {
|
|
// Declare the list of enum value names private. When this field is
|
|
// cloned into a user-defined enum class, the field will be inaccessible
|
|
// because of the library-specific name suffix. The toString() function
|
|
// below can access it because it uses the same name suffix.
|
|
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;
|
|
}
|
|
}
|
|
}
|