Files
sdk/runtime/lib/core_patch.dart
T
iposva@google.com ebabd58de8 - Add a _fatal helper function into dart:core, so that we can
abort if we get into an unrecoverable state in the core library.

R=hausner@google.com

Review URL: https://codereview.chromium.org//953973003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@44010 260f80e4-7a28-3924-810f-c04153c831b5
2015-02-24 23:27:56 +00:00

81 lines
2.6 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";
// Equivalent of calling FATAL from C++ code.
_fatal(msg) native "DartCore_fatal";
// 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) {
// Spec mandates: it is a dynamic error if the class of [the object
// returned by yield*] does not implement Iterable.
yieldEachIterator = (current as Iterable).iterator;
continue;
}
return true;
}
}
}