Version 0.6.19.0 .
svn merge -r 26167:26292 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
git-svn-id: http://dart.googlecode.com/svn/trunk@26296 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/.gitignore b/.gitignore
index d82160d..1632934 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,3 +57,7 @@
# Generated files.
tools/out
tools/xcodebuild
+pkg/shadow_dom/tool/node_modules
+
+
+
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index f850b03..9206a32 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -14,5 +14,6 @@
input_api,
output_api,
json_url='http://dart-status.appspot.com/current?format=json')
- results.extend(status_check)
+ # TODO(ricow): reenable when status page is back in shape
+ # results.extend(status_check)
return results
diff --git a/WATCHLISTS b/WATCHLISTS
new file mode 100644
index 0000000..ceb0027
--- /dev/null
+++ b/WATCHLISTS
@@ -0,0 +1,19 @@
+# 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.
+
+# Watchlist Rules
+# Refer: http://dev.chromium.org/developers/contributing-code/watchlists
+
+{
+ 'WATCHLIST_DEFINITIONS': {
+ 'runtime': {
+ 'filepath': 'runtime/',
+ },
+ },
+
+ 'WATCHLISTS': {
+ 'runtime': ['vm-dev@dartlang.org'],
+ },
+}
+
diff --git a/pkg/analyzer_experimental/lib/analyzer.dart b/pkg/analyzer_experimental/lib/analyzer.dart
index 644009c..a88c94c 100644
--- a/pkg/analyzer_experimental/lib/analyzer.dart
+++ b/pkg/analyzer_experimental/lib/analyzer.dart
@@ -11,7 +11,6 @@
import 'src/error.dart';
import 'src/generated/ast.dart';
import 'src/generated/error.dart';
-import 'src/generated/java_io.dart';
import 'src/generated/parser.dart';
import 'src/generated/scanner.dart';
import 'src/generated/source_io.dart';
@@ -49,13 +48,7 @@
/// Converts an AST node representing a string literal into a [String].
String stringLiteralToString(StringLiteral literal) {
- if (literal is AdjacentStrings) {
- return literal.strings.map(stringLiteralToString).join();
- } else if (literal is SimpleStringLiteral) {
- return literal.value;
- } else {
- throw new ArgumentError("Can't convert $literal to a Dart string.");
- }
+ return literal.stringValue;
}
/// A simple error listener that collects errors into an [AnalysisErrorGroup].
diff --git a/pkg/analyzer_experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
index dd841f0..37c6c8d 100644
--- a/pkg/analyzer_experimental/lib/options.dart
+++ b/pkg/analyzer_experimental/lib/options.dart
@@ -5,6 +5,7 @@
library options;
import 'package:args/args.dart';
+import 'package:path/path.dart';
import 'dart:io';
@@ -153,9 +154,8 @@
static String _getVersion() {
try {
- Path path = new Path(Platform.script);
- Path versionPath = path.directoryPath.append('..').append('version');
- File versionFile = new File.fromPath(versionPath);
+ String versionPath = join(dirname(Platform.script), '..', 'version');;
+ File versionFile = new File(versionPath);
return versionFile.readAsStringSync().trim();
} catch (_) {
// This happens when the script is not running in the context of an SDK.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index af48a47..341480d 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -113,8 +113,10 @@
/// Gets the asset identified by [id].
///
/// If [id] is for a generated or transformed asset, this will wait until it
- /// has been created and return it. If the asset cannot be found, returns
- /// null.
+ /// has been created and return it. This means that the returned asset will
+ /// always be [AssetState.AVAILABLE].
+ ///
+ /// If the asset cannot be found, returns null.
Future<AssetNode> getAssetNode(AssetId id) {
assert(id.package == package);
@@ -126,11 +128,9 @@
// * If [id] has never been generated and all active transformers provide
// metadata about the file names of assets it can emit, we can prove that
// none of them can emit [id] and fail early.
- return newFuture(() {
- var node = _getAssetNode(id);
-
+ return _phases.last.getInput(id).then((node) {
// If the requested asset is available, we can just return it.
- if (node != null) return node;
+ if (node != null && node.state.isAvailable) return node;
// If there's a build running, that build might generate the asset, so we
// wait for it to complete and then try again.
@@ -144,24 +144,6 @@
});
}
- // Returns the post-transformation asset node for [id], if one is available.
- //
- // This will only return a node that has an asset available, and only if that
- // node is guaranteed not to be consumed by any transforms. If the phase is
- // still working to figure out if a node will be consumed by a transformer,
- // that node won't be returned.
- AssetNode _getAssetNode(AssetId id) {
- // Each phase's inputs are the outputs of the previous phase. Find the last
- // phase that contains the asset. Since the last phase has no transformers,
- // this will find the latest output for that id.
- for (var i = _phases.length - 1; i >= 0; i--) {
- var node = _phases[i].getUnconsumedInput(id);
- if (node != null) return node;
- }
-
- return null;
- }
-
/// Adds [sources] to the graph's known set of source assets.
///
/// Begins applying any transforms that can consume any of the sources. If a
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index 27c4d47..3dcb23e 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -73,7 +73,7 @@
Future<Asset> getAssetById(AssetId id) {
return _graph.getAssetNode(id).then((node) {
if (node == null) throw new AssetNotFoundException(id);
- return node.whenAvailable;
+ return node.asset;
});
}
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index a379ae5..f356066 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -29,6 +29,10 @@
/// Error thrown when two or more transformers both output an asset with [id].
class AssetCollisionException implements BarbackException {
/// All the transforms that output an asset with [id].
+ ///
+ /// If this only contains a single transform, that indicates that a
+ /// transformer produced an output that collides with a source asset or an
+ /// asset from a previous phase.
final Set<TransformInfo> transforms;
final AssetId id;
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/package_graph.dart
index 307a870..c46ed55 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/package_graph.dart
@@ -85,8 +85,10 @@
/// Gets the asset node identified by [id].
///
/// If [id] is for a generated or transformed asset, this will wait until it
- /// has been created and return it. If the asset cannot be found, returns
- /// null.
+ /// has been created and return it. This means that the returned asset will
+ /// always be [AssetState.AVAILABLE].
+ ///
+ /// If the asset cannot be found, returns null.
Future<AssetNode> getAssetNode(AssetId id) {
var cascade = _cascades[id.package];
if (cascade != null) return cascade.getAssetNode(id);
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index cf817ca..86444ad 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -56,6 +56,13 @@
/// is a transformer. "dart2js on web/main.dart" is a transform.
final _transforms = new Map<AssetId, Set<TransformNode>>();
+ /// Controllers for assets that aren't consumed by transforms in this phase.
+ ///
+ /// These assets are passed to the next phase unmodified. They need
+ /// intervening controllers to ensure that the outputs can be marked dirty
+ /// when determining whether transforms apply, and removed if they do.
+ final _passThroughControllers = new Map<AssetId, AssetNodeController>();
+
/// Futures that will complete once the transformers that can consume a given
/// asset are determined.
///
@@ -73,10 +80,10 @@
/// transforms that produced those asset nodes.
///
/// Usually there's only one node for a given output id. However, it's
- /// possible for multiple transformers in this phase to output an asset with
- /// the same id. In that case, the chronologically first output emitted is
- /// passed forward. We keep track of the other nodes so that if that output is
- /// removed, we know which asset to replace it with.
+ /// possible for multiple transformers to output an asset with the same id. In
+ /// that case, the chronologically first output emitted is passed forward. We
+ /// keep track of the other nodes so that if that output is removed, we know
+ /// which asset to replace it with.
final _outputs = new Map<AssetId, Queue<AssetNode>>();
/// A stream that emits an event whenever this phase becomes dirty and needs
@@ -163,36 +170,11 @@
});
}
- /// Returns the input for this phase with the given [id], but only if that
- /// input is known not to be consumed as a transformer's primary input.
- ///
- /// If the input is unavailable, or if the phase hasn't determined whether or
- /// not any transformers will consume it as a primary input, null will be
- /// returned instead. This means that the return value is guaranteed to always
- /// be [AssetState.AVAILABLE].
- AssetNode getUnconsumedInput(AssetId id) {
- if (!_inputs.containsKey(id)) return null;
-
- // If the asset has transforms, it's not unconsumed.
- if (!_transforms[id].isEmpty) return null;
-
- // If we're working on figuring out if the asset has transforms, we can't
- // prove that it's unconsumed.
- if (_adjustTransformersFutures.containsKey(id)) return null;
-
- // The asset should be available. If it were removed, it wouldn't be in
- // _inputs, and if it were dirty, it'd be in _adjustTransformersFutures.
- assert(_inputs[id].state.isAvailable);
- return _inputs[id];
- }
-
/// Gets the asset node for an input [id].
///
/// If an input with that ID cannot be found, returns null.
Future<AssetNode> getInput(AssetId id) {
return newFuture(() {
- // TODO(rnystrom): Need to handle passthrough where an asset from a
- // previous phase can be found.
if (id.package == cascade.package) return _inputs[id];
return cascade.graph.getAssetNode(id);
});
@@ -210,6 +192,11 @@
// kick off a build, even if that build does nothing.
_onDirtyController.add(null);
+ // If there's a pass-through for this node, mark it dirty while we figure
+ // out whether we need to add any transforms for it.
+ var controller = _passThroughControllers[node.id];
+ if (controller != null) controller.setDirty();
+
// Once the input is available, hook up transformers for it. If it changes
// while that's happening, try again.
_adjustTransformersFutures[node.id] = node.tryUntilStable((asset) {
@@ -219,6 +206,8 @@
return _removeStaleTransforms(asset)
.then((_) => _addFreshTransforms(node, oldTransformers));
}).then((_) {
+ _adjustPassThrough(node);
+
// Now all the transforms are set up correctly and the asset is available
// for the time being. Set up handlers for when the asset changes in the
// future.
@@ -226,6 +215,8 @@
if (state.isRemoved) {
_onDirtyController.add(null);
_transforms.remove(node.id);
+ var passThrough = _passThroughControllers.remove(node.id);
+ if (passThrough != null) passThrough.setRemoved();
} else {
_adjustTransformers(node);
}
@@ -237,8 +228,10 @@
// If the asset is removed, [tryUntilStable] will throw an
// [AssetNotFoundException]. In that case, just remove all transforms for
- // the node.
+ // the node, and its pass-through.
_transforms.remove(node.id);
+ var passThrough = _passThroughControllers.remove(node.id);
+ if (passThrough != null) passThrough.setRemoved();
}).whenComplete(() {
_adjustTransformersFutures.remove(node.id);
});
@@ -291,6 +284,28 @@
}));
}
+ /// Adjust whether [node] is passed through the phase unmodified, based on
+ /// whether it's consumed by other transforms in this phase.
+ ///
+ /// If [node] was already passed-through, this will update the passed-through
+ /// value.
+ void _adjustPassThrough(AssetNode node) {
+ assert(node.state.isAvailable);
+
+ if (_transforms[node.id].isEmpty) {
+ var controller = _passThroughControllers[node.id];
+ if (controller != null) {
+ controller.setAvailable(node.asset);
+ } else {
+ _passThroughControllers[node.id] =
+ new AssetNodeController.available(node.asset, node.transform);
+ }
+ } else {
+ var controller = _passThroughControllers.remove(node.id);
+ if (controller != null) controller.setRemoved();
+ }
+ }
+
/// Processes this phase.
///
/// Returns a future that completes when processing is done. If there is
@@ -308,14 +323,24 @@
/// Applies all currently wired up and dirty transforms.
Future _processTransforms() {
+ if (_next == null) return;
+
+ var newPassThroughs = _passThroughControllers.values
+ .map((controller) => controller.node)
+ .where((output) {
+ return !_outputs.containsKey(output.id) ||
+ !_outputs[output.id].contains(output);
+ }).toSet();
+
// Convert this to a list so we can safely modify _transforms while
// iterating over it.
var dirtyTransforms =
flatten(_transforms.values.map((transforms) => transforms.toList()))
.where((transform) => transform.isDirty).toList();
- if (dirtyTransforms.isEmpty) return null;
- var collisions = new Set<AssetId>();
+ if (dirtyTransforms.isEmpty && newPassThroughs.isEmpty) return null;
+
+ var collisions = _passAssetsThrough(newPassThroughs);
return Future.wait(dirtyTransforms.map((transform) {
return transform.apply().then((outputs) {
for (var output in outputs) {
@@ -346,6 +371,30 @@
});
}
+ /// Pass all new assets that aren't consumed by transforms through to the next
+ /// phase.
+ ///
+ /// Returns a set of asset ids that have collisions between new passed-through
+ /// assets and pre-existing transform outputs.
+ Set<AssetId> _passAssetsThrough(Set<AssetId> newPassThroughs) {
+ var collisions = new Set<AssetId>();
+ for (var output in newPassThroughs) {
+ if (_outputs.containsKey(output.id)) {
+ // There shouldn't be another pass-through asset with the same id.
+ assert(!_outputs[output.id].any((asset) => asset.transform == null));
+
+ _outputs[output.id].add(output);
+ collisions.add(output.id);
+ } else {
+ _outputs[output.id] = new Queue<AssetNode>.from([output]);
+ _next.addInput(output);
+ }
+
+ _handleOutputRemoval(output);
+ }
+ return collisions;
+ }
+
/// Properly resolve collisions when [output] is removed.
void _handleOutputRemoval(AssetNode output) {
output.whenRemoved.then((_) {
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 46ff289..8e4fd89 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -284,4 +284,53 @@
expectAsset("app|foo.out", "two.out");
buildShouldFail([isAssetCollisionException("app|foo.out")]);
});
+
+ test("a collision with a pass-through asset returns the pass-through asset",
+ () {
+ initGraph([
+ "app|foo.txt",
+ "app|foo.in"
+ ], {"app": [
+ [new RewriteTransformer("in", "txt")]
+ ]});
+
+ updateSources(["app|foo.txt", "app|foo.in"]);
+ expectAsset("app|foo.txt", "foo");
+ buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+ });
+
+ test("a new pass-through asset that collides returns the previous asset", () {
+ initGraph([
+ "app|foo.txt",
+ "app|foo.in"
+ ], {"app": [
+ [new RewriteTransformer("in", "txt")]
+ ]});
+
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.txt", "foo.txt");
+ buildShouldSucceed();
+
+ updateSources(["app|foo.txt"]);
+ expectAsset("app|foo.txt", "foo.txt");
+ buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+ });
+
+ test("a new transform output that collides with a pass-through asset returns "
+ "the pass-through asset", () {
+ initGraph([
+ "app|foo.txt",
+ "app|foo.in"
+ ], {"app": [
+ [new RewriteTransformer("in", "txt")]
+ ]});
+
+ updateSources(["app|foo.txt"]);
+ expectAsset("app|foo.txt", "foo");
+ buildShouldSucceed();
+
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.txt", "foo");
+ buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+ });
}
diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart
index c24bae8..4d7b97e 100644
--- a/pkg/barback/test/package_graph/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform_test.dart
@@ -603,7 +603,7 @@
test("doesn't transform an asset that goes from primary to non-primary "
"during isPrimary", () {
- var check = new CheckContentTransformer("do", "ne");
+ var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
initGraph({
"app|foo.txt": "do"
}, {"app": [[check]]});
@@ -662,7 +662,7 @@
test("doesn't transform an asset that goes from primary to non-primary "
"during another transformer's isPrimary", () {
var rewrite = new RewriteTransformer("md", "md");
- var check = new CheckContentTransformer("do", "ne");
+ var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
initGraph({
"app|foo.txt": "do",
"app|foo.md": "foo"
@@ -809,6 +809,138 @@
buildShouldSucceed();
});
+ group("pass-through", () {
+ test("passes an asset through a phase in which no transforms apply", () {
+ initGraph([
+ "app|foo.in",
+ "app|bar.zip",
+ ], {"app": [
+ [new RewriteTransformer("in", "mid")],
+ [new RewriteTransformer("zip", "zap")],
+ [new RewriteTransformer("mid", "out")],
+ ]});
+
+ updateSources(["app|foo.in", "app|bar.zip"]);
+ expectAsset("app|foo.out", "foo.mid.out");
+ expectAsset("app|bar.zap", "bar.zap");
+ buildShouldSucceed();
+ });
+
+ test("doesn't pass an asset through a phase in which a transform consumes "
+ "it", () {
+ initGraph([
+ "app|foo.in",
+ ], {"app": [
+ [new RewriteTransformer("in", "mid")],
+ [new RewriteTransformer("mid", "phase2")],
+ [new RewriteTransformer("mid", "phase3")],
+ ]});
+
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.phase2", "foo.mid.phase2");
+ expectNoAsset("app|foo.phase3");
+ buildShouldSucceed();
+ });
+
+ test("removes a pass-through asset when the source is removed", () {
+ initGraph([
+ "app|foo.in",
+ "app|bar.zip",
+ ], {"app": [
+ [new RewriteTransformer("zip", "zap")],
+ [new RewriteTransformer("in", "out")],
+ ]});
+
+ updateSources(["app|foo.in", "app|bar.zip"]);
+ expectAsset("app|foo.out", "foo.out");
+ buildShouldSucceed();
+
+ removeSources(["app|foo.in"]);
+ expectNoAsset("app|foo.in");
+ expectNoAsset("app|foo.out");
+ buildShouldSucceed();
+ });
+
+ test("updates a pass-through asset when the source is updated", () {
+ initGraph([
+ "app|foo.in",
+ "app|bar.zip",
+ ], {"app": [
+ [new RewriteTransformer("zip", "zap")],
+ [new RewriteTransformer("in", "out")],
+ ]});
+
+ updateSources(["app|foo.in", "app|bar.zip"]);
+ expectAsset("app|foo.out", "foo.out");
+ buildShouldSucceed();
+
+ modifyAsset("app|foo.in", "boo");
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.out", "boo.out");
+ buildShouldSucceed();
+ });
+
+ test("passes an asset through a phase in which transforms have ceased to "
+ "apply", () {
+ initGraph([
+ "app|foo.in",
+ ], {"app": [
+ [new RewriteTransformer("in", "mid")],
+ [new CheckContentTransformer("foo.mid", ".phase2")],
+ [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+ ]});
+
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.mid", "foo.mid.phase2");
+ buildShouldSucceed();
+
+ modifyAsset("app|foo.in", "bar");
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.mid", "bar.mid.phase3");
+ buildShouldSucceed();
+ });
+
+ test("doesn't pass an asset through a phase in which transforms have "
+ "started to apply", () {
+ initGraph([
+ "app|foo.in",
+ ], {"app": [
+ [new RewriteTransformer("in", "mid")],
+ [new CheckContentTransformer("bar.mid", ".phase2")],
+ [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+ ]});
+
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.mid", "foo.mid.phase3");
+ buildShouldSucceed();
+
+ modifyAsset("app|foo.in", "bar");
+ updateSources(["app|foo.in"]);
+ expectAsset("app|foo.mid", "bar.mid.phase2");
+ buildShouldSucceed();
+ });
+
+ test("doesn't pass an asset through if it's removed during isPrimary", () {
+ var check = new CheckContentTransformer("bar", " modified");
+ initGraph(["app|foo.txt"], {"app": [[check]]});
+
+ updateSources(["app|foo.txt"]);
+ expectAsset("app|foo.txt", "foo");
+ buildShouldSucceed();
+
+ check.pauseIsPrimary("app|foo.txt");
+ modifyAsset("app|foo.txt", "bar");
+ updateSources(["app|foo.txt"]);
+ // Ensure we're waiting on [check.isPrimary]
+ schedule(pumpEventQueue);
+
+ removeSources(["app|foo.txt"]);
+ check.resumeIsPrimary("app|foo.txt");
+ expectNoAsset("app|foo.txt");
+ buildShouldSucceed();
+ });
+ });
+
group('cross-package transforms', () {
test("can access other packages' source assets", () {
initGraph({
diff --git a/pkg/barback/test/transformer/check_content.dart b/pkg/barback/test/transformer/check_content.dart
index 252ee1c..445e86f 100644
--- a/pkg/barback/test/transformer/check_content.dart
+++ b/pkg/barback/test/transformer/check_content.dart
@@ -10,15 +10,15 @@
import 'mock.dart';
-/// A transformer that modifies assets with the given content.
+/// A transformer that modifies assets that contains the given content.
class CheckContentTransformer extends MockTransformer {
- final String content;
+ final Pattern content;
final String addition;
CheckContentTransformer(this.content, this.addition);
Future<bool> doIsPrimary(Asset asset) =>
- asset.readAsString().then((value) => value == content);
+ asset.readAsString().then((value) => value.contains(content));
Future doApply(Transform transform) {
return getPrimary(transform).then((primary) {
diff --git a/pkg/browser/lib/dart.js b/pkg/browser/lib/dart.js
index e14bfbb..b96581c 100644
--- a/pkg/browser/lib/dart.js
+++ b/pkg/browser/lib/dart.js
@@ -2,6 +2,7 @@
// 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.
+(function() {
// Bootstrap support for Dart scripts on the page as this script.
if (navigator.webkitStartDart) {
if (!navigator.webkitStartDart()) {
@@ -35,3 +36,4 @@
}
}
}
+})();
diff --git a/pkg/docgen/README.md b/pkg/docgen/README.md
index 1af9ebe..24ba58a 100644
--- a/pkg/docgen/README.md
+++ b/pkg/docgen/README.md
@@ -38,6 +38,9 @@
- `--parse-sdk` Parses the SDK libraries only. (Ignores the path passed in.)
- `--package-root` Sets the package root of the library being analyzed.
- `--append` Appends to the docs folder, library_list.txt, and index.txt.
+- `--introduction` Adds the provided markdown text file as the introduction
+for the outputted documentation.
+
###### Output Directory
Documented libraries will be located at bin/docs in either YAML or JSON format
diff --git a/pkg/docgen/bin/docgen.dart b/pkg/docgen/bin/docgen.dart
index 48b9071..ca4f780 100644
--- a/pkg/docgen/bin/docgen.dart
+++ b/pkg/docgen/bin/docgen.dart
@@ -23,7 +23,9 @@
includePrivate: results['include-private'],
includeSdk: results['parse-sdk'] || results['include-sdk'],
parseSdk: results['parse-sdk'],
- append: results['append'] && new Directory('docs').existsSync());
+ append: results['append'] && new Directory('docs').existsSync(),
+ introduction: results['parse-sdk'] ?
+ 'sdk-introduction.md' : results['introduction']);
}
/**
@@ -57,10 +59,13 @@
help: 'Parses the SDK libraries only.',
defaultsTo: false, negatable: false);
parser.addOption('package-root',
- help: "Sets the package root of the library being analyzed.");
+ help: 'Sets the package root of the library being analyzed.');
parser.addFlag('append',
help: 'Append to the docs folder, library_list.txt and index.txt',
defaultsTo: false, negatable: false);
+ parser.addOption('introduction',
+ help: 'Adds the provided markdown text file as the introduction'
+ ' for the outputted documentation.', defaultsTo: '');
return parser;
}
diff --git a/pkg/docgen/bin/sdk-introduction.md b/pkg/docgen/bin/sdk-introduction.md
new file mode 100644
index 0000000..1362e5b
--- /dev/null
+++ b/pkg/docgen/bin/sdk-introduction.md
@@ -0,0 +1,19 @@
+Welcome to the Dart API reference documentation,
+covering the official Dart APIs (dart:*)
+as well as other packages that live in the Dart project.
+For help using the Dart APIs, also see
+[www.dartlang.org](https://www.dartlang.org)
+pages such as the following:
+
+ * [Programmer's Guide](https://www.dartlang.org/docs/)
+ * [A Tour of the Dart Libraries](https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html)
+ * [Dart Cookbook](https://www.dartlang.org/docs/cookbook/)
+ * [Articles](https://www.dartlang.org/articles/)
+
+The API reference is automatically generated from the source code in the
+[Dart project](https://code.google.com/p/dart/).
+If you'd like to contribute to this documentation, see
+[Guidelines for Dart Doc Comments](http://www.dartlang.org/articles/doc-comment-guidelines/),
+[Contributing](https://code.google.com/p/dart/wiki/Contributing),
+and, if you're contributing to DOM-related docs such as dart:html,
+[Contributing HTML Documentation](https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation).
\ No newline at end of file
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index b67a321..a51ab86 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -65,6 +65,11 @@
/// This is set from the command line arguments flag --include-private
bool _includePrivate = false;
+// TODO(janicejl): Make MDN content generic or pluggable. Maybe move
+// MDN-specific code to its own library that is imported into the default impl?
+/// Map of all the comments for dom elements from MDN.
+Map _mdn;
+
/**
* Docgen constructor initializes the link resolver for markdown parsing.
* Also initializes the command line arguments.
@@ -79,7 +84,7 @@
*/
Future<bool> docgen(List<String> files, {String packageRoot,
bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
- bool parseSdk: false, bool append: false}) {
+ bool parseSdk: false, bool append: false, String introduction: ''}) {
_includePrivate = includePrivate;
if (!append) {
var dir = new Directory('docs');
@@ -96,7 +101,6 @@
}
}
logger.info('Package Root: ${packageRoot}');
-
linkResolver = (name) =>
fixReference(name, _currentLibrary, _currentClass, _currentMember);
@@ -106,7 +110,8 @@
throw new StateError('No library mirrors were created.');
}
_documentLibraries(mirrorSystem.libraries.values,includeSdk: includeSdk,
- outputToYaml: outputToYaml, append: append, parseSdk: parseSdk);
+ outputToYaml: outputToYaml, append: append, parseSdk: parseSdk,
+ introduction: introduction);
return true;
});
@@ -222,7 +227,8 @@
* Creates documentation for filtered libraries.
*/
void _documentLibraries(List<LibraryMirror> libs, {bool includeSdk: false,
- bool outputToYaml: true, bool append: false, bool parseSdk: false}) {
+ bool outputToYaml: true, bool append: false, bool parseSdk: false,
+ String introduction: ''}) {
libs.forEach((lib) {
// Files belonging to the SDK have a uri that begins with 'dart:'.
if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
@@ -242,12 +248,22 @@
filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
_writeIndexableToFile(output, outputToYaml);
});
- // Outputs a yaml file with all libraries and their preview comments after
- // creating all libraries. This will help the viewer know what libraries are
- // available to read in.
- var libraryMap = {'libraries' : filteredEntities.where((e) =>
- e is Library).map((e) => e.previewMap).toList()};
- _writeToFile(getYamlString(libraryMap), 'library_list.yaml', append: append);
+ // Outputs a YAML or JSON file with all libraries and their preview comments
+ // after creating all libraries. This will help the viewer know what
+ // libraries are available to read in.
+ var libraryMap = {
+ 'libraries' : filteredEntities.where((e) =>
+ e is Library).map((e) => e.previewMap).toList(),
+ 'introduction' : introduction == '' ?
+ '' : markdown.markdownToHtml(new File(introduction).readAsStringSync(),
+ linkResolver: linkResolver, inlineSyntaxes: markdownSyntaxes)
+ };
+ if (outputToYaml) {
+ _writeToFile(getYamlString(libraryMap), 'library_list.yaml',
+ append: append);
+ } else {
+ _writeToFile(stringify(libraryMap), 'library_list.json', append: append);
+ }
// Outputs all the qualified names documented with their type.
// This will help generate search results.
_writeToFile(filteredEntities.map((e) =>
@@ -313,7 +329,7 @@
/**
* Returns a list of meta annotations assocated with a mirror.
*/
-List<String> _annotations(DeclarationMirror mirror) {
+List<Annotation> _annotations(DeclarationMirror mirror) {
var annotationMirrors = mirror.metadata.where((e) =>
e is dart2js.Dart2JsConstructedConstantMirror);
var annotations = [];
@@ -357,6 +373,58 @@
}
/**
+ * Generates MDN comments from database.json.
+ */
+void _mdnComment(Indexable item) {
+ //Check if MDN is loaded.
+ if (_mdn == null) {
+ // Reading in MDN related json file.
+ var mdnDir = path.join(path.dirname(path.dirname(path.dirname(path.dirname(
+ path.absolute(new Options().script))))), 'utils', 'apidoc', 'mdn');
+ _mdn = parse(new File(path.join(mdnDir, 'database.json'))
+ .readAsStringSync());
+ }
+ if (item.comment.isNotEmpty) return;
+ var domAnnotation = item.annotations.firstWhere(
+ (e) => e.qualifiedName == 'metadata.DomName', orElse: () => null);
+ if (domAnnotation == null) return;
+ var domName = domAnnotation.parameters.single;
+ var parts = domName.split('.');
+ if (parts.length == 2) item.comment = _mdnMemberComment(parts[0], parts[1]);
+ if (parts.length == 1) item.comment = _mdnTypeComment(parts[0]);
+}
+
+/**
+ * Generates the MDN Comment for variables and method DOM elements.
+ */
+String _mdnMemberComment(String type, String member) {
+ var mdnType = _mdn[type];
+ if (mdnType == null) return '';
+ var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
+ orElse: () => null);
+ if (mdnMember == null) return '';
+ if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
+ if (mdnMember['url'] == null) return '';
+ return _htmlMdn(mdnMember['help'], mdnMember['url']);
+}
+
+/**
+ * Generates the MDN Comment for class DOM elements.
+ */
+String _mdnTypeComment(String type) {
+ var mdnType = _mdn[type];
+ if (mdnType == null) return '';
+ if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
+ if (mdnType['srcUrl'] == null) return '';
+ return _htmlMdn(mdnType['summary'], mdnType['srcUrl']);
+}
+
+String _htmlMdn(String content, String url) {
+ return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
+ '<a href="' + url.trim() + '">from Mdn</a></p></div>';
+}
+
+/**
* Converts all [foo] references in comments to <a>libraryName.foo</a>.
*/
markdown.Node fixReference(String name, LibraryMirror currentLibrary,
@@ -406,7 +474,7 @@
MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
var group = new MethodGroup();
mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
- if (_includePrivate || !_isHidden(mirror)) {
+ if (_includePrivate || !mirror.isPrivate) {
group.addMethod(mirror);
}
});
@@ -429,11 +497,8 @@
_methods(mirror.methods), _annotations(mirror), _generics(mirror),
mirror.qualifiedName, _isHidden(mirror), mirror.owner.qualifiedName,
mirror.isAbstract);
- if (superclass != null)
- clazz.addInherited(superclass);
- interfaces.forEach((interface) {
- clazz.addInherited(interface);
- });
+ if (superclass != null) clazz.addInherited(superclass);
+ interfaces.forEach((interface) => clazz.addInherited(interface));
entityMap[mirror.qualifiedName] = clazz;
}
return clazz;
@@ -621,12 +686,14 @@
bool isAbstract;
/// List of the meta annotations on the class.
- List<String> annotations;
+ List<Annotation> annotations;
Class(String name, this.superclass, String comment, this.interfaces,
this.variables, this.methods, this.annotations, this.generics,
String qualifiedName, bool isPrivate, String owner, this.isAbstract)
- : super(name, comment, qualifiedName, isPrivate, owner);
+ : super(name, comment, qualifiedName, isPrivate, owner) {
+ _mdnComment(this);
+ }
String get typeName => 'class';
@@ -646,9 +713,7 @@
*/
void addInherited(Class superclass) {
inheritedVariables.addAll(superclass.inheritedVariables);
- if (_isVisible(superclass)) {
- inheritedVariables.addAll(superclass.variables);
- }
+ inheritedVariables.addAll(superclass.variables);
inheritedMethods.addInherited(superclass);
}
@@ -808,7 +873,7 @@
Map<String, Generic> generics;
/// List of the meta annotations on the typedef.
- List<String> annotations;
+ List<Annotation> annotations;
Typedef(String name, this.returnType, String comment, this.generics,
this.parameters, this.annotations,
@@ -839,11 +904,13 @@
Type type;
/// List of the meta annotations on the variable.
- List<String> annotations;
+ List<Annotation> annotations;
Variable(String name, this.isFinal, this.isStatic, this.isConst, this.type,
String comment, this.annotations, String qualifiedName, bool isPrivate,
- String owner) : super(name, comment, qualifiedName, isPrivate, owner);
+ String owner) : super(name, comment, qualifiedName, isPrivate, owner) {
+ _mdnComment(this);
+ }
/// Generates a map describing the [Variable] object.
Map toMap() => {
@@ -881,13 +948,15 @@
String commentInheritedFrom = "";
/// List of the meta annotations on the method.
- List<String> annotations;
+ List<Annotation> annotations;
Method(String name, this.isStatic, this.isAbstract, this.isConst,
this.returnType, String comment, this.parameters, this.annotations,
String qualifiedName, bool isPrivate, String owner, this.isConstructor,
this.isGetter, this.isSetter, this.isOperator)
- : super(name, comment, qualifiedName, isPrivate, owner);
+ : super(name, comment, qualifiedName, isPrivate, owner) {
+ _mdnComment(this);
+ }
/**
* Makes sure that the method with an inherited equivalent have comments.
@@ -956,15 +1025,13 @@
void addInherited(Class parent) {
setters.addAll(parent.inheritedMethods.setters);
+ setters.addAll(parent.methods.setters);
getters.addAll(parent.inheritedMethods.getters);
+ getters.addAll(parent.methods.getters);
operators.addAll(parent.inheritedMethods.operators);
+ operators.addAll(parent.methods.operators);
regularMethods.addAll(parent.inheritedMethods.regularMethods);
- if (_isVisible(parent)) {
- setters.addAll(parent.methods.setters);
- getters.addAll(parent.methods.getters);
- operators.addAll(parent.methods.operators);
- regularMethods.addAll(parent.methods.regularMethods);
- }
+ regularMethods.addAll(parent.methods.regularMethods);
}
Map toMap() => {
@@ -1006,7 +1073,7 @@
String defaultValue;
/// List of the meta annotations on the parameter.
- List<String> annotations;
+ List<Annotation> annotations;
Parameter(this.name, this.isOptional, this.isNamed, this.hasDefaultValue,
this.type, this.defaultValue, this.annotations);
diff --git a/pkg/http_server/lib/http_server.dart b/pkg/http_server/lib/http_server.dart
index 1f10eb8..123ff7c 100644
--- a/pkg/http_server/lib/http_server.dart
+++ b/pkg/http_server/lib/http_server.dart
@@ -9,6 +9,7 @@
import 'dart:json' as JSON;
import 'package:mime/mime.dart';
+import "package:path/path.dart";
part 'src/http_body.dart';
part 'src/http_body_impl.dart';
diff --git a/pkg/http_server/lib/src/virtual_directory.dart b/pkg/http_server/lib/src/virtual_directory.dart
index f608eb9..42b0c026 100644
--- a/pkg/http_server/lib/src/virtual_directory.dart
+++ b/pkg/http_server/lib/src/virtual_directory.dart
@@ -77,7 +77,7 @@
}
void serveRequest(HttpRequest request) {
- _locateResource(new Path('.'), request.uri.pathSegments.iterator..moveNext())
+ _locateResource('.', request.uri.pathSegments.iterator..moveNext())
.then((entity) {
if (entity == null) {
_serveErrorPage(HttpStatus.NOT_FOUND, request);
@@ -101,39 +101,39 @@
_errorCallback = callback;
}
- Future<FileSystemEntity> _locateResource(Path path,
+ Future<FileSystemEntity> _locateResource(String path,
Iterator<String> segments) {
- path = path.canonicalize();
- if (path.segments().first == "..") return new Future.value(null);
- Path fullPath() => new Path(root).join(path);
- return FileSystemEntity.type(fullPath().toNativePath(), followLinks: false)
+ path = normalize(path);
+ if (split(path).first == "..") return new Future.value(null);
+ String fullPath() => join(root, path);
+ return FileSystemEntity.type(fullPath(), followLinks: false)
.then((type) {
switch (type) {
case FileSystemEntityType.FILE:
if (segments.current == null) {
- return new File.fromPath(fullPath());
+ return new File(fullPath());
}
break;
case FileSystemEntityType.DIRECTORY:
if (segments.current == null) {
if (allowDirectoryListing) {
- return new Directory.fromPath(fullPath());
+ return new Directory(fullPath());
}
} else {
if (_invalidPathRegExp.hasMatch(segments.current)) break;
- return _locateResource(path.append(segments.current),
+ return _locateResource(join(path, segments.current),
segments..moveNext());
}
break;
case FileSystemEntityType.LINK:
if (followLinks) {
- return new Link.fromPath(fullPath()).target()
+ return new Link(fullPath()).target()
.then((target) {
- var targetPath = new Path(target).canonicalize();
- if (targetPath.isAbsolute) return null;
- targetPath = path.directoryPath.join(targetPath);
+ String targetPath = normalize(target);
+ if (isAbsolute(targetPath)) return null;
+ targetPath = join(dirname(path), targetPath);
return _locateResource(targetPath, segments);
});
}
@@ -254,7 +254,7 @@
void add(String name, String modified, var size) {
if (size == null) size = "-";
if (modified == null) modified = "";
- var p = new Path(path).append(name).canonicalize().toString();
+ var p = normalize(join(path, name));
var entry =
''' <tr>
<td><a href="$p">$name</a></td>
@@ -272,11 +272,11 @@
// TODO(ajohnsen): Consider async dir listing.
if (entity is File) {
var stat = entity.statSync();
- add(new Path(entity.path).filename,
+ add(basename(entity.path),
stat.modified.toString(),
stat.size);
} else if (entity is Directory) {
- add(new Path(entity.path).filename + '/',
+ add(basename(entity.path) + '/',
entity.statSync().modified.toString(),
null);
}
diff --git a/pkg/http_server/test/utils.dart b/pkg/http_server/test/utils.dart
index 498d159..6a46696 100644
--- a/pkg/http_server/test/utils.dart
+++ b/pkg/http_server/test/utils.dart
@@ -6,7 +6,7 @@
import 'dart:async';
import 'dart:io';
-
+import "package:path/path.dart";
Future<int> getStatusCode(int port,
String path,
@@ -57,8 +57,8 @@
setupSecure() {
- Path scriptDir = new Path(new Options().script).directoryPath;
- Path certificateDatabase = scriptDir.append('pkcert');
- SecureSocket.initialize(database: certificateDatabase.toNativePath(),
+ String scriptDir = dirname(new Options().script);
+ String certificateDatabase = join(scriptDir, 'pkcert');
+ SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart');
}
diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
index 0136b62..4b59f2c 100644
--- a/pkg/http_server/test/virtual_directory_test.dart
+++ b/pkg/http_server/test/virtual_directory_test.dart
@@ -5,8 +5,9 @@
import 'dart:async';
import 'dart:io';
-import "package:unittest/unittest.dart";
import "package:http_server/http_server.dart";
+import "package:path/path.dart";
+import "package:unittest/unittest.dart";
import 'utils.dart';
@@ -296,7 +297,7 @@
test('relative-parent-link', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var dir = new Directory('').createTempSync();
- var name = new Path(dir.path).filename;
+ var name = basename(dir.path);
var file = new File('${dir.path}/file')..createSync();
var link = new Link('${dir.path}/dir3')
..createSync('../$name/file');
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index a232fd3..9516372 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -85,7 +85,7 @@
* We can't use a hyphen in a Dart library name, so convert the locale
* separator to an underscore.
*/
-String asLibraryName(String x) => x.replaceAll('-', '_');
+String _libraryName(String x) => x.replaceAll('-', '_');
/**
* Generate a file <[generated_file_prefix]>_messages_<[locale]>.dart
@@ -146,6 +146,9 @@
get localeName => '$locale';
""";
+
+_deferredName(locale) => "lazy_${_libraryName(locale)}";
+
/**
* This section generates the messages_all.dart file based on the list of
* [allLocales].
@@ -153,17 +156,28 @@
String generateMainImportFile() {
var output = new StringBuffer();
output.write(mainPrologue);
- for (var each in allLocales) {
- var baseFile = '${generatedFilePrefix}messages_$each.dart';
+ for (var locale in allLocales) {
+ var baseFile = '${generatedFilePrefix}messages_$locale.dart';
var file = importForGeneratedFile(baseFile);
- output.write("import '$file' as ${asLibraryName(each)};\n");
+ output.write("@${_deferredName(locale)} ");
+ output.write("import '$file' as ${_libraryName(locale)};\n");
}
+ output.write("\n");
+ for (var locale in allLocales) {
+ output.write("const ${_deferredName(locale)} = const DeferredLibrary");
+ output.write("('${_libraryName(locale)}');\n");
+ }
+ output.write("\nconst deferredLibraries = const {\n");
+ for (var locale in allLocales) {
+ output.write(" '$locale' : ${_deferredName(locale)},\n");
+ }
+ output.write("};\n");
output.write(
"\nMessageLookupByLibrary _findExact(localeName) {\n"
" switch (localeName) {\n");
- for (var each in allLocales) {
+ for (var locale in allLocales) {
output.write(
- " case '$each' : return ${asLibraryName(each)}.messages;\n");
+ " case '$locale' : return ${_libraryName(locale)}.messages;\n");
}
output.write(closing);
return output.toString();
@@ -198,10 +212,10 @@
}
/** User programs should call this before using [localeName] for messages.*/
-initializeMessages(localeName) {
+Future initializeMessages(String localeName) {
initializeInternalMessageLookup(() => new CompositeMessageLookup());
messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
- return new Future.value();
+ return deferredLibraries[localeName].load();
}
MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index e91c2b2..a15abed 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -249,8 +249,8 @@
// top-level message, so look up our translation by calling Intl.message
// with ourselves as an argument.
if (name != null) {
- return Intl.message(
- Intl.plural(howMany,
+ return message(
+ plural(howMany,
zero: zero, one: one, two: two, few: few, many: many, other: other),
name: name,
args: args,
@@ -273,10 +273,10 @@
}
/**
- * Format a message differently depending on [gender]. Normally used as part
- * of an Intl.message message that is to be translated.
+ * Format a message differently depending on [targetGender]. Normally used as
+ * part of an Intl.message message that is to be translated.
*/
- static String gender(String gender,
+ static String gender(String targetGender,
{String male, String female, String other,
String desc, Map examples, String locale, String name,
List<String>args}) {
@@ -284,8 +284,8 @@
// top-level message, so look up our translation by calling Intl.message
// with ourselves as an argument.
if (name != null) {
- return Intl.message(
- Intl.gender(gender, male: male, female: female, other: other),
+ return message(
+ gender(targetGender, male: male, female: female, other: other),
name: name,
args: args,
locale: locale);
@@ -294,7 +294,7 @@
if (other == null) {
throw new ArgumentError("The 'other' named argument must be specified");
}
- switch(gender) {
+ switch(targetGender) {
case "female" : return female == null ? other : female;
case "male" : return male == null ? other : male;
default: return other;
@@ -314,8 +314,8 @@
// top-level message, so look up our translation by calling Intl.message
// with ourselves as an argument.
if (name != null) {
- return Intl.message(
- Intl.select(choice, cases),
+ return message(
+ select(choice, cases),
name: name,
args: args,
locale: locale);
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 81660c1..39486e0 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -20,10 +20,14 @@
[ $compiler == dart2js && $runtime == d8 ]
unmodifiable_collection/test/unmodifiable_collection_test: Pass, Fail # Issue 12429
+csslib/test/declaration_test: Pass, Crash # V8 issue 2846
[ $compiler == dart2js ]
analyzer_experimental/test/generated/ast_test: Fail #Issue 12341
+[ $compiler == dart2js && $checked && $runtime == ie9 ]
+crypto/test/base64_test: Timeout # Issue 12486
+
[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
crypto/test/hmac_sha256_test: Pass, Fail # v8 bug: Issue 12293
crypto/test/sha1_test: Pass, Fail # v8 bug: Issue 12293
@@ -56,6 +60,7 @@
crypto/test/hmac_sha1_test: Fail # Issue 11407.
crypto/test/sha1_test: Fail # Issue 11407.
stack_trace/test/trace_test: Fail # http://dartbug.com/12380
+crypto/test/sha256_test: Pass, Fail # Issue 12502
# Skip browser-specific tests on VM
[ $runtime == vm ]
@@ -199,6 +204,7 @@
custom_element: Skip
mdv: Skip
mutation_observer: Skip
+polymer_expressions/test/syntax_test: Skip
third_party/html5lib/test/browser/browser_test: Skip
[ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
diff --git a/pkg/polymer_expressions/README.md b/pkg/polymer_expressions/README.md
new file mode 100644
index 0000000..5a7e9b2
--- /dev/null
+++ b/pkg/polymer_expressions/README.md
@@ -0,0 +1,282 @@
+polymer_expressions
+===================
+
+Polymer Expressions are an expressive syntax that can be used in templates in
+Dart. Polymer Expressions allow you to write complex binding expressions, with
+property access, function invocation, list/map indexing, and two-way filtering
+like:
+
+```html
+ {{ person.title + " " + person.getFullName() | upppercase }}
+```
+
+## Overview
+
+### Model-Driven Views (MDV)
+[MDV][mdv] allows you to define templates directly in HTML that are rendered by the
+browser into the DOM. Templates are bound to a data model, and changes to the
+data are automatically reflected in the DOM, and changes in HTML inputs are
+assigned back into the model. The template and model are bound together via
+binding expressions that are evaluated against the model. These binding
+expressions are placed in double-curly-braces, or "mustaches".
+
+Example:
+
+```html
+ <template>
+ <p>Hello {{ person.name }}</p>
+ </template>
+```
+
+MDV includes a very basic binding syntax which only allows a series of
+dot-separate property names.
+
+[mdv]: http://www.polymer-project.org/platform/mdv.html
+
+### Custom Binding Syntaxes with BindingDelegate
+
+While MDV's built-in syntax is very basic, it does allow custom syntaxes called
+"binding delegates" to be installed and used. A binding delegate can interpret
+the contents of mustaches however it likes. PolymerExpressions is such a
+binding delegate.
+
+Example:
+
+```html
+ <template bind>
+ <p>Hello {{ person.title + " " + person.getFullName() | uppercase }}</p>
+ </template>
+```
+
+## Usage
+
+### Installing from Pub
+
+Add the following to your pubspec.yaml file:
+
+```yaml
+ dependencies:
+ polymer_expressions: any
+```
+
+Hint: check https://pub.dartlang.org/packages/polymer_expressions for the latest
+version number.
+
+Then import polymer_expressions.dart:
+
+ import 'package:polymer_expressions/polymer_expressions.dart';
+
+### Registering a Binding Delegate
+
+**Polymer Expressions are now the default syntax for `<polymer-element>` custom
+elements.**
+
+You do not need to manually register the bindingDelegate if your bindings are
+inside a custom element. However, if you want to use polymer_expressions outside
+a custom element, read on:
+
+Binding delegates must be installed on a template before they can be used.
+For example, set the bindingDelegate property of your template
+elements to an instance of PolymerExpressions. The templates will then use the
+PolymerExpressions instance to interpret
+binding expressions.
+
+```dart
+ import 'dart:html';
+ import 'package:polymer_expressions/polymer_expressions.dart';
+
+ main() {
+ var template = query('#my_template');
+ template.bindingDelegate = new PolymerExpressions();
+ }
+```
+
+### Registering Top-Level Variables
+
+Before a top-level variable can be used, it must be registered. The
+PolymerExpressions constructor takes a map of named values to use as variables.
+
+```dart
+ main() {
+ var globals = {
+ 'uppercase': (String v) => v.toUpperCase(),
+ 'app_id': 'my_app_123',
+ };
+ var template = query('#my_template');
+ template.bindingDelegate = new PolymerExpressions(globals: globals);
+ }
+```
+
+## Features
+
+### The Model and Scope
+
+Polymer Expressions allow binding to more than just the model assigned to a
+template instance. Top-level variables can be defined so that you can use
+filters, global variables and constants, functions, etc. These variables and the
+model are held together in a container called a Scope. Scopes can be nested,
+which happens when template tags are nested.
+
+### Two-way Bindings
+
+Bindings can be used to modify the data model based on events in the DOM. The
+most common case is to bind an <input> element's value field to a model
+property and have the property update when the input changes. For this to work,
+the binding expression must be "assignable". Only a subset of expressions are
+assignable. Assignable expressions cannot contain function calls, operators, and
+any index operator must have a literal argument. Assignable expressions can
+contain filter operators as long as all the filters are two-way transformers.
+
+Some restrictions may be relaxed further as allowed.
+
+Assignable Expressions:
+
+ * `foo`
+ * `foo.bar`
+ * `items[0].description`
+ * `people['john'].name`
+ * `product.cost | convertCurrency('ZWD')` where `convertCurrency` evaluates to
+ a Tranformer object.
+
+Non-Assignable Expressions:
+
+ * `a + 1`
+ * `!c`
+ * `foo()`
+ * `person.lastName | uppercase` where `uppercase` is a filter function.
+
+### Null-Safety
+
+Expressions are generally null-safe. If an intermediate expression yields `null`
+the entire expression will return null, rather than throwing an exception.
+Property access, method invocation and operators are null-safe. Passing null to
+a function that doesn't handle null will not be null safe.
+
+### Streams
+
+Polymer Expressions have experimental support for binding to streams, and when
+new values are passed to the stream, the template updates. The feature is not
+fully implemented yet.
+
+See the examples in /example/streams for more details.
+
+## Syntax
+
+### Property Access
+
+Properties on the model and in the scope are looked up via simple property
+names, like `foo`. Property names are looked up first in the top-level
+variables, next in the model, then recursively in parent scopes. Properties on
+objects can be access with dot notation like `foo.bar`.
+
+The keyword `this` always refers to the model if there is one, otherwise `this`
+is `null`. If you have model properties and top-level variables with the same
+name, you can use `this` to refer to the model property.
+
+### Literals
+
+Polymer Expressions support number, boolean, string, and map literals. Strings
+can use either single or double quotes.
+
+ * Numbers: `1`, `1.0`
+ * Booleans: `true`, `false`
+ * Strings: `'abc'`, `"xyz"`
+ * Maps: `{ 'a': 1, 'b': 2 }`
+
+List literals are planned, see [issue 9](https://github.com/dart-lang/polymer_expressions/issues/9)
+
+### Functions and Methods
+
+If a property is a function in the scope, a method on the model, or a method on
+an object, it can be invoked with standard function syntax. Functions and
+Methods can take arguments. Named arguments are not supported. Arguments can be
+literals or variables.
+
+Examples:
+
+ * Top-level function: `myFunction()`
+ * Top-level function with arguments: `myFunction(a, b, 42)`
+ * Model method: `aMethod()`
+ * Method on nested-property: `a.b.anotherMethod()`
+
+### Operators
+
+Polymer Expressions supports the following binary and unary operators:
+
+ * Arithmetic operators: +, -, *, /, %, unary + and -
+ * Comparison operators: ==, !=, <=, <, >, >=
+ * Boolean operators: &&, ||, unary !
+
+Expressions do not support bitwise operators such as &, |, << and >>, or increment/decrement operators (++ and --)
+
+### List and Map Indexing
+
+List and Map like objects can be accessed via the index operator: []
+
+Examples:
+
+ * `items[2]`
+ * `people['john']`
+
+Unlike JavaScript, list and map contents are not generally available via
+property access. That is, the previous examples are not equivalent to `items.2`
+and `people.john`. This ensures that access to properties and methods on Lists
+and Maps is preserved.
+
+### Filters and Transformers
+
+A filter is a function that transforms a value into another, used via the pipe
+syntax: `value | filter` Any function that takes exactly one argument can be
+used as a filter.
+
+Example:
+
+If `person.name` is "John", and a top-level function named `uppercase` has been
+registered, then `person.name | uppercase` will have the value "JOHN".
+
+The pipe syntax is used rather than a regular function call so that we can
+support two-way bindings through transformers. A transformer is a filter that
+has an inverse function. Transformers must extend or implement the `Transformer`
+class, which has `forward()` and `reverse()` methods.
+
+### Repeating Templates
+
+A template can be repeated by using the "repeat" attribute with a binding. The
+binding can either evaluate to an Iterable, in which case the template is
+instantiated for each item in the iterable and the model of the instance is
+set to the item, or the binding can be a "in" iterator expression, in which
+case a new variable is added to each scope.
+
+The following examples produce the same output.
+
+Evaluate to an iterable:
+
+```html
+ <template repeat="{{ items }}">
+ <div>{{ }}</div>
+ </template>
+```
+
+"in" expression:
+
+```html
+ <template repeat="{{ item in items }}">
+ <div>{{ item }}</div>
+ </template>
+```
+
+## Status
+
+The syntax implemented is experimental and subject to change, in fact, it
+**will** change soon. The goal is to be compatible with Polymer's binding
+syntax. We will announce breaking changes on the
+[web-ui@dartlang.org mailing list][web-ui-list].
+
+Please [file issues on Dart project page](http://dartbug.com/new)
+for any bugs you find or for feature requests. Make a note that it applies to
+"package:polymer_expressions"
+
+You can discuss Polymer Expressions on the
+[web-ui@dartlang.org mailing list][web-ui-list].
+
+[web-ui-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/web-ui
diff --git a/pkg/polymer_expressions/example/example.dart b/pkg/polymer_expressions/example/example.dart
new file mode 100644
index 0000000..f3ad658
--- /dev/null
+++ b/pkg/polymer_expressions/example/example.dart
@@ -0,0 +1,26 @@
+// 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:html';
+
+import 'package:polymer_expressions/polymer_expressions.dart';
+import 'package:mdv/mdv.dart' as mdv;
+
+import 'person.dart';
+
+main() {
+ mdv.initialize();
+ var john = new Person('John', 'Messerly', ['A', 'B', 'C']);
+ var justin = new Person('Justin', 'Fagnani', ['D', 'E', 'F']);
+ var globals = {
+ 'uppercase': (String v) => v.toUpperCase(),
+ 'people': [john, justin],
+ };
+
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions(globals: globals)
+ ..model = john;
+
+ query('#test2').model = john;
+}
diff --git a/pkg/polymer_expressions/example/example.html b/pkg/polymer_expressions/example/example.html
new file mode 100644
index 0000000..50a2ef8
--- /dev/null
+++ b/pkg/polymer_expressions/example/example.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+ <head>
+ <title>example</title>
+ <style>
+ .jname {
+ background: #faa;
+ }
+ .fname {
+ border: solid 1px #88f;
+ }
+ </style>
+ </head>
+
+ <body>
+ <template id="test" bind>
+ <h1>Polymer Expression Syntax</h1>
+ <label> first name: <input value="{{ firstName }}"></label>
+ <label> last name: <input value="{{ lastName }}"></label>
+ <div>Hello {{ getFullName() }}!</div>
+ <div>{{ firstName }} {{ lastName }}</div>
+ <div>
+ <h2>Iteration</h2>
+ <ul>
+ <template repeat="{{ item in items.take(2) }}">
+ <li>{{ item }}</li>
+ </template>
+ </ul>
+ <ul>
+ <template repeat="{{ people }}">
+ <li class="{{ {'jname': firstName.startsWith('J'),
+ 'fname': lastName.startsWith('F')} }}">
+ {{ firstName }} {{ lastName }}
+ </li>
+ <ul>
+ <template repeat="{{ item in items }}">
+ <li checked?="{{ item == 'A'}}">{{ firstName }} {{ item }}</li>
+ </template>
+ </ul>
+ </template>
+ </ul>
+ </div>
+ </template>
+
+ <template id="test2" bind>
+ <h1>Default Syntax</h1>
+ <label> first name: <input value="{{ firstName }}"></label>
+ <label> last name: <input value="{{ lastName }}"></label>
+ </template>
+
+ <script type="application/dart" src="example.dart"></script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/example/person.dart b/pkg/polymer_expressions/example/person.dart
new file mode 100644
index 0000000..d561fac
--- /dev/null
+++ b/pkg/polymer_expressions/example/person.dart
@@ -0,0 +1,46 @@
+// 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.
+
+library person;
+
+import 'package:observe/observe.dart';
+
+class Person extends ChangeNotifierBase {
+ static const _FIRST_NAME = const Symbol('firstName');
+ static const _LAST_NAME = const Symbol('lastName');
+ static const _ITEMS = const Symbol('items');
+ static const _GET_FULL_NAME = const Symbol('getFullName');
+
+ String _firstName;
+ String _lastName;
+ List<String> _items;
+
+ Person(this._firstName, this._lastName, this._items);
+
+ String get firstName => _firstName;
+
+ void set firstName(String value) {
+ _firstName = value;
+ notifyChange(new PropertyChangeRecord(_FIRST_NAME));
+ }
+
+ String get lastName => _lastName;
+
+ void set lastName(String value) {
+ _lastName = value;
+ notifyChange(new PropertyChangeRecord(_LAST_NAME));
+ }
+
+ String getFullName() => '$_firstName $_lastName';
+
+ List<String> get items => _items;
+
+ void set items(List<String> value) {
+ _items = value;
+ notifyChange(new PropertyChangeRecord(_ITEMS));
+ }
+
+ String toString() => "Person(firstName: $_firstName, lastName: $_lastName)";
+
+}
diff --git a/pkg/polymer_expressions/example/streams/collect_key_press.html b/pkg/polymer_expressions/example/streams/collect_key_press.html
new file mode 100644
index 0000000..48221c1
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/collect_key_press.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+ <body>
+ <template id="test" repeat="{{ keyPress | collect }}">
+ <div>key: {{ }}</div>
+ </template>
+ <script type="application/dart">
+ import 'dart:async';
+ import 'dart:html';
+ import 'package:polymer_expressions/polymer_expressions.dart';
+ import 'package:polymer_expressions/async.dart';
+ import 'package:mdv/mdv.dart' as mdv;
+ import 'package:observe/observe.dart';
+
+ Iterable collect(StreamBinding s) {
+ var list = new ObservableList();
+ s.stream.listen((e) { list.add(e); });
+ return list;
+ }
+
+ main() {
+ mdv.initialize();
+
+ var globals = {
+ 'keyPress': document.onKeyPress
+ .map((e) => new String.fromCharCode(e.charCode)),
+ 'collect': collect,
+ };
+
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions(globals: globals)
+ ..model = null;
+ }
+ </script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/count_clicks.html b/pkg/polymer_expressions/example/streams/count_clicks.html
new file mode 100644
index 0000000..e164719
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/count_clicks.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+ <body>
+ <template id="test" bind="{{ mouseDown | count }}">
+ Clicks: {{ value }}
+ </template>
+ <script type="application/dart">
+ import 'dart:async';
+ import 'dart:html';
+ import 'package:polymer_expressions/polymer_expressions.dart';
+ import 'package:polymer_expressions/async.dart';
+ import 'package:mdv/mdv.dart' as mdv;
+ import 'package:observe/observe.dart';
+
+ count(StreamBinding s) {
+ var box = new ObservableBox();
+ box.value = 0;
+ s.stream.listen((e) { box.value++; });
+ return box;
+ }
+
+ main() {
+ mdv.initialize();
+
+ var globals = {
+ 'mouseDown': document.onMouseDown,
+ 'count': count,
+ };
+
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions(globals: globals)
+ ..model = null;
+ }
+ </script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/mouse_move.html b/pkg/polymer_expressions/example/streams/mouse_move.html
new file mode 100644
index 0000000..c6cd1cc
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/mouse_move.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+ <body>
+ <template id="test" bind="{{ mouse }}">
+ ({{ value.offsetX }}, {{ value.offsetY }})
+ </template>
+ <script type="application/dart">
+ import 'dart:html';
+ import 'package:polymer_expressions/polymer_expressions.dart';
+ import 'package:mdv/mdv.dart' as mdv;
+
+ main() {
+ mdv.initialize();
+
+ var globals = {
+ 'mouse': document.onMouseMove,
+ };
+
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions(globals: globals)
+ ..model = null;
+ }
+ </script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/mouse_resize_image.html b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
new file mode 100644
index 0000000..a056d2e
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+ <body>
+ <template id="test" bind="{{ mouseMax }}">
+ <img src="http://www.dartlang.org/logos/dart-logo.png"
+ width="{{ value }}"
+ height="{{ value }}">
+ </template>
+ <script type="application/dart">
+ import 'dart:html';
+ import 'dart:math';
+ import 'package:polymer_expressions/polymer_expressions.dart';
+ import 'package:mdv/mdv.dart' as mdv;
+
+ main() {
+ mdv.initialize();
+
+ var globals = {
+ 'mouse': document.onMouseMove,
+ 'mouseMax':
+ document.onMouseMove.map((e) => max(e.offsetX, e.offsetY)),
+ };
+
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions(globals: globals)
+ ..model = null;
+ }
+ </script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/lib/async.dart b/pkg/polymer_expressions/lib/async.dart
new file mode 100644
index 0000000..23e9846
--- /dev/null
+++ b/pkg/polymer_expressions/lib/async.dart
@@ -0,0 +1,17 @@
+// 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.
+
+library polymer_expressions.async;
+
+import 'dart:async';
+import 'package:observe/observe.dart';
+
+class StreamBinding<T> extends ObservableBox {
+ final Stream<T> stream;
+
+ StreamBinding(this.stream) {
+ stream.listen((T i) { value = i; });
+ }
+
+}
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
new file mode 100644
index 0000000..dbf1f88
--- /dev/null
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -0,0 +1,613 @@
+// 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.
+
+library polymer_expressions.eval;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:mirrors';
+
+import 'package:observe/observe.dart';
+
+import 'async.dart';
+import 'expression.dart';
+import 'filter.dart';
+import 'visitor.dart';
+import 'src/mirrors.dart';
+
+final _BINARY_OPERATORS = {
+ '+': (a, b) => a + b,
+ '-': (a, b) => a - b,
+ '*': (a, b) => a * b,
+ '/': (a, b) => a / b,
+ '==': (a, b) => a == b,
+ '!=': (a, b) => a != b,
+ '>': (a, b) => a > b,
+ '>=': (a, b) => a >= b,
+ '<': (a, b) => a < b,
+ '<=': (a, b) => a <= b,
+ '||': (a, b) => a || b,
+ '&&': (a, b) => a && b,
+ '|': (a, f) {
+ if (f is Transformer) return f.forward(a);
+ if (f is Filter) return f(a);
+ throw new EvalException("Filters must be a one-argument function.");
+ }
+};
+
+final _UNARY_OPERATORS = {
+ '+': (a) => a,
+ '-': (a) => -a,
+ '!': (a) => !a,
+};
+
+final _BOOLEAN_OPERATORS = ['!', '||', '&&'];
+
+/**
+ * Evaluation [expr] in the context of [scope].
+ */
+Object eval(Expression expr, Scope scope) => observe(expr, scope)._value;
+
+
+ExpressionObserver observe(Expression expr, Scope scope) {
+ var observer = new ObserverBuilder(scope).visit(expr);
+ new Updater(scope).visit(observer);
+ return observer;
+}
+
+/**
+ * Assign [value] to the variable or field referenced by [expr] in the context
+ * of [scope].
+ *
+ * [expr] must be an /assignable/ expression, it must not contain
+ * operators or function invocations, and any index operations must use a
+ * literal index.
+ */
+void assign(Expression expr, Object value, Scope scope) {
+
+ notAssignable() =>
+ throw new EvalException("Expression is not assignable: $expr");
+
+ Expression expression;
+ var property;
+ bool isIndex = false;
+ var filters = <Expression>[]; // reversed order for assignment
+
+ while (expr is BinaryOperator && expr.operator == '|') {
+ filters.add(expr.right);
+ expr = expr.left;
+ }
+
+ if (expr is Identifier) {
+ expression = empty();
+ property = expr.value;
+ } else if (expr is Invoke) {
+ expression = expr.receiver;
+ if (expr.method == '[]') {
+ if (expr.arguments[0] is! Literal) notAssignable();
+ Literal l = expr.arguments[0];
+ property = l.value;
+ isIndex = true;
+ } else if (expr.method != null) {
+ if (expr.arguments != null) notAssignable();
+ property = expr.method;
+ } else {
+ notAssignable();
+ }
+ } else {
+ notAssignable();
+ }
+
+ // transform the values backwards through the filters
+ for (var filterExpr in filters) {
+ var filter = eval(filterExpr, scope);
+ if (filter is! Transformer) {
+ throw new EvalException("filter must implement Transformer: $filterExpr");
+ }
+ value = filter.reverse(value);
+ }
+ // make the assignment
+ var o = eval(expression, scope);
+ if (o == null) throw new EvalException("Can't assign to null: $expression");
+ if (isIndex) {
+ o[property] = value;
+ } else {
+ reflect(o).setField(new Symbol(property), value);
+ }
+}
+
+/**
+ * A mapping of names to objects. Scopes contain a set of named [variables] and
+ * a single [model] object (which can be thought of as the "this" reference).
+ * Names are currently looked up in [variables] first, then the [model].
+ *
+ * Scopes can be nested by giving them a [parent]. If a name in not found in a
+ * Scope, it will look for it in it's parent.
+ */
+class Scope extends Object {
+ final Scope parent;
+ final Object model;
+ // TODO(justinfagnani): disallow adding/removing names
+ final ObservableMap<String, Object> _variables;
+ InstanceMirror __modelMirror;
+
+ Scope({this.model, Map<String, Object> variables: const {}, this.parent})
+ : _variables = new ObservableMap.from(variables);
+
+ InstanceMirror get _modelMirror {
+ if (__modelMirror != null) return __modelMirror;
+ __modelMirror = reflect(model);
+ return __modelMirror;
+ }
+
+ Object operator[](String name) {
+ if (name == 'this') {
+ return model;
+ } else if (_variables.containsKey(name)) {
+ return _convert(_variables[name]);
+ } else if (model != null) {
+ var symbol = new Symbol(name);
+ var classMirror = _modelMirror.type;
+ var memberMirror = getMemberMirror(classMirror, symbol);
+ if (memberMirror is VariableMirror ||
+ (memberMirror is MethodMirror && memberMirror.isGetter)) {
+ return _convert(_modelMirror.getField(symbol).reflectee);
+ } else if (memberMirror is MethodMirror) {
+ return new Method(_modelMirror, symbol);
+ }
+ }
+ if (parent != null) {
+ return _convert(parent[name]);
+ } else {
+ throw new EvalException("variable not found: $name in $hashCode");
+ }
+ }
+
+ Object ownerOf(String name) {
+ if (name == 'this') {
+ // we could return the Scope if it were Observable, but since assigning
+ // a model to a template destroys and recreates the instance, it doesn't
+ // seem neccessary
+ return null;
+ } else if (_variables.containsKey(name)) {
+ return _variables;
+ } else {
+ var symbol = new Symbol(name);
+ var classMirror = _modelMirror.type;
+ if (getMemberMirror(classMirror, symbol) != null) {
+ return model;
+ }
+ }
+ if (parent != null) {
+ return parent.ownerOf(name);
+ }
+ }
+
+ bool contains(String name) {
+ if (_variables.containsKey(name)) {
+ return true;
+ } else {
+ var symbol = new Symbol(name);
+ var classMirror = _modelMirror.type;
+ if (getMemberMirror(classMirror, symbol) != null) {
+ return true;
+ }
+ }
+ if (parent != null) {
+ return parent.contains(name);
+ }
+ return false;
+ }
+
+ String toString() => 'Scope($hashCode $parent)';
+}
+
+Object _convert(v) {
+ if (v is Stream) return new StreamBinding(v);
+ return v;
+}
+
+abstract class ExpressionObserver<E extends Expression> implements Expression {
+ final E _expr;
+ ExpressionObserver _parent;
+
+ StreamSubscription _subscription;
+ Object _value;
+
+ StreamController _controller = new StreamController.broadcast();
+ Stream get onUpdate => _controller.stream;
+
+ ExpressionObserver(this._expr);
+
+ Object get currentValue => _value;
+
+ update(Scope scope) => _updateSelf(scope);
+
+ _updateSelf(Scope scope) {}
+
+ _invalidate(Scope scope) {
+ _observe(scope);
+ if (_parent != null) {
+ _parent._invalidate(scope);
+ }
+ }
+
+ _observe(Scope scope) {
+ // unobserve last value
+ if (_subscription != null) {
+ _subscription.cancel();
+ _subscription = null;
+ }
+
+ var _oldValue = _value;
+
+ // evaluate
+ _updateSelf(scope);
+
+ if (!identical(_value, _oldValue)) {
+ _controller.add(_value);
+ }
+ }
+
+ String toString() => _expr.toString();
+}
+
+class Updater extends RecursiveVisitor<ExpressionObserver> {
+ final Scope scope;
+
+ Updater(this.scope);
+
+ visitExpression(ExpressionObserver e) {
+ e._observe(scope);
+ }
+
+ visitInExpression(InObserver c) {
+ visit(c.right);
+ visitExpression(c);
+ }
+}
+
+class ObserverBuilder extends Visitor {
+ final Scope scope;
+ final Queue parents = new Queue();
+
+ ObserverBuilder(this.scope);
+
+ visitEmptyExpression(EmptyExpression e) => new EmptyObserver(e);
+
+ visitParenthesizedExpression(ParenthesizedExpression e) => visit(e.child);
+
+ visitInvoke(Invoke i) {
+ var receiver = visit(i.receiver);
+ var args = (i.arguments == null)
+ ? null
+ : i.arguments.map(visit).toList(growable: false);
+ var invoke = new InvokeObserver(i, receiver, args);
+ receiver._parent = invoke;
+ if (args != null) args.forEach((a) => a._parent = invoke);
+ return invoke;
+ }
+
+ visitLiteral(Literal l) => new LiteralObserver(l);
+
+ visitMapLiteral(MapLiteral l) {
+ var entries = l.entries.map(visit).toList(growable: false);
+ var map = new MapLiteralObserver(l, entries);
+ entries.forEach((e) => e._parent = map);
+ return map;
+ }
+
+ visitMapLiteralEntry(MapLiteralEntry e) {
+ var key = visit(e.key);
+ var value = visit(e.entryValue);
+ var entry = new MapLiteralEntryObserver(e, key, value);
+ key._parent = entry;
+ value._parent = entry;
+ return entry;
+ }
+
+ visitIdentifier(Identifier i) => new IdentifierObserver(i);
+
+ visitBinaryOperator(BinaryOperator o) {
+ var left = visit(o.left);
+ var right = visit(o.right);
+ var binary = new BinaryObserver(o, left, right);
+ left._parent = binary;
+ right._parent = binary;
+ return binary;
+ }
+
+ visitUnaryOperator(UnaryOperator o) {
+ var expr = visit(o.child);
+ var unary = new UnaryObserver(o, expr);
+ expr._parent = unary;
+ return unary;
+ }
+
+ visitInExpression(InExpression i) {
+ // don't visit the left. It's an identifier, but we don't want to evaluate
+ // it, we just want to add it to the comprehension object
+ var left = visit(i.left);
+ var right = visit(i.right);
+ var inexpr = new InObserver(i, left, right);
+ right._parent = inexpr;
+ return inexpr;
+ }
+}
+
+class EmptyObserver extends ExpressionObserver<EmptyExpression>
+ implements EmptyExpression {
+
+ EmptyObserver(EmptyExpression value) : super(value);
+
+ _updateSelf(Scope scope) {
+ _value = scope.model;
+ // TODO(justin): listen for scope.model changes?
+ }
+
+ accept(Visitor v) => v.visitEmptyExpression(this);
+}
+
+class LiteralObserver extends ExpressionObserver<Literal> implements Literal {
+
+ LiteralObserver(Literal value) : super(value);
+
+ dynamic get value => _expr.value;
+
+ _updateSelf(Scope scope) {
+ _value = _expr.value;
+ }
+
+ accept(Visitor v) => v.visitLiteral(this);
+}
+
+class MapLiteralObserver extends ExpressionObserver<MapLiteral>
+ implements MapLiteral {
+
+ final List<MapLiteralEntryObserver> entries;
+
+ MapLiteralObserver(MapLiteral value, this.entries) : super(value);
+
+ _updateSelf(Scope scope) {
+ _value = entries.fold(new Map(),
+ (m, e) => m..[e.key._value] = e.entryValue._value);
+ }
+
+ accept(Visitor v) => v.visitMapLiteral(this);
+}
+
+class MapLiteralEntryObserver extends ExpressionObserver<MapLiteralEntry>
+ implements MapLiteralEntry {
+
+ final LiteralObserver key;
+ final ExpressionObserver entryValue;
+
+ MapLiteralEntryObserver(MapLiteralEntry value, this.key, this.entryValue)
+ : super(value);
+
+ accept(Visitor v) => v.visitMapLiteralEntry(this);
+}
+
+class IdentifierObserver extends ExpressionObserver<Identifier>
+ implements Identifier {
+
+ IdentifierObserver(Identifier value) : super(value);
+
+ dynamic get value => _expr.value;
+
+ _updateSelf(Scope scope) {
+ _value = scope[_expr.value];
+
+ var owner = scope.ownerOf(_expr.value);
+ if (owner is Observable) {
+ _subscription = (owner as Observable).changes.listen(
+ (List<ChangeRecord> changes) {
+ var symbol = new Symbol(_expr.value);
+ if (changes.any((c) => c.changes(symbol))) {
+ _invalidate(scope);
+ }
+ });
+ }
+ }
+
+ accept(Visitor v) => v.visitIdentifier(this);
+}
+
+class ParenthesizedObserver extends ExpressionObserver<ParenthesizedExpression>
+ implements ParenthesizedExpression {
+ final ExpressionObserver child;
+
+ ParenthesizedObserver(ExpressionObserver expr, this.child) : super(expr);
+
+
+ _updateSelf(Scope scope) {
+ _value = child._value;
+ }
+
+ accept(Visitor v) => v.visitParenthesizedExpression(this);
+}
+
+class UnaryObserver extends ExpressionObserver<UnaryOperator>
+ implements UnaryOperator {
+ final ExpressionObserver child;
+
+ UnaryObserver(UnaryOperator expr, this.child) : super(expr);
+
+ String get operator => _expr.operator;
+
+ _updateSelf(Scope scope) {
+ var f = _UNARY_OPERATORS[_expr.operator];
+ if (operator == '!') {
+ _value = f(_toBool(child._value));
+ } else {
+ _value = (child._value == null) ? null : f(child._value);
+ }
+ }
+
+ accept(Visitor v) => v.visitUnaryOperator(this);
+}
+
+class BinaryObserver extends ExpressionObserver<BinaryOperator>
+ implements BinaryOperator {
+
+ final ExpressionObserver left;
+ final ExpressionObserver right;
+
+ BinaryObserver(BinaryOperator expr, this.left, this.right)
+ : super(expr);
+
+ String get operator => _expr.operator;
+
+ _updateSelf(Scope scope) {
+ var f = _BINARY_OPERATORS[operator];
+ if (operator == '&&' || operator == '||') {
+ _value = f(_toBool(left._value), _toBool(right._value));
+ } else {
+ _value = (left._value == null || right._value == null)
+ ? null : f(left._value, right._value);
+ }
+ }
+
+ accept(Visitor v) => v.visitBinaryOperator(this);
+
+}
+
+class InvokeObserver extends ExpressionObserver<Invoke> implements Invoke {
+ final ExpressionObserver receiver;
+ List<ExpressionObserver> arguments;
+
+ InvokeObserver(Expression expr, this.receiver, [this.arguments])
+ : super(expr);
+
+ bool get isGetter => _expr.isGetter;
+
+ String get method => _expr.method;
+
+ _updateSelf(Scope scope) {
+ var args = (arguments == null)
+ ? []
+ : arguments.map((a) => a._value)
+ .toList(growable: false);
+ var receiverValue = receiver._value;
+ if (receiverValue == null) {
+ _value = null;
+ } else if (_expr.method == null) {
+ if (_expr.isGetter) {
+ // getter, but not a top-level identifier
+ // TODO(justin): listen to the receiver's owner
+ _value = receiverValue;
+ } else {
+ // top-level function or model method
+ // TODO(justin): listen to model changes to see if the method has
+ // changed? listen to the scope to see if the top-level method has
+ // changed?
+ assert(receiverValue is Function);
+ _value = call(receiverValue, args);
+ }
+ } else {
+ // special case [] because we don't need mirrors
+ if (_expr.method == '[]') {
+ assert(args.length == 1);
+ var key = args[0];
+ _value = receiverValue[key];
+
+ if (receiverValue is Observable) {
+ _subscription = (receiverValue as Observable).changes.listen(
+ (List<ChangeRecord> changes) {
+ if (changes.any((c) =>
+ c is MapChangeRecord && c.changes(key))) {
+ _invalidate(scope);
+ }
+ });
+ }
+ } else {
+ var mirror = reflect(receiverValue);
+ var symbol = new Symbol(_expr.method);
+ _value = (_expr.isGetter)
+ ? mirror.getField(symbol).reflectee
+ : mirror.invoke(symbol, args, null).reflectee;
+
+ if (receiverValue is Observable) {
+ _subscription = (receiverValue as Observable).changes.listen(
+ (List<ChangeRecord> changes) {
+ if (changes.any((c) => c.changes(symbol))) {
+ _invalidate(scope);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ accept(Visitor v) => v.visitInvoke(this);
+}
+
+class InObserver extends ExpressionObserver<InExpression>
+ implements InExpression {
+ IdentifierObserver left;
+ ExpressionObserver right;
+
+ InObserver(Expression expr, this.left, this.right) : super(expr);
+
+ _updateSelf(Scope scope) {
+ Identifier identifier = left;
+ var iterable = right._value;
+
+ if (iterable is! Iterable && iterable != null) {
+ throw new EvalException("right side of 'in' is not an iterator");
+ }
+
+ if (iterable is ObservableList) {
+ _subscription = (iterable as ObservableList).changes.listen(
+ (List<ChangeRecord> changes) {
+ if (changes.any((c) => c is ListChangeRecord)) {
+ _invalidate(scope);
+ }
+ });
+ }
+
+ // TODO: make Comprehension observable and update it
+ _value = new Comprehension(identifier.value, iterable);
+ }
+
+ accept(Visitor v) => v.visitInExpression(this);
+}
+
+_toBool(v) => (v == null) ? false : v;
+
+call(dynamic receiver, List args) {
+ if (receiver is Method) {
+ return
+ _convert(receiver.mirror.invoke(receiver.symbol, args, null).reflectee);
+ } else {
+ return _convert(Function.apply(receiver, args, null));
+ }
+}
+
+/**
+ * A comprehension declaration ("a in b").
+ */
+class Comprehension {
+ final String identifier;
+ final Iterable iterable;
+ Comprehension(this.identifier, this.iterable);
+}
+
+/**
+ * A method on a model object in a [Scope].
+ */
+class Method { //implements _FunctionWrapper {
+ final InstanceMirror mirror;
+ final Symbol symbol;
+
+ Method(this.mirror, this.symbol);
+
+ dynamic call(List args) => mirror.invoke(symbol, args, null).reflectee;
+}
+
+class EvalException implements Exception {
+ final String message;
+ EvalException(this.message);
+ String toString() => "EvalException: $message";
+}
diff --git a/pkg/polymer_expressions/lib/expression.dart b/pkg/polymer_expressions/lib/expression.dart
new file mode 100644
index 0000000..516e85b
--- /dev/null
+++ b/pkg/polymer_expressions/lib/expression.dart
@@ -0,0 +1,208 @@
+// 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.
+
+library polymer_expressions.expression;
+
+import 'visitor.dart';
+
+// Helper functions for building expression trees programmatically
+
+EmptyExpression empty() => new EmptyExpression();
+Literal literal(v) => new Literal(v);
+MapLiteral mapLiteral(List<MapLiteralEntry> entries) => new MapLiteral(entries);
+MapLiteralEntry mapLiteralEntry(Literal key, Expression value) =>
+ new MapLiteralEntry(key, value);
+Identifier ident(String v) => new Identifier(v);
+ParenthesizedExpression paren(Expression e) => new ParenthesizedExpression(e);
+UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
+BinaryOperator binary(Expression l, String op, Expression r) =>
+ new BinaryOperator(l, op, r);
+Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+ new Invoke(e, m, a);
+InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
+
+
+class AstFactory {
+ EmptyExpression empty() => new EmptyExpression();
+
+ Literal literal(v) => new Literal(v);
+
+ MapLiteral mapLiteral(List<MapLiteralEntry> entries) =>
+ new MapLiteral(entries);
+
+ MapLiteralEntry mapLiteralEntry(Literal key, Expression value) =>
+ new MapLiteralEntry(key, value);
+
+ Identifier identifier(String v) => new Identifier(v);
+
+ ParenthesizedExpression parenthesized(Expression e) =>
+ new ParenthesizedExpression(e);
+
+ UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
+
+ BinaryOperator binary(Expression l, String op, Expression r) =>
+ new BinaryOperator(l, op, r);
+
+ Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+ new Invoke(e, m, a);
+
+ InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
+}
+
+/// Base class for all expressions
+abstract class Expression {
+ accept(Visitor v);
+}
+
+class EmptyExpression extends Expression {
+ accept(Visitor v) => v.visitEmptyExpression(this);
+ bool operator ==(o) => o is EmptyExpression;
+}
+
+class Literal<T> extends Expression {
+ final T value;
+
+ Literal(this.value);
+
+ accept(Visitor v) => v.visitLiteral(this);
+
+ String toString() => (value is String) ? '"$value"' : '$value';
+
+ bool operator ==(o) => o is Literal<T> && o.value == value;
+
+ int get hashCode => value.hashCode;
+}
+
+class MapLiteral extends Expression {
+ final List<MapLiteralEntry> entries;
+
+ MapLiteral(this.entries);
+
+ accept(Visitor v) => v.visitMapLiteral(this);
+
+ String toString() => "{$entries}";
+
+ bool operator ==(o) => o is MapLiteral && _listEquals(o.entries, entries);
+}
+
+class MapLiteralEntry extends Expression {
+ final Literal key;
+ final Expression entryValue;
+
+ MapLiteralEntry(this.key, this.entryValue);
+
+ accept(Visitor v) => v.visitMapLiteralEntry(this);
+
+ String toString() => "$key: $entryValue";
+
+ bool operator ==(o) => o is MapLiteralEntry && o.key == key
+ && o.entryValue == entryValue;
+}
+
+class ParenthesizedExpression extends Expression {
+ final Expression child;
+
+ ParenthesizedExpression(this.child);
+
+ accept(Visitor v) => v.visitParenthesizedExpression(this);
+
+ String toString() => '($child)';
+
+ bool operator ==(o) => o is ParenthesizedExpression && o.child == child;
+
+ int get hashCode => child.hashCode;
+}
+
+class Identifier extends Expression {
+ final String value;
+
+ Identifier(this.value);
+
+ accept(Visitor v) => v.visitIdentifier(this);
+
+ String toString() => value;
+
+ bool operator ==(o) => o is Identifier && o.value == value;
+
+ int get hashCode => value.hashCode;
+}
+
+class UnaryOperator extends Expression {
+ final String operator;
+ final Expression child;
+
+ UnaryOperator(this.operator, this.child);
+
+ accept(Visitor v) => v.visitUnaryOperator(this);
+
+ String toString() => '$operator $child';
+
+ bool operator ==(o) => o is UnaryOperator && o.operator == operator
+ && o.child == child;
+}
+
+class BinaryOperator extends Expression {
+ final String operator;
+ final Expression left;
+ final Expression right;
+
+ BinaryOperator(this.left, this.operator, this.right);
+
+ accept(Visitor v) => v.visitBinaryOperator(this);
+
+ String toString() => '($left $operator $right)';
+
+ bool operator ==(o) => o is BinaryOperator && o.operator == operator
+ && o.left == left && o.right == right;
+}
+
+class InExpression extends Expression {
+ final Expression left;
+ final Expression right;
+
+ InExpression(this.left, this.right);
+
+ accept(Visitor v) => v.visitInExpression(this);
+
+ String toString() => '($left in $right)';
+
+ bool operator ==(o) => o is InExpression && o.left == left
+ && o.right == right;
+}
+
+/**
+ * Represents a function or method invocation. If [method] is null, then
+ * [receiver] is an expression that should evaluate to a function. If [method]
+ * is not null, then [receiver] is an expression that should evaluate to an
+ * object that has an appropriate method.
+ */
+class Invoke extends Expression {
+ final Expression receiver;
+ final String method;
+ final List<Expression> arguments;
+
+ Invoke(this.receiver, this.method, [this.arguments]);
+
+ accept(Visitor v) => v.visitInvoke(this);
+
+ bool get isGetter => arguments == null;
+
+ String toString() => '$receiver.$method($arguments)';
+
+ bool operator ==(o) =>
+ o is Invoke
+ && o.receiver == receiver
+ && o.method == method
+ && _listEquals(o.arguments, arguments);
+}
+
+bool _listEquals(List a, List b) {
+ if (a == b) return true;
+ if (a == null || b == null) return false;
+ if (a.length != b.length) return false;
+ for (int i = 0; i < a.length; i++) {
+ if (a[i] != b[i]) return false;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/pkg/polymer_expressions/lib/filter.dart b/pkg/polymer_expressions/lib/filter.dart
new file mode 100644
index 0000000..ab808ed
--- /dev/null
+++ b/pkg/polymer_expressions/lib/filter.dart
@@ -0,0 +1,23 @@
+// 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.
+
+library polymer_expressions.filter;
+
+typedef Object Filter(Object value);
+
+abstract class Transformer<T, V> {
+
+ T forward(V v);
+ V reverse(T t);
+ Transformer<V, T> get inverse => new _InverseTransformer(this);
+}
+
+class _InverseTransformer<T, V> implements Transformer<T, V> {
+ final Transformer<V, T> _t;
+ _InverseTransformer(this._t);
+
+ T forward(V v) => _t.reverse(v);
+ V reverse(T t) => _t.forward(t);
+ Transformer<V, T> get inverse => _t;
+}
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
new file mode 100644
index 0000000..c02d656
--- /dev/null
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -0,0 +1,282 @@
+// 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.
+
+library polymer_expressions.parser;
+
+import 'tokenizer.dart';
+import 'expression.dart';
+
+const _UNARY_OPERATORS = const ['+', '-', '!'];
+
+Expression parse(String expr) => new Parser(expr).parse();
+
+class Parser {
+ final AstFactory _astFactory;
+ final Tokenizer _tokenizer;
+ List<Token> _tokens;
+ Iterator _iterator;
+ Token _token;
+
+ Parser(String input, {AstFactory astFactory})
+ : _tokenizer = new Tokenizer(input),
+ _astFactory = (astFactory == null) ? new AstFactory() : astFactory;
+
+ Expression parse() {
+ _tokens = _tokenizer.tokenize();
+ _iterator = _tokens.iterator;
+ _advance();
+ return _parseExpression();
+ }
+
+ _advance([int kind, String value]) {
+ if ((kind != null && _token.kind != kind)
+ || (value != null && _token.value != value)) {
+ throw new ParseException("Expected $value: $_token");
+ }
+ _token = _iterator.moveNext() ? _iterator.current : null;
+ }
+
+ Expression _parseExpression() {
+ if (_token == null) return _astFactory.empty();
+ var expr = _parseUnary();
+ return (expr == null) ? null : _parsePrecedence(expr, 0);
+ }
+
+ // _parsePrecedence and _parseBinary implement the precedence climbing
+ // algorithm as described in:
+ // http://en.wikipedia.org/wiki/Operator-precedence_parser#Precedence_climbing_method
+ Expression _parsePrecedence(Expression left, int precedence) {
+ assert(left != null);
+ while (_token != null) {
+ if (_token.kind == GROUPER_TOKEN) {
+ if (_token.value == '(') {
+ var args = _parseArguments();
+ left = _astFactory.invoke(left, null, args);
+ } else if (_token.value == '[') {
+ var indexExpr = _parseIndex();
+ var args = indexExpr == null ? [] : [indexExpr];
+ left = _astFactory.invoke(left, '[]', args);
+ } else {
+ break;
+ }
+ } else if (_token.kind == DOT_TOKEN) {
+ _advance();
+ var right = _parseUnary();
+ left = _makeInvoke(left, right);
+ } else if (_token.kind == KEYWORD_TOKEN && _token.value == 'in') {
+ left = _parseComprehension(left);
+ } else if (_token.kind == OPERATOR_TOKEN
+ && _token.precedence >= precedence) {
+ left = _parseBinary(left);
+ } else {
+ break;
+ }
+ }
+ return left;
+ }
+
+ Invoke _makeInvoke(left, right) {
+ if (right is Identifier) {
+ return _astFactory.invoke(left, right.value);
+ } else if (right is Invoke && right.receiver is Identifier) {
+ Identifier method = right.receiver;
+ return _astFactory.invoke(left, method.value, right.arguments);
+ } else {
+ throw new ParseException("expected identifier: $right");
+ }
+ }
+
+ Expression _parseBinary(left) {
+ var op = _token;
+ _advance();
+ var right = _parseUnary();
+ while (_token != null
+ && (_token.kind == OPERATOR_TOKEN
+ || _token.kind == DOT_TOKEN
+ || _token.kind == GROUPER_TOKEN)
+ && _token.precedence > op.precedence) {
+ right = _parsePrecedence(right, _token.precedence);
+ }
+ return _astFactory.binary(left, op.value, right);
+ }
+
+ Expression _parseUnary() {
+ if (_token.kind == OPERATOR_TOKEN) {
+ var value = _token.value;
+ if (value == '+' || value == '-') {
+ _advance();
+ if (_token.kind == INTEGER_TOKEN) {
+ return _parseInteger(value);
+ } else if (_token.kind == DECIMAL_TOKEN) {
+ return _parseDecimal(value);
+ } else {
+ var expr = _parsePrecedence(_parsePrimary(), POSTFIX_PRECEDENCE);
+ return _astFactory.unary(value, expr);
+ }
+ } else if (value == '!') {
+ _advance();
+ var expr = _parsePrecedence(_parsePrimary(), POSTFIX_PRECEDENCE);
+ return _astFactory.unary(value, expr);
+ }
+ }
+ return _parsePrimary();
+ }
+
+ Expression _parsePrimary() {
+ var kind = _token.kind;
+ switch (kind) {
+ case KEYWORD_TOKEN:
+ var keyword = _token.value;
+ if (keyword == 'this') {
+ _advance();
+ // TODO(justin): return keyword node
+ return _astFactory.identifier('this');
+ } else if (keyword == 'in') {
+ return null;
+ } else {
+ throw new ArgumentError('unrecognized keyword: $keyword');
+ }
+ break;
+ case IDENTIFIER_TOKEN:
+ return _parseInvokeOrIdentifier();
+ break;
+ case STRING_TOKEN:
+ return _parseString();
+ break;
+ case INTEGER_TOKEN:
+ return _parseInteger();
+ break;
+ case DECIMAL_TOKEN:
+ return _parseDecimal();
+ break;
+ case GROUPER_TOKEN:
+ if (_token.value == '(') {
+ return _parseParenthesized();
+ } else if (_token.value == '{') {
+ return _parseMapLiteral();
+ }
+ return null;
+ break;
+ default:
+ return null;
+ }
+ }
+
+ MapLiteral _parseMapLiteral() {
+ var entries = [];
+ do {
+ _advance();
+ if (_token.kind == GROUPER_TOKEN && _token.value == '}') {
+ break;
+ }
+ entries.add(_parseMapLiteralEntry());
+ } while(_token != null && _token.value == ',');
+ _advance(GROUPER_TOKEN, '}');
+ return new MapLiteral(entries);
+ }
+
+ MapLiteralEntry _parseMapLiteralEntry() {
+ var key = _parseString();
+ _advance(COLON_TOKEN, ':');
+ var value = _parseExpression();
+ return _astFactory.mapLiteralEntry(key, value);
+ }
+
+ InExpression _parseComprehension(Expression left) {
+ assert(_token.value == 'in');
+ if (left is! Identifier) {
+ throw new ParseException(
+ "in... statements must start with an identifier");
+ }
+ _advance();
+ var right = _parseExpression();
+ return _astFactory.inExpr(left, right);
+ }
+
+ Expression _parseInvokeOrIdentifier() {
+ if (_token.value == 'true') {
+ _advance();
+ return _astFactory.literal(true);
+ }
+ if (_token.value == 'false') {
+ _advance();
+ return _astFactory.literal(false);
+ }
+ var identifier = _parseIdentifier();
+ var args = _parseArguments();
+ if (args == null) {
+ return identifier;
+ } else {
+ return _astFactory.invoke(identifier, null, args);
+ }
+ }
+
+ Invoke _parseInvoke() {
+ var identifier = _parseIdentifier();
+ var args = _parseArguments();
+ return _astFactory.invoke(null, identifier, args);
+ }
+
+ Identifier _parseIdentifier() {
+ if (_token.kind != IDENTIFIER_TOKEN) {
+ throw new ParseException("expected identifier: $_token.value");
+ }
+ var value = _token.value;
+ _advance();
+ return _astFactory.identifier(value);
+ }
+
+ List<Expression> _parseArguments() {
+ if (_token != null && _token.kind == GROUPER_TOKEN && _token.value == '(') {
+ var args = [];
+ do {
+ _advance();
+ if (_token.kind == GROUPER_TOKEN && _token.value == ')') {
+ break;
+ }
+ var expr = _parseExpression();
+ args.add(expr);
+ } while(_token != null && _token.value == ',');
+ _advance(GROUPER_TOKEN, ')');
+ return args;
+ }
+ return null;
+ }
+
+ Expression _parseIndex() {
+ if (_token != null && _token.kind == GROUPER_TOKEN && _token.value == '[') {
+ _advance();
+ var expr = _parseExpression();
+ _advance(GROUPER_TOKEN, ']');
+ return expr;
+ }
+ return null;
+ }
+
+ ParenthesizedExpression _parseParenthesized() {
+ _advance();
+ var expr = _parseExpression();
+ _advance(GROUPER_TOKEN, ')');
+ return _astFactory.parenthesized(expr);
+ }
+
+ Literal<String> _parseString() {
+ var value = _astFactory.literal(_token.value);
+ _advance();
+ return value;
+ }
+
+ Literal<int> _parseInteger([String prefix = '']) {
+ var value = _astFactory.literal(int.parse('$prefix${_token.value}'));
+ _advance();
+ return value;
+ }
+
+ Literal<double> _parseDecimal([String prefix = '']) {
+ var value = _astFactory.literal(double.parse('$prefix${_token.value}'));
+ _advance();
+ return value;
+ }
+
+}
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
new file mode 100644
index 0000000..dd7d7af
--- /dev/null
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -0,0 +1,109 @@
+// 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.
+
+library polymer_expressions;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:observe/observe.dart';
+
+import 'eval.dart';
+import 'expression.dart';
+import 'parser.dart';
+
+// TODO(justin): Investigate XSS protection
+Object _classAttributeConverter(v) =>
+ (v is Map) ? v.keys.where((k) => v[k] == true).join(' ') :
+ (v is Iterable) ? v.join(' ') :
+ v;
+
+Object _styleAttributeConverter(v) =>
+ (v is Map) ? v.keys.map((k) => '$k: ${v[k]}').join(';') :
+ (v is Iterable) ? v.join(';') :
+ v;
+
+class PolymerExpressions extends BindingDelegate {
+
+ final Map<String, Object> globals;
+
+ PolymerExpressions({Map<String, Object> globals})
+ : globals = (globals == null) ? new Map<String, Object>() : globals;
+
+ _Binding getBinding(model, String path, name, node) {
+ if (path == null) return null;
+ var expr = new Parser(path).parse();
+ if (model is! Scope) {
+ model = new Scope(model: model, variables: globals);
+ }
+ if (node is Element && name == "class") {
+ return new _Binding(expr, model, _classAttributeConverter);
+ }
+ if (node is Element && name == "style") {
+ return new _Binding(expr, model, _styleAttributeConverter);
+ }
+ return new _Binding(expr, model);
+ }
+
+ getInstanceModel(Element template, model) {
+ if (model is! Scope) {
+ var _scope = new Scope(model: model, variables: globals);
+ return _scope;
+ }
+ return model;
+ }
+}
+
+class _Binding extends Object with ChangeNotifierMixin {
+ static const _VALUE = const Symbol('value');
+
+ final Scope _scope;
+ final ExpressionObserver _expr;
+ final _converter;
+ var _value;
+
+
+ _Binding(Expression expr, Scope scope, [this._converter])
+ : _expr = observe(expr, scope),
+ _scope = scope {
+ _expr.onUpdate.listen(_setValue);
+ _setValue(_expr.currentValue);
+ }
+
+ _setValue(v) {
+ if (v is Comprehension) {
+ // convert the Comprehension into a list of scopes with the loop
+ // variable added to the scope
+ _value = v.iterable.map((i) {
+ var vars = new Map();
+ vars[v.identifier] = i;
+ Scope childScope = new Scope(parent: _scope, variables: vars);
+ return childScope;
+ }).toList(growable: false);
+ } else {
+ _value = (_converter == null) ? v : _converter(v);
+ }
+ notifyChange(new PropertyChangeRecord(_VALUE));
+ }
+
+ get value => _value;
+
+ set value(v) {
+ try {
+ assign(_expr, v, _scope);
+ notifyChange(new PropertyChangeRecord(_VALUE));
+ } on EvalException catch (e) {
+ // silently swallow binding errors
+ }
+ }
+
+ getValueWorkaround(key) {
+ if (key == _VALUE) return value;
+ }
+
+ setValueWorkaround(key, v) {
+ if (key == _VALUE) value = v;
+ }
+
+}
diff --git a/pkg/polymer_expressions/lib/src/mirrors.dart b/pkg/polymer_expressions/lib/src/mirrors.dart
new file mode 100644
index 0000000..c2a6c47
--- /dev/null
+++ b/pkg/polymer_expressions/lib/src/mirrors.dart
@@ -0,0 +1,42 @@
+// 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.
+
+library polymer_expressions.mirrors;
+
+import 'dart:mirrors';
+
+/**
+ * Walks up the class hierarchy to find a method declaration with the given
+ * [name].
+ *
+ * Note that it's not possible to tell if there's an implementation via
+ * noSuchMethod().
+ */
+Mirror getMemberMirror(ClassMirror classMirror, Symbol name) {
+ if (classMirror.members.containsKey(name)) {
+ return classMirror.members[name];
+ }
+ if (hasSuperclass(classMirror)) {
+ var mirror = getMemberMirror(classMirror.superclass, name);
+ if (mirror != null) {
+ return mirror;
+ }
+ }
+ for (ClassMirror supe in classMirror.superinterfaces) {
+ var mirror = getMemberMirror(supe, name);
+ if (mirror != null) {
+ return mirror;
+ }
+ }
+ return null;
+}
+
+/**
+ * Work-around for http://dartbug.com/5794
+ */
+bool hasSuperclass(ClassMirror classMirror) {
+ var superclass = classMirror.superclass;
+ return (superclass != null) &&
+ (superclass.qualifiedName != const Symbol('dart.core.Object'));
+}
diff --git a/pkg/polymer_expressions/lib/tokenizer.dart b/pkg/polymer_expressions/lib/tokenizer.dart
new file mode 100644
index 0000000..4e03167
--- /dev/null
+++ b/pkg/polymer_expressions/lib/tokenizer.dart
@@ -0,0 +1,300 @@
+// 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.
+
+library polymer_expressions.tokenizer;
+
+const int _TAB = 9;
+const int _LF = 10;
+const int _VTAB = 11;
+const int _FF = 12;
+const int _CR = 13;
+const int _SPACE = 32;
+const int _BANG = 33;
+const int _DQ = 34;
+const int _$ = 36;
+const int _AMPERSAND = 38;
+const int _SQ = 39;
+const int _OPEN_PAREN = 40;
+const int _CLOSE_PAREN = 41;
+const int _STAR = 42;
+const int _PLUS = 43;
+const int _COMMA = 44;
+const int _MINUS = 45;
+const int _PERIOD = 46;
+const int _SLASH = 47;
+const int _0 = 48;
+const int _9 = 57;
+const int _COLON = 58;
+const int _LT = 60;
+const int _EQ = 61;
+const int _GT = 62;
+const int _QUESTION = 63;
+const int _A = 65;
+const int _Z = 90;
+const int _OPEN_SQUARE_BRACKET = 91;
+const int _BACKSLASH = 92;
+const int _CLOSE_SQUARE_BRACKET = 93;
+const int _CARET = 94;
+const int _US = 95;
+const int _a = 97;
+const int _f = 102;
+const int _n = 110;
+const int _r = 114;
+const int _t = 116;
+const int _v = 118;
+const int _z = 122;
+const int _OPEN_CURLY_BRACKET = 123;
+const int _BAR = 124;
+const int _CLOSE_CURLY_BRACKET = 125;
+const int _NBSP = 160;
+
+const _OPERATORS = const [_PLUS, _MINUS, _STAR, _SLASH, _BANG, _AMPERSAND,
+ /*_COMMA,*/ _LT, _EQ, _GT, _QUESTION, _CARET, _BAR];
+
+const _GROUPERS = const [_OPEN_PAREN, _CLOSE_PAREN,
+ _OPEN_SQUARE_BRACKET, _CLOSE_SQUARE_BRACKET,
+ _OPEN_CURLY_BRACKET, _CLOSE_CURLY_BRACKET];
+
+const _TWO_CHAR_OPS = const ['==', '!=', '<=', '>=', '||', '&&'];
+
+const _KEYWORDS = const ['in', 'this'];
+
+const _PRECEDENCE = const {
+ '!': 0,
+ ':': 0,
+ ',': 0,
+ ')': 0,
+ ']': 0,
+ '}': 0, // ?
+ '?': 1,
+ '||': 2,
+ '&&': 3,
+ '|': 4,
+ '^': 5,
+ '&': 6,
+
+ // equality
+ '!=': 7,
+ '==': 7,
+
+ // relational
+ '>=': 8,
+ '>': 8,
+ '<=': 8,
+ '<': 8,
+
+ // additive
+ '+': 9,
+ '-': 9,
+
+ // multiplicative
+ '%': 10,
+ '/': 10,
+ '*': 10,
+
+ // postfix
+ '(': 11,
+ '[': 11,
+ '.': 11,
+ '{': 11, //not sure this is correct
+};
+
+const POSTFIX_PRECEDENCE = 11;
+
+const int STRING_TOKEN = 1;
+const int IDENTIFIER_TOKEN = 2;
+const int DOT_TOKEN = 3;
+const int COMMA_TOKEN = 4;
+const int COLON_TOKEN = 5;
+const int INTEGER_TOKEN = 6;
+const int DECIMAL_TOKEN = 7;
+const int OPERATOR_TOKEN = 8;
+const int GROUPER_TOKEN = 9;
+const int KEYWORD_TOKEN = 10;
+
+bool isWhitespace(int next) => next == _SPACE || next == _TAB || next == _NBSP;
+
+bool isIdentifierOrKeywordStart(int next) => (_a <= next && next <= _z) ||
+ (_A <= next && next <= _Z) || next == _US || next == _$ || next > 127;
+
+bool isIdentifier(int next) => (_a <= next && next <= _z) ||
+ (_A <= next && next <= _Z) || (_0 <= next && next <= _9) ||
+ next == _US || next == _$ || next > 127;
+
+bool isQuote(int next) => next == _DQ || next == _SQ;
+
+bool isNumber(int next) => _0 <= next && next <= _9;
+
+bool isOperator(int next) => _OPERATORS.contains(next);
+
+bool isGrouper(int next) => _GROUPERS.contains(next);
+
+int escape(int c) {
+ switch (c) {
+ case _f: return _FF; break;
+ case _n: return _LF; break;
+ case _r: return _CR; break;
+ case _t: return _TAB; break;
+ case _v: return _VTAB; break;
+ default: return c;
+ }
+}
+
+class Token {
+ final int kind;
+ final String value;
+ final int precedence;
+
+ Token(this.kind, this.value, [this.precedence = 0]);
+
+ String toString() => "($kind, '$value')";
+}
+
+class Tokenizer {
+ final List<Token> _tokens = <Token>[];
+ final StringBuffer _sb = new StringBuffer();
+ final RuneIterator _iterator;
+
+ int _next;
+
+ Tokenizer(String input) : _iterator = new RuneIterator(input);
+
+ _advance() {
+ _next = _iterator.moveNext() ? _iterator.current : null;
+ }
+
+ List<Token> tokenize() {
+ _advance();
+ while(_next != null) {
+ if (isWhitespace(_next)) {
+ _advance();
+ } else if (isQuote(_next)) {
+ tokenizeString();
+ } else if (isIdentifierOrKeywordStart(_next)) {
+ tokenizeIdentifierOrKeyword();
+ } else if (isNumber(_next)) {
+ tokenizeNumber();
+ } else if (_next == _PERIOD) {
+ tokenizeDot();
+ } else if (_next == _COMMA) {
+ tokenizeComma();
+ } else if (_next == _COLON) {
+ tokenizeColon();
+ } else if (isOperator(_next)) {
+ tokenizeOperator();
+ } else if (isGrouper(_next)) {
+ tokenizeGrouper();
+ } else {
+ _advance();
+ }
+ }
+ return _tokens;
+ }
+
+ tokenizeString() {
+ int quoteChar = _next;
+ _advance();
+ while (_next != quoteChar) {
+ if (_next == null) throw new ParseException("unterminated string");
+ if (_next == _BACKSLASH) {
+ _advance();
+ if (_next == null) throw new ParseException("unterminated string");
+ _sb.writeCharCode(escape(_next));
+ } else {
+ _sb.writeCharCode(_next);
+ }
+ _advance();
+ }
+ _tokens.add(new Token(STRING_TOKEN, _sb.toString()));
+ _sb.clear();
+ _advance();
+ }
+
+ tokenizeIdentifierOrKeyword() {
+ while (_next != null && isIdentifier(_next)) {
+ _sb.writeCharCode(_next);
+ _advance();
+ }
+ var value = _sb.toString();
+ if (_KEYWORDS.contains(value)) {
+ _tokens.add(new Token(KEYWORD_TOKEN, value));
+ } else {
+ _tokens.add(new Token(IDENTIFIER_TOKEN, value));
+ }
+ _sb.clear();
+ }
+
+ tokenizeNumber() {
+ while (_next != null && isNumber(_next)) {
+ _sb.writeCharCode(_next);
+ _advance();
+ }
+ if (_next == _PERIOD) {
+ tokenizeDot();
+ } else {
+ _tokens.add(new Token(INTEGER_TOKEN, _sb.toString()));
+ _sb.clear();
+ }
+ }
+
+ tokenizeDot() {
+ _advance();
+ if (isNumber(_next)) {
+ tokenizeFraction();
+ } else {
+ _tokens.add(new Token(DOT_TOKEN, '.', POSTFIX_PRECEDENCE));
+ }
+ }
+
+ tokenizeComma() {
+ _advance();
+ _tokens.add(new Token(COMMA_TOKEN, ','));
+ }
+
+ tokenizeColon() {
+ _advance();
+ _tokens.add(new Token(COLON_TOKEN, ':'));
+ }
+
+ tokenizeFraction() {
+ _sb.writeCharCode(_PERIOD);
+ while (_next != null && isNumber(_next)) {
+ _sb.writeCharCode(_next);
+ _advance();
+ }
+ _tokens.add(new Token(DECIMAL_TOKEN, _sb.toString()));
+ _sb.clear();
+ }
+
+ tokenizeOperator() {
+ int startChar = _next;
+ _advance();
+ var op;
+ // check for 2 character operators
+ if (isOperator(_next)) {
+ var op2 = new String.fromCharCodes([startChar, _next]);
+ if (_TWO_CHAR_OPS.contains(op2)) {
+ op = op2;
+ _advance();
+ } else {
+ op = new String.fromCharCode(startChar);
+ }
+ } else {
+ op = new String.fromCharCode(startChar);
+ }
+ _tokens.add(new Token(OPERATOR_TOKEN, op, _PRECEDENCE[op]));
+ }
+
+ tokenizeGrouper() {
+ var value = new String.fromCharCode(_next);
+ _tokens.add(new Token(GROUPER_TOKEN, value, _PRECEDENCE[value]));
+ _advance();
+ }
+}
+
+class ParseException implements Exception {
+ final String message;
+ ParseException(this.message);
+ String toString() => "ParseException: $message";
+}
diff --git a/pkg/polymer_expressions/lib/visitor.dart b/pkg/polymer_expressions/lib/visitor.dart
new file mode 100644
index 0000000..a11a0d4
--- /dev/null
+++ b/pkg/polymer_expressions/lib/visitor.dart
@@ -0,0 +1,76 @@
+// 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.
+
+library polymer_expressions.visitor;
+
+import 'expression.dart';
+
+abstract class Visitor<E extends Expression> {
+ visit(E s) => s.accept(this);
+ visitEmptyExpression(EmptyExpression e);
+ visitParenthesizedExpression(ParenthesizedExpression e);
+ visitInvoke(Invoke i);
+ visitLiteral(Literal l);
+ visitMapLiteral(MapLiteral l);
+ visitMapLiteralEntry(MapLiteralEntry l);
+ visitIdentifier(Identifier i);
+ visitBinaryOperator(BinaryOperator o);
+ visitUnaryOperator(UnaryOperator o);
+ visitInExpression(InExpression c);
+}
+
+abstract class RecursiveVisitor<E> extends Visitor<E> {
+ visitExpression(E e);
+
+ visitEmptyExpression(EmptyExpression e) => visitExpression(e);
+
+ visitParenthesizedExpression(ParenthesizedExpression e) {
+ visit(e);
+ visitExpression(e);
+ }
+
+ visitInvoke(Invoke i) {
+ visit(i.receiver);
+ if (i.arguments != null) {
+ for (var a in i.arguments) {
+ visit(a);
+ }
+ }
+ visitExpression(i);
+ }
+
+ visitLiteral(Literal l) => visitExpression(l);
+
+ visitMapLiteral(MapLiteral l) {
+ for (var e in l.entries) {
+ visit(e);
+ }
+ visitExpression(l);
+ }
+
+ visitMapLiteralEntry(MapLiteralEntry e) {
+ visit(e.key);
+ visit(e.entryValue);
+ visitExpression(e);
+ }
+
+ visitIdentifier(Identifier i) => visitExpression(i);
+
+ visitBinaryOperator(BinaryOperator o) {
+ visit(o.left);
+ visit(o.right);
+ visitExpression(o);
+ }
+
+ visitUnaryOperator(UnaryOperator o) {
+ visit(o.child);
+ visitExpression(o);
+ }
+
+ visitInExpression(InExpression c) {
+ visit(c.left);
+ visit(c.right);
+ visitExpression(c);
+ }
+}
\ No newline at end of file
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
new file mode 100644
index 0000000..d6322cf
--- /dev/null
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -0,0 +1,10 @@
+name: polymer_expressions
+author: Web UI Authors <html-dev@dartlang.org>
+description: An expressive custom binding syntax for MDV templates
+homepage: http://www.dartlang.org/
+dependencies:
+ browser: any
+ mdv: any
+ observe: any
+dev_dependencies:
+ unittest: any
diff --git a/pkg/polymer_expressions/test/all_tests.dart b/pkg/polymer_expressions/test/all_tests.dart
new file mode 100644
index 0000000..bbfccba
--- /dev/null
+++ b/pkg/polymer_expressions/test/all_tests.dart
@@ -0,0 +1,15 @@
+// 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.
+
+library all_tests;
+
+import 'eval_test.dart' as eval;
+import 'parser_test.dart' as parser;
+import 'tokenizer_test.dart' as tokenizer;
+
+main() {
+ tokenizer.main();
+ parser.main();
+ eval.main();
+}
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
new file mode 100644
index 0000000..b2d9123
--- /dev/null
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -0,0 +1,378 @@
+// 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.
+
+library eval_test;
+
+import 'dart:async';
+
+import 'package:polymer_expressions/eval.dart';
+import 'package:polymer_expressions/filter.dart';
+import 'package:polymer_expressions/parser.dart';
+import 'package:unittest/unittest.dart';
+import 'package:observe/observe.dart';
+
+main() {
+
+ group('eval', () {
+ test('should return the model for an empty expression', () {
+ expectEval('', 'model', 'model');
+ });
+
+ test('should handle the "this" keyword', () {
+ expectEval('this', 'model', 'model');
+ expectEval('this.name', 'foo', new Foo(name: 'foo'));
+ expectEval('this["a"]', 'x', {'a': 'x'});
+ });
+
+ test('should return a literal int', () {
+ expectEval('1', 1);
+ expectEval('+1', 1);
+ expectEval('-1', -1);
+ });
+
+ test('should return a literal double', () {
+ expectEval('1.2', 1.2);
+ expectEval('+1.2', 1.2);
+ expectEval('-1.2', -1.2);
+ });
+
+ test('should return a literal string', () {
+ expectEval('"hello"', "hello");
+ expectEval("'hello'", "hello");
+ });
+
+ test('should return a literal boolean', () {
+ expectEval('true', true);
+ expectEval('false', false);
+ });
+
+ test('should return a literal map', () {
+ expectEval('{"a": 1}', equals(new Map.from({'a': 1})));
+ expectEval('{"a": 1}', containsPair('a', 1));
+ });
+
+ test('should call methods on a literal map', () {
+ expectEval('{"a": 1}.length', 1);
+ });
+
+ test('should evaluate unary operators', () {
+ expectEval('+a', 2, null, {'a': 2});
+ expectEval('-a', -2, null, {'a': 2});
+ expectEval('!a', false, null, {'a': true});
+ });
+
+ test('should evaluate binary operators', () {
+ expectEval('1 + 2', 3);
+ expectEval('2 - 1', 1);
+ expectEval('4 / 2', 2);
+ expectEval('2 * 3', 6);
+
+ expectEval('1 == 1', true);
+ expectEval('1 == 2', false);
+ expectEval('1 != 1', false);
+ expectEval('1 != 2', true);
+
+ expectEval('1 > 1', false);
+ expectEval('1 > 2', false);
+ expectEval('2 > 1', true);
+ expectEval('1 >= 1', true);
+ expectEval('1 >= 2', false);
+ expectEval('2 >= 1', true);
+ expectEval('1 < 1', false);
+ expectEval('1 < 2', true);
+ expectEval('2 < 1', false);
+ expectEval('1 <= 1', true);
+ expectEval('1 <= 2', true);
+ expectEval('2 <= 1', false);
+
+ expectEval('true || true', true);
+ expectEval('true || false', true);
+ expectEval('false || true', true);
+ expectEval('false || false', false);
+
+ expectEval('true && true', true);
+ expectEval('true && false', false);
+ expectEval('false && true', false);
+ expectEval('false && false', false);
+ });
+
+ test('should invoke a method on the model', () {
+ var foo = new Foo(name: 'foo', age: 2);
+ expectEval('x()', foo.x(), foo);
+ expectEval('name', foo.name, foo);
+ });
+
+ test('should invoke chained methods', () {
+ var foo = new Foo(name: 'foo', age: 2);
+ expectEval('name.length', foo.name.length, foo);
+ expectEval('x().toString()', foo.x().toString(), foo);
+ expectEval('name.substring(2)', foo.name.substring(2), foo);
+ expectEval('a()()', 1, null, {'a': () => () => 1});
+ });
+
+ test('should invoke a top-level function', () {
+ expectEval('x()', 42, null, {'x': () => 42});
+ expectEval('x(5)', 5, null, {'x': (i) => i});
+ expectEval('y(5, 10)', 50, null, {'y': (i, j) => i * j});
+ });
+
+ test('should give precedence to top-level functions over methods', () {
+ var foo = new Foo(name: 'foo', age: 2);
+ expectEval('x()', 42, foo, {'x': () => 42});
+ });
+
+ test('should invoke the [] operator', () {
+ var map = {'a': 1, 'b': 2};
+ expectEval('map["a"]', 1, null, {'map': map});
+ expectEval('map["a"] + map["b"]', 3, null, {'map': map});
+ });
+
+ test('should call a filter', () {
+ var topLevel = {
+ 'a': 'foo',
+ 'uppercase': (s) => s.toUpperCase(),
+ };
+ expectEval('a | uppercase', 'FOO', null, topLevel);
+ });
+
+ test('should call a transformer', () {
+ var topLevel = {
+ 'a': '42',
+ 'parseInt': parseInt,
+ 'add': add,
+ };
+ expectEval('a | parseInt()', 42, null, topLevel);
+ expectEval('a | parseInt(8)', 34, null, topLevel);
+ expectEval('a | parseInt() | add(10)', 52, null, topLevel);
+ });
+
+ test('should return null if the receiver of a method is null', () {
+ expectEval('a.b', null, null, {'a': null});
+ expectEval('a.b()', null, null, {'a': null});
+ });
+
+ test('should return null if null is invoked', () {
+ expectEval('a()', null, null, {'a': null});
+ });
+
+ test('should return null if an operand is null', () {
+ expectEval('a + b', null, null, {'a': null, 'b': null});
+ expectEval('+a', null, null, {'a': null});
+ });
+
+ test('should treat null as false', () {
+ expectEval('!a', true, null, {'a': null});
+
+ expectEval('a && b', false, null, {'a': null, 'b': true});
+ expectEval('a && b', false, null, {'a': true, 'b': null});
+ expectEval('a && b', false, null, {'a': null, 'b': false});
+ expectEval('a && b', false, null, {'a': false, 'b': null});
+ expectEval('a && b', false, null, {'a': null, 'b': null});
+
+ expectEval('a || b', true, null, {'a': null, 'b': true});
+ expectEval('a || b', true, null, {'a': true, 'b': null});
+ expectEval('a || b', false, null, {'a': null, 'b': false});
+ expectEval('a || b', false, null, {'a': false, 'b': null});
+ expectEval('a || b', false, null, {'a': null, 'b': null});
+ });
+
+ test('should evaluate an "in" expression', () {
+ var scope = new Scope(variables: {'items': [1, 2, 3]});
+ var comprehension = eval(parse('item in items'), scope);
+ expect(comprehension.iterable, orderedEquals([1, 2, 3]));
+ });
+
+ test('should handle null iterators in "in" expressions', () {
+ var scope = new Scope(variables: {'items': null});
+ var comprehension = eval(parse('item in items'), scope);
+ expect(comprehension, isNotNull);
+ expect(comprehension.iterable, null);
+ });
+
+ });
+
+ group('assign', () {
+
+ test('should assign a single identifier', () {
+ var foo = new Foo(name: 'a');
+ assign(parse('name'), 'b', new Scope(model: foo));
+ expect(foo.name, 'b');
+ });
+
+ test('should assign a sub-property', () {
+ var child = new Foo(name: 'child');
+ var parent = new Foo(child: child);
+ assign(parse('child.name'), 'Joe', new Scope(model: parent));
+ expect(parent.child.name, 'Joe');
+ });
+
+ test('should assign an index', () {
+ var foo = new Foo(items: [1, 2, 3]);
+ assign(parse('items[0]'), 4, new Scope(model: foo));
+ expect(foo.items[0], 4);
+ });
+
+ test('should assign through transformers', () {
+ var foo = new Foo(name: '42', age: 32);
+ var globals = {
+ 'a': '42',
+ 'parseInt': parseInt,
+ 'add': add,
+ };
+ var scope = new Scope(model: foo, variables: globals);
+ assign(parse('age | add(7)'), 29, scope);
+ expect(foo.age, 22);
+ assign(parse('name | parseInt() | add(10)'), 29, scope);
+ expect(foo.name, '19');
+ });
+
+ });
+
+ group('scope', () {
+ test('should return fields on the model', () {
+ var foo = new Foo(name: 'a', age: 1);
+ var scope = new Scope(model: foo);
+ expect(scope['name'], 'a');
+ expect(scope['age'], 1);
+ });
+
+ test('should throw for undefined names', () {
+ var scope = new Scope();
+ expect(() => scope['a'], throwsException);
+ });
+
+ test('should return variables', () {
+ var scope = new Scope(variables: {'a': 'A'});
+ expect(scope['a'], 'A');
+ });
+
+ test("should a field from the parent's model", () {
+ var parent = new Scope(variables: {'a': 'A', 'b': 'B'});
+ var child = new Scope(variables: {'a': 'a'}, parent: parent);
+ expect(child['a'], 'a');
+ expect(parent['a'], 'A');
+ expect(child['b'], 'B');
+ });
+
+ });
+
+ group('observe', () {
+ test('should observe an identifier', () {
+ var foo = new Foo(name: 'foo');
+ return expectObserve('name',
+ model: foo,
+ beforeMatcher: 'foo',
+ mutate: () {
+ foo.name = 'fooz';
+ },
+ afterMatcher: 'fooz'
+ );
+ });
+
+ test('should observe an invocation', () {
+ var foo = new Foo(name: 'foo');
+ return expectObserve('foo.name',
+ variables: {'foo': foo},
+ beforeMatcher: 'foo',
+ mutate: () {
+ foo.name = 'fooz';
+ },
+ afterMatcher: 'fooz'
+ );
+ });
+
+ test('should observe map access', () {
+ var foo = toObservable({'one': 'one', 'two': 'two'});
+ return expectObserve('foo["one"]',
+ variables: {'foo': foo},
+ beforeMatcher: 'one',
+ mutate: () {
+ foo['one'] = '1';
+ },
+ afterMatcher: '1'
+ );
+ });
+
+ test('should observe an comprehension', () {
+ var items = new ObservableList();
+ var foo = new Foo(name: 'foo');
+ return expectObserve('item in items',
+ variables: {'items': items},
+ beforeMatcher: (c) => c.iterable.isEmpty,
+ mutate: () {
+ items.add(foo);
+ },
+ afterMatcher: (c) => c.iterable.contains(foo)
+ );
+ });
+
+ });
+
+}
+
+class Foo extends Object with ChangeNotifierMixin {
+ String _name;
+ String get name => _name;
+ void set name(String n) {
+ _name = notifyPropertyChange(const Symbol('name'), _name, n);
+ }
+
+ int age;
+ Foo child;
+ List<int> items;
+
+ Foo({name, this.age, this.child, this.items}) : _name = name;
+
+ int x() => age * age;
+}
+
+parseInt([int radix = 10]) => new IntToString(radix: radix);
+
+class IntToString extends Transformer<int, String> {
+ final int radix;
+ IntToString({this.radix: 10});
+ int forward(String s) => int.parse(s, radix: radix);
+ String reverse(int i) => '$i';
+}
+
+add(int i) => new Add(i);
+
+class Add extends Transformer<int, int> {
+ final int i;
+ Add(this.i);
+ int forward(int x) => x + i;
+ int reverse(int x) => x - i;
+}
+
+Object evalString(String s, [Object model, Map vars]) =>
+ eval(new Parser(s).parse(), new Scope(model: model, variables: vars));
+
+expectEval(String s, dynamic matcher, [Object model, Map vars = const {}]) =>
+ expect(
+ eval(new Parser(s).parse(), new Scope(model: model, variables: vars)),
+ matcher,
+ reason: s);
+
+expectObserve(String s, {
+ Object model,
+ Map variables: const {},
+ dynamic beforeMatcher,
+ mutate(),
+ dynamic afterMatcher}) {
+
+ var observer = observe(new Parser(s).parse(),
+ new Scope(model: model, variables: variables));
+ expect(observer.currentValue, beforeMatcher);
+ var passed = false;
+ var future = observer.onUpdate.first.then((value) {
+ expect(value, afterMatcher);
+ expect(observer.currentValue, afterMatcher);
+ passed = true;
+ });
+ mutate();
+ // fail if we don't receive an update by the next event loop
+ return Future.wait([future, new Future(() {
+ expect(passed, true, reason: "Didn't receive a change notification on $s");
+ })]);
+}
diff --git a/pkg/polymer_expressions/test/parser_test.dart b/pkg/polymer_expressions/test/parser_test.dart
new file mode 100644
index 0000000..21b11fb
--- /dev/null
+++ b/pkg/polymer_expressions/test/parser_test.dart
@@ -0,0 +1,199 @@
+// 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.
+
+library parser_test;
+
+import 'package:polymer_expressions/parser.dart';
+import 'package:polymer_expressions/expression.dart';
+import 'package:unittest/unittest.dart';
+
+expectParse(String s, Expression e) =>
+ expect(new Parser(s).parse(), e, reason: s);
+
+main() {
+
+ group('parser', () {
+
+ test('should parse an empty expression', () {
+ expectParse('', empty());
+ });
+
+ test('should parse an identifier', () {
+ expectParse('abc', ident('abc'));
+ });
+
+ test('should parse a string literal', () {
+ expectParse('"abc"', literal('abc'));
+ });
+
+ test('should parse an integer literal', () {
+ expectParse('123', literal(123));
+ });
+
+ test('should parse a double literal', () {
+ expectParse('1.23', literal(1.23));
+ });
+
+ test('should parse a positive double literal', () {
+ expectParse('+1.23', literal(1.23));
+ });
+
+ test('should parse a negative double literal', () {
+ expectParse('-1.23', literal(-1.23));
+ });
+
+ test('should parse a plus operator with literals', () {
+ expectParse('1 + 2', binary(literal(1), '+', literal(2)));
+ });
+
+ test('should parse binary operators', () {
+ expectParse('a && b', binary(ident('a'), '&&', ident('b')));
+ expectParse('1 && 2', binary(literal(1), '&&', literal(2)));
+ expectParse('false && true', binary(literal(false), '&&', literal(true)));
+ expectParse('false || true', binary(literal(false), '||', literal(true)));
+ });
+
+ test('should give multiply higher associativity than plus', () {
+ expectParse('a + b * c',
+ binary(
+ ident('a'),
+ '+',
+ binary(ident('b'), '*', ident('c'))));
+ });
+
+ test('should give multiply higher associativity than plus 2', () {
+ expectParse('a * b + c',
+ binary(
+ binary(ident('a'), '*', ident('b')),
+ '+',
+ ident('c')));
+ });
+
+ test('should parse a dot operator', () {
+ expectParse('a.b', invoke(ident('a'), 'b'));
+ });
+
+ test('should parse chained dot operators', () {
+ expectParse('a.b.c', invoke(invoke(ident('a'), 'b'), 'c'));
+ });
+
+ test('should give dot high associativity', () {
+ expectParse('a * b.c', binary(ident('a'), '*', invoke(ident('b'), 'c')));
+ });
+
+ test('should parse a function with no arguments', () {
+ expectParse('a()', invoke(ident('a'), null, []));
+ });
+
+ test('should parse a single function argument', () {
+ expectParse('a(b)', invoke(ident('a'), null, [ident('b')]));
+ });
+
+ test('should parse a function call as a subexpression', () {
+ expectParse('a() + 1',
+ binary(
+ invoke(ident('a'), null, []),
+ '+',
+ literal(1)));
+ });
+
+ test('should parse multiple function arguments', () {
+ expectParse('a(b, c)',
+ invoke(ident('a'), null, [ident('b'), ident('c')]));
+ });
+
+ test('should parse nested function calls', () {
+ expectParse('a(b(c))', invoke(ident('a'), null, [
+ invoke(ident('b'), null, [ident('c')])]));
+ });
+
+ test('should parse an empty method call', () {
+ expectParse('a.b()', invoke(ident('a'), 'b', []));
+ });
+
+ test('should parse a method call with a single argument', () {
+ expectParse('a.b(c)', invoke(ident('a'), 'b', [ident('c')]));
+ });
+
+ test('should parse a method call with multiple arguments', () {
+ expectParse('a.b(c, d)',
+ invoke(ident('a'), 'b', [ident('c'), ident('d')]));
+ });
+
+ test('should parse chained method calls', () {
+ expectParse('a.b().c()', invoke(invoke(ident('a'), 'b', []), 'c', []));
+ });
+
+ test('should parse chained function calls', () {
+ expectParse('a()()', invoke(invoke(ident('a'), null, []), null, []));
+ });
+
+ test('should parse parenthesized expression', () {
+ expectParse('(a)', paren(ident('a')));
+ expectParse('(( 3 * ((1 + 2)) ))', paren(paren(
+ binary(literal(3), '*', paren(paren(
+ binary(literal(1), '+', literal(2))))))));
+ });
+
+ test('should parse an index operator', () {
+ expectParse('a[b]', invoke(ident('a'), '[]', [ident('b')]));
+ expectParse('a.b[c]', invoke(invoke(ident('a'), 'b', null),
+ '[]', [ident('c')]));
+ });
+
+ test('should parse chained index operators', () {
+ expectParse('a[][]', invoke(invoke(ident('a'), '[]', []), '[]', []));
+ });
+
+ test('should parse multiple index operators', () {
+ expectParse('a[b] + c[d]', binary(
+ invoke(ident('a'), '[]', [ident('b')]),
+ '+',
+ invoke(ident('c'), '[]', [ident('d')])));
+ });
+
+ test('should parse a filter chain', () {
+ expectParse('a | b | c', binary(binary(ident('a'), '|', ident('b')),
+ '|', ident('c')));
+ });
+
+ test('should parse comprehension', () {
+ expectParse('a in b', inExpr(ident('a'), ident('b')));
+ expectParse('a in b.c',
+ inExpr(ident('a'), invoke(ident('b'), 'c', null)));
+ expectParse('a in b + c',
+ inExpr(ident('a'), binary(ident('b'), '+', ident('c'))));
+ });
+
+ test('should reject comprehension with non-assignable left expression', () {
+ expect(() => parse('a + 1 in b'), throwsException);
+ });
+
+ test('should reject keywords as identifiers', () {
+ expect(() => parse('a.in'), throwsException);
+ });
+
+ test('should parse map literals', () {
+ expectParse("{'a': 1}",
+ mapLiteral([mapLiteralEntry(literal('a'), literal(1))]));
+ expectParse("{'a': 1, 'b': 2 + 3}",
+ mapLiteral([
+ mapLiteralEntry(literal('a'), literal(1)),
+ mapLiteralEntry(literal('b'),
+ binary(literal(2), '+', literal(3)))]));
+ expectParse("{'a': foo()}",
+ mapLiteral([mapLiteralEntry(
+ literal('a'), invoke(ident('foo'), null, []))]));
+ expectParse("{'a': foo('a')}",
+ mapLiteral([mapLiteralEntry(
+ literal('a'), invoke(ident('foo'), null, [literal('a')]))]));
+ });
+
+ test('should parse map literals with method calls', () {
+ expectParse("{'a': 1}.length",
+ invoke(mapLiteral([mapLiteralEntry(literal('a'), literal(1))]),
+ 'length'));
+ });
+ });
+}
diff --git a/pkg/polymer_expressions/test/syntax_test.dart b/pkg/polymer_expressions/test/syntax_test.dart
new file mode 100644
index 0000000..791a021
--- /dev/null
+++ b/pkg/polymer_expressions/test/syntax_test.dart
@@ -0,0 +1,87 @@
+// 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:async';
+import 'dart:html';
+
+import 'package:polymer_expressions/polymer_expressions.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_enhanced_config.dart';
+import 'package:observe/observe.dart';
+import 'package:mdv/mdv.dart' as mdv;
+
+main() {
+ mdv.initialize();
+ useHtmlEnhancedConfiguration();
+
+ group('syntax', () {
+ setUp(() {
+ document.body.nodes.add(new Element.html('''
+ <template id="test" bind>
+ <input id="input" value="{{ firstName }}">
+ </template>'''));
+ });
+
+ tearDown(() {
+ query('#test')..unbindAll()..remove();
+ });
+
+ test('should make two-way bindings to inputs', () {
+ var person = new Person('John', 'Messerly', ['A', 'B', 'C']);
+ query('#test')
+ ..bindingDelegate = new PolymerExpressions()
+ ..model = person;
+ return new Future.delayed(new Duration()).then((_) {
+ InputElement input = query('#input');
+ expect(input.value, 'John');
+ input.focus();
+ input.value = 'Justin';
+ input.blur();
+ var event = new Event('change');
+ // TODO(justin): figure out how to trigger keyboard events to test
+ // two-way bindings
+ });
+ });
+
+ });
+}
+
+class Person extends Object with ChangeNotifierMixin {
+ static const _FIRST_NAME = const Symbol('firstName');
+ static const _LAST_NAME = const Symbol('lastName');
+ static const _ITEMS = const Symbol('items');
+ static const _GET_FULL_NAME = const Symbol('getFullName');
+
+ String _firstName;
+ String _lastName;
+ List<String> _items;
+
+ Person(this._firstName, this._lastName, this._items);
+
+ String get firstName => _firstName;
+
+ void set firstName(String value) {
+ _firstName = value;
+ notifyChange(new PropertyChangeRecord(_FIRST_NAME));
+ }
+
+ String get lastName => _lastName;
+
+ void set lastName(String value) {
+ _lastName = value;
+ notifyChange(new PropertyChangeRecord(_LAST_NAME));
+ }
+
+ String getFullName() => '$_firstName $_lastName';
+
+ List<String> get items => _items;
+
+ void set items(List<String> value) {
+ _items = value;
+ notifyChange(new PropertyChangeRecord(_ITEMS));
+ }
+
+ String toString() => "Person(firstName: $_firstName, lastName: $_lastName)";
+
+}
diff --git a/pkg/polymer_expressions/test/syntax_test.html b/pkg/polymer_expressions/test/syntax_test.html
new file mode 100644
index 0000000..4f494a6
--- /dev/null
+++ b/pkg/polymer_expressions/test/syntax_test.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <title>syntax_test</title>
+ </head>
+
+ <body>
+ <script type="application/dart" src="syntax_test.dart"></script>
+ <script src="packages/browser/dart.js"></script>
+ </body>
+</html>
diff --git a/pkg/polymer_expressions/test/tokenizer_test.dart b/pkg/polymer_expressions/test/tokenizer_test.dart
new file mode 100644
index 0000000..6c40514
--- /dev/null
+++ b/pkg/polymer_expressions/test/tokenizer_test.dart
@@ -0,0 +1,190 @@
+// 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.
+
+library tokenizer_test;
+
+import 'package:polymer_expressions/tokenizer.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+
+ group('tokenizer', () {
+
+ test('should tokenize an empty expression', () {
+ expectTokens('', []);
+ });
+
+ test('should tokenize an identifier', () {
+ expectTokens('abc', [t(IDENTIFIER_TOKEN, 'abc')]);
+ });
+
+ test('should tokenize a double quoted String', () {
+ expectTokens('"abc"', [t(STRING_TOKEN, 'abc')]);
+ });
+
+ test('should tokenize a single quoted String', () {
+ expectTokens("'abc'", [t(STRING_TOKEN, 'abc')]);
+ });
+
+ test('should tokenize a String with escaping', () {
+ expectTokens('"a\\b\\\\c\\\'\\""', [t(STRING_TOKEN, 'ab\\c\'"')]);
+ });
+
+ test('should tokenize a dot operator', () {
+ expectTokens('a.b', [
+ t(IDENTIFIER_TOKEN, 'a'),
+ t(DOT_TOKEN, '.'),
+ t(IDENTIFIER_TOKEN, 'b')]);
+ });
+
+ test('should tokenize a unary plus operator', () {
+ expectTokens('+a', [
+ t(OPERATOR_TOKEN, '+'),
+ t(IDENTIFIER_TOKEN, 'a')]);
+ });
+
+ test('should tokenize a binary plus operator', () {
+ expectTokens('a + b', [
+ t(IDENTIFIER_TOKEN, 'a'),
+ t(OPERATOR_TOKEN, '+'),
+ t(IDENTIFIER_TOKEN, 'b')]);
+ });
+
+ test('should tokenize a logical and operator', () {
+ expectTokens('a && b', [
+ t(IDENTIFIER_TOKEN, 'a'),
+ t(OPERATOR_TOKEN, '&&'),
+ t(IDENTIFIER_TOKEN, 'b')]);
+ });
+
+ test('should tokenize an iterate expression with "in" keyword', () {
+ expectTokens('item in items', [
+ t(IDENTIFIER_TOKEN, 'item'),
+ t(KEYWORD_TOKEN, 'in'),
+ t(IDENTIFIER_TOKEN, 'items')]);
+ });
+
+ test('should tokenize keywords', () {
+ expectTokens('in', [t(KEYWORD_TOKEN, 'in')]);
+ expectTokens('this', [t(KEYWORD_TOKEN, 'this')]);
+ });
+
+ test('should tokenize groups', () {
+ expectTokens('a(b)[]{}', [
+ t(IDENTIFIER_TOKEN, 'a'),
+ t(GROUPER_TOKEN, '('),
+ t(IDENTIFIER_TOKEN, 'b'),
+ t(GROUPER_TOKEN, ')'),
+ t(GROUPER_TOKEN, '['),
+ t(GROUPER_TOKEN, ']'),
+ t(GROUPER_TOKEN, '{'),
+ t(GROUPER_TOKEN, '}')]);
+ });
+
+ test('should tokenize argument lists', () {
+ expectTokens('(a, b)', [
+ t(GROUPER_TOKEN, '('),
+ t(IDENTIFIER_TOKEN, 'a'),
+ t(COMMA_TOKEN, ','),
+ t(IDENTIFIER_TOKEN, 'b'),
+ t(GROUPER_TOKEN, ')')]);
+ });
+
+ test('should tokenize maps', () {
+ expectTokens("{'a': b}", [
+ t(GROUPER_TOKEN, '{'),
+ t(STRING_TOKEN, 'a'),
+ t(COLON_TOKEN, ':'),
+ t(IDENTIFIER_TOKEN, 'b'),
+ t(GROUPER_TOKEN, '}')]);
+ });
+
+ test('should tokenize integers', () {
+ expectTokens('123', [t(INTEGER_TOKEN, '123')]);
+ expectTokens('+123', [t(OPERATOR_TOKEN, '+'), t(INTEGER_TOKEN, '123')]);
+ expectTokens('-123', [t(OPERATOR_TOKEN, '-'), t(INTEGER_TOKEN, '123')]);
+ });
+
+ test('should tokenize decimals', () {
+ expectTokens('1.23', [t(DECIMAL_TOKEN, '1.23')]);
+ expectTokens('+1.23', [t(OPERATOR_TOKEN, '+'), t(DECIMAL_TOKEN, '1.23')]);
+ expectTokens('-1.23', [t(OPERATOR_TOKEN, '-'), t(DECIMAL_TOKEN, '1.23')]);
+ });
+
+ test('should tokenize booleans as identifiers', () {
+ expectTokens('true', [t(IDENTIFIER_TOKEN, 'true')]);
+ expectTokens('false', [t(IDENTIFIER_TOKEN, 'false')]);
+ });
+
+ });
+}
+
+TokenMatcher isToken(int index, String text) => new TokenMatcher(index, text);
+
+class TokenMatcher extends Matcher {
+ final int kind;
+ final String value;
+
+ TokenMatcher(this.kind, this.value);
+
+ bool matches(Token t, Map m) => t.kind == kind && t.value == value;
+
+ Description describe(Description d) => d.add('isToken($kind, $value) ');
+}
+
+expectTokens(String s, List<Token> expected) {
+ var tokens = new Tokenizer(s).tokenize();
+ var matchers = expected.map((t) => isToken(t.kind, t.value)).toList();
+ expect(tokens, matchList(matchers), reason: s);
+}
+
+Token t(int kind, String value) => new Token(kind, value);
+
+MatcherList matchList(List matchers) => new MatcherList(matchers);
+
+class MatcherList extends Matcher {
+ final List<Matcher> matchers;
+
+ MatcherList(this.matchers);
+
+ bool matches(List o, Map matchState) {
+ if (o.length != matchers.length) return false;
+ for (int i = 0; i < o.length; i++) {
+ var state = new Map();
+ if (!matchers[i].matches(o[i], state)) {
+ matchState = {
+ 'index': i,
+ 'value': o[i],
+ 'state': state,
+ };
+ return false;
+ }
+ }
+ return true;
+ }
+
+ Description describe(Description d) {
+ d.add('matches all: ');
+ matchers.forEach((m) => m.describe(d));
+ }
+
+ Description describeMismatch(item, Description mismatchDescription,
+ Map matchState, bool verbose) {
+ if (matchState != null) {
+ var index = matchState['index'];
+ var value = matchState['value'];
+ var state = matchState['state'];
+ var matcher = matchers[index];
+ mismatchDescription.add("Mismatch at index $index: ");
+ matcher.describeMismatch(value, mismatchDescription, state, verbose);
+ } else {
+ if (item.length != matchers.length) {
+ mismatchDescription.add('wrong lengths');
+ } else {
+ mismatchDescription.add('was ').addDescriptionOf(item);
+ }
+ }
+ }
+
+}
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/scheduled_test/test/metatest.dart
index cc77069..4834b6e 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/scheduled_test/test/metatest.dart
@@ -200,7 +200,7 @@
/// Special test configuration for use within the child isolates. This hides all
/// output and reports data back to the parent isolate.
-class _MetaConfiguration extends Configuration {
+class _MetaConfiguration extends SimpleConfiguration {
final name = "MetaConfiguration";
void logTestCaseMesssage(TestCase testCase, String message) {}
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index 4ea1ab8..eff86b3 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -3204,4 +3204,528 @@
};
})();
+// 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.
+
+var Platform = {};
+
+/*
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/*
+ This is a limited shim for ShadowDOM css styling.
+ https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
+
+ The intention here is to support only the styling features which can be
+ relatively simply implemented. The goal is to allow users to avoid the
+ most obvious pitfalls and do so without compromising performance significantly.
+ For ShadowDOM styling that's not covered here, a set of best practices
+ can be provided that should allow users to accomplish more complex styling.
+
+ The following is a list of specific ShadowDOM styling features and a brief
+ discussion of the approach used to shim.
+
+ Shimmed features:
+
+ * @host: ShadowDOM allows styling of the shadowRoot's host element using the
+ @host rule. To shim this feature, the @host styles are reformatted and
+ prefixed with a given scope name and promoted to a document level stylesheet.
+ For example, given a scope name of .foo, a rule like this:
+
+ @host {
+ * {
+ background: red;
+ }
+ }
+
+ becomes:
+
+ .foo {
+ background: red;
+ }
+
+ * encapsultion: Styles defined within ShadowDOM, apply only to
+ dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
+ this feature.
+
+ By default, rules are prefixed with the host element tag name
+ as a descendant selector. This ensures styling does not leak out of the 'top'
+ of the element's ShadowDOM. For example,
+
+ div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+ x-foo div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+
+ Alternatively, if Platform.ShadowCSS.strictStyling is set to true then
+ selectors are scoped by adding an attribute selector suffix to each
+ simple selector that contains the host element tag name. Each element
+ in the element's ShadowDOM template is also given the scope attribute.
+ Thus, these rules match only elements that have the scope attribute.
+ For example, given a scope name of x-foo, a rule like this:
+
+ div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+ div[x-foo] {
+ font-weight: bold;
+ }
+
+ Note that elements that are dynamically added to a scope must have the scope
+ selector added to them manually.
+
+ * ::pseudo: These rules are converted to rules that take advantage of the
+ pseudo attribute. For example, a shadowRoot like this inside an x-foo
+
+ <div pseudo="x-special">Special</div>
+
+ with a rule like this:
+
+ x-foo::x-special { ... }
+
+ becomes:
+
+ x-foo [pseudo=x-special] { ... }
+
+ Unaddressed ShadowDOM styling features:
+
+ * upper/lower bound encapsulation: Styles which are defined outside a
+ shadowRoot should not cross the ShadowDOM boundary and should not apply
+ inside a shadowRoot.
+
+ This styling behavior is not emulated. Some possible ways to do this that
+ were rejected due to complexity and/or performance concerns include: (1) reset
+ every possible property for every possible selector for a given scope name;
+ (2) re-implement css in javascript.
+
+ As an alternative, users should make sure to use selectors
+ specific to the scope in which they are working.
+
+ * ::distributed: This behavior is not emulated. It's often not necessary
+ to style the contents of a specific insertion point and instead, descendants
+ of the host element can be styled selectively. Users can also create an
+ extra node around an insertion point and style that node's contents
+ via descendent selectors. For example, with a shadowRoot like this:
+
+ <style>
+ content::-webkit-distributed(div) {
+ background: red;
+ }
+ </style>
+ <content></content>
+
+ could become:
+
+ <style>
+ / *@polyfill .content-container div * /
+ content::-webkit-distributed(div) {
+ background: red;
+ }
+ </style>
+ <div class="content-container">
+ <content></content>
+ </div>
+
+ Note the use of @polyfill in the comment above a ShadowDOM specific style
+ declaration. This is a directive to the styling shim to use the selector
+ in comments in lieu of the next selector when running under polyfill.
+*/
+(function(scope) {
+
+var ShadowCSS = {
+ strictStyling: false,
+ registry: {},
+ // Shim styles for a given root associated with a name and extendsName
+ // 1. cache root styles by name
+ // 2. optionally tag root nodes with scope name
+ // 3. shim polyfill directives /* @polyfill */
+ // 4. shim @host and scoping
+ shimStyling: function(root, name, extendsName) {
+ if (root) {
+ // use caching to make working with styles nodes easier and to facilitate
+ // lookup of extendee
+ var def = this.registerDefinition(root, name, extendsName);
+ // find styles and apply shimming...
+ if (this.strictStyling) {
+ this.applyScopeToContent(root, name);
+ }
+ this.shimPolyfillDirectives(def.rootStyles, name);
+ this.applyShimming(def.scopeStyles, name);
+ }
+ },
+ // Shim styles to be placed inside a shadowRoot.
+ // 1. shim polyfill directives /* @polyfill */
+ // 2. shim @host and scoping
+ shimShadowDOMStyling: function(styles, name) {
+ this.shimPolyfillDirectives(styles, name);
+ this.applyShimming(styles, name);
+ },
+ registerDefinition: function(root, name, extendsName) {
+ var def = this.registry[name] = {
+ root: root,
+ name: name,
+ extendsName: extendsName
+ }
+ var styles = root.querySelectorAll('style');
+ styles = styles ? Array.prototype.slice.call(styles, 0) : [];
+ def.rootStyles = styles;
+ def.scopeStyles = def.rootStyles;
+ var extendee = this.registry[def.extendsName];
+ if (extendee) {
+ def.scopeStyles = def.scopeStyles.concat(extendee.scopeStyles);
+ }
+ return def;
+ },
+ applyScopeToContent: function(root, name) {
+ if (root) {
+ // add the name attribute to each node in root.
+ Array.prototype.forEach.call(root.querySelectorAll('*'),
+ function(node) {
+ node.setAttribute(name, '');
+ });
+ // and template contents too
+ Array.prototype.forEach.call(root.querySelectorAll('template'),
+ function(template) {
+ this.applyScopeToContent(template.content, name);
+ },
+ this);
+ }
+ },
+ /*
+ * Process styles to convert native ShadowDOM rules that will trip
+ * up the css parser; we rely on decorating the stylesheet with comments.
+ *
+ * For example, we convert this rule:
+ *
+ * (comment start) @polyfill @host g-menu-item (comment end)
+ * shadow::-webkit-distributed(g-menu-item) {
+ *
+ * to this:
+ *
+ * scopeName g-menu-item {
+ *
+ **/
+ shimPolyfillDirectives: function(styles, name) {
+ if (styles) {
+ Array.prototype.forEach.call(styles, function(s) {
+ s.textContent = this.convertPolyfillDirectives(s.textContent, name);
+ }, this);
+ }
+ },
+ convertPolyfillDirectives: function(cssText, name) {
+ var r = '', l = 0, matches, selector;
+ while (matches = cssPolyfillCommentRe.exec(cssText)) {
+ r += cssText.substring(l, matches.index);
+ // remove end comment delimiter (*/)
+ selector = matches[1].slice(0, -2).replace(hostRe, name);
+ r += this.scopeSelector(selector, name) + '{';
+ l = cssPolyfillCommentRe.lastIndex;
+ }
+ r += cssText.substring(l, cssText.length);
+ return r;
+ },
+ // apply @host and scope shimming
+ applyShimming: function(styles, name) {
+ var cssText = this.shimAtHost(styles, name);
+ cssText += this.shimScoping(styles, name);
+ addCssToDocument(cssText);
+ },
+ // form: @host { .foo { declarations } }
+ // becomes: scopeName.foo { declarations }
+ shimAtHost: function(styles, name) {
+ if (styles) {
+ return this.convertAtHostStyles(styles, name);
+ }
+ },
+ convertAtHostStyles: function(styles, name) {
+ var cssText = stylesToCssText(styles);
+ var r = '', l=0, matches;
+ while (matches = hostRuleRe.exec(cssText)) {
+ r += cssText.substring(l, matches.index);
+ r += this.scopeHostCss(matches[1], name);
+ l = hostRuleRe.lastIndex;
+ }
+ r += cssText.substring(l, cssText.length);
+ var re = new RegExp('^' + name + selectorReSuffix, 'm');
+ var cssText = rulesToCss(this.findAtHostRules(cssToRules(r),
+ re));
+ return cssText;
+ },
+ scopeHostCss: function(cssText, name) {
+ var r = '', matches;
+ while (matches = selectorRe.exec(cssText)) {
+ r += this.scopeHostSelector(matches[1], name) +' ' + matches[2] + '\n\t';
+ }
+ return r;
+ },
+ // supports scopig by name and [is=name] syntax
+ scopeHostSelector: function(selector, name) {
+ var r = [], parts = selector.split(','), is = '[is=' + name + ']';
+ parts.forEach(function(p) {
+ p = p.trim();
+ // selector: *|:scope -> name
+ if (p.match(hostElementRe)) {
+ p = p.replace(hostElementRe, name + '$1$3, ' + is + '$1$3');
+ // selector: .foo -> name.foo, [bar] -> name[bar]
+ } else if (p.match(hostFixableRe)) {
+ p = name + p + ', ' + is + p;
+ }
+ r.push(p);
+ }, this);
+ return r.join(', ');
+ },
+ // consider styles that do not include component name in the selector to be
+ // unscoped and in need of promotion;
+ // for convenience, also consider keyframe rules this way.
+ findAtHostRules: function(cssRules, matcher) {
+ return Array.prototype.filter.call(cssRules,
+ this.isHostRule.bind(this, matcher));
+ },
+ isHostRule: function(matcher, cssRule) {
+ return (cssRule.selectorText && cssRule.selectorText.match(matcher)) ||
+ (cssRule.cssRules && this.findAtHostRules(cssRule.cssRules, matcher).length) ||
+ (cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
+ },
+ /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+ *
+ * .foo {... }
+ *
+ * and converts this to
+ *
+ * scopeName .foo { ... }
+ */
+ shimScoping: function(styles, name) {
+ if (styles) {
+ return this.convertScopedStyles(styles, name);
+ }
+ },
+ convertScopedStyles: function(styles, name) {
+ Array.prototype.forEach.call(styles, function(s) {
+ if (s.parentNode) {
+ s.parentNode.removeChild(s);
+ }
+ });
+ var cssText = stylesToCssText(styles).replace(hostRuleRe, '');
+ cssText = this.convertPseudos(cssText);
+ var rules = cssToRules(cssText);
+ cssText = this.scopeRules(rules, name);
+ return cssText;
+ },
+ convertPseudos: function(cssText) {
+ return cssText.replace(cssPseudoRe, ' [pseudo=$1]');
+ },
+ // change a selector like 'div' to 'name div'
+ scopeRules: function(cssRules, name) {
+ var cssText = '';
+ Array.prototype.forEach.call(cssRules, function(rule) {
+ if (rule.selectorText && (rule.style && rule.style.cssText)) {
+ cssText += this.scopeSelector(rule.selectorText, name,
+ this.strictStyling) + ' {\n\t';
+ cssText += this.propertiesFromRule(rule) + '\n}\n\n';
+ } else if (rule.media) {
+ cssText += '@media ' + rule.media.mediaText + ' {\n';
+ cssText += this.scopeRules(rule.cssRules, name);
+ cssText += '\n}\n\n';
+ } else if (rule.cssText) {
+ cssText += rule.cssText + '\n\n';
+ }
+ }, this);
+ return cssText;
+ },
+ scopeSelector: function(selector, name, strict) {
+ var r = [], parts = selector.split(',');
+ parts.forEach(function(p) {
+ p = p.trim();
+ if (this.selectorNeedsScoping(p, name)) {
+ p = strict ? this.applyStrictSelectorScope(p, name) :
+ this.applySimpleSelectorScope(p, name);
+ }
+ r.push(p);
+ }, this);
+ return r.join(', ');
+ },
+ selectorNeedsScoping: function(selector, name) {
+ var matchScope = '(' + name + '|\\[is=' + name + '\\])';
+ var re = new RegExp('^' + matchScope + selectorReSuffix, 'm');
+ return !selector.match(re);
+ },
+ // scope via name and [is=name]
+ applySimpleSelectorScope: function(selector, name) {
+ return name + ' ' + selector + ', ' + '[is=' + name + '] ' + selector;
+ },
+ // return a selector with [name] suffix on each simple selector
+ // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
+ applyStrictSelectorScope: function(selector, name) {
+ var splits = [' ', '>', '+', '~'],
+ scoped = selector,
+ attrName = '[' + name + ']';
+ splits.forEach(function(sep) {
+ var parts = scoped.split(sep);
+ scoped = parts.map(function(p) {
+ var t = p.trim();
+ if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
+ p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
+ }
+ return p;
+ }).join(sep);
+ });
+ return scoped;
+ },
+ propertiesFromRule: function(rule) {
+ var properties = rule.style.cssText;
+ // TODO(sorvell): Chrome cssom incorrectly removes quotes from the content
+ // property. (https://code.google.com/p/chromium/issues/detail?id=247231)
+ if (rule.style.content && !rule.style.content.match(/['"]+/)) {
+ properties = 'content: \'' + rule.style.content + '\';\n' +
+ rule.style.cssText.replace(/content:[^;]*;/g, '');
+ }
+ return properties;
+ }
+};
+
+var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+ selectorRe = /([^{]*)({[\s\S]*?})/gim,
+ hostElementRe = /(.*)((?:\*)|(?:\:scope))(.*)/,
+ hostFixableRe = /^[.\[:]/,
+ cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+ cssPolyfillCommentRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+ cssPseudoRe = /::(x-[^\s{,(]*)/gim,
+ selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
+ hostRe = /@host/gim;
+
+function stylesToCssText(styles, preserveComments) {
+ var cssText = '';
+ Array.prototype.forEach.call(styles, function(s) {
+ cssText += s.textContent + '\n\n';
+ });
+ // strip comments for easier processing
+ if (!preserveComments) {
+ cssText = cssText.replace(cssCommentRe, '');
+ }
+ return cssText;
+}
+
+function cssToRules(cssText) {
+ var style = document.createElement('style');
+ style.textContent = cssText;
+ document.head.appendChild(style);
+ var rules = style.sheet.cssRules;
+ style.parentNode.removeChild(style);
+ return rules;
+}
+
+function rulesToCss(cssRules) {
+ for (var i=0, css=[]; i < cssRules.length; i++) {
+ css.push(cssRules[i].cssText);
+ }
+ return css.join('\n\n');
+}
+
+function addCssToDocument(cssText) {
+ if (cssText) {
+ getSheet().appendChild(document.createTextNode(cssText));
+ }
+}
+
+var sheet;
+function getSheet() {
+ if (!sheet) {
+ sheet = document.createElement("style");
+ sheet.setAttribute('ShadowCSSShim', '');
+ }
+ return sheet;
+}
+
+// add polyfill stylesheet to document
+if (window.ShadowDOMPolyfill) {
+ addCssToDocument('style { display: none !important; }\n');
+ var head = document.querySelector('head');
+ head.insertBefore(getSheet(), head.childNodes[0]);
+}
+
+// exports
+scope.ShadowCSS = ShadowCSS;
+
+})(window.Platform);
+// 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.
+
+(function(scope) {
+ // TODO(terry): Remove shimShadowDOMStyling2 until wrap/unwrap from a
+ // dart:html Element to a JS DOM node is available.
+ /**
+ * Given the content of a STYLE tag and the name of a component shim the CSS
+ * and return the new scoped CSS to replace the STYLE's content. The content
+ * is replaced in Dart's implementation of PolymerElement.
+ */
+ function shimShadowDOMStyling2(styleContent, name) {
+ if (window.ShadowDOMPolyfill) {
+ var content = this.convertPolyfillDirectives(styleContent, name);
+
+ // applyShimming calls shimAtHost and shipScoping
+ // shimAtHost code:
+ var r = '', l=0, matches;
+ while (matches = hostRuleRe.exec(content)) {
+ r += content.substring(l, matches.index);
+ r += this.scopeHostCss(matches[1], name);
+ l = hostRuleRe.lastIndex;
+ }
+ r += content.substring(l, content.length);
+ var re = new RegExp('^' + name + selectorReSuffix, 'm');
+ var atHostCssText = rulesToCss(this.findAtHostRules(cssToRules(r), re));
+
+ // shimScoping code:
+ // strip comments for easier processing
+ content = content.replace(cssCommentRe, '');
+
+ content = this.convertPseudos(content);
+ var rules = cssToRules(content);
+ var cssText = this.scopeRules(rules, name);
+
+ return atHostCssText + cssText;
+ }
+ }
+
+ // Minimal copied code from ShadowCSS, that is not exposed in
+ // PlatForm.ShadowCSS (local code).
+ var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+ cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+ selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
+
+ function cssToRules(cssText) {
+ var style = document.createElement('style');
+ style.textContent = cssText;
+ document.head.appendChild(style);
+ var rules = style.sheet.cssRules;
+ style.parentNode.removeChild(style);
+ return rules;
+ }
+
+ function rulesToCss(cssRules) {
+ for (var i=0, css=[]; i < cssRules.length; i++) {
+ css.push(cssRules[i].cssText);
+ }
+ return css.join('\n\n');
+ }
+
+ // exports
+ scope.ShadowCSS.shimShadowDOMStyling2 = shimShadowDOMStyling2;
+})(window.Platform);
+
}
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index e9d570e..888ec35 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,2 +1,2 @@
-if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){(function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})})();var SideTable;"undefined"!=typeof WeakMap&&0>navigator.userAgent.indexOf("Firefox/")?SideTable=WeakMap:function(){var e=Object.defineProperty,t=Object.hasOwnProperty,n=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(n++ +"__")},SideTable.prototype={set:function(t,n){e(t,this.name,{value:n,writable:!0})},get:function(e){return t.call(e,this.name)?e[this.name]:void 0},"delete":function(e){this.set(e,void 0)}}}();var ShadowDOMPolyfill={};(function(e){"use strict";function t(e){if(!e)throw new Error("Assertion failed")}function n(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function r(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){switch(n){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function i(e){var t=e.__proto__||Object.getPrototypeOf(e),n=M.get(t);if(n)return n;var r=i(t),o=p(r);return u(t,o,e),o}function o(e,t){l(e,t,!0)}function a(e,t){l(t,e,!1)}function l(e,t,n){Object.getOwnPropertyNames(e).forEach(function(r){if(!(r in t)){L&&e.__lookupGetter__(r);var i;try{i=Object.getOwnPropertyDescriptor(e,r)}catch(o){i=C}var a,l;if(n&&"function"==typeof i.value)return t[r]=function(){return this.impl[r].apply(this.impl,arguments)},void 0;a=function(){return this.impl[r]},(i.writable||i.set)&&(l=function(e){this.impl[r]=e}),Object.defineProperty(t,r,{get:a,set:l,configurable:i.configurable,enumerable:i.enumerable})}})}function s(e,t,n){var i=e.prototype;u(i,t,n),r(t,e)}function u(e,n,r){var i=n.prototype;t(void 0===M.get(e)),M.set(e,n),o(e,i),r&&a(i,r)}function c(e,t){return M.get(t.prototype)===e}function d(e){var t=Object.getPrototypeOf(e),n=i(t),r=p(n);return u(t,r,e),r}function p(e){function t(t){e.call(this,t)}return t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t._ShadowDOMPolyfill$isGeneratedWrapper=!0,t}function h(e){return e instanceof N.EventTarget||e instanceof N.Event||e instanceof N.DOMImplementation}function f(e){return e instanceof D||e instanceof O||e instanceof _||e instanceof H}function m(e){if(null===e)return null;t(f(e));var n=S.get(e);if(!n){var r=i(e);n=new r(e),S.set(e,n)}return n}function g(e){return null===e?null:(t(h(e)),e.impl)}function w(e){return e&&h(e)?g(e):e}function v(e){return e&&!h(e)?m(e):e}function E(e,n){null!==n&&(t(f(e)),t(void 0===n||h(n)),S.set(e,n))}function y(e,t,n){Object.defineProperty(e.prototype,t,{get:n,configurable:!0,enumerable:!0})}function T(e,t){y(e,t,function(){return m(this.impl[t])})}function b(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=m(this);return e[t].apply(e,arguments)}})})}var S=new SideTable,M=new SideTable,N=Object.create(null);Object.getOwnPropertyNames(window);var L=/Firefox/.test(navigator.userAgent),C={get:function(){},set:function(){},configurable:!0,enumerable:!0},H=DOMImplementation,O=Event,D=Node,_=Window;e.assert=t,e.defineGetter=y,e.defineWrapGetter=T,e.forwardMethodsToWrapper=b,e.isWrapper=h,e.isWrapperFor=c,e.mixin=n,e.registerObject=d,e.registerWrapper=s,e.rewrap=E,e.unwrap=g,e.unwrapIfNeeded=w,e.wrap=m,e.wrapIfNeeded=v,e.wrappers=N})(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof I.ShadowRoot}function n(e){var t=e.localName;return"content"===t||"shadow"===t}function r(e){return!!e.shadowRoot}function i(e){var t;return e.parentNode||(t=e.defaultView)&&R(t)||null}function o(o,a,l){if(l.length)return l.shift();if(t(o))return o.insertionParent||e.getHostForShadowRoot(o);var s=e.eventParentsTable.get(o);if(s){for(var u=1;s.length>u;u++)l[u-1]=s[u];return s[0]}if(a&&n(o)){var c=o.parentNode;if(c&&r(c))for(var d=e.getShadowTrees(c),p=a.insertionParent,u=0;d.length>u;u++)if(d[u].contains(p))return p}return i(o)}function a(e){for(var r=[],i=e,a=[],s=[];i;){var u=null;if(n(i)){u=l(r);var c=r[r.length-1]||i;r.push(c)}else r.length||r.push(i);var d=r[r.length-1];a.push({target:d,currentTarget:i}),t(i)&&r.pop(),i=o(i,u,s)}return a}function l(e){for(var t=e.length-1;t>=0;t--)if(!n(e[t]))return e[t];return null}function s(r,i){for(var a=[];r;){for(var s=[],c=i,p=void 0;c;){var h=null;if(s.length){if(n(c)&&(h=l(s),u(p))){var f=s[s.length-1];s.push(f)}}else s.push(c);if(d(c,r))return s[s.length-1];t(c)&&s.pop(),p=c,c=o(c,h,a)}r=t(r)?e.getHostForShadowRoot(r):r.parentNode}}function u(e){return e.insertionParent}function c(e){for(var t;t=e.parentNode;)e=t;return e}function d(e,t){return c(e)===c(t)}function p(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function h(t){if(!F.get(t)){F.set(t,!0),p(t.type)||e.renderAllPending();var n=R(t.target),r=R(t);return f(r,n)}}function f(e,t){var n=a(t);return"load"===e.type&&2===n.length&&n[0].target instanceof I.Document&&n.shift(),m(e,n)&&g(e,n)&&w(e,n),k.set(e,y.NONE),W.set(e,null),e.defaultPrevented}function m(e,t){for(var n,r=t.length-1;r>0;r--){var i=t[r].target,o=t[r].currentTarget;if(i!==o&&(n=y.CAPTURING_PHASE,!v(t[r],e,n)))return!1}return!0}function g(e,t){var n=y.AT_TARGET;return v(t[0],e,n)}function w(e,t){for(var n,r=e.bubbles,i=1;t.length>i;i++){var o=t[i].target,a=t[i].currentTarget;if(o===a)n=y.AT_TARGET;else{if(!r||q.get(e))continue;n=y.BUBBLING_PHASE}if(!v(t[i],e,n))return}}function v(e,t,n){var r=e.target,i=e.currentTarget,o=A.get(i);if(!o)return!0;if("relatedTarget"in t){var a=x(t),l=R(a.relatedTarget),u=s(i,l);if(u===r)return!0;B.set(t,u)}k.set(t,n);var c=t.type,d=!1;j.set(t,r),W.set(t,i);for(var p=0;o.length>p;p++){var h=o[p];if(h.removed)d=!0;else if(!(h.type!==c||!h.capture&&n===y.CAPTURING_PHASE||h.capture&&n===y.BUBBLING_PHASE))try{if("function"==typeof h.handler?h.handler.call(i,t):h.handler.handleEvent(t),q.get(t))return!1}catch(f){window.onerror?window.onerror(f.message):console.error(f)}}if(d){var m=o.slice();o.length=0;for(var p=0;m.length>p;p++)m[p].removed||o.push(m[p])}return!G.get(t)}function E(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){return e instanceof U?(this.impl=e,void 0):R(M(U,"Event",e,t))}function T(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:x(e.relatedTarget)}}):e}function b(e,t,n){var r=window[e],i=function(t,n){return t instanceof r?(this.impl=t,void 0):R(M(r,e,t,n))};return i.prototype=Object.create(t.prototype),n&&_(i.prototype,n),r&&P(r,i,document.createEvent(e)),i}function S(e,t){return function(){arguments[t]=x(arguments[t]);var n=x(this);n[e].apply(n,arguments)}}function M(e,t,n,r){if(et)return new e(n,T(r));var i=x(document.createEvent(t)),o=J[t],a=[n];return Object.keys(o).forEach(function(e){var t=null!=r&&e in r?r[e]:o[e];"relatedTarget"===e&&(t=x(t)),a.push(t)}),i["init"+t].apply(i,a),i}function N(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){this.impl=e}function C(t){return t instanceof I.ShadowRoot&&(t=e.getHostForShadowRoot(t)),x(t)}function H(e){D(e,rt)}function O(t,n,r,i){e.renderAllPending();for(var o=R(it.call(n.impl,r,i)),l=a(o,this),s=0;l.length>s;s++){var u=l[s];if(u.currentTarget===t)return u.target}return null}var D=e.forwardMethodsToWrapper,_=e.mixin,P=e.registerWrapper,x=e.unwrap,R=e.wrap,I=e.wrappers;new SideTable;var A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=new SideTable,G=new SideTable,q=new SideTable;E.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var U=window.Event;y.prototype={get target(){return j.get(this)},get currentTarget(){return W.get(this)},get eventPhase(){return k.get(this)},stopPropagation:function(){G.set(this,!0)},stopImmediatePropagation:function(){G.set(this,!0),q.set(this,!0)}},P(U,y,document.createEvent("Event"));var V=b("UIEvent",y),K=b("CustomEvent",y),$={get relatedTarget(){return B.get(this)||R(x(this).relatedTarget)}},z=_({initMouseEvent:S("initMouseEvent",14)},$),X=_({initFocusEvent:S("initFocusEvent",5)},$),Y=b("MouseEvent",V,z),Q=b("FocusEvent",V,X),Z=b("MutationEvent",y,{initMutationEvent:S("initMutationEvent",3),get relatedNode(){return R(this.impl.relatedNode)}}),J=Object.create(null),et=function(){try{new window.MouseEvent("click")}catch(e){return!1}return!0}();if(!et){var tt=function(e,t,n){if(n){var r=J[n];t=_(_({},r),t)}J[e]=t};tt("Event",{bubbles:!1,cancelable:!1}),tt("CustomEvent",{detail:null},"Event"),tt("UIEvent",{view:null,detail:0},"Event"),tt("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),tt("FocusEvent",{relatedTarget:null},"UIEvent")}var nt=window.EventTarget,rt=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(e){var t=e.prototype;rt.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)){var r=new E(e,t,n),i=A.get(this);if(i){for(var o=0;i.length>o;o++)if(r.equals(i[o]))return}else i=[],A.set(this,i);i.push(r);var a=C(this);a.addEventListener_(e,h,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=A.get(this);if(r){for(var i=0,o=!1,a=0;r.length>a;a++)r[a].type===e&&r[a].capture===n&&(i++,r[a].handler===t&&(o=!0,r[a].remove()));if(o&&1===i){var l=C(this);l.removeEventListener_(e,h,!0)}}},dispatchEvent:function(t){e.renderAllPending();var n=C(this);return n.dispatchEvent_(x(t))}},nt&&P(nt,L);var it=document.elementFromPoint;e.adjustRelatedTarget=s,e.elementFromPoint=O,e.wrapEventTargetMethods=H,e.wrappers.CustomEvent=K,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=Q,e.wrappers.MouseEvent=Y,e.wrappers.MutationEvent=Z,e.wrappers.UIEvent=V}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,{enumerable:!1})}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,i=e.length;i>r;r++)t[r]=o(e[r]);return t.length=i,t}function i(e,t){e.prototype[t]=function(){return r(this.impl[t].apply(this.impl,arguments))}}var o=e.wrap;n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=i,e.wrapNodeList=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){s(e instanceof o)}function n(e,t,n,r){if(e.nodeType!==o.DOCUMENT_FRAGMENT_NODE)return e.parentNode&&e.parentNode.removeChild(e),e.parentNode_=t,e.previousSibling_=n,e.nextSibling_=r,n&&(n.nextSibling_=e),r&&(r.previousSibling_=e),[e];for(var i,a=[];i=e.firstChild;)e.removeChild(i),a.push(i),i.parentNode_=t;for(var l=0;a.length>l;l++)a[l].previousSibling_=a[l-1]||n,a[l].nextSibling_=a[l+1]||r;return n&&(n.nextSibling_=a[0]),r&&(r.previousSibling_=a[a.length-1]),a}function r(e){if(1===e.length)return d(e[0]);for(var t=d(document.createDocumentFragment()),n=0;e.length>n;n++)t.appendChild(d(e[n]));return t}function i(e){for(var t=e.firstChild;t;){s(t.parentNode===e);var n=t.nextSibling,r=d(t),i=r.parentNode;i&&w.call(i,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}function o(e){s(e instanceof h),a.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var a=e.wrappers.EventTarget,l=e.wrappers.NodeList;e.defineWrapGetter;var s=e.assert,u=e.mixin,c=e.registerWrapper,d=e.unwrap,p=e.wrap,h=window.Node,f=h.prototype.appendChild,m=h.prototype.insertBefore,g=h.prototype.replaceChild,w=h.prototype.removeChild,v=h.prototype.compareDocumentPosition;o.prototype=Object.create(a.prototype),u(o.prototype,{appendChild:function(e){t(e),this.invalidateShadowRenderer();var i=this.lastChild,o=null,a=n(e,this,i,o);return this.lastChild_=a[a.length-1],i||(this.firstChild_=a[0]),f.call(this.impl,r(a)),e},insertBefore:function(e,i){if(!i)return this.appendChild(e);t(e),t(i),s(i.parentNode===this),this.invalidateShadowRenderer();var o=i.previousSibling,a=i,l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]);var u=d(i),c=u.parentNode;return c&&m.call(c,r(l),u),e},removeChild:function(e){if(t(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var n=this.firstChild,r=this.lastChild,i=e.nextSibling,o=e.previousSibling,a=d(e),l=a.parentNode;return l&&w.call(l,a),n===e&&(this.firstChild_=i),r===e&&(this.lastChild_=o),o&&(o.nextSibling_=i),i&&(i.previousSibling_=o),e.previousSibling_=e.nextSibling_=e.parentNode_=null,e},replaceChild:function(e,i){if(t(e),t(i),i.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var o=i.previousSibling,a=i.nextSibling;a===e&&(a=e.nextSibling);var l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]),this.lastChild===i&&(this.lastChild_=l[l.length-1]),i.previousSibling_=null,i.nextSibling_=null,i.parentNode_=null;var s=d(i);return s.parentNode&&g.call(s.parentNode,r(l),s),i},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:p(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:p(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:p(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:p(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:p(this.impl.previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==o.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)e+=t.textContent;return e},set textContent(e){if(i(this),this.invalidateShadowRenderer(),""!==e){var t=this.impl.ownerDocument.createTextNode(e);this.appendChild(t)}},get childNodes(){for(var e=new l,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){if(!this.invalidateShadowRenderer())return p(this.impl.cloneNode(e));var t=p(this.impl.cloneNode(!1));if(e)for(var n=this.firstChild;n;n=n.nextSibling)t.appendChild(n.cloneNode(!0));return t},contains:function(e){if(!e)return!1;if(e===this)return!0;var t=e.parentNode;return t?this.contains(t):!1},compareDocumentPosition:function(e){return v.call(this.impl,d(e))},get ownerDocument(){return e.renderAllPending(),p(this.impl.ownerDocument)}}),c(h,o,document.createDocumentFragment()),delete o.prototype.querySelector,delete o.prototype.querySelectorAll,o.prototype=u(Object.create(a.prototype),o.prototype),e.wrappers.Node=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,n){for(var r,i=e.firstElementChild;i;){if(i.matches(n))return i;if(r=t(i,n))return r;i=i.nextElementSibling}return null}function n(e,t,r){for(var i=e.firstElementChild;i;)i.matches(t)&&(r[r.length++]=i),n(i,t,r),i=i.nextElementSibling;return r}var r={querySelector:function(e){return t(this,e)},querySelectorAll:function(e){return n(this,e,new NodeList)}},i={getElementsByTagName:function(e){return this.querySelectorAll(e)},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){if("*"===e)return this.getElementsByTagName(t);for(var n=new NodeList,r=this.getElementsByTagName(t),i=0,o=0;r.length>i;i++)r[i].namespaceURI===e&&(n[o++]=r[i]);return n.length=o,n}};e.GetElementsByInterface=i,e.SelectorsInterface=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,i={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e}},o={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.nextSibling)}};e.ChildNodeInterface=o,e.ParentNodeInterface=i}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,i=e.mixin,o=e.registerWrapper,a=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get textContent(){return this.data},set textContent(e){this.data=e}}),i(t.prototype,n),o(a,t,document.createTextNode("")),e.wrappers.CharacterData=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){i.call(this,e)}var n=e.ChildNodeInterface,r=e.GetElementsByInterface,i=e.wrappers.Node,o=e.ParentNodeInterface,a=e.SelectorsInterface;e.addWrapNodeListMethod;var l=e.mixin,s=e.registerWrapper,u=e.wrappers,c=new SideTable,d=window.Element,p=d.prototype.matches||d.prototype.mozMatchesSelector||d.prototype.msMatchesSelector||d.prototype.webkitMatchesSelector;t.prototype=Object.create(i.prototype),l(t.prototype,{createShadowRoot:function(){var t=new u.ShadowRoot(this);return c.set(this,t),e.getRendererForHost(this),this.invalidateShadowRenderer(!0),t},get shadowRoot(){return c.get(this)||null},setAttribute:function(e,t){this.impl.setAttribute(e,t),this.invalidateShadowRenderer()},matches:function(e){return p.call(this.impl,e)}}),l(t.prototype,n),l(t.prototype,r),l(t.prototype,o),l(t.prototype,a),s(d,t),e.wrappers.Element=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&";case"<":return"<";case'"':return"""}}function n(e){return e.replace(m,t)}function r(e){switch(e.nodeType){case Node.ELEMENT_NODE:for(var t,r=e.tagName.toLowerCase(),o="<"+r,a=e.attributes,l=0;t=a[l];l++)o+=" "+t.name+'="'+n(t.value)+'"';return o+=">",g[r]?o:o+i(e)+"</"+r+">";case Node.TEXT_NODE:return n(e.nodeValue);case Node.COMMENT_NODE:return"<!--"+n(e.nodeValue)+"-->";default:throw console.error(e),new Error("not implemented")}}function i(e){for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=r(n);return t}function o(e,t,n){var r=n||"div";e.textContent="";var i=h(e.ownerDocument.createElement(r));i.innerHTML=t;for(var o;o=i.firstChild;)e.appendChild(f(o))}function a(e){u.call(this,e)}function l(t){c(a,t,function(){return e.renderAllPending(),this.impl[t]})}function s(t){Object.defineProperty(a.prototype,t,{value:function(){return e.renderAllPending(),this.impl[t].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var u=e.wrappers.Element,c=e.defineGetter,d=e.mixin,p=e.registerWrapper,h=e.unwrap,f=e.wrap,m=/&|<|"/g,g={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},w=window.HTMLElement;a.prototype=Object.create(u.prototype),d(a.prototype,{get innerHTML(){return i(this)},set innerHTML(e){o(this,e,this.tagName)},get outerHTML(){return r(this)},set outerHTML(e){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=e}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(l),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(s),p(w,a,document.createElement("b")),e.wrappers.HTMLElement=a,e.getInnerHTML=i,e.setInnerHTML=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),o&&i(o,t),e.wrappers.HTMLContentElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e),this.olderShadowRoot_=null}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){n.prototype.invalidateShadowRenderer.call(this,!0)}}),o&&i(o,t),e.wrappers.HTMLShadowElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),i=r.createDocumentFragment();n=e.firstChild;)i.appendChild(n);return i}function r(e){i.call(this,e)}var i=e.wrappers.HTMLElement,o=e.getInnerHTML,a=e.mixin,l=e.registerWrapper,s=e.setInnerHTML,u=e.wrap,c=new SideTable,d=new SideTable,p=window.HTMLTemplateElement;r.prototype=Object.create(i.prototype),a(r.prototype,{get content(){if(p)return u(this.impl.content);var e=c.get(this);return e||(e=n(this),c.set(this,e)),e},get innerHTML(){return o(this.content)},set innerHTML(e){s(this.content,e),this.invalidateShadowRenderer()}}),p&&l(p,r),e.wrappers.HTMLTemplateElement=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new i(e);case"template":return new o(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,i=e.wrappers.HTMLShadowElement,o=e.wrappers.HTMLTemplateElement;e.mixin;var a=e.registerWrapper,l=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(l,t),e.wrappers.HTMLUnknownElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";var t=e.GetElementsByInterface,n=e.ParentNodeInterface,r=e.SelectorsInterface,i=e.mixin,o=e.registerObject,a=o(document.createDocumentFragment());i(a.prototype,n),i(a.prototype,r),i(a.prototype,t);var l=o(document.createTextNode("")),s=o(document.createComment(""));e.wrappers.Comment=s,e.wrappers.DocumentFragment=a,e.wrappers.Text=l}(this.ShadowDOMPolyfill),function(e){"use strict";function t(t){var r=s(t.impl.ownerDocument.createDocumentFragment());n.call(this,r),a(r,this);var i=t.shadowRoot;e.nextOlderShadowTreeTable.set(this,i),u.set(this,t)}var n=e.wrappers.DocumentFragment,r=e.elementFromPoint,i=e.getInnerHTML,o=e.mixin,a=e.rewrap,l=e.setInnerHTML,s=e.unwrap,u=new SideTable;t.prototype=Object.create(n.prototype),o(t.prototype,{get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return u.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return r(this,this.ownerDocument,e,t)},getElementById:function(e){return this.querySelector("#"+e)}}),e.wrappers.ShadowRoot=t,e.getHostForShadowRoot=function(e){return u.get(e)}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(e){e.firstChild_=e.firstChild,e.lastChild_=e.lastChild}function r(e){_(e instanceof D);for(var r=e.firstChild;r;r=r.nextSibling)t(r);n(e)}function i(e){var t=x(e);r(e),t.textContent=""}function o(e,n){var i=x(e),o=x(n);o.nodeType===D.DOCUMENT_FRAGMENT_NODE?r(n):(l(n),t(n)),e.lastChild_=e.lastChild,e.lastChild===e.firstChild&&(e.firstChild_=e.firstChild);var a=R(i.lastChild);a&&(a.nextSibling_=a.nextSibling),i.appendChild(o)}function a(e,n){var r=x(e),i=x(n);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),e.lastChild===n&&(e.lastChild_=n),e.firstChild===n&&(e.firstChild_=n),r.removeChild(i)}function l(e){var t=x(e),n=t.parentNode;n&&a(R(n),e)}function s(e,t){c(t).push(e),F.set(e,t);var n=A.get(e);n||A.set(e,n=[]),n.push(t)}function u(e){I.set(e,[])}function c(e){return I.get(e)}function d(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function p(e,t,n){for(var r=d(e),i=0;r.length>i;i++){var o=r[i];if(t(o)){if(n(o)===!1)return}else p(o,t,n)}}function h(e,t){var n=!1;return p(e,y,function(e){u(e);for(var r=0;t.length>r;r++){var i=t[r];void 0!==i&&m(i,e)&&(s(i,e),t[r]=void 0,n=!0)}}),n?t.filter(function(e){return void 0!==e}):t}function f(e,t){for(var n=0;t.length>n;n++)if(t[n]in e)return t[n]}function m(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(e.nodeType!==D.ELEMENT_NODE)return!1;if(!k.test(n))return!1;if(":"===n[0]&&!G.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function g(){H=null,U.forEach(function(e){e.render()}),U=[]}function w(e){this.host=e,this.dirty=!1,this.associateNode(e)}function v(e){var t=W.get(e);return t||(t=new w(e),W.set(e,t)),t}function E(e){return"content"===e.localName}function y(e){return"content"===e.localName}function T(e){return"shadow"===e.localName}function b(e){return"shadow"===e.localName}function S(e){return!!e.shadowRoot}function M(e){return j.get(e)}function N(e){for(var t=[],n=e.shadowRoot;n;n=j.get(n))t.push(n);return t}function L(e,t){F.set(e,t)}function C(e){new w(e).render()}var H,O=e.wrappers.HTMLContentElement,D=e.wrappers.Node,_=e.assert,P=e.mixin,x=e.unwrap,R=e.wrap,I=new SideTable,A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=/^[*.:#[a-zA-Z_|]/,G=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),q=f(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),U=[];w.prototype={render:function(){if(this.dirty){var e=this.host;this.treeComposition();var t=e.shadowRoot;if(t){this.removeAllChildNodes(this.host);var n=d(t);n.forEach(function(n){this.renderNode(e,t,n,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,U.push(this),H)return;H=window[q](g,0)}},renderNode:function(e,t,n,r){if(S(n)){this.appendChild(e,n);var i=v(n);i.dirty=!0,i.render()}else E(n)?this.renderInsertionPoint(e,t,n,r):T(n)?this.renderShadowInsertionPoint(e,t,n):this.renderAsAnyDomTree(e,t,n,r)},renderAsAnyDomTree:function(e,t,n,r){if(this.appendChild(e,n),S(n))C(n);else{var i=n,o=d(i);o.forEach(function(e){this.renderNode(i,t,e,r)},this)}},renderInsertionPoint:function(e,t,n,r){var i=c(n);i.length?(this.removeAllChildNodes(n),i.forEach(function(n){E(n)&&r?this.renderInsertionPoint(e,t,n,r):this.renderAsAnyDomTree(e,t,n,r)},this)):this.renderFallbackContent(e,n),this.remove(n)},renderShadowInsertionPoint:function(e,t,n){var r=M(t);if(r){F.set(r,n),n.olderShadowRoot_=r,this.remove(n);var i=d(r);i.forEach(function(t){this.renderNode(e,r,t,!0)},this)}else this.renderFallbackContent(e,n)},renderFallbackContent:function(e,t){var n=d(t);n.forEach(function(t){this.appendChild(e,t)},this)},treeComposition:function(){var e=this.host,t=e.shadowRoot,n=[],r=d(e);r.forEach(function(e){if(E(e)){var t=c(e);t&&t.length||(t=d(e)),n.push.apply(n,t)}else n.push(e)});for(var i,o;t;){if(i=void 0,p(t,b,function(e){return i=e,!1}),o=i,n=h(t,n),o){var a=M(t);if(a){t=a,L(t,o);continue}break}break}},appendChild:function(e,t){o(e,t),this.associateNode(t)},remove:function(e){l(e),this.associateNode(e)},removeAllChildNodes:function(e){i(e)},associateNode:function(e){B.set(e,this)}},D.prototype.invalidateShadowRenderer=function(e){var t=B.get(this);if(!t)return!1;var n;return(e||this.shadowRoot||(n=this.parentNode)&&(n.shadowRoot||n instanceof ShadowRoot))&&t.invalidate(),!0},O.prototype.getDistributedNodes=function(){return g(),c(this)},P(D.prototype,{get insertionParent(){return F.get(this)||null}}),e.eventParentsTable=A,e.getRendererForHost=v,e.getShadowTrees=N,e.nextOlderShadowTreeTable=j,e.renderAllPending=g,e.visual={removeAllChildNodes:i,appendChild:o,removeChild:a}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e)}function n(e){var n=document[e];t.prototype[e]=function(){return g(n.apply(this.impl,arguments))}}function r(e){this.impl=e}function i(e,t){var n=document.implementation[t];e.prototype[t]=function(){return g(n.apply(this.impl,arguments))}}function o(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(this.impl,arguments)}}var a=e.GetElementsByInterface,l=e.wrappers.Node,s=e.ParentNodeInterface,u=e.SelectorsInterface,c=e.defineWrapGetter,d=e.elementFromPoint,p=e.forwardMethodsToWrapper,h=e.mixin,f=e.registerWrapper,m=e.unwrap,g=e.wrap,w=e.wrapEventTargetMethods;e.wrapNodeList;var v=new SideTable;t.prototype=Object.create(l.prototype),c(t,"documentElement"),c(t,"body"),c(t,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(n);var E=document.adoptNode,y=document.write;h(t.prototype,{adoptNode:function(e){return E.call(this.impl,m(e)),e},elementFromPoint:function(e,t){return d(this,this,e,t)},write:function(e){for(var t=this.querySelectorAll("*"),n=t[t.length-1];n.nextSibling;)n=n.nextSibling;var r=n.parentNode;r.lastChild_=void 0,n.nextSibling_=void 0,y.call(this.impl,e)}}),p([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),p([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),h(t.prototype,a),h(t.prototype,s),h(t.prototype,u),h(t.prototype,{get implementation(){var e=v.get(this);return e?e:(e=new r(m(this).implementation),v.set(this,e),e)}}),f(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&f(window.HTMLDocument,t),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),i(r,"createDocumentType"),i(r,"createDocument"),i(r,"createHTMLDocument"),o(r,"hasFeature"),f(window.DOMImplementation,r),p([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),e.wrappers.Document=t,e.wrappers.DOMImplementation=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,i=e.registerWrapper,o=e.unwrap,a=e.unwrapIfNeeded,l=e.wrap,s=window.Window;t.prototype=Object.create(n.prototype);var u=window.getComputedStyle;s.prototype.getComputedStyle=function(e,t){return u.call(this||window,a(e),t)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){s.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)}}),r(t.prototype,{getComputedStyle:function(e,t){return u.call(o(this),a(e),t)}}),i(s,t),e.wrappers.Window=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){this.impl=e}function n(e){return new t(e)}function r(e){return e.map(n)}function i(e){var t=this;this.impl=new c(function(n){e.call(t,r(n),t)})}var o=e.defineGetter,a=e.defineWrapGetter,l=e.registerWrapper,s=e.unwrapIfNeeded,u=e.wrapNodeList;e.wrappers;var c=window.MutationObserver||window.WebKitMutationObserver;if(c){var d=window.MutationRecord;t.prototype={get addedNodes(){return u(this.impl.addedNodes)},get removedNodes(){return u(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(e){a(t,e)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(e){o(t,e,function(){return this.impl[e]
-})}),d&&l(d,t),window.Node,i.prototype={observe:function(e,t){this.impl.observe(s(e),t)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return r(this.impl.takeRecords())}},e.wrappers.MutationObserver=i,e.wrappers.MutationRecord=t}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var i=document.createElement(e),o=i.constructor;window[t]=o}}e.isWrapperFor;var n={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]}),e.knownElements=n}(this.ShadowDOMPolyfill),function(){var e=window.ShadowDOMPolyfill;e.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(t){function n(e){if(e instanceof r)return"NodeList";if(e instanceof i)return"ShadowRoot";if(e instanceof MutationRecord)return"MutationRecord";if(e instanceof MutationObserver)return"MutationObserver";if(o(e)){e=a(e);var n=e.constructor;if(n&&n._ShadowDOMPolyfill$isGeneratedWrapper){var l=n._ShadowDOMPolyfill$cacheTag_;return l||(l=Object.prototype.toString.call(e),l=l.substring(8,l.length-1),n._ShadowDOMPolyfill$cacheTag_=l),l}}return t(e)}var r=e.wrappers.NodeList,i=e.wrappers.ShadowRoot,o=e.isWrapper,a=e.unwrap;return n}}()}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}();var SideTable;"undefined"!=typeof WeakMap&&navigator.userAgent.indexOf("Firefox/")<0?SideTable=WeakMap:function(){var a=Object.defineProperty,b=Object.hasOwnProperty,c=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(c++ +"__")},SideTable.prototype={set:function(b,c){a(b,this.name,{value:c,writable:!0})},get:function(a){return b.call(a,this.name)?a[this.name]:void 0},"delete":function(a){this.set(a,void 0)}}}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a){var b=a.__proto__||Object.getPrototypeOf(a),c=y.get(b);if(c)return c;var d=e(b),f=m(d);return j(b,f,a),f}function f(a,b){h(a,b,!0)}function g(a,b){h(b,a,!1)}function h(a,b,c){Object.getOwnPropertyNames(a).forEach(function(d){if(!(d in b)){A&&a.__lookupGetter__(d);var e;try{e=Object.getOwnPropertyDescriptor(a,d)}catch(f){e=B}var g,h;if(c&&"function"==typeof e.value)return b[d]=function(){return this.impl[d].apply(this.impl,arguments)},void 0;g=function(){return this.impl[d]},(e.writable||e.set)&&(h=function(a){this.impl[d]=a}),Object.defineProperty(b,d,{get:g,set:h,configurable:e.configurable,enumerable:e.enumerable})}})}function i(a,b,c){var e=a.prototype;j(e,b,c),d(b,a)}function j(a,c,d){var e=c.prototype;b(void 0===y.get(a)),y.set(a,c),f(a,e),d&&g(e,d)}function k(a,b){return y.get(b.prototype)===a}function l(a){var b=Object.getPrototypeOf(a),c=e(b),d=m(c);return j(b,d,a),d}function m(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b._ShadowDOMPolyfill$isGeneratedWrapper=!0,b}function n(a){return a instanceof z.EventTarget||a instanceof z.Event||a instanceof z.DOMImplementation}function o(a){return a instanceof E||a instanceof D||a instanceof F||a instanceof C}function p(a){if(null===a)return null;b(o(a));var c=x.get(a);if(!c){var d=e(a);c=new d(a),x.set(a,c)}return c}function q(a){return null===a?null:(b(n(a)),a.impl)}function r(a){return a&&n(a)?q(a):a}function s(a){return a&&!n(a)?p(a):a}function t(a,c){null!==c&&(b(o(a)),b(void 0===c||n(c)),x.set(a,c))}function u(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function v(a,b){u(a,b,function(){return p(this.impl[b])})}function w(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=p(this);return a[b].apply(a,arguments)}})})}var x=new SideTable,y=new SideTable,z=Object.create(null);Object.getOwnPropertyNames(window);var A=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(){},configurable:!0,enumerable:!0},C=DOMImplementation,D=Event,E=Node,F=Window;a.assert=b,a.defineGetter=u,a.defineWrapGetter=v,a.forwardMethodsToWrapper=w,a.isWrapper=n,a.isWrapperFor=k,a.mixin=c,a.registerObject=l,a.registerWrapper=i,a.rewrap=t,a.unwrap=q,a.unwrapIfNeeded=r,a.wrap=p,a.wrapIfNeeded=s,a.wrappers=z}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof J.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&I(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return f.insertionParent||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var j=1;j<i.length;j++)h[j-1]=i[j];return i[0]}if(g&&c(f)){var k=f.parentNode;if(k&&d(k))for(var l=a.getShadowTrees(k),m=g.insertionParent,j=0;j<l.length;j++)if(l[j].contains(m))return m}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(d,e){for(var g=[];d;){for(var i=[],k=e,m=void 0;k;){var n=null;if(i.length){if(c(k)&&(n=h(i),j(m))){var o=i[i.length-1];i.push(o)}}else i.push(k);if(l(k,d))return i[i.length-1];b(k)&&i.pop(),m=k,k=f(k,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(a){return a.insertionParent}function k(a){for(var b;b=a.parentNode;)a=b;return a}function l(a,b){return k(a)===k(b)}function m(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function n(b){if(!L.get(b)){L.set(b,!0),m(b.type)||a.renderAllPending();var c=I(b.target),d=I(b);return o(d,c)}}function o(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof J.Document&&c.shift(),p(a,c)&&q(a,c)&&r(a,c),P.set(a,u.NONE),N.set(a,null),a.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||R.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=K.get(e);if(!f)return!0;if("relatedTarget"in b){var g=H(b),h=I(g.relatedTarget),j=i(e,h);if(j===d)return!0;O.set(b,j)}P.set(b,c);var k=b.type,l=!1;M.set(b,d),N.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===u.CAPTURING_PHASE||n.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),R.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!Q.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){return a instanceof S?(this.impl=a,void 0):I(y(S,"Event",a,b))}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:H(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):I(y(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&F(e.prototype,c),d&&G(d,e,document.createEvent(a)),e}function x(a,b){return function(){arguments[b]=H(arguments[b]);var c=H(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(ab)return new a(c,v(d));var e=H(document.createEvent(b)),f=_[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=H(b)),g.push(b)}),e["init"+b].apply(e,g),e}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){this.impl=a}function B(b){return b instanceof J.ShadowRoot&&(b=a.getHostForShadowRoot(b)),H(b)}function C(a){E(a,db)}function D(b,c,d,e){a.renderAllPending();for(var f=I(eb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}var E=a.forwardMethodsToWrapper,F=a.mixin,G=a.registerWrapper,H=a.unwrap,I=a.wrap,J=a.wrappers;new SideTable;var K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=new SideTable,Q=new SideTable,R=new SideTable;t.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var S=window.Event;u.prototype={get target(){return M.get(this)},get currentTarget(){return N.get(this)},get eventPhase(){return P.get(this)},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),R.set(this,!0)}},G(S,u,document.createEvent("Event"));var T=w("UIEvent",u),U=w("CustomEvent",u),V={get relatedTarget(){return O.get(this)||I(H(this).relatedTarget)}},W=F({initMouseEvent:x("initMouseEvent",14)},V),X=F({initFocusEvent:x("initFocusEvent",5)},V),Y=w("MouseEvent",T,W),Z=w("FocusEvent",T,X),$=w("MutationEvent",u,{initMutationEvent:x("initMutationEvent",3),get relatedNode(){return I(this.impl.relatedNode)}}),_=Object.create(null),ab=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!ab){var bb=function(a,b,c){if(c){var d=_[c];b=F(F({},d),b)}_[a]=b};bb("Event",{bubbles:!1,cancelable:!1}),bb("CustomEvent",{detail:null},"Event"),bb("UIEvent",{view:null,detail:0},"Event"),bb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),bb("FocusEvent",{relatedTarget:null},"UIEvent")}var cb=window.EventTarget,db=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(a){var b=a.prototype;db.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),A.prototype={addEventListener:function(a,b,c){if(z(b)){var d=new t(a,b,c),e=K.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],K.set(this,e);e.push(d);var g=B(this);g.addEventListener_(a,n,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=K.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=B(this);h.removeEventListener_(a,n,!0)}}},dispatchEvent:function(b){a.renderAllPending();var c=B(this);return c.dispatchEvent_(H(b))}},cb&&G(cb,A);var eb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=D,a.wrapEventTargetMethods=C,a.wrappers.CustomEvent=U,a.wrappers.Event=u,a.wrappers.EventTarget=A,a.wrappers.FocusEvent=Z,a.wrappers.MouseEvent=Y,a.wrappers.MutationEvent=$,a.wrappers.UIEvent=T}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){i(a instanceof f)}function c(a,b,c,d){if(a.nodeType!==f.DOCUMENT_FRAGMENT_NODE)return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e,g=[];e=a.firstChild;)a.removeChild(e),g.push(e),e.parentNode_=b;for(var h=0;h<g.length;h++)g[h].previousSibling_=g[h-1]||c,g[h].nextSibling_=g[h+1]||d;return c&&(c.nextSibling_=g[0]),d&&(d.previousSibling_=g[g.length-1]),g}function d(a){if(1===a.length)return l(a[0]);for(var b=l(document.createDocumentFragment()),c=0;c<a.length;c++)b.appendChild(l(a[c]));return b}function e(a){for(var b=a.firstChild;b;){i(b.parentNode===a);var c=b.nextSibling,d=l(b),e=d.parentNode;e&&r.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}function f(a){i(a instanceof n),g.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var g=a.wrappers.EventTarget,h=a.wrappers.NodeList;a.defineWrapGetter;var i=a.assert,j=a.mixin,k=a.registerWrapper,l=a.unwrap,m=a.wrap,n=window.Node,o=n.prototype.appendChild,p=n.prototype.insertBefore,q=n.prototype.replaceChild,r=n.prototype.removeChild,s=n.prototype.compareDocumentPosition;f.prototype=Object.create(g.prototype),j(f.prototype,{appendChild:function(a){b(a),this.invalidateShadowRenderer();var e=this.lastChild,f=null,g=c(a,this,e,f);return this.lastChild_=g[g.length-1],e||(this.firstChild_=g[0]),o.call(this.impl,d(g)),a},insertBefore:function(a,e){if(!e)return this.appendChild(a);b(a),b(e),i(e.parentNode===this),this.invalidateShadowRenderer();var f=e.previousSibling,g=e,h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]);var j=l(e),k=j.parentNode;return k&&p.call(k,d(h),j),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var c=this.firstChild,d=this.lastChild,e=a.nextSibling,f=a.previousSibling,g=l(a),h=g.parentNode;return h&&r.call(h,g),c===a&&(this.firstChild_=e),d===a&&(this.lastChild_=f),f&&(f.nextSibling_=e),e&&(e.previousSibling_=f),a.previousSibling_=a.nextSibling_=a.parentNode_=null,a},replaceChild:function(a,e){if(b(a),b(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var f=e.previousSibling,g=e.nextSibling;g===a&&(g=a.nextSibling);var h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]),this.lastChild===e&&(this.lastChild_=h[h.length-1]),e.previousSibling_=null,e.nextSibling_=null,e.parentNode_=null;var i=l(e);return i.parentNode&&q.call(i.parentNode,d(h),i),e},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:m(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:m(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:m(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:m(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:m(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==f.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(e(this),this.invalidateShadowRenderer(),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}},get childNodes(){for(var a=new h,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return m(this.impl.cloneNode(a));var b=m(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return s.call(this.impl,l(a))},get ownerDocument(){return a.renderAllPending(),m(this.impl.ownerDocument)}}),k(n,f,document.createDocumentFragment()),delete f.prototype.querySelector,delete f.prototype.querySelectorAll,f.prototype=j(Object.create(g.prototype),f.prototype),a.wrappers.Node=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.nextSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){e.call(this,a)}var c=a.ChildNodeInterface,d=a.GetElementsByInterface,e=a.wrappers.Node,f=a.ParentNodeInterface,g=a.SelectorsInterface;a.addWrapNodeListMethod;var h=a.mixin,i=a.registerWrapper,j=a.wrappers,k=new SideTable,l=window.Element,m=l.prototype.matches||l.prototype.mozMatchesSelector||l.prototype.msMatchesSelector||l.prototype.webkitMatchesSelector;b.prototype=Object.create(e.prototype),h(b.prototype,{createShadowRoot:function(){var b=new j.ShadowRoot(this);return k.set(this,b),a.getRendererForHost(this),this.invalidateShadowRenderer(!0),b},get shadowRoot(){return k.get(this)||null},setAttribute:function(a,b){this.impl.setAttribute(a,b),this.invalidateShadowRenderer()},matches:function(a){return m.call(this.impl,a)}}),h(b.prototype,c),h(b.prototype,d),h(b.prototype,f),h(b.prototype,g),i(l,b),a.wrappers.Element=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&";case"<":return"<";case'"':return"""}}function c(a){return a.replace(p,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",q[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=n(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(o(f))}function g(a){j.call(this,a)}function h(b){k(g,b,function(){return a.renderAllPending(),this.impl[b]})}function i(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var j=a.wrappers.Element,k=a.defineGetter,l=a.mixin,m=a.registerWrapper,n=a.unwrap,o=a.wrap,p=/&|<|"/g,q={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},r=window.HTMLElement;g.prototype=Object.create(j.prototype),l(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){f(this,a,this.tagName)},get outerHTML(){return d(this)},set outerHTML(a){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=a}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(h),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(i),m(r,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a),this.olderShadowRoot_=null}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){c.prototype.invalidateShadowRenderer.call(this,!0)}}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=d.createDocumentFragment();c=a.firstChild;)e.appendChild(c);return e}function d(a){e.call(this,a)}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.registerWrapper,i=a.setInnerHTML,j=a.wrap,k=new SideTable,l=new SideTable,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){if(m)return j(this.impl.content);var a=k.get(this);return a||(a=c(this),k.set(this,a)),a},get innerHTML(){return f(this.content)},set innerHTML(a){i(this.content,a),this.invalidateShadowRenderer()}}),m&&h(m,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){var d=i(b.impl.ownerDocument.createDocumentFragment());c.call(this,d),g(d,this);var e=b.shadowRoot;a.nextOlderShadowTreeTable.set(this,e),j.set(this,b)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new SideTable;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b,a.getHostForShadowRoot=function(a){return j.get(a)}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a){a.firstChild_=a.firstChild,a.lastChild_=a.lastChild}function d(a){F(a instanceof E);for(var d=a.firstChild;d;d=d.nextSibling)b(d);c(a)}function e(a){var b=H(a);d(a),b.textContent=""}function f(a,c){var e=H(a),f=H(c);f.nodeType===E.DOCUMENT_FRAGMENT_NODE?d(c):(h(c),b(c)),a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var g=I(e.lastChild);g&&(g.nextSibling_=g.nextSibling),e.appendChild(f)}function g(a,c){var d=H(a),e=H(c);b(c),c.previousSibling&&(c.previousSibling.nextSibling_=c),c.nextSibling&&(c.nextSibling.previousSibling_=c),a.lastChild===c&&(a.lastChild_=c),a.firstChild===c&&(a.firstChild_=c),d.removeChild(e)}function h(a){var b=H(a),c=b.parentNode;c&&g(I(c),a)}function i(a,b){k(b).push(a),L.set(a,b);var c=K.get(a);c||K.set(a,c=[]),c.push(b)}function j(a){J.set(a,[])}function k(a){return J.get(a)}function l(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function m(a,b,c){for(var d=l(a),e=0;e<d.length;e++){var f=d[e];if(b(f)){if(c(f)===!1)return}else m(f,b,c)}}function n(a,b){var c=!1;return m(a,u,function(a){j(a);for(var d=0;d<b.length;d++){var e=b[d];void 0!==e&&p(e,a)&&(i(e,a),b[d]=void 0,c=!0)}}),c?b.filter(function(a){return void 0!==a}):b}function o(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function p(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(a.nodeType!==E.ELEMENT_NODE)return!1;if(!P.test(c))return!1;if(":"===c[0]&&!Q.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function q(){C=null,S.forEach(function(a){a.render()}),S=[]}function r(a){this.host=a,this.dirty=!1,this.associateNode(a)}function s(a){var b=N.get(a);return b||(b=new r(a),N.set(a,b)),b}function t(a){return"content"===a.localName}function u(a){return"content"===a.localName}function v(a){return"shadow"===a.localName}function w(a){return"shadow"===a.localName}function x(a){return!!a.shadowRoot}function y(a){return M.get(a)}function z(a){for(var b=[],c=a.shadowRoot;c;c=M.get(c))b.push(c);return b}function A(a,b){L.set(a,b)}function B(a){new r(a).render()}var C,D=a.wrappers.HTMLContentElement,E=a.wrappers.Node,F=a.assert,G=a.mixin,H=a.unwrap,I=a.wrap,J=new SideTable,K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=/^[*.:#[a-zA-Z_|]/,Q=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),R=o(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),S=[];r.prototype={render:function(){if(this.dirty){var a=this.host;this.treeComposition();var b=a.shadowRoot;if(b){this.removeAllChildNodes(this.host);var c=l(b);c.forEach(function(c){this.renderNode(a,b,c,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,S.push(this),C)return;C=window[R](q,0)}},renderNode:function(a,b,c,d){if(x(c)){this.appendChild(a,c);var e=s(c);e.dirty=!0,e.render()}else t(c)?this.renderInsertionPoint(a,b,c,d):v(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(this.appendChild(a,c),x(c))B(c);else{var e=c,f=l(e);f.forEach(function(a){this.renderNode(e,b,a,d)},this)}},renderInsertionPoint:function(a,b,c,d){var e=k(c);e.length?(this.removeAllChildNodes(c),e.forEach(function(c){t(c)&&d?this.renderInsertionPoint(a,b,c,d):this.renderAsAnyDomTree(a,b,c,d)},this)):this.renderFallbackContent(a,c),this.remove(c)},renderShadowInsertionPoint:function(a,b,c){var d=y(b);if(d){L.set(d,c),c.olderShadowRoot_=d,this.remove(c);var e=l(d);e.forEach(function(b){this.renderNode(a,d,b,!0)},this)}else this.renderFallbackContent(a,c)},renderFallbackContent:function(a,b){var c=l(b);c.forEach(function(b){this.appendChild(a,b)},this)},treeComposition:function(){var a=this.host,b=a.shadowRoot,c=[],d=l(a);d.forEach(function(a){if(t(a)){var b=k(a);b&&b.length||(b=l(a)),c.push.apply(c,b)}else c.push(a)});for(var e,f;b;){if(e=void 0,m(b,w,function(a){return e=a,!1}),f=e,c=n(b,c),f){var g=y(b);if(g){b=g,A(b,f);continue}break}break}},appendChild:function(a,b){f(a,b),this.associateNode(b)},remove:function(a){h(a),this.associateNode(a)},removeAllChildNodes:function(a){e(a)},associateNode:function(a){O.set(a,this)}},E.prototype.invalidateShadowRenderer=function(a){var b=O.get(this);if(!b)return!1;var c;return(a||this.shadowRoot||(c=this.parentNode)&&(c.shadowRoot||c instanceof ShadowRoot))&&b.invalidate(),!0},D.prototype.getDistributedNodes=function(){return q(),k(this)},G(E.prototype,{get insertionParent(){return L.get(this)||null}}),a.eventParentsTable=K,a.getRendererForHost=s,a.getShadowTrees=z,a.nextOlderShadowTreeTable=M,a.renderAllPending=q,a.visual={removeAllChildNodes:e,appendChild:f,removeChild:g}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){h.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return q(c.apply(this.impl,arguments))}}function d(a){this.impl=a}function e(a,b){var c=document.implementation[b];a.prototype[b]=function(){return q(c.apply(this.impl,arguments))}}function f(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=a.defineWrapGetter,l=a.elementFromPoint,m=a.forwardMethodsToWrapper,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=a.wrapEventTargetMethods;a.wrapNodeList;var s=new SideTable;b.prototype=Object.create(h.prototype),k(b,"documentElement"),k(b,"body"),k(b,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(c);var t=document.adoptNode,u=document.write;n(b.prototype,{adoptNode:function(a){return t.call(this.impl,p(a)),a},elementFromPoint:function(a,b){return l(this,this,a,b)},write:function(a){for(var b=this.querySelectorAll("*"),c=b[b.length-1];c.nextSibling;)c=c.nextSibling;var d=c.parentNode;d.lastChild_=void 0,c.nextSibling_=void 0,u.call(this.impl,a)}}),m([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),m([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),n(b.prototype,g),n(b.prototype,i),n(b.prototype,j),n(b.prototype,{get implementation(){var a=s.get(this);return a?a:(a=new d(p(this).implementation),s.set(this,a),a)}}),o(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&o(window.HTMLDocument,b),r([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),e(d,"createDocumentType"),e(d,"createDocument"),e(d,"createHTMLDocument"),f(d,"hasFeature"),o(window.DOMImplementation,d),m([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.wrappers.Document=b,a.wrappers.DOMImplementation=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Window;b.prototype=Object.create(c.prototype);var j=window.getComputedStyle;i.prototype.getComputedStyle=function(a,b){return j.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){i.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return j.call(f(this),g(a),b)}}),e(i,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]
+})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(a instanceof MutationRecord)return"MutationRecord";if(a instanceof MutationObserver)return"MutationObserver";if(f(a)){a=g(a);var c=a.constructor;if(c&&c._ShadowDOMPolyfill$isGeneratedWrapper){var h=c._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(a),h=h.substring(8,h.length-1),c._ShadowDOMPolyfill$cacheTag_=h),h}}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.isWrapper,g=a.unwrap;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(m,"")),c}function c(a){var b=document.createElement("style");b.textContent=a,document.head.appendChild(b);var c=b.sheet.cssRules;return b.parentNode.removeChild(b),c}function d(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function e(a){a&&f().appendChild(document.createTextNode(a))}function f(){return g||(g=document.createElement("style"),g.setAttribute("ShadowCSSShim","")),g}var g,h={strictStyling:!1,registry:{},shimStyling:function(a,b,c){if(a){var d=this.registerDefinition(a,b,c);this.strictStyling&&this.applyScopeToContent(a,b),this.shimPolyfillDirectives(d.rootStyles,b),this.applyShimming(d.scopeStyles,b)}},shimShadowDOMStyling:function(a,b){this.shimPolyfillDirectives(a,b),this.applyShimming(a,b)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a.querySelectorAll("style");e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=d.scopeStyles.concat(f.scopeStyles)),d},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},shimPolyfillDirectives:function(a,b){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.convertPolyfillDirectives(a.textContent,b)},this)},convertPolyfillDirectives:function(a,b){for(var c,d,e="",f=0;c=n.exec(a);)e+=a.substring(f,c.index),d=c[1].slice(0,-2).replace(q,b),e+=this.scopeSelector(d,b)+"{",f=n.lastIndex;return e+=a.substring(f,a.length)},applyShimming:function(a,b){var c=this.shimAtHost(a,b);c+=this.shimScoping(a,b),e(c)},shimAtHost:function(a,b){return a?this.convertAtHostStyles(a,b):void 0},convertAtHostStyles:function(a,e){for(var f,g=b(a),h="",j=0;f=i.exec(g);)h+=g.substring(j,f.index),h+=this.scopeHostCss(f[1],e),j=i.lastIndex;h+=g.substring(j,g.length);var k=new RegExp("^"+e+p,"m"),g=d(this.findAtHostRules(c(h),k));return g},scopeHostCss:function(a,b){for(var c,d="";c=j.exec(a);)d+=this.scopeHostSelector(c[1],b)+" "+c[2]+"\n ";return d},scopeHostSelector:function(a,b){var c=[],d=a.split(","),e="[is="+b+"]";return d.forEach(function(a){a=a.trim(),a.match(k)?a=a.replace(k,b+"$1$3, "+e+"$1$3"):a.match(l)&&(a=b+a+", "+e+a),c.push(a)},this),c.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b){return a?this.convertScopedStyles(a,b):void 0},convertScopedStyles:function(a,d){Array.prototype.forEach.call(a,function(a){a.parentNode&&a.parentNode.removeChild(a)});var e=b(a).replace(i,"");e=this.convertPseudos(e);var f=c(e);return e=this.scopeRules(f,d)},convertPseudos:function(a){return a.replace(o," [pseudo=$1]")},scopeRules:function(a,b){var c="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n ",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){var c="("+b+"|\\[is="+b+"\\])",d=new RegExp("^"+c+p,"m");return!a.match(d)},applySimpleSelectorScope:function(a,b){return b+" "+a+", "+"[is="+b+"] "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim();return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},i=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,j=/([^{]*)({[\s\S]*?})/gim,k=/(.*)((?:\*)|(?:\:scope))(.*)/,l=/^[.\[:]/,m=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,n=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,o=/::(x-[^\s{,(]*)/gim,p="([>\\s~+[.,{:][\\s\\S]*)?$",q=/@host/gim;if(window.ShadowDOMPolyfill){e("style { display: none !important; }\n");var r=document.querySelector("head");r.insertBefore(f(),r.childNodes[0])}a.ShadowCSS=h}(window.Platform),function(a){function b(a,b){if(window.ShadowDOMPolyfill){for(var h,i=this.convertPolyfillDirectives(a,b),j="",k=0;h=e.exec(i);)j+=i.substring(k,h.index),j+=this.scopeHostCss(h[1],b),k=e.lastIndex;j+=i.substring(k,i.length);var l=new RegExp("^"+b+g,"m"),m=d(this.findAtHostRules(c(j),l));i=i.replace(f,""),i=this.convertPseudos(i);var n=c(i),o=this.scopeRules(n,b);return m+o}}function c(a){var b=document.createElement("style");b.textContent=a,document.head.appendChild(b);var c=b.sheet.cssRules;return b.parentNode.removeChild(b),c}function d(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}var e=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,f=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,g="([>\\s~+[.,{:][\\s\\S]*)?$";a.ShadowCSS.shimShadowDOMStyling2=b}(window.Platform)}
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/src/platform/ShadowCSS.js b/pkg/shadow_dom/lib/src/platform/ShadowCSS.js
new file mode 100644
index 0000000..96861a1
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/ShadowCSS.js
@@ -0,0 +1,452 @@
+/*
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/*
+ This is a limited shim for ShadowDOM css styling.
+ https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
+
+ The intention here is to support only the styling features which can be
+ relatively simply implemented. The goal is to allow users to avoid the
+ most obvious pitfalls and do so without compromising performance significantly.
+ For ShadowDOM styling that's not covered here, a set of best practices
+ can be provided that should allow users to accomplish more complex styling.
+
+ The following is a list of specific ShadowDOM styling features and a brief
+ discussion of the approach used to shim.
+
+ Shimmed features:
+
+ * @host: ShadowDOM allows styling of the shadowRoot's host element using the
+ @host rule. To shim this feature, the @host styles are reformatted and
+ prefixed with a given scope name and promoted to a document level stylesheet.
+ For example, given a scope name of .foo, a rule like this:
+
+ @host {
+ * {
+ background: red;
+ }
+ }
+
+ becomes:
+
+ .foo {
+ background: red;
+ }
+
+ * encapsultion: Styles defined within ShadowDOM, apply only to
+ dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
+ this feature.
+
+ By default, rules are prefixed with the host element tag name
+ as a descendant selector. This ensures styling does not leak out of the 'top'
+ of the element's ShadowDOM. For example,
+
+ div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+ x-foo div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+
+ Alternatively, if Platform.ShadowCSS.strictStyling is set to true then
+ selectors are scoped by adding an attribute selector suffix to each
+ simple selector that contains the host element tag name. Each element
+ in the element's ShadowDOM template is also given the scope attribute.
+ Thus, these rules match only elements that have the scope attribute.
+ For example, given a scope name of x-foo, a rule like this:
+
+ div {
+ font-weight: bold;
+ }
+
+ becomes:
+
+ div[x-foo] {
+ font-weight: bold;
+ }
+
+ Note that elements that are dynamically added to a scope must have the scope
+ selector added to them manually.
+
+ * ::pseudo: These rules are converted to rules that take advantage of the
+ pseudo attribute. For example, a shadowRoot like this inside an x-foo
+
+ <div pseudo="x-special">Special</div>
+
+ with a rule like this:
+
+ x-foo::x-special { ... }
+
+ becomes:
+
+ x-foo [pseudo=x-special] { ... }
+
+ Unaddressed ShadowDOM styling features:
+
+ * upper/lower bound encapsulation: Styles which are defined outside a
+ shadowRoot should not cross the ShadowDOM boundary and should not apply
+ inside a shadowRoot.
+
+ This styling behavior is not emulated. Some possible ways to do this that
+ were rejected due to complexity and/or performance concerns include: (1) reset
+ every possible property for every possible selector for a given scope name;
+ (2) re-implement css in javascript.
+
+ As an alternative, users should make sure to use selectors
+ specific to the scope in which they are working.
+
+ * ::distributed: This behavior is not emulated. It's often not necessary
+ to style the contents of a specific insertion point and instead, descendants
+ of the host element can be styled selectively. Users can also create an
+ extra node around an insertion point and style that node's contents
+ via descendent selectors. For example, with a shadowRoot like this:
+
+ <style>
+ content::-webkit-distributed(div) {
+ background: red;
+ }
+ </style>
+ <content></content>
+
+ could become:
+
+ <style>
+ / *@polyfill .content-container div * /
+ content::-webkit-distributed(div) {
+ background: red;
+ }
+ </style>
+ <div class="content-container">
+ <content></content>
+ </div>
+
+ Note the use of @polyfill in the comment above a ShadowDOM specific style
+ declaration. This is a directive to the styling shim to use the selector
+ in comments in lieu of the next selector when running under polyfill.
+*/
+(function(scope) {
+
+var ShadowCSS = {
+ strictStyling: false,
+ registry: {},
+ // Shim styles for a given root associated with a name and extendsName
+ // 1. cache root styles by name
+ // 2. optionally tag root nodes with scope name
+ // 3. shim polyfill directives /* @polyfill */
+ // 4. shim @host and scoping
+ shimStyling: function(root, name, extendsName) {
+ if (root) {
+ // use caching to make working with styles nodes easier and to facilitate
+ // lookup of extendee
+ var def = this.registerDefinition(root, name, extendsName);
+ // find styles and apply shimming...
+ if (this.strictStyling) {
+ this.applyScopeToContent(root, name);
+ }
+ this.shimPolyfillDirectives(def.rootStyles, name);
+ this.applyShimming(def.scopeStyles, name);
+ }
+ },
+ // Shim styles to be placed inside a shadowRoot.
+ // 1. shim polyfill directives /* @polyfill */
+ // 2. shim @host and scoping
+ shimShadowDOMStyling: function(styles, name) {
+ this.shimPolyfillDirectives(styles, name);
+ this.applyShimming(styles, name);
+ },
+ registerDefinition: function(root, name, extendsName) {
+ var def = this.registry[name] = {
+ root: root,
+ name: name,
+ extendsName: extendsName
+ }
+ var styles = root.querySelectorAll('style');
+ styles = styles ? Array.prototype.slice.call(styles, 0) : [];
+ def.rootStyles = styles;
+ def.scopeStyles = def.rootStyles;
+ var extendee = this.registry[def.extendsName];
+ if (extendee) {
+ def.scopeStyles = def.scopeStyles.concat(extendee.scopeStyles);
+ }
+ return def;
+ },
+ applyScopeToContent: function(root, name) {
+ if (root) {
+ // add the name attribute to each node in root.
+ Array.prototype.forEach.call(root.querySelectorAll('*'),
+ function(node) {
+ node.setAttribute(name, '');
+ });
+ // and template contents too
+ Array.prototype.forEach.call(root.querySelectorAll('template'),
+ function(template) {
+ this.applyScopeToContent(template.content, name);
+ },
+ this);
+ }
+ },
+ /*
+ * Process styles to convert native ShadowDOM rules that will trip
+ * up the css parser; we rely on decorating the stylesheet with comments.
+ *
+ * For example, we convert this rule:
+ *
+ * (comment start) @polyfill @host g-menu-item (comment end)
+ * shadow::-webkit-distributed(g-menu-item) {
+ *
+ * to this:
+ *
+ * scopeName g-menu-item {
+ *
+ **/
+ shimPolyfillDirectives: function(styles, name) {
+ if (styles) {
+ Array.prototype.forEach.call(styles, function(s) {
+ s.textContent = this.convertPolyfillDirectives(s.textContent, name);
+ }, this);
+ }
+ },
+ convertPolyfillDirectives: function(cssText, name) {
+ var r = '', l = 0, matches, selector;
+ while (matches = cssPolyfillCommentRe.exec(cssText)) {
+ r += cssText.substring(l, matches.index);
+ // remove end comment delimiter (*/)
+ selector = matches[1].slice(0, -2).replace(hostRe, name);
+ r += this.scopeSelector(selector, name) + '{';
+ l = cssPolyfillCommentRe.lastIndex;
+ }
+ r += cssText.substring(l, cssText.length);
+ return r;
+ },
+ // apply @host and scope shimming
+ applyShimming: function(styles, name) {
+ var cssText = this.shimAtHost(styles, name);
+ cssText += this.shimScoping(styles, name);
+ addCssToDocument(cssText);
+ },
+ // form: @host { .foo { declarations } }
+ // becomes: scopeName.foo { declarations }
+ shimAtHost: function(styles, name) {
+ if (styles) {
+ return this.convertAtHostStyles(styles, name);
+ }
+ },
+ convertAtHostStyles: function(styles, name) {
+ var cssText = stylesToCssText(styles);
+ var r = '', l=0, matches;
+ while (matches = hostRuleRe.exec(cssText)) {
+ r += cssText.substring(l, matches.index);
+ r += this.scopeHostCss(matches[1], name);
+ l = hostRuleRe.lastIndex;
+ }
+ r += cssText.substring(l, cssText.length);
+ var re = new RegExp('^' + name + selectorReSuffix, 'm');
+ var cssText = rulesToCss(this.findAtHostRules(cssToRules(r),
+ re));
+ return cssText;
+ },
+ scopeHostCss: function(cssText, name) {
+ var r = '', matches;
+ while (matches = selectorRe.exec(cssText)) {
+ r += this.scopeHostSelector(matches[1], name) +' ' + matches[2] + '\n\t';
+ }
+ return r;
+ },
+ // supports scopig by name and [is=name] syntax
+ scopeHostSelector: function(selector, name) {
+ var r = [], parts = selector.split(','), is = '[is=' + name + ']';
+ parts.forEach(function(p) {
+ p = p.trim();
+ // selector: *|:scope -> name
+ if (p.match(hostElementRe)) {
+ p = p.replace(hostElementRe, name + '$1$3, ' + is + '$1$3');
+ // selector: .foo -> name.foo, [bar] -> name[bar]
+ } else if (p.match(hostFixableRe)) {
+ p = name + p + ', ' + is + p;
+ }
+ r.push(p);
+ }, this);
+ return r.join(', ');
+ },
+ // consider styles that do not include component name in the selector to be
+ // unscoped and in need of promotion;
+ // for convenience, also consider keyframe rules this way.
+ findAtHostRules: function(cssRules, matcher) {
+ return Array.prototype.filter.call(cssRules,
+ this.isHostRule.bind(this, matcher));
+ },
+ isHostRule: function(matcher, cssRule) {
+ return (cssRule.selectorText && cssRule.selectorText.match(matcher)) ||
+ (cssRule.cssRules && this.findAtHostRules(cssRule.cssRules, matcher).length) ||
+ (cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
+ },
+ /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+ *
+ * .foo {... }
+ *
+ * and converts this to
+ *
+ * scopeName .foo { ... }
+ */
+ shimScoping: function(styles, name) {
+ if (styles) {
+ return this.convertScopedStyles(styles, name);
+ }
+ },
+ convertScopedStyles: function(styles, name) {
+ Array.prototype.forEach.call(styles, function(s) {
+ if (s.parentNode) {
+ s.parentNode.removeChild(s);
+ }
+ });
+ var cssText = stylesToCssText(styles).replace(hostRuleRe, '');
+ cssText = this.convertPseudos(cssText);
+ var rules = cssToRules(cssText);
+ cssText = this.scopeRules(rules, name);
+ return cssText;
+ },
+ convertPseudos: function(cssText) {
+ return cssText.replace(cssPseudoRe, ' [pseudo=$1]');
+ },
+ // change a selector like 'div' to 'name div'
+ scopeRules: function(cssRules, name) {
+ var cssText = '';
+ Array.prototype.forEach.call(cssRules, function(rule) {
+ if (rule.selectorText && (rule.style && rule.style.cssText)) {
+ cssText += this.scopeSelector(rule.selectorText, name,
+ this.strictStyling) + ' {\n\t';
+ cssText += this.propertiesFromRule(rule) + '\n}\n\n';
+ } else if (rule.media) {
+ cssText += '@media ' + rule.media.mediaText + ' {\n';
+ cssText += this.scopeRules(rule.cssRules, name);
+ cssText += '\n}\n\n';
+ } else if (rule.cssText) {
+ cssText += rule.cssText + '\n\n';
+ }
+ }, this);
+ return cssText;
+ },
+ scopeSelector: function(selector, name, strict) {
+ var r = [], parts = selector.split(',');
+ parts.forEach(function(p) {
+ p = p.trim();
+ if (this.selectorNeedsScoping(p, name)) {
+ p = strict ? this.applyStrictSelectorScope(p, name) :
+ this.applySimpleSelectorScope(p, name);
+ }
+ r.push(p);
+ }, this);
+ return r.join(', ');
+ },
+ selectorNeedsScoping: function(selector, name) {
+ var matchScope = '(' + name + '|\\[is=' + name + '\\])';
+ var re = new RegExp('^' + matchScope + selectorReSuffix, 'm');
+ return !selector.match(re);
+ },
+ // scope via name and [is=name]
+ applySimpleSelectorScope: function(selector, name) {
+ return name + ' ' + selector + ', ' + '[is=' + name + '] ' + selector;
+ },
+ // return a selector with [name] suffix on each simple selector
+ // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
+ applyStrictSelectorScope: function(selector, name) {
+ var splits = [' ', '>', '+', '~'],
+ scoped = selector,
+ attrName = '[' + name + ']';
+ splits.forEach(function(sep) {
+ var parts = scoped.split(sep);
+ scoped = parts.map(function(p) {
+ var t = p.trim();
+ if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
+ p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
+ }
+ return p;
+ }).join(sep);
+ });
+ return scoped;
+ },
+ propertiesFromRule: function(rule) {
+ var properties = rule.style.cssText;
+ // TODO(sorvell): Chrome cssom incorrectly removes quotes from the content
+ // property. (https://code.google.com/p/chromium/issues/detail?id=247231)
+ if (rule.style.content && !rule.style.content.match(/['"]+/)) {
+ properties = 'content: \'' + rule.style.content + '\';\n' +
+ rule.style.cssText.replace(/content:[^;]*;/g, '');
+ }
+ return properties;
+ }
+};
+
+var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+ selectorRe = /([^{]*)({[\s\S]*?})/gim,
+ hostElementRe = /(.*)((?:\*)|(?:\:scope))(.*)/,
+ hostFixableRe = /^[.\[:]/,
+ cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+ cssPolyfillCommentRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+ cssPseudoRe = /::(x-[^\s{,(]*)/gim,
+ selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
+ hostRe = /@host/gim;
+
+function stylesToCssText(styles, preserveComments) {
+ var cssText = '';
+ Array.prototype.forEach.call(styles, function(s) {
+ cssText += s.textContent + '\n\n';
+ });
+ // strip comments for easier processing
+ if (!preserveComments) {
+ cssText = cssText.replace(cssCommentRe, '');
+ }
+ return cssText;
+}
+
+function cssToRules(cssText) {
+ var style = document.createElement('style');
+ style.textContent = cssText;
+ document.head.appendChild(style);
+ var rules = style.sheet.cssRules;
+ style.parentNode.removeChild(style);
+ return rules;
+}
+
+function rulesToCss(cssRules) {
+ for (var i=0, css=[]; i < cssRules.length; i++) {
+ css.push(cssRules[i].cssText);
+ }
+ return css.join('\n\n');
+}
+
+function addCssToDocument(cssText) {
+ if (cssText) {
+ getSheet().appendChild(document.createTextNode(cssText));
+ }
+}
+
+var sheet;
+function getSheet() {
+ if (!sheet) {
+ sheet = document.createElement("style");
+ sheet.setAttribute('ShadowCSSShim', '');
+ }
+ return sheet;
+}
+
+// add polyfill stylesheet to document
+if (window.ShadowDOMPolyfill) {
+ addCssToDocument('style { display: none !important; }\n');
+ var head = document.querySelector('head');
+ head.insertBefore(getSheet(), head.childNodes[0]);
+}
+
+// exports
+scope.ShadowCSS = ShadowCSS;
+
+})(window.Platform);
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js b/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js
new file mode 100644
index 0000000..9525570
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js
@@ -0,0 +1,65 @@
+// 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.
+
+(function(scope) {
+ // TODO(terry): Remove shimShadowDOMStyling2 until wrap/unwrap from a
+ // dart:html Element to a JS DOM node is available.
+ /**
+ * Given the content of a STYLE tag and the name of a component shim the CSS
+ * and return the new scoped CSS to replace the STYLE's content. The content
+ * is replaced in Dart's implementation of PolymerElement.
+ */
+ function shimShadowDOMStyling2(styleContent, name) {
+ if (window.ShadowDOMPolyfill) {
+ var content = this.convertPolyfillDirectives(styleContent, name);
+
+ // applyShimming calls shimAtHost and shipScoping
+ // shimAtHost code:
+ var r = '', l=0, matches;
+ while (matches = hostRuleRe.exec(content)) {
+ r += content.substring(l, matches.index);
+ r += this.scopeHostCss(matches[1], name);
+ l = hostRuleRe.lastIndex;
+ }
+ r += content.substring(l, content.length);
+ var re = new RegExp('^' + name + selectorReSuffix, 'm');
+ var atHostCssText = rulesToCss(this.findAtHostRules(cssToRules(r), re));
+
+ // shimScoping code:
+ // strip comments for easier processing
+ content = content.replace(cssCommentRe, '');
+
+ content = this.convertPseudos(content);
+ var rules = cssToRules(content);
+ var cssText = this.scopeRules(rules, name);
+
+ return atHostCssText + cssText;
+ }
+ }
+
+ // Minimal copied code from ShadowCSS, that is not exposed in
+ // PlatForm.ShadowCSS (local code).
+ var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+ cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+ selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
+
+ function cssToRules(cssText) {
+ var style = document.createElement('style');
+ style.textContent = cssText;
+ document.head.appendChild(style);
+ var rules = style.sheet.cssRules;
+ style.parentNode.removeChild(style);
+ return rules;
+ }
+
+ function rulesToCss(cssRules) {
+ for (var i=0, css=[]; i < cssRules.length; i++) {
+ css.push(cssRules[i].cssText);
+ }
+ return css.join('\n\n');
+ }
+
+ // exports
+ scope.ShadowCSS.shimShadowDOMStyling2 = shimShadowDOMStyling2;
+})(window.Platform);
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js
new file mode 100644
index 0000000..fe15015
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function() {
+ // TODO(jmesserly): fix dart:html to use unprefixed name
+ if (Element.prototype.webkitCreateShadowRoot) {
+ Element.prototype.webkitCreateShadowRoot = function() {
+ return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot();
+ };
+ }
+})();
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js
new file mode 100644
index 0000000..cafb597
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function() {
+ var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
+ var wrap = ShadowDOMPolyfill.wrap;
+
+ // patch in prefixed name
+ Object.defineProperties(HTMLElement.prototype, {
+ //TODO(sjmiles): review accessor alias with Arv
+ webkitShadowRoot: {
+ get: function() {
+ return this.shadowRoot;
+ }
+ }
+ });
+
+ //TODO(sjmiles): review method alias with Arv
+ HTMLElement.prototype.webkitCreateShadowRoot =
+ HTMLElement.prototype.createShadowRoot;
+
+ // TODO(jmesserly): we need to wrap document somehow (a dart:html hook?)
+ window.dartExperimentalFixupGetTag = function(originalGetTag) {
+ var NodeList = ShadowDOMPolyfill.wrappers.NodeList;
+ var ShadowRoot = ShadowDOMPolyfill.wrappers.ShadowRoot;
+ var isWrapper = ShadowDOMPolyfill.isWrapper;
+ var unwrap = ShadowDOMPolyfill.unwrap;
+ function getTag(obj) {
+ if (obj instanceof NodeList) return 'NodeList';
+ if (obj instanceof ShadowRoot) return 'ShadowRoot';
+ if (obj instanceof MutationRecord) return 'MutationRecord';
+ if (obj instanceof MutationObserver) return 'MutationObserver';
+
+ if (isWrapper(obj)) {
+ obj = unwrap(obj);
+
+ // Fix up class names for Firefox. For some of them like
+ // HTMLFormElement and HTMLInputElement, the "constructor" property of
+ // the unwrapped nodes points at the wrapper for some reason.
+ // TODO(jmesserly): figure out why this is happening.
+ var ctor = obj.constructor;
+ if (ctor && ctor._ShadowDOMPolyfill$isGeneratedWrapper) {
+ var name = ctor._ShadowDOMPolyfill$cacheTag_;
+ if (!name) {
+ name = Object.prototype.toString.call(obj);
+ name = name.substring(8, name.length - 1);
+ ctor._ShadowDOMPolyfill$cacheTag_ = name;
+ }
+ return name;
+ }
+ }
+ return originalGetTag(obj);
+ }
+
+ return getTag;
+ };
+})();
diff --git a/pkg/shadow_dom/lib/src/platform/platform-init.js b/pkg/shadow_dom/lib/src/platform/platform-init.js
new file mode 100644
index 0000000..4e83afc
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/platform-init.js
@@ -0,0 +1,5 @@
+// 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.
+
+var Platform = {};
diff --git a/pkg/shadow_dom/test/runner.html b/pkg/shadow_dom/test/runner.html
new file mode 100644
index 0000000..83dd0ee
--- /dev/null
+++ b/pkg/shadow_dom/test/runner.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is governed by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<link rel="stylesheet" href="../tool/node_modules/mocha/mocha.css">
+<script src="../tool/node_modules/chai/chai.js"></script>
+<script src="../tool/node_modules/mocha/mocha.js"></script>
+<script src="../tools/test/mocha-htmltest.js"></script>
+<script src="../tool/shadowdom.js"></script>
+<script src="../../../third_party/polymer/ShadowDOM/test/test.main.js"></script>
+<div id="mocha"></div>
+<script>
+mocha.run();
+</script>
diff --git a/pkg/shadow_dom/test/runner.min.html b/pkg/shadow_dom/test/runner.min.html
new file mode 100644
index 0000000..6c45525
--- /dev/null
+++ b/pkg/shadow_dom/test/runner.min.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is governed by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<link rel="stylesheet" href="../tool/node_modules/mocha/mocha.css">
+<script src="../tool/node_modules/chai/chai.js"></script>
+<script src="../tool/node_modules/mocha/mocha.js"></script>
+<script src="../tools/test/mocha-htmltest.js"></script>
+<script src="../tool/shadowdom.min.js"></script>
+<script src="../../../third_party/polymer/ShadowDOM/test/test.main.js"></script>
+<div id="mocha"></div>
+<script>
+mocha.run();
+</script>
+
diff --git a/pkg/shadow_dom/tool/build/else.js b/pkg/shadow_dom/tool/build/else.js
new file mode 100644
index 0000000..dacd762
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/else.js
@@ -0,0 +1 @@
+} else {
\ No newline at end of file
diff --git a/pkg/shadow_dom/tool/build/end-if.js b/pkg/shadow_dom/tool/build/end-if.js
new file mode 100644
index 0000000..ff30235
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/end-if.js
@@ -0,0 +1 @@
+}
\ No newline at end of file
diff --git a/pkg/shadow_dom/tool/build/if-poly.js b/pkg/shadow_dom/tool/build/if-poly.js
new file mode 100644
index 0000000..7503d65
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/if-poly.js
@@ -0,0 +1,3 @@
+if ((!HTMLElement.prototype.createShadowRoot &&
+ !HTMLElement.prototype.webkitCreateShadowRoot) ||
+ window.__forceShadowDomPolyfill) {
diff --git a/pkg/shadow_dom/tool/conf/karma.conf.js b/pkg/shadow_dom/tool/conf/karma.conf.js
new file mode 100644
index 0000000..382e2c7
--- /dev/null
+++ b/pkg/shadow_dom/tool/conf/karma.conf.js
@@ -0,0 +1,89 @@
+// Sample Karma configuration file, that contain pretty much all the available options
+// It's used for running client tests on Travis (http://travis-ci.org/#!/karma-runner/karma)
+// Most of the options can be overriden by cli arguments (see karma --help)
+//
+// For all available config options and default values, see:
+// https://github.com/karma-runner/karma/blob/stable/lib/config.js#L54
+
+
+// base path, that will be used to resolve files and exclude
+basePath = '../';
+
+// list of files / patterns to load in the browser
+files = [
+ 'tools/test/mocha-htmltest.js',
+ 'conf/mocha.conf.js',
+ 'node_modules/chai/chai.js',
+ 'shadowdom.js',
+ 'test/test.main.js',
+ {pattern: 'src/**/*.js', included: false},
+ {pattern: 'test/**/*.js', included: false},
+ {pattern: 'test/**/*.html', included: false},
+ {pattern: 'tools/**/*.js', included: false}
+];
+
+// list of files to exclude
+exclude = [];
+
+frameworks = ['mocha'];
+
+// use dots reporter, as travis terminal does not support escaping sequences
+// possible values: 'dots', 'progress', 'junit', 'teamcity'
+// CLI --reporters progress
+reporters = ['progress'];
+
+// web server port
+// CLI --port 9876
+port = 9876;
+
+// cli runner port
+// CLI --runner-port 9100
+runnerPort = 9100;
+
+// enable / disable colors in the output (reporters and logs)
+// CLI --colors --no-colors
+colors = true;
+
+// level of logging
+// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
+// CLI --log-level debug
+logLevel = LOG_INFO;
+
+// enable / disable watching file and executing tests whenever any file changes
+// CLI --auto-watch --no-auto-watch
+autoWatch = true;
+
+// Start these browsers, currently available:
+// - Chrome
+// - ChromeCanary
+// - Firefox
+// - Opera
+// - Safari (only Mac)
+// - PhantomJS
+// - IE (only Windows)
+// CLI --browsers Chrome,Firefox,Safari
+browsers = ['ChromeCanary'];
+
+// If browser does not capture in given timeout [ms], kill it
+// CLI --capture-timeout 5000
+captureTimeout = 50000;
+
+// Auto run tests on start (when browsers are captured) and exit
+// CLI --single-run --no-single-run
+singleRun = true;
+
+// report which specs are slower than 500ms
+// CLI --report-slower-than 500
+reportSlowerThan = 500;
+
+// compile coffee scripts
+preprocessors = {
+};
+
+plugins = [
+ 'karma-mocha',
+ 'karma-chrome-launcher',
+ 'karma-firefox-launcher',
+ 'karma-script-launcher',
+ 'karma-crbot-reporter'
+]
diff --git a/pkg/shadow_dom/tool/conf/mocha.conf.js b/pkg/shadow_dom/tool/conf/mocha.conf.js
new file mode 100644
index 0000000..11dd0d6
--- /dev/null
+++ b/pkg/shadow_dom/tool/conf/mocha.conf.js
@@ -0,0 +1 @@
+mocha.setup({ui:'tdd',htmlbase: '/base/test/'});
diff --git a/pkg/shadow_dom/tool/gruntfile.js b/pkg/shadow_dom/tool/gruntfile.js
new file mode 100644
index 0000000..f245d73
--- /dev/null
+++ b/pkg/shadow_dom/tool/gruntfile.js
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+module.exports = function(grunt) {
+ ShadowDOMPolyfill = [
+ 'sidetable.js',
+ 'wrappers.js',
+ 'wrappers/events.js',
+ 'wrappers/NodeList.js',
+ 'wrappers/Node.js',
+ 'querySelector.js',
+ 'wrappers/node-interfaces.js',
+ 'wrappers/CharacterData.js',
+ 'wrappers/Element.js',
+ 'wrappers/HTMLElement.js',
+ 'wrappers/HTMLContentElement.js',
+ 'wrappers/HTMLShadowElement.js',
+ 'wrappers/HTMLTemplateElement.js',
+ 'wrappers/HTMLUnknownElement.js',
+ 'wrappers/generic.js',
+ 'wrappers/ShadowRoot.js',
+ 'ShadowRenderer.js',
+ 'wrappers/Document.js',
+ 'wrappers/Window.js',
+ 'wrappers/MutationObserver.js',
+ 'wrappers/override-constructors.js'
+ ];
+ ShadowDOMPolyfill = ShadowDOMPolyfill.map(function(p) {
+ return '../../../third_party/polymer/ShadowDOM/src/' + p;
+ });
+
+ // Apply partial patch from Polymer/Platform, dart2js, CSS
+ // polyfill from platform and dart2js CSS patches:
+ ShadowDOMPolyfill.unshift(
+ '../lib/src/platform/patches-shadowdom-polyfill-before.js'
+ );
+ ShadowDOMPolyfill.push(
+ '../lib/src/platform/patches-shadowdom-polyfill.js',
+ '../lib/src/platform/platform-init.js',
+ '../lib/src/platform/ShadowCSS.js',
+ '../lib/src/platform/patches-shadow-css.js'
+ );
+
+ // Only load polyfill if not natively present.
+ ConditionalShadowDOM = [].concat(
+ 'build/if-poly.js',
+ ShadowDOMPolyfill,
+ 'build/end-if.js'
+ );
+
+ // karma setup
+ var browsers;
+ (function() {
+ try {
+ var config = grunt.file.readJSON('local.json');
+ if (config.browsers) {
+ browsers = config.browsers;
+ }
+ } catch (e) {
+ var os = require('os');
+ browsers = ['Chrome', 'Firefox'];
+ if (os.type() === 'Darwin') {
+ browsers.push('ChromeCanary');
+ }
+ if (os.type() === 'Windows_NT') {
+ browsers.push('IE');
+ }
+ }
+ })();
+ grunt.initConfig({
+ karma: {
+ options: {
+ configFile: 'conf/karma.conf.js',
+ keepalive: true,
+ browsers: browsers
+ },
+ buildbot: {
+ browsers: browsers,
+ reporters: ['crbot'],
+ logLevel: 'OFF'
+ },
+ ShadowDOM: {
+ browsers: browsers
+ }
+ },
+ concat: {
+ ShadowDOM: {
+ src: ConditionalShadowDOM,
+ dest: '../lib/shadow_dom.debug.js',
+ nonull: true
+ }
+ },
+ uglify: {
+ ShadowDOM: {
+ options: {
+ compress: {
+ // TODO(sjmiles): should be false by default (?)
+ // https://github.com/mishoo/UglifyJS2/issues/165
+ unsafe: false
+ }
+ //compress: true, Xmangle: true, beautify: true, unsafe: false
+ },
+ files: {
+ '../lib/shadow_dom.min.js': ['../lib/shadow_dom.debug.js']
+ }
+ }
+ },
+
+ yuidoc: {
+ compile: {
+ name: '<%= pkg.name %>',
+ description: '<%= pkg.description %>',
+ version: '<%= pkg.version %>',
+ url: '<%= pkg.homepage %>',
+ options: {
+ exclude: 'third_party',
+ paths: '.',
+ outdir: 'docs',
+ linkNatives: 'true',
+ tabtospace: 2,
+ themedir: '../docs/doc_themes/simple'
+ }
+ }
+ },
+ pkg: grunt.file.readJSON('package.json')
+ });
+
+ // plugins
+ grunt.loadNpmTasks('grunt-contrib-concat');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+ grunt.loadNpmTasks('grunt-contrib-yuidoc');
+ grunt.loadNpmTasks('grunt-karma-0.9.1');
+
+ // tasks
+ grunt.registerTask('default', ['concat', 'uglify']);
+ grunt.registerTask('minify', ['concat', 'uglify']);
+ grunt.registerTask('docs', ['yuidoc']);
+ grunt.registerTask('test', ['karma:ShadowDOM']);
+ grunt.registerTask('test-buildbot', ['karma:buildbot']);
+};
+
diff --git a/pkg/shadow_dom/tool/package.json b/pkg/shadow_dom/tool/package.json
new file mode 100644
index 0000000..766ca28
--- /dev/null
+++ b/pkg/shadow_dom/tool/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "ShadowDOM",
+ "version": "0.0.1",
+ "devDependencies": {
+ "mocha": ">=1.9",
+ "chai": "*",
+ "grunt": "*",
+ "grunt-contrib-concat": "*",
+ "grunt-contrib-uglify": "*",
+ "grunt-contrib-yuidoc": "~0.4.0",
+ "grunt-karma-0.9.1": "~0.4.3",
+ "karma-mocha": "*",
+ "karma-script-launcher": "*",
+ "karma-crbot-reporter": "*"
+ }
+}
diff --git a/pkg/shadow_dom/tool/play.html b/pkg/shadow_dom/tool/play.html
new file mode 100644
index 0000000..f17b471
--- /dev/null
+++ b/pkg/shadow_dom/tool/play.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is goverened by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<script src="shadowdom.js"></script>
+<style>
+
+.el,
+.sr {
+ height: 300px;
+ width: 300px;
+}
+
+</style>
+<textarea class="el" placeholder="Element host"></textarea>
+<textarea class="sr" placeholder="Shadow Root"></textarea>
+<button onclick="update()">Update</button>
+
+<div class="test">Real</div>
+
+<script>
+
+var el = document.querySelector('.test');
+var sr = el.createShadowRoot();
+
+sr.innerHTML = 'Before <content></content> After';
+
+function update() {
+ el.innerHTML = document.querySelector('.el').value;
+ sr.innerHTML = document.querySelector('.sr').value;
+}
+
+document.querySelector('.el').value = el.innerHTML;
+document.querySelector('.sr').value = sr.innerHTML;
+
+</script>
diff --git a/pkg/shadow_dom/tool/readme.txt b/pkg/shadow_dom/tool/readme.txt
new file mode 100644
index 0000000..829c697
--- /dev/null
+++ b/pkg/shadow_dom/tool/readme.txt
@@ -0,0 +1,18 @@
+How to build shadow_dom package:
+
+- Install nodejs and npm
+ sudo apt-get install nodejs
+ sudo apt-get install npm
+- Install grunt http://gruntjs.com/getting-started
+
+- Change to the shadow_dom tool directory
+ cd pkg/shadow_dom/tool
+
+- Install project dependencies
+ npm install
+
+- Run grunt to generate the shadow_dom packages in pkg/shadow_dom/lib
+ grunt
+
+
+
diff --git a/pkg/shadow_dom/tool/shadowdom.js b/pkg/shadow_dom/tool/shadowdom.js
new file mode 100644
index 0000000..91f5819
--- /dev/null
+++ b/pkg/shadow_dom/tool/shadowdom.js
@@ -0,0 +1,44 @@
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function() {
+ var thisFile = 'shadowdom.js';
+ var base = '';
+ Array.prototype.forEach.call(document.querySelectorAll('script[src]'), function(s) {
+ var src = s.getAttribute('src');
+ var re = new RegExp(thisFile + '[^\\\\]*');
+ var match = src.match(re);
+ if (match) {
+ base = src.slice(0, -match[0].length);
+ }
+ });
+ base += '../../../third_party/polymer/ShadowDOM/src/';
+
+ [
+ 'sidetable.js',
+ 'wrappers.js',
+ 'wrappers/events.js',
+ 'wrappers/NodeList.js',
+ 'wrappers/Node.js',
+ 'querySelector.js',
+ 'wrappers/node-interfaces.js',
+ 'wrappers/CharacterData.js',
+ 'wrappers/Element.js',
+ 'wrappers/HTMLElement.js',
+ 'wrappers/HTMLContentElement.js',
+ 'wrappers/HTMLShadowElement.js',
+ 'wrappers/HTMLTemplateElement.js',
+ 'wrappers/HTMLUnknownElement.js',
+ 'wrappers/generic.js',
+ 'wrappers/ShadowRoot.js',
+ 'ShadowRenderer.js',
+ 'wrappers/Document.js',
+ 'wrappers/Window.js',
+ 'wrappers/MutationObserver.js',
+ 'wrappers/override-constructors.js'
+ ].forEach(function(src) {
+ document.write('<script src="' + base + src + '"></script>');
+ });
+
+})();
diff --git a/pkg/unittest/lib/html_config.dart b/pkg/unittest/lib/html_config.dart
index 86123cf..2dde44b 100644
--- a/pkg/unittest/lib/html_config.dart
+++ b/pkg/unittest/lib/html_config.dart
@@ -95,7 +95,7 @@
.replaceAll('>','>');
}
-class HtmlConfiguration extends Configuration {
+class HtmlConfiguration extends SimpleConfiguration {
/** Whether this is run within dartium layout tests. */
final bool _isLayoutTest;
HtmlConfiguration(this._isLayoutTest);
diff --git a/pkg/unittest/lib/html_enhanced_config.dart b/pkg/unittest/lib/html_enhanced_config.dart
index 5cc5fe5..723fc0c 100644
--- a/pkg/unittest/lib/html_enhanced_config.dart
+++ b/pkg/unittest/lib/html_enhanced_config.dart
@@ -15,7 +15,7 @@
import 'dart:html';
import 'unittest.dart';
-class HtmlEnhancedConfiguration extends Configuration {
+class HtmlEnhancedConfiguration extends SimpleConfiguration {
/** Whether this is run within dartium layout tests. */
final bool _isLayoutTest;
HtmlEnhancedConfiguration(this._isLayoutTest);
diff --git a/pkg/unittest/lib/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
index 106b071..27791ee 100644
--- a/pkg/unittest/lib/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -64,7 +64,7 @@
}
-class HtmlConfiguration extends Configuration {
+class HtmlConfiguration extends SimpleConfiguration {
StreamSubscription _errorSubscription;
void _installErrorHandler() {
diff --git a/pkg/unittest/lib/src/configuration.dart b/pkg/unittest/lib/src/configuration.dart
new file mode 100644
index 0000000..4571b90
--- /dev/null
+++ b/pkg/unittest/lib/src/configuration.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2011, 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.
+
+part of unittest;
+
+/**
+ * Describes the interface used by the unit test system for communicating the
+ * results of a test run.
+ */
+abstract class Configuration {
+
+ /**
+ * Creates an instance of [SimpleConfiguration].
+ */
+ factory Configuration() => new SimpleConfiguration();
+
+ /**
+ * If [true], tests are started automatically. Otherwise [runTests]
+ * must be called explicitly after tests are set up.
+ */
+ bool get autoStart;
+
+ /**
+ * Called as soon as the unittest framework becomes initialized. This is done
+ * even before tests are added to the test framework. It might be used to
+ * determine/debug errors that occur before the test harness starts executing.
+ * It is also used to tell the vm or browser that tests are going to be run
+ * asynchronously and that the process should wait until they are done.
+ */
+ void onInit();
+
+ /** Called as soon as the unittest framework starts running. */
+ void onStart() {}
+
+ /**
+ * Called when each test starts. Useful to show intermediate progress on
+ * a test suite.
+ */
+ void onTestStart(TestCase testCase);
+
+ /**
+ * Called when each test is first completed. Useful to show intermediate
+ * progress on a test suite.
+ */
+ void onTestResult(TestCase testCase);
+
+ /**
+ * Called when an already completed test changes state. For example: a test
+ * that was marked as passing may later be marked as being in error because
+ * it still had callbacks being invoked.
+ */
+ void onTestResultChanged(TestCase testCase);
+
+ /**
+ * Handles the logging of messages by a test case.
+ */
+ void onLogMessage(TestCase testCase, String message);
+
+ /**
+ * Called when the unittest framework is done running. [success] indicates
+ * whether all tests passed successfully.
+ */
+ void onDone(bool success);
+
+ /**
+ * Called with the result of all test cases. Browser tests commonly override
+ * this to reformat the output.
+ *
+ * When [uncaughtError] is not null, it contains an error that occured outside
+ * of tests (e.g. setting up the test).
+ */
+ void onSummary(int passed, int failed, int errors, List<TestCase> results,
+ String uncaughtError);
+}
+
diff --git a/pkg/unittest/lib/src/expect.dart b/pkg/unittest/lib/src/expect.dart
index 0df9068..76151c0 100644
--- a/pkg/unittest/lib/src/expect.dart
+++ b/pkg/unittest/lib/src/expect.dart
@@ -5,15 +5,12 @@
part of matcher;
/** The objects thrown by the default failure handler. */
-class TestFailure {
- String _message;
+class TestFailure extends Error {
+ final String message;
- get message => _message;
- set message(String value) => _message = value;
+ TestFailure(this.message);
- TestFailure(String message) : _message = message;
-
- String toString() => _message;
+ String toString() => message;
}
/**
@@ -30,7 +27,7 @@
/**
* Some matchers, like those for Futures and exception testing,
* can fail in asynchronous sections, and throw exceptions.
- * A user of this library will typically want to catch and handle
+ * A user of this library will typically want to catch and handle
* such exceptions. The [wrapAsync] property is a function that
* can wrap callbacks used by these Matchers so that they can be
* used safely. For example, the unittest library will set this
diff --git a/pkg/unittest/lib/src/config.dart b/pkg/unittest/lib/src/simple_configuration.dart
similarity index 79%
rename from pkg/unittest/lib/src/config.dart
rename to pkg/unittest/lib/src/simple_configuration.dart
index d79306f..b9d3a02 100644
--- a/pkg/unittest/lib/src/config.dart
+++ b/pkg/unittest/lib/src/simple_configuration.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
+// 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.
@@ -7,9 +7,9 @@
// A custom failure handler for [expect] that routes expect failures
// to the config.
class _ExpectFailureHandler extends DefaultFailureHandler {
- Configuration _config;
+ final SimpleConfiguration _config;
- _ExpectFailureHandler(this._config) : super();
+ _ExpectFailureHandler(this._config);
void fail(String reason) {
_config.onExpectFailure(reason);
@@ -22,8 +22,7 @@
* advantage of the platform can create a subclass and override methods from
* this class.
*/
-
-class Configuration {
+class SimpleConfiguration implements Configuration {
// The VM won't shut down if a receive port is open. Use this to make sure
// we correctly wait for asynchronous tests.
ReceivePort _receivePort;
@@ -35,11 +34,7 @@
*/
final String name = 'Configuration';
- /**
- * If true, then tests are started automatically (otherwise [runTests]
- * must be called explicitly after the tests are set up.
- */
- final bool autoStart = true;
+ bool get autoStart => true;
/**
* If true (the default), throw an exception at the end if any tests failed.
@@ -61,22 +56,15 @@
* The constructor sets up a failure handler for [expect] that redirects
* [expect] failures to [onExpectFailure].
*/
- Configuration() {
+ SimpleConfiguration() {
configureExpectFailureHandler(new _ExpectFailureHandler(this));
}
- /**
- * Called as soon as the unittest framework becomes initialized. This is done
- * even before tests are added to the test framework. It might be used to
- * determine/debug errors that occur before the test harness starts executing.
- * It is also used to tell the vm or browser that tests are going to be run
- * asynchronously and that the process should wait until they are done.
- */
+
void onInit() {
_receivePort = new ReceivePort();
_postMessage('unittest-suite-wait-for-done');
}
- /** Called as soon as the unittest framework starts running. */
void onStart() {}
/**
@@ -91,7 +79,7 @@
/**
* Called when each test is first completed. Useful to show intermediate
- * progress on a test suite. Derived classes should call this first
+ * progress on a test suite. Derived classes should call this first
* before their own override code.
*/
void onTestResult(TestCase testCase) {
@@ -112,25 +100,20 @@
if (testCase.result == PASS) {
testCase._result = FAIL;
testCase._message = reason.toString();
- // Use the last stack as the overall failure stack.
+ // Use the last stack as the overall failure stack.
testCase._stackTrace = lastReasonAndTrace.last;
} else {
// Add the last stack to the message; we have a further stack
// caused by some other failure.
reason.write(lastReasonAndTrace.last);
reason.write('\n');
- // Add the existing reason to the end of the expect log to
+ // Add the existing reason to the end of the expect log to
// create the final message.
testCase._message = '${reason.toString()}\n${testCase._message}';
}
}
}
- /**
- * Called when an already completed test changes state; for example a test
- * that was marked as passing may later be marked as being in error because
- * it still had callbacks being invoked.
- */
void onTestResultChanged(TestCase testCase) {
assert(testCase != null);
}
@@ -159,7 +142,7 @@
}
}
}
-
+
/**
* Format a test result.
*/
@@ -213,10 +196,6 @@
}
}
- /**
- * Called when the unittest framework is done running. [success] indicates
- * whether all tests passed successfully.
- */
void onDone(bool success) {
if (success) {
_postMessage('unittest-suite-success');
@@ -229,13 +208,7 @@
}
}
- /** Handle errors that happen outside the tests. */
- // TODO(vsm): figure out how to expose the stack trace here
- // Currently e.message works in dartium, but not in dartc.
- void handleExternalError(e, String message, [stack]) =>
- _reportTestError('$message\nCaught $e', stack);
-
- _postMessage(String message) {
+ void _postMessage(String message) {
// In dart2js browser tests, the JavaScript-based test controller
// intercepts calls to print and listens for "secret" messages.
print(message);
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index 43365f4..eb186bd 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -146,13 +146,15 @@
import 'dart:async';
import 'dart:collection';
import 'dart:isolate';
+import 'package:stack_trace/stack_trace.dart';
+
import 'matcher.dart';
export 'matcher.dart';
-import 'package:stack_trace/stack_trace.dart';
-
import 'src/utils.dart';
-part 'src/config.dart';
+
+part 'src/configuration.dart';
+part 'src/simple_configuration.dart';
part 'src/test_case.dart';
Configuration _config;
@@ -656,16 +658,16 @@
_runTest();
}
-/**
- * Utility function that can be used to notify the test framework that an
- * error was caught outside of this library.
- */
-void _reportTestError(String msg, trace) {
- if (_currentTestCaseIndex < testCases.length) {
- final testCase = testCases[_currentTestCaseIndex];
- testCase.error(msg, trace);
+/** Handle errors that happen outside the tests. */
+// TODO(vsm): figure out how to expose the stack trace here
+// Currently e.message works in dartium, but not in dartc.
+void handleExternalError(e, String message, [stack]) {
+ var msg = '$message\nCaught $e';
+
+ if (currentTestCase != null) {
+ currentTestCase.error(msg, stack);
} else {
- _uncaughtErrorMessage = "$msg: $trace";
+ _uncaughtErrorMessage = "$msg: $stack";
}
}
diff --git a/pkg/unittest/lib/vm_config.dart b/pkg/unittest/lib/vm_config.dart
index 7ff2154..0133186 100644
--- a/pkg/unittest/lib/vm_config.dart
+++ b/pkg/unittest/lib/vm_config.dart
@@ -11,7 +11,7 @@
import 'dart:io';
import 'unittest.dart';
-class VMConfiguration extends Configuration {
+class VMConfiguration extends SimpleConfiguration {
// Color constants used for generating messages.
final String GREEN_COLOR = '\u001b[32m';
final String RED_COLOR = '\u001b[31m';
diff --git a/pkg/unittest/test/unittest_test_utils.dart b/pkg/unittest/test/unittest_test_utils.dart
index 7b171f1..03fc8d6 100644
--- a/pkg/unittest/test/unittest_test_utils.dart
+++ b/pkg/unittest/test/unittest_test_utils.dart
@@ -33,7 +33,7 @@
'$setup:$teardown:$uncaughtError$testDetails';
}
-class TestConfiguration extends Configuration {
+class TestConfiguration extends SimpleConfiguration {
// Some test state that is captured.
int count = 0; // A count of callbacks.
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 700eed7..2cc50c3 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -77,6 +77,7 @@
// Are we running on Windows?
var _isWindows = false;
+var _workingWindowsDrivePrefix;
// The current working directory
var _workingDirectoryUri;
// The URI that the entry point script was loaded from. Remembered so that
@@ -115,6 +116,7 @@
return fixedPath;
}
+
_enforceTrailingSlash(uri) {
// Ensure we have a trailing slash character.
if (!uri.endsWith('/')) {
@@ -124,7 +126,19 @@
}
+_extractDriveLetterPrefix(cwd) {
+ if (!_isWindows) {
+ return null;
+ }
+ if (cwd.length > 1 && cwd[1] == ':') {
+ return '/${cwd[0]}:';
+ }
+ return null;
+}
+
+
void _setWorkingDirectory(cwd) {
+ _workingWindowsDrivePrefix = _extractDriveLetterPrefix(cwd);
cwd = _sanitizeWindowsPath(cwd);
cwd = _enforceTrailingSlash(cwd);
_workingDirectoryUri = new Uri(scheme: 'file', path: cwd);
@@ -227,8 +241,20 @@
throw "URIs using the 'file:' scheme may not contain a host.";
}
- _logResolution('# Path: $uri -> ${uri.path}');
- return uri.path;
+ String path = uri.path;
+ _logResolution('# Path: $uri -> ${path}');
+ // Check that the path is not already in the form of /X:.
+ if (_isWindows && (path.length > 2) && path.startsWith('/') &&
+ (path[2] != ':')) {
+ // Absolute path on Windows without a drive letter.
+ if (_workingWindowsDrivePrefix == null) {
+ throw 'Could not determine windows drive letter prefix.';
+ }
+ _logResolution('# Path: Windows absolute path needs a drive letter.'
+ ' Prepending $_workingWindowsDrivePrefix.');
+ path = '$_workingWindowsDrivePrefix$path';
+ }
+ return path;
}
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index a5c7170..ff790d6 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -51,12 +51,7 @@
V(SecureSocket_RegisterBadCertificateCallback, 2) \
V(SecureSocket_RegisterHandshakeCompleteCallback, 2) \
V(SecureSocket_Renegotiate, 4) \
- V(SecureSocket_InitializeLibrary, 4) \
- V(SecureSocket_AddCertificate, 2) \
- V(SecureSocket_ChangeTrust, 2) \
- V(SecureSocket_ImportCertificatesWithPrivateKeys, 2) \
- V(SecureSocket_GetCertificate, 1) \
- V(SecureSocket_RemoveCertificate, 1) \
+ V(SecureSocket_InitializeLibrary, 3) \
V(SecureSocket_NewServicePort, 0) \
V(SecureSocket_FilterPointer, 1) \
V(ServerSocket_CreateBindListen, 5) \
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index dbc685a..e1c64e1 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -17,7 +17,6 @@
'variables': {
# Added by Dart.
'nss_directory': '../../../third_party/nss',
- 'pkcs12_directory': '../../../third_party/nss_pkcs12',
'conditions': [
['OS=="ios"', {
'exclude_nss_root_certs%': 0,
@@ -1069,19 +1068,6 @@
'<(nss_directory)/nss/lib/util/utilpars.h',
'<(nss_directory)/nss/lib/util/utilparst.h',
'<(nss_directory)/nss/lib/util/utilrename.h',
- '<(pkcs12_directory)/p12creat.c',
- '<(pkcs12_directory)/p12d.c',
- '<(pkcs12_directory)/p12dec.c',
- '<(pkcs12_directory)/p12e.c',
- '<(pkcs12_directory)/p12.h',
- '<(pkcs12_directory)/p12local.c',
- '<(pkcs12_directory)/p12local.h',
- '<(pkcs12_directory)/p12plcy.c',
- '<(pkcs12_directory)/p12plcy.h',
- '<(pkcs12_directory)/p12t.h',
- '<(pkcs12_directory)/p12tmpl.c',
- '<(pkcs12_directory)/pkcs12.h',
- '<(pkcs12_directory)/pkcs12t.h',
],
'sources!': [
# mpi_arm.c is included by mpi_arm_mac.c.
@@ -1147,7 +1133,6 @@
'<(nss_directory)/nss/lib/softoken',
'<(nss_directory)/nss/lib/ssl',
'<(nss_directory)/nss/lib/util',
- '<(pkcs12_directory)',
],
'direct_dependent_settings': {
'defines': [
@@ -1174,7 +1159,6 @@
'<(nss_directory)/nss/lib/smime',
'<(nss_directory)/nss/lib/softoken',
'<(nss_directory)/nss/lib/util',
- '<(pkcs12_directory)',
],
},
'msvs_disabled_warnings': [4018, 4101, 4267, ],
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 2bfa94f..5038266 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -10,12 +10,9 @@
#include <stdio.h>
#include <string.h>
-#include <certdb.h>
#include <key.h>
#include <keyt.h>
#include <nss.h>
-#include <p12.h>
-#include <p12plcy.h>
#include <pk11pub.h>
#include <prerror.h>
#include <prinit.h>
@@ -40,10 +37,10 @@
bool SSLFilter::library_initialized_ = false;
// To protect library initialization.
-dart::Mutex* SSLFilter::mutex = new dart::Mutex();
+dart::Mutex* SSLFilter::mutex_ = new dart::Mutex();
// The password is needed when creating secure server sockets. It can
// be null if only secure client sockets are used.
-char* SSLFilter::password_ = NULL;
+const char* SSLFilter::password_ = NULL;
// Forward declaration.
static void ProcessFilter(Dart_Port dest_port_id,
@@ -232,7 +229,7 @@
&certificate_database));
} else if (!Dart_IsNull(certificate_database_object)) {
Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.initialize: database argument is not a String or null"));
+ "Non-String certificate directory argument to SetCertificateDatabase"));
}
// Leave certificate_database as NULL if no value was provided.
@@ -247,7 +244,7 @@
password = "";
} else {
Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.initialize: password argument is not a String or null"));
+ "Password argument to SetCertificateDatabase is not a String or null"));
}
Dart_Handle builtin_roots_object =
@@ -258,322 +255,10 @@
ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots));
} else {
Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.initialize: useBuiltinRoots argument is not a bool"));
+ "UseBuiltinRoots argument to SetCertificateDatabase is not a bool"));
}
- Dart_Handle read_only_object =
- ThrowIfError(Dart_GetNativeArgument(args, 3));
- // Check that the type is boolean, and get the boolean value from it.
- bool read_only = true;
- if (Dart_IsBoolean(read_only_object)) {
- ThrowIfError(Dart_BooleanValue(read_only_object, &read_only));
- } else {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.initialize: readOnly argument is not a bool"));
- }
-
- SSLFilter::InitializeLibrary(
- certificate_database, password, builtin_roots, read_only);
-}
-
-
-static Dart_Handle X509FromCertificate(CERTCertificate* certificate) {
- PRTime start_validity;
- PRTime end_validity;
- SECStatus status =
- CERT_GetCertTimes(certificate, &start_validity, &end_validity);
- if (status != SECSuccess) {
- ThrowPRException("CertificateException",
- "Cannot get validity times from certificate");
- }
- int64_t start_epoch_ms = start_validity / PR_USEC_PER_MSEC;
- int64_t end_epoch_ms = end_validity / PR_USEC_PER_MSEC;
- Dart_Handle subject_name_object =
- DartUtils::NewString(certificate->subjectName);
- Dart_Handle issuer_name_object =
- DartUtils::NewString(certificate->issuerName);
- Dart_Handle start_epoch_ms_int = Dart_NewInteger(start_epoch_ms);
- Dart_Handle end_epoch_ms_int = Dart_NewInteger(end_epoch_ms);
-
- Dart_Handle date_type =
- DartUtils::GetDartType(DartUtils::kCoreLibURL, "DateTime");
- Dart_Handle from_milliseconds =
- DartUtils::NewString("fromMillisecondsSinceEpoch");
-
- Dart_Handle start_validity_date =
- Dart_New(date_type, from_milliseconds, 1, &start_epoch_ms_int);
- Dart_Handle end_validity_date =
- Dart_New(date_type, from_milliseconds, 1, &end_epoch_ms_int);
-
- Dart_Handle x509_type =
- DartUtils::GetDartType(DartUtils::kIOLibURL, "X509Certificate");
- Dart_Handle arguments[] = { subject_name_object,
- issuer_name_object,
- start_validity_date,
- end_validity_date };
- return Dart_New(x509_type, Dart_Null(), 4, arguments);
-}
-
-
-char* PasswordCallback(PK11SlotInfo* slot, PRBool retry, void* arg) {
- if (!retry) {
- return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals.
- }
- return NULL;
-}
-
-
-void FUNCTION_NAME(SecureSocket_AddCertificate)
- (Dart_NativeArguments args) {
- Dart_Handle certificate_object =
- ThrowIfError(Dart_GetNativeArgument(args, 0));
- Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
-
- if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "Bad argument to SecureSocket.addCertificate"));
- }
-
- intptr_t length;
- ThrowIfError(Dart_ListLength(certificate_object, &length));
- uint8_t* certificate = reinterpret_cast<uint8_t*>(malloc(length + 1));
- if (certificate == NULL) {
- FATAL("Out of memory in SecureSocket.addCertificate");
- }
- ThrowIfError(Dart_ListGetAsBytes(
- certificate_object, 0, certificate, length));
-
- const char* trust_string;
- ThrowIfError(Dart_StringToCString(trust_object,
- &trust_string));
-
- PK11SlotInfo* slot = PK11_GetInternalKeySlot();
- SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
- PK11_FreeSlot(slot);
- if (status == SECFailure) {
- ThrowPRException("CertificateException",
- "Could not authenticate to certificate database");
- }
-
- CERTCertificate* cert = CERT_DecodeCertFromPackage(
- reinterpret_cast<char*>(certificate), length);
- if (cert == NULL) {
- ThrowPRException("CertificateException", "Certificate cannot be decoded");
- }
- CERTCertTrust trust;
- status = CERT_DecodeTrustString(&trust, trust_string);
- if (status != SECSuccess) {
- ThrowPRException("CertificateException", "Trust string cannot be decoded");
- }
- {
- MutexLocker locker(SSLFilter::mutex);
- status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust);
- }
- if (status != SECSuccess) {
- ThrowPRException("CertificateException", "Cannot set trust attributes");
- }
-
- Dart_SetReturnValue(args, X509FromCertificate(cert));
- return;
-}
-
-
-/*
- * Called by the PKCS#12 decoder if a certificate's nickname collides with
- * the nickname of a different existing certificate in the database.
- */
-SECItem* nickname_callback(SECItem *old_nickname,
- PRBool *cancel,
- void *arg) {
- *cancel = PR_TRUE;
- return NULL;
-}
-
-
-void FUNCTION_NAME(SecureSocket_ImportCertificatesWithPrivateKeys)
- (Dart_NativeArguments args) {
- Dart_Handle pk12_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
- if (!Dart_IsList(pk12_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.importPrivateCertificates: certificates is not a List"));
- }
-
- Dart_Handle password_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
- if (!Dart_IsString(password_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.importPrivateCertificates: password is not a String"));
- }
-
- intptr_t length;
- ThrowIfError(Dart_ListLength(pk12_object, &length));
- uint8_t* pk12 = Dart_ScopeAllocate(length);
- if (pk12 == NULL) {
- FATAL("Out of memory in SecureSocket.importPrivateCertificates");
- }
- ThrowIfError(Dart_ListGetAsBytes(pk12_object, 0, pk12, length));
-
- // A big-endian Unicode (UTF16) password.
- intptr_t password_length;
- ThrowIfError(Dart_StringLength(password_object, &password_length));
- password_length++;
- uint16_t* password = reinterpret_cast<uint16_t*>(
- Dart_ScopeAllocate(sizeof(uint16_t) * password_length));
- if (password == NULL) {
- FATAL("Out of memory in SecureSocket.importPrivateCertificates");
- }
- intptr_t returned_length = password_length;
- ThrowIfError(Dart_StringToUTF16(password_object, password, &returned_length));
- ASSERT(password_length == returned_length + 1);
- password[password_length - 1] = 0;
- for (int i = 0; i < password_length; ++i) {
- password[i] = Utils::HostToBigEndian16(password[i]);
- }
- SECItem p12_password;
- p12_password.type = siBuffer;
- p12_password.data = reinterpret_cast<unsigned char*>(password);
- p12_password.len = sizeof(uint16_t) * password_length;
-
- Dart_SetReturnValue(args, Dart_Null());
- // Set the password callback for the certificate database we are importing to.
- // The password for a slot is gotten from a callback, and it is freed by the
- // caller of the callback. The argument to the callback comes from the wincx
- // argument to a PK11 function.
- PK11SlotInfo* slot = PK11_GetInternalKeySlot();
- SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
- if (status == SECFailure) {
- PK11_FreeSlot(slot);
- ThrowPRException("CertificateException",
- "Could not authenticate to certificate database");
- }
-
- SEC_PKCS12DecoderContext* context = SEC_PKCS12DecoderStart(
- &p12_password,
- slot,
- SSLFilter::GetPassword(),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL);
- PK11_FreeSlot(slot);
- if (!context) {
- FATAL("Unexpected error: SecureSocket.addPrivateCertificates DecoderStart");
- }
- bool success;
- {
- MutexLocker locker(SSLFilter::mutex);
- success =
- SECSuccess == SEC_PKCS12DecoderUpdate(context, pk12, length) &&
- SECSuccess == SEC_PKCS12DecoderVerify(context) &&
- SECSuccess == SEC_PKCS12DecoderValidateBags(context,
- nickname_callback) &&
- SECSuccess == SEC_PKCS12DecoderImportBags(context);
- }
- SEC_PKCS12DecoderFinish(context);
- if (!success) {
- ThrowPRException("CertificateException", "Could not import PKCS#12 file");
- }
-}
-
-
-void FUNCTION_NAME(SecureSocket_ChangeTrust)(Dart_NativeArguments args) {
- Dart_Handle nickname_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
- if (!Dart_IsString(nickname_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.changeTrust: nickname argument is not a String"));
- }
- const char* nickname;
- ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
- Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
- if (!Dart_IsString(trust_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.changeTrust: trust argument is not a String"));
- }
- const char* trust_string;
- ThrowIfError(Dart_StringToCString(trust_object, &trust_string));
-
- PK11SlotInfo* slot = PK11_GetInternalKeySlot();
- SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
- if (status == SECFailure) {
- ThrowPRException("CertificateException",
- "Could not authenticate to certificate database");
- }
- PK11_FreeSlot(slot);
-
- CERTCertificate* certificate =
- PK11_FindCertFromNickname(nickname, SSLFilter::GetPassword());
- if (certificate == NULL) {
- ThrowCertificateException("Cannot find certificate with nickname %s",
- nickname);
- }
- CERTCertTrust trust;
- if (SECSuccess != CERT_DecodeTrustString(&trust, trust_string)) {
- CERT_DestroyCertificate(certificate);
- ThrowPRException("CertificateException", "Trust string cannot be decoded");
- }
- {
- MutexLocker locker(SSLFilter::mutex);
- status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), certificate, &trust);
- }
- if (status != SECSuccess) {
- CERT_DestroyCertificate(certificate);
- ThrowCertificateException("Cannot set trust on certificate %s", nickname);
- }
- Dart_SetReturnValue(args, X509FromCertificate(certificate));
- CERT_DestroyCertificate(certificate);
-}
-
-
-void FUNCTION_NAME(SecureSocket_GetCertificate)(Dart_NativeArguments args) {
- Dart_Handle nickname_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
- if (!Dart_IsString(nickname_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.getCertificate: nickname argument is not a String"));
- }
- const char* nickname;
- ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
- CERTCertificate* certificate = PK11_FindCertFromNickname(
- nickname, SSLFilter::GetPassword());
- if (certificate != NULL) {
- Dart_SetReturnValue(args, X509FromCertificate(certificate));
- CERT_DestroyCertificate(certificate);
- }
-}
-
-
-void FUNCTION_NAME(SecureSocket_RemoveCertificate)(Dart_NativeArguments args) {
- Dart_Handle nickname_object =
- ThrowIfError(Dart_GetNativeArgument(args, 0));
- if (!Dart_IsString(nickname_object)) {
- Dart_ThrowException(DartUtils::NewDartArgumentError(
- "SecureSocket.removeCertificate: nickname is not a String"));
- }
- const char* nickname;
- ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
- CERTCertificate* certificate =
- PK11_FindCertFromNickname(nickname, SSLFilter::GetPassword());
- if (certificate == NULL) {
- ThrowCertificateException("Cannot find certificate with nickname %s",
- nickname);
- }
- SECKEYPrivateKey* key =
- PK11_FindKeyByAnyCert(certificate, SSLFilter::GetPassword());
- // Free the copy returned from FindKeyByAnyCert.
- SECKEY_DestroyPrivateKey(key);
- SECStatus status;
- {
- MutexLocker locker(SSLFilter::mutex);
- status = (key == NULL) ?
- SEC_DeletePermCertificate(certificate) :
- PK11_DeleteTokenCertAndKey(certificate, SSLFilter::GetPassword());
- }
- CERT_DestroyCertificate(certificate);
- if (status != SECSuccess) {
- ThrowCertificateException("Cannot remove certificate %s", nickname);
- }
+ SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots);
}
@@ -723,9 +408,47 @@
}
+static Dart_Handle X509FromCertificate(CERTCertificate* certificate) {
+ PRTime start_validity;
+ PRTime end_validity;
+ SECStatus status =
+ CERT_GetCertTimes(certificate, &start_validity, &end_validity);
+ if (status != SECSuccess) {
+ ThrowPRException("CertificateException",
+ "Cannot get validity times from certificate");
+ }
+ int64_t start_epoch_ms = start_validity / PR_USEC_PER_MSEC;
+ int64_t end_epoch_ms = end_validity / PR_USEC_PER_MSEC;
+ Dart_Handle subject_name_object =
+ DartUtils::NewString(certificate->subjectName);
+ Dart_Handle issuer_name_object =
+ DartUtils::NewString(certificate->issuerName);
+ Dart_Handle start_epoch_ms_int = Dart_NewInteger(start_epoch_ms);
+ Dart_Handle end_epoch_ms_int = Dart_NewInteger(end_epoch_ms);
+
+ Dart_Handle date_type =
+ DartUtils::GetDartType(DartUtils::kCoreLibURL, "DateTime");
+ Dart_Handle from_milliseconds =
+ DartUtils::NewString("fromMillisecondsSinceEpoch");
+
+ Dart_Handle start_validity_date =
+ Dart_New(date_type, from_milliseconds, 1, &start_epoch_ms_int);
+ Dart_Handle end_validity_date =
+ Dart_New(date_type, from_milliseconds, 1, &end_epoch_ms_int);
+
+ Dart_Handle x509_type =
+ DartUtils::GetDartType(DartUtils::kIOLibURL, "X509Certificate");
+ Dart_Handle arguments[] = { subject_name_object,
+ issuer_name_object,
+ start_validity_date,
+ end_validity_date };
+ return Dart_New(x509_type, Dart_Null(), 4, arguments);
+}
+
+
void SSLFilter::Init(Dart_Handle dart_this) {
if (!library_initialized_) {
- InitializeLibrary(NULL, "", true, true, false);
+ InitializeLibrary(NULL, "", true, false);
}
ASSERT(string_start_ == NULL);
string_start_ = Dart_NewPersistentHandle(DartUtils::NewString("start"));
@@ -798,6 +521,14 @@
}
+char* PasswordCallback(PK11SlotInfo* slot, PRBool retry, void* arg) {
+ if (!retry) {
+ return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals.
+ }
+ return NULL;
+}
+
+
static const char* builtin_roots_module =
#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
"name=\"Root Certs\" library=\"libnssckbi.so\"";
@@ -814,9 +545,8 @@
void SSLFilter::InitializeLibrary(const char* certificate_database,
const char* password,
bool use_builtin_root_certificates,
- bool read_only,
bool report_duplicate_initialization) {
- MutexLocker locker(mutex);
+ MutexLocker locker(mutex_);
SECStatus status;
if (!library_initialized_) {
PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
@@ -824,7 +554,7 @@
if (certificate_database == NULL || certificate_database[0] == '\0') {
status = NSS_NoDB_Init(NULL);
if (status != SECSuccess) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed NSS_NoDB_Init call.");
}
@@ -832,13 +562,13 @@
SECMODModule* module = SECMOD_LoadUserModule(
const_cast<char*>(builtin_roots_module), NULL, PR_FALSE);
if (!module) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed to load builtin root certificates.");
}
}
} else {
- PRUint32 init_flags = read_only ? NSS_INIT_READONLY : 0;
+ PRUint32 init_flags = NSS_INIT_READONLY;
if (!use_builtin_root_certificates) {
init_flags |= NSS_INIT_NOMODDB;
}
@@ -848,7 +578,7 @@
SECMOD_DB,
init_flags);
if (status != SECSuccess) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed NSS_Init call.");
}
@@ -857,34 +587,28 @@
}
library_initialized_ = true;
- // Allow encoding and decoding of private keys in PKCS#12 files.
- SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_40, 1);
- SEC_PKCS12EnableCipher(PKCS12_DES_EDE3_168, 1);
- SEC_PKCS12SetPreferredCipher(PKCS12_DES_EDE3_168, 1);
-
status = NSS_SetDomesticPolicy();
if (status != SECSuccess) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed NSS_SetDomesticPolicy call.");
}
-
// Enable TLS, as well as SSL3 and SSL2.
status = SSL_OptionSetDefault(SSL_ENABLE_TLS, PR_TRUE);
if (status != SECSuccess) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed SSL_OptionSetDefault enable TLS call.");
}
status = SSL_ConfigServerSessionIDCache(0, 0, 0, NULL);
if (status != SECSuccess) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
ThrowPRException("TlsException",
"Failed SSL_ConfigServerSessionIDCache call.");
}
} else if (report_duplicate_initialization) {
- mutex->Unlock(); // MutexLocker destructor not called when throwing.
+ mutex_->Unlock(); // MutexLocker destructor not called when throwing.
// Like ThrowPRException, without adding an OSError.
Dart_ThrowException(DartUtils::NewDartIOException("TlsException",
"Called SecureSocket.initialize more than once",
@@ -959,20 +683,23 @@
const_cast<char*>(certificate_name));
if (certificate == NULL) {
ThrowCertificateException(
- "Cannot find server certificate with distinguished name %s",
+ "Cannot find server certificate by distinguished name: %s",
certificate_name);
}
} else {
// Look up certificate using the nickname certificate_name.
certificate = PK11_FindCertFromNickname(
- const_cast<char*>(certificate_name), GetPassword());
+ const_cast<char*>(certificate_name),
+ static_cast<void*>(const_cast<char*>(password_)));
if (certificate == NULL) {
ThrowCertificateException(
- "Cannot find server certificate with nickname %s",
+ "Cannot find server certificate by nickname: %s",
certificate_name);
}
}
- SECKEYPrivateKey* key = PK11_FindKeyByAnyCert(certificate, GetPassword());
+ SECKEYPrivateKey* key = PK11_FindKeyByAnyCert(
+ certificate,
+ static_cast<void*>(const_cast<char*>(password_)));
if (key == NULL) {
CERT_DestroyCertificate(certificate);
if (PR_GetError() == -8177) {
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index cdb4f65..304ccd5 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -46,8 +46,6 @@
kFirstEncrypted = kReadEncrypted
};
- static dart::Mutex* mutex; // To protect library initialization.
-
SSLFilter()
: callback_error(NULL),
string_start_(NULL),
@@ -89,17 +87,15 @@
static void InitializeLibrary(const char* certificate_database,
const char* password,
bool use_builtin_root_certificates,
- bool read_only,
bool report_duplicate_initialization = true);
static Dart_Port GetServicePort();
Dart_Handle callback_error;
- static char* GetPassword() { return password_; }
-
private:
static const int kMemioBufferSize = 20 * KB;
static bool library_initialized_;
- static char* password_;
+ static const char* password_;
+ static dart::Mutex* mutex_; // To protect library initialization.
static NativeService filter_service_;
uint8_t* buffers_[kNumBuffers];
@@ -119,6 +115,7 @@
return static_cast<BufferIndex>(i) >= kFirstEncrypted;
}
void InitializeBuffers(Dart_Handle dart_this);
+ void InitializePlatformData();
DISALLOW_COPY_AND_ASSIGN(SSLFilter);
};
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 13640b2..104f562 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -8,27 +8,8 @@
/* patch */ static void initialize({String database,
String password,
- bool useBuiltinRoots: true,
- bool readOnly: true})
- native "SecureSocket_InitializeLibrary";
-
- /* patch */ static X509Certificate addCertificate(List<int> certificate,
- String trust)
- native "SecureSocket_AddCertificate";
-
- /* patch */ static importCertificatesWithPrivateKeys(List<int> certificates,
- String password)
- native "SecureSocket_ImportCertificatesWithPrivateKeys";
-
- /* patch */ static X509Certificate changeTrust(String nickname,
- String trust)
- native "SecureSocket_ChangeTrust";
-
- /* patch */ static X509Certificate getCertificate(String nickname)
- native "SecureSocket_GetCertificate";
-
- /* patch */ static removeCertificate(String nickname)
- native "SecureSocket_RemoveCertificate";
+ bool useBuiltinRoots: true})
+ native "SecureSocket_InitializeLibrary";
}
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 4d9225d..55f9224e 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -2,7 +2,7 @@
// 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.
-patch class RawServerSocket {
+patch class RawServerSocket {
/* patch */ static Future<RawServerSocket> bind(address,
int port,
{int backlog: 0,
@@ -145,7 +145,7 @@
static Uint8List _fixed(int id) native "InternetAddress_Fixed";
}
-class _NetworkInterface implements NetworkInterface{
+class _NetworkInterface implements NetworkInterface {
final String name;
final List<InternetAddress> addresses;
diff --git a/runtime/lib/bool_patch.dart b/runtime/lib/bool_patch.dart
index f5020c3..d5594e2 100644
--- a/runtime/lib/bool_patch.dart
+++ b/runtime/lib/bool_patch.dart
@@ -10,4 +10,7 @@
return this ? 1231 : 1237;
}
+ String toString() {
+ return this ? "true" : "false";
+ }
}
diff --git a/runtime/lib/corelib_sources.gypi b/runtime/lib/corelib_sources.gypi
index 14a53b2..3d50b40 100644
--- a/runtime/lib/corelib_sources.gypi
+++ b/runtime/lib/corelib_sources.gypi
@@ -35,6 +35,7 @@
'invocation_mirror.h',
'invocation_mirror_patch.dart',
'map_patch.dart',
+ 'null_patch.dart',
'object.cc',
'object_patch.dart',
'print_patch.dart',
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index 8fb5560..9e2abeb 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -39,11 +39,11 @@
}
/* patch */ static double parse(String str,
- [double handleError(String str)]) {
+ [double onError(String str)]) {
var result = _parse(str);
if (result == null) {
- if (handleError == null) throw new FormatException(str);
- return handleError(str);
+ if (onError == null) throw new FormatException(str);
+ return onError(str);
}
return result;
}
diff --git a/runtime/lib/null_patch.dart b/runtime/lib/null_patch.dart
new file mode 100644
index 0000000..cfc1f33
--- /dev/null
+++ b/runtime/lib/null_patch.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// Dart core library.
+
+patch class Null {
+
+ factory Null._uninstantiable() {
+ throw new UnsupportedError(
+ "class Null cannot be instantiated");
+ }
+
+ int get hashCode {
+ return 2011; // The year Dart was announced and a prime.
+ }
+
+ String toString() {
+ return 'null';
+ }
+}
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index e2b4933..2d42da7 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -13,9 +13,6 @@
static _setHash(obj, hash) native "Object_setHash";
/* patch */ int get hashCode {
- if (this == null) {
- return 2011; // The year Dart was announced and a prime.
- }
var result = _getHash(this);
if (result == 0) {
// We want the hash to be a Smi value greater than 0.
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index 0ff6da4..9b79412 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -233,6 +233,13 @@
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
int64_t m = mask.AsInt64Value();
+ if (m < 0 || m > 255) {
+ const String& error = String::Handle(
+ String::NewFormatted("mask (%"Pd64") must be in the range [0..256)", m));
+ const Array& args = Array::Handle(Array::New(1));
+ args.SetAt(0, error);
+ Exceptions::ThrowByType(Exceptions::kRange, args);
+ }
float data[4] = { self.x(), self.y(), self.z(), self.w() };
float _x = data[m & 0x3];
float _y = data[(m >> 2) & 0x3];
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index de61ae0..4e76c27 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -2022,263 +2022,8 @@
double get y native "Float32x4_getY";
double get z native "Float32x4_getZ";
double get w native "Float32x4_getW";
- Float32x4 get xxxx => _shuffle(0x0);
- Float32x4 get xxxy => _shuffle(0x40);
- Float32x4 get xxxz => _shuffle(0x80);
- Float32x4 get xxxw => _shuffle(0xC0);
- Float32x4 get xxyx => _shuffle(0x10);
- Float32x4 get xxyy => _shuffle(0x50);
- Float32x4 get xxyz => _shuffle(0x90);
- Float32x4 get xxyw => _shuffle(0xD0);
- Float32x4 get xxzx => _shuffle(0x20);
- Float32x4 get xxzy => _shuffle(0x60);
- Float32x4 get xxzz => _shuffle(0xA0);
- Float32x4 get xxzw => _shuffle(0xE0);
- Float32x4 get xxwx => _shuffle(0x30);
- Float32x4 get xxwy => _shuffle(0x70);
- Float32x4 get xxwz => _shuffle(0xB0);
- Float32x4 get xxww => _shuffle(0xF0);
- Float32x4 get xyxx => _shuffle(0x4);
- Float32x4 get xyxy => _shuffle(0x44);
- Float32x4 get xyxz => _shuffle(0x84);
- Float32x4 get xyxw => _shuffle(0xC4);
- Float32x4 get xyyx => _shuffle(0x14);
- Float32x4 get xyyy => _shuffle(0x54);
- Float32x4 get xyyz => _shuffle(0x94);
- Float32x4 get xyyw => _shuffle(0xD4);
- Float32x4 get xyzx => _shuffle(0x24);
- Float32x4 get xyzy => _shuffle(0x64);
- Float32x4 get xyzz => _shuffle(0xA4);
- Float32x4 get xyzw => _shuffle(0xE4);
- Float32x4 get xywx => _shuffle(0x34);
- Float32x4 get xywy => _shuffle(0x74);
- Float32x4 get xywz => _shuffle(0xB4);
- Float32x4 get xyww => _shuffle(0xF4);
- Float32x4 get xzxx => _shuffle(0x8);
- Float32x4 get xzxy => _shuffle(0x48);
- Float32x4 get xzxz => _shuffle(0x88);
- Float32x4 get xzxw => _shuffle(0xC8);
- Float32x4 get xzyx => _shuffle(0x18);
- Float32x4 get xzyy => _shuffle(0x58);
- Float32x4 get xzyz => _shuffle(0x98);
- Float32x4 get xzyw => _shuffle(0xD8);
- Float32x4 get xzzx => _shuffle(0x28);
- Float32x4 get xzzy => _shuffle(0x68);
- Float32x4 get xzzz => _shuffle(0xA8);
- Float32x4 get xzzw => _shuffle(0xE8);
- Float32x4 get xzwx => _shuffle(0x38);
- Float32x4 get xzwy => _shuffle(0x78);
- Float32x4 get xzwz => _shuffle(0xB8);
- Float32x4 get xzww => _shuffle(0xF8);
- Float32x4 get xwxx => _shuffle(0xC);
- Float32x4 get xwxy => _shuffle(0x4C);
- Float32x4 get xwxz => _shuffle(0x8C);
- Float32x4 get xwxw => _shuffle(0xCC);
- Float32x4 get xwyx => _shuffle(0x1C);
- Float32x4 get xwyy => _shuffle(0x5C);
- Float32x4 get xwyz => _shuffle(0x9C);
- Float32x4 get xwyw => _shuffle(0xDC);
- Float32x4 get xwzx => _shuffle(0x2C);
- Float32x4 get xwzy => _shuffle(0x6C);
- Float32x4 get xwzz => _shuffle(0xAC);
- Float32x4 get xwzw => _shuffle(0xEC);
- Float32x4 get xwwx => _shuffle(0x3C);
- Float32x4 get xwwy => _shuffle(0x7C);
- Float32x4 get xwwz => _shuffle(0xBC);
- Float32x4 get xwww => _shuffle(0xFC);
- Float32x4 get yxxx => _shuffle(0x1);
- Float32x4 get yxxy => _shuffle(0x41);
- Float32x4 get yxxz => _shuffle(0x81);
- Float32x4 get yxxw => _shuffle(0xC1);
- Float32x4 get yxyx => _shuffle(0x11);
- Float32x4 get yxyy => _shuffle(0x51);
- Float32x4 get yxyz => _shuffle(0x91);
- Float32x4 get yxyw => _shuffle(0xD1);
- Float32x4 get yxzx => _shuffle(0x21);
- Float32x4 get yxzy => _shuffle(0x61);
- Float32x4 get yxzz => _shuffle(0xA1);
- Float32x4 get yxzw => _shuffle(0xE1);
- Float32x4 get yxwx => _shuffle(0x31);
- Float32x4 get yxwy => _shuffle(0x71);
- Float32x4 get yxwz => _shuffle(0xB1);
- Float32x4 get yxww => _shuffle(0xF1);
- Float32x4 get yyxx => _shuffle(0x5);
- Float32x4 get yyxy => _shuffle(0x45);
- Float32x4 get yyxz => _shuffle(0x85);
- Float32x4 get yyxw => _shuffle(0xC5);
- Float32x4 get yyyx => _shuffle(0x15);
- Float32x4 get yyyy => _shuffle(0x55);
- Float32x4 get yyyz => _shuffle(0x95);
- Float32x4 get yyyw => _shuffle(0xD5);
- Float32x4 get yyzx => _shuffle(0x25);
- Float32x4 get yyzy => _shuffle(0x65);
- Float32x4 get yyzz => _shuffle(0xA5);
- Float32x4 get yyzw => _shuffle(0xE5);
- Float32x4 get yywx => _shuffle(0x35);
- Float32x4 get yywy => _shuffle(0x75);
- Float32x4 get yywz => _shuffle(0xB5);
- Float32x4 get yyww => _shuffle(0xF5);
- Float32x4 get yzxx => _shuffle(0x9);
- Float32x4 get yzxy => _shuffle(0x49);
- Float32x4 get yzxz => _shuffle(0x89);
- Float32x4 get yzxw => _shuffle(0xC9);
- Float32x4 get yzyx => _shuffle(0x19);
- Float32x4 get yzyy => _shuffle(0x59);
- Float32x4 get yzyz => _shuffle(0x99);
- Float32x4 get yzyw => _shuffle(0xD9);
- Float32x4 get yzzx => _shuffle(0x29);
- Float32x4 get yzzy => _shuffle(0x69);
- Float32x4 get yzzz => _shuffle(0xA9);
- Float32x4 get yzzw => _shuffle(0xE9);
- Float32x4 get yzwx => _shuffle(0x39);
- Float32x4 get yzwy => _shuffle(0x79);
- Float32x4 get yzwz => _shuffle(0xB9);
- Float32x4 get yzww => _shuffle(0xF9);
- Float32x4 get ywxx => _shuffle(0xD);
- Float32x4 get ywxy => _shuffle(0x4D);
- Float32x4 get ywxz => _shuffle(0x8D);
- Float32x4 get ywxw => _shuffle(0xCD);
- Float32x4 get ywyx => _shuffle(0x1D);
- Float32x4 get ywyy => _shuffle(0x5D);
- Float32x4 get ywyz => _shuffle(0x9D);
- Float32x4 get ywyw => _shuffle(0xDD);
- Float32x4 get ywzx => _shuffle(0x2D);
- Float32x4 get ywzy => _shuffle(0x6D);
- Float32x4 get ywzz => _shuffle(0xAD);
- Float32x4 get ywzw => _shuffle(0xED);
- Float32x4 get ywwx => _shuffle(0x3D);
- Float32x4 get ywwy => _shuffle(0x7D);
- Float32x4 get ywwz => _shuffle(0xBD);
- Float32x4 get ywww => _shuffle(0xFD);
- Float32x4 get zxxx => _shuffle(0x2);
- Float32x4 get zxxy => _shuffle(0x42);
- Float32x4 get zxxz => _shuffle(0x82);
- Float32x4 get zxxw => _shuffle(0xC2);
- Float32x4 get zxyx => _shuffle(0x12);
- Float32x4 get zxyy => _shuffle(0x52);
- Float32x4 get zxyz => _shuffle(0x92);
- Float32x4 get zxyw => _shuffle(0xD2);
- Float32x4 get zxzx => _shuffle(0x22);
- Float32x4 get zxzy => _shuffle(0x62);
- Float32x4 get zxzz => _shuffle(0xA2);
- Float32x4 get zxzw => _shuffle(0xE2);
- Float32x4 get zxwx => _shuffle(0x32);
- Float32x4 get zxwy => _shuffle(0x72);
- Float32x4 get zxwz => _shuffle(0xB2);
- Float32x4 get zxww => _shuffle(0xF2);
- Float32x4 get zyxx => _shuffle(0x6);
- Float32x4 get zyxy => _shuffle(0x46);
- Float32x4 get zyxz => _shuffle(0x86);
- Float32x4 get zyxw => _shuffle(0xC6);
- Float32x4 get zyyx => _shuffle(0x16);
- Float32x4 get zyyy => _shuffle(0x56);
- Float32x4 get zyyz => _shuffle(0x96);
- Float32x4 get zyyw => _shuffle(0xD6);
- Float32x4 get zyzx => _shuffle(0x26);
- Float32x4 get zyzy => _shuffle(0x66);
- Float32x4 get zyzz => _shuffle(0xA6);
- Float32x4 get zyzw => _shuffle(0xE6);
- Float32x4 get zywx => _shuffle(0x36);
- Float32x4 get zywy => _shuffle(0x76);
- Float32x4 get zywz => _shuffle(0xB6);
- Float32x4 get zyww => _shuffle(0xF6);
- Float32x4 get zzxx => _shuffle(0xA);
- Float32x4 get zzxy => _shuffle(0x4A);
- Float32x4 get zzxz => _shuffle(0x8A);
- Float32x4 get zzxw => _shuffle(0xCA);
- Float32x4 get zzyx => _shuffle(0x1A);
- Float32x4 get zzyy => _shuffle(0x5A);
- Float32x4 get zzyz => _shuffle(0x9A);
- Float32x4 get zzyw => _shuffle(0xDA);
- Float32x4 get zzzx => _shuffle(0x2A);
- Float32x4 get zzzy => _shuffle(0x6A);
- Float32x4 get zzzz => _shuffle(0xAA);
- Float32x4 get zzzw => _shuffle(0xEA);
- Float32x4 get zzwx => _shuffle(0x3A);
- Float32x4 get zzwy => _shuffle(0x7A);
- Float32x4 get zzwz => _shuffle(0xBA);
- Float32x4 get zzww => _shuffle(0xFA);
- Float32x4 get zwxx => _shuffle(0xE);
- Float32x4 get zwxy => _shuffle(0x4E);
- Float32x4 get zwxz => _shuffle(0x8E);
- Float32x4 get zwxw => _shuffle(0xCE);
- Float32x4 get zwyx => _shuffle(0x1E);
- Float32x4 get zwyy => _shuffle(0x5E);
- Float32x4 get zwyz => _shuffle(0x9E);
- Float32x4 get zwyw => _shuffle(0xDE);
- Float32x4 get zwzx => _shuffle(0x2E);
- Float32x4 get zwzy => _shuffle(0x6E);
- Float32x4 get zwzz => _shuffle(0xAE);
- Float32x4 get zwzw => _shuffle(0xEE);
- Float32x4 get zwwx => _shuffle(0x3E);
- Float32x4 get zwwy => _shuffle(0x7E);
- Float32x4 get zwwz => _shuffle(0xBE);
- Float32x4 get zwww => _shuffle(0xFE);
- Float32x4 get wxxx => _shuffle(0x3);
- Float32x4 get wxxy => _shuffle(0x43);
- Float32x4 get wxxz => _shuffle(0x83);
- Float32x4 get wxxw => _shuffle(0xC3);
- Float32x4 get wxyx => _shuffle(0x13);
- Float32x4 get wxyy => _shuffle(0x53);
- Float32x4 get wxyz => _shuffle(0x93);
- Float32x4 get wxyw => _shuffle(0xD3);
- Float32x4 get wxzx => _shuffle(0x23);
- Float32x4 get wxzy => _shuffle(0x63);
- Float32x4 get wxzz => _shuffle(0xA3);
- Float32x4 get wxzw => _shuffle(0xE3);
- Float32x4 get wxwx => _shuffle(0x33);
- Float32x4 get wxwy => _shuffle(0x73);
- Float32x4 get wxwz => _shuffle(0xB3);
- Float32x4 get wxww => _shuffle(0xF3);
- Float32x4 get wyxx => _shuffle(0x7);
- Float32x4 get wyxy => _shuffle(0x47);
- Float32x4 get wyxz => _shuffle(0x87);
- Float32x4 get wyxw => _shuffle(0xC7);
- Float32x4 get wyyx => _shuffle(0x17);
- Float32x4 get wyyy => _shuffle(0x57);
- Float32x4 get wyyz => _shuffle(0x97);
- Float32x4 get wyyw => _shuffle(0xD7);
- Float32x4 get wyzx => _shuffle(0x27);
- Float32x4 get wyzy => _shuffle(0x67);
- Float32x4 get wyzz => _shuffle(0xA7);
- Float32x4 get wyzw => _shuffle(0xE7);
- Float32x4 get wywx => _shuffle(0x37);
- Float32x4 get wywy => _shuffle(0x77);
- Float32x4 get wywz => _shuffle(0xB7);
- Float32x4 get wyww => _shuffle(0xF7);
- Float32x4 get wzxx => _shuffle(0xB);
- Float32x4 get wzxy => _shuffle(0x4B);
- Float32x4 get wzxz => _shuffle(0x8B);
- Float32x4 get wzxw => _shuffle(0xCB);
- Float32x4 get wzyx => _shuffle(0x1B);
- Float32x4 get wzyy => _shuffle(0x5B);
- Float32x4 get wzyz => _shuffle(0x9B);
- Float32x4 get wzyw => _shuffle(0xDB);
- Float32x4 get wzzx => _shuffle(0x2B);
- Float32x4 get wzzy => _shuffle(0x6B);
- Float32x4 get wzzz => _shuffle(0xAB);
- Float32x4 get wzzw => _shuffle(0xEB);
- Float32x4 get wzwx => _shuffle(0x3B);
- Float32x4 get wzwy => _shuffle(0x7B);
- Float32x4 get wzwz => _shuffle(0xBB);
- Float32x4 get wzww => _shuffle(0xFB);
- Float32x4 get wwxx => _shuffle(0xF);
- Float32x4 get wwxy => _shuffle(0x4F);
- Float32x4 get wwxz => _shuffle(0x8F);
- Float32x4 get wwxw => _shuffle(0xCF);
- Float32x4 get wwyx => _shuffle(0x1F);
- Float32x4 get wwyy => _shuffle(0x5F);
- Float32x4 get wwyz => _shuffle(0x9F);
- Float32x4 get wwyw => _shuffle(0xDF);
- Float32x4 get wwzx => _shuffle(0x2F);
- Float32x4 get wwzy => _shuffle(0x6F);
- Float32x4 get wwzz => _shuffle(0xAF);
- Float32x4 get wwzw => _shuffle(0xEF);
- Float32x4 get wwwx => _shuffle(0x3F);
- Float32x4 get wwwy => _shuffle(0x7F);
- Float32x4 get wwwz => _shuffle(0xBF);
- Float32x4 get wwww => _shuffle(0xFF);
- Float32x4 _shuffle(int mask) native "Float32x4_shuffle";
+
+ Float32x4 shuffle(int mask) native "Float32x4_shuffle";
Float32x4 withZWInXY(Float32x4 other) native "Float32x4_withZWInXY";
Float32x4 interleaveXY(Float32x4 other) native "Float32x4_interleaveXY";
diff --git a/runtime/platform/thread_win.cc b/runtime/platform/thread_win.cc
index 6265f6f..7b3ca56 100644
--- a/runtime/platform/thread_win.cc
+++ b/runtime/platform/thread_win.cc
@@ -71,7 +71,7 @@
ThreadLocalKey Thread::CreateThreadLocal() {
ThreadLocalKey key = TlsAlloc();
if (key == kUnsetThreadLocalKey) {
- FATAL("TlsAlloc failed");
+ FATAL1("TlsAlloc failed %d", GetLastError());
}
return key;
}
@@ -81,7 +81,7 @@
ASSERT(key != kUnsetThreadLocalKey);
BOOL result = TlsFree(key);
if (!result) {
- FATAL("TlsFree failed");
+ FATAL1("TlsFree failed %d", GetLastError());
}
}
@@ -96,7 +96,7 @@
ASSERT(key != kUnsetThreadLocalKey);
BOOL result = TlsSetValue(key, reinterpret_cast<void*>(value));
if (!result) {
- FATAL("TlsSetValue failed");
+ FATAL1("TlsSetValue failed %d", GetLastError());
}
}
@@ -105,7 +105,7 @@
// Allocate unnamed semaphore with initial count 1 and max count 1.
data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL);
if (data_.semaphore_ == NULL) {
- FATAL("Mutex allocation failed");
+ FATAL1("Mutex allocation failed %d", GetLastError());
}
}
@@ -118,7 +118,7 @@
void Mutex::Lock() {
DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE);
if (result != WAIT_OBJECT_0) {
- FATAL("Mutex lock failed");
+ FATAL1("Mutex lock failed %d", GetLastError());
}
}
@@ -130,7 +130,7 @@
return true;
}
if (result == WAIT_ABANDONED || result == WAIT_FAILED) {
- FATAL("Mutex try lock failed");
+ FATAL1("Mutex try lock failed %d", GetLastError());
}
ASSERT(result == WAIT_TIMEOUT);
return false;
@@ -140,7 +140,7 @@
void Mutex::Unlock() {
BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL);
if (result == 0) {
- FATAL("Mutex unlock failed");
+ FATAL1("Mutex unlock failed", GetLastError());
}
}
@@ -244,7 +244,7 @@
// Signal event.
BOOL result = SetEvent(first->event_);
if (result == 0) {
- FATAL("Monitor::Notify failed to signal event");
+ FATAL1("Monitor::Notify failed to signal event", GetLastError());
}
}
LeaveCriticalSection(&waiters_cs_);
@@ -261,7 +261,7 @@
while (current != NULL) {
BOOL result = SetEvent(current->event_);
if (result == 0) {
- FATAL("Failed to set event for NotifyAll");
+ FATAL1("Failed to set event for NotifyAll", GetLastError());
}
current = current->next_;
}
@@ -315,14 +315,14 @@
// Wait forever for a Notify or a NotifyAll event.
result = WaitForSingleObject(wait_data->event_, INFINITE);
if (result == WAIT_FAILED) {
- FATAL("Monitor::Wait failed");
+ FATAL1("Monitor::Wait failed", GetLastError());
}
} else {
// Wait for the given period of time for a Notify or a NotifyAll
// event.
result = WaitForSingleObject(wait_data->event_, millis);
if (result == WAIT_FAILED) {
- FATAL("Monitor::Wait with timeout failed");
+ FATAL1("Monitor::Wait with timeout failed", GetLastError());
}
if (result == WAIT_TIMEOUT) {
// No longer waiting. Remove from the list of waiters.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index f59a048..5b4a370 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1938,6 +1938,7 @@
case kExternalOneByteStringCid:
case kExternalTwoByteStringCid:
case kBoolCid:
+ case kNullCid:
case kArrayCid:
case kImmutableArrayCid:
case kGrowableObjectArrayCid:
@@ -1996,11 +1997,12 @@
String::Handle(interface_class.Name()).ToCString());
}
// Verify that unless cls belongs to core lib, it cannot extend or implement
- // any of bool, num, int, double, String, Function, dynamic.
+ // any of Null, bool, num, int, double, String, Function, dynamic.
// The exception is signature classes, which are compiler generated and
// represent a function type, therefore implementing the Function interface.
if (!cls_belongs_to_core_lib) {
if (interface.IsBoolType() ||
+ interface.IsNullType() ||
interface.IsNumberType() ||
interface.IsIntType() ||
interface.IsDoubleType() ||
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 7aaf5bc..2f72473 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1032,11 +1032,6 @@
const MegamorphicCache& cache = MegamorphicCache::Handle(
isolate->megamorphic_cache_table()->Lookup(name, descriptor));
Class& cls = Class::Handle(receiver.clazz());
- const bool is_null = cls.IsNullClass();
- // For lookups treat null as an instance of class Object.
- if (is_null) {
- cls = isolate->object_store()->object_class();
- }
ASSERT(!cls.IsNull());
if (FLAG_trace_ic || FLAG_trace_ic_miss_in_optimized) {
OS::PrintErr("Megamorphic IC miss, class=%s, function=%s\n",
@@ -1064,8 +1059,7 @@
if (instructions.IsNull()) return;
cache.EnsureCapacity();
- const Smi& class_id = Smi::Handle(Smi::New(
- is_null ? static_cast<intptr_t>(kNullCid) : cls.id()));
+ const Smi& class_id = Smi::Handle(Smi::New(cls.id()));
cache.Insert(class_id, target);
return;
}
@@ -1217,11 +1211,7 @@
const Array& args_descriptor = Array::CheckedHandle(arguments.ArgAt(2));
const Array& args = Array::CheckedHandle(arguments.ArgAt(3));
- Class& receiver_class = Class::Handle(receiver.clazz());
- // For lookups treat null as an instance of class Object.
- if (receiver_class.IsNullClass()) {
- receiver_class = isolate->object_store()->object_class();
- }
+ const Class& receiver_class = Class::Handle(receiver.clazz());
const String& target_name = String::Handle(ic_data.target_name());
Object& result = Object::Handle();
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index aa88e83..fdc7e50 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -240,26 +240,44 @@
}
+#define GET_PEER(type, ctype, raw_obj, peer) \
+
+
+#define EXTERNAL_PEER_HELPER(cid, raw_obj, peer) \
+ switch (cid) { \
+ case kExternalOneByteStringCid: { \
+ RawExternalOneByteString* raw_string = \
+ reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr(); \
+ ExternalStringData<uint8_t>* data = raw_string->external_data_; \
+ *peer = data->peer(); \
+ return true; \
+ } \
+ case kExternalTwoByteStringCid: { \
+ RawExternalTwoByteString* raw_string = \
+ reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); \
+ ExternalStringData<uint16_t>* data = raw_string->external_data_; \
+ *peer = data->peer(); \
+ return true; \
+ } \
+ } \
+ return false; \
+
+
+bool Api::ExternalStringGetPeerHelper(Dart_NativeArguments args,
+ int arg_index,
+ void** peer) {
+ NoGCScope no_gc_scope;
+ NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+ RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+ intptr_t cid = raw_obj->GetClassId();
+ EXTERNAL_PEER_HELPER(cid, raw_obj, peer);
+}
+
+
bool Api::ExternalStringGetPeerHelper(Dart_Handle object, void** peer) {
NoGCScope no_gc_scope;
RawObject* raw_obj = Api::UnwrapHandle(object);
- switch (Api::ClassId(object)) {
- case kExternalOneByteStringCid: {
- RawExternalOneByteString* raw_string =
- reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr();
- ExternalStringData<uint8_t>* data = raw_string->external_data_;
- *peer = data->peer();
- return true;
- }
- case kExternalTwoByteStringCid: {
- RawExternalTwoByteString* raw_string =
- reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr();
- ExternalStringData<uint16_t>* data = raw_string->external_data_;
- *peer = data->peer();
- return true;
- }
- }
- return false;
+ EXTERNAL_PEER_HELPER(Api::ClassId(object), raw_obj, peer);
}
@@ -3686,18 +3704,14 @@
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
Isolate* isolate = arguments->isolate();
CHECK_ISOLATE(isolate);
- ReusableObjectHandleScope reused_obj_handle(isolate);
- Object& obj = reused_obj_handle.Handle();
- obj = arguments->NativeArgAt(arg_index);
- intptr_t cid = obj.GetClassId();
- if (RawObject::IsExternalStringClassId(cid)) {
- const String& str = String::Cast(obj);
- *peer = str.GetPeer();
- ASSERT(*peer != NULL);
+ if (Api::ExternalStringGetPeerHelper(args, arg_index, peer)) {
return Api::Success();
}
*peer = NULL;
- if (RawObject::IsStringClassId(cid)) {
+ ReusableObjectHandleScope reused_obj_handle(isolate);
+ Object& obj = reused_obj_handle.Handle();
+ obj = arguments->NativeArgAt(arg_index);
+ if (RawObject::IsStringClassId(obj.GetClassId())) {
return Api::NewHandle(isolate, obj.raw());
}
return Api::NewError("%s expects argument to be of"
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index d549b8f..dc2f88c 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -191,6 +191,9 @@
static void InitHandles();
// Helper function to get the peer value of an external string object.
+ static bool ExternalStringGetPeerHelper(Dart_NativeArguments args,
+ int arg_index,
+ void** peer);
static bool ExternalStringGetPeerHelper(Dart_Handle object, void** peer);
// Helper function to set the return value of native functions.
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index c1717ec..e818aa2 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1222,27 +1222,20 @@
node->left()->IsLiteralNode() &&
type.IsInstantiated()) {
const Instance& literal_value = node->left()->AsLiteralNode()->literal();
- const Class& cls = Class::Handle(literal_value.clazz());
ConstantInstr* result = NULL;
- if (cls.IsNullClass()) {
- // A null object is only an instance of Object and dynamic, which has
- // already been checked above (if the type is instantiated). So we can
- // return false here if the instance is null (and if the type is
- // instantiated).
- result = new ConstantInstr(negate_result ? Bool::True() : Bool::False());
+
+ Error& malformed_error = Error::Handle();
+ if (literal_value.IsInstanceOf(type,
+ TypeArguments::Handle(),
+ &malformed_error)) {
+ result = new ConstantInstr(negate_result ?
+ Bool::False() : Bool::True());
} else {
- Error& malformed_error = Error::Handle();
- if (literal_value.IsInstanceOf(type,
- TypeArguments::Handle(),
- &malformed_error)) {
- result = new ConstantInstr(negate_result ?
- Bool::False() : Bool::True());
- } else {
- result = new ConstantInstr(negate_result ?
- Bool::True() : Bool::False());
- }
- ASSERT(malformed_error.IsNull());
+ result = new ConstantInstr(negate_result ?
+ Bool::True() : Bool::False());
}
+ ASSERT(malformed_error.IsNull());
+
ReturnDefinition(result);
return;
}
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 74137bc..84879f5 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -46,6 +46,8 @@
static bool ShouldInlineSimd() {
#if defined(TARGET_ARCH_MIPS)
return false;
+#elif defined(TARGET_ARCH_ARM)
+ return CPUFeatures::neon_supported() && FLAG_enable_simd_inline;
#endif
return FLAG_enable_simd_inline;
}
@@ -398,20 +400,49 @@
} else if ((from == kUnboxedUint32x4) && (to == kTagged)) {
converted = new BoxUint32x4Instr(use->CopyWithType());
} else {
+ // We have failed to find a suitable conversion instruction.
+ // Insert two "dummy" conversion instructions with the correct
+ // "from" and "to" representation. The inserted instructions will
+ // trigger a deoptimization if executed. See #12417 for a discussion.
const intptr_t deopt_id = (deopt_target != NULL) ?
deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
- // We have failed to find a suitable conversion instruction.
- // Insert a "dummy" conversion instruction with the correct
- // "to" representation. The inserted instruction will trigger a
- // a deoptimization if executed. See issue #12417 for a discussion.
+ ASSERT(from != kTagged);
+ ASSERT(to != kTagged);
+ Value* to_value = NULL;
+ if (from == kUnboxedDouble) {
+ BoxDoubleInstr* boxed = new BoxDoubleInstr(use->CopyWithType());
+ use->BindTo(boxed);
+ InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+ to_value = new Value(boxed);
+ } else if (from == kUnboxedUint32x4) {
+ BoxUint32x4Instr* boxed = new BoxUint32x4Instr(use->CopyWithType());
+ use->BindTo(boxed);
+ InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+ to_value = new Value(boxed);
+ } else if (from == kUnboxedFloat32x4) {
+ BoxFloat32x4Instr* boxed = new BoxFloat32x4Instr(use->CopyWithType());
+ use->BindTo(boxed);
+ InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+ to_value = new Value(boxed);
+ } else if (from == kUnboxedMint) {
+ BoxIntegerInstr* boxed = new BoxIntegerInstr(use->CopyWithType());
+ use->BindTo(boxed);
+ InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+ to_value = new Value(boxed);
+ } else {
+ UNIMPLEMENTED();
+ }
+ ASSERT(to_value != NULL);
if (to == kUnboxedDouble) {
- converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+ converted = new UnboxDoubleInstr(to_value, deopt_id);
} else if (to == kUnboxedUint32x4) {
- converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+ converted = new UnboxUint32x4Instr(to_value, deopt_id);
} else if (to == kUnboxedFloat32x4) {
- converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+ converted = new UnboxFloat32x4Instr(to_value, deopt_id);
} else if (to == kUnboxedMint) {
- converted = new UnboxIntegerInstr(use->CopyWithType(), deopt_id);
+ converted = new UnboxIntegerInstr(to_value, deopt_id);
+ } else {
+ UNIMPLEMENTED();
}
}
ASSERT(converted != NULL);
@@ -1236,15 +1267,12 @@
} else if (HasOnlyOneDouble(*call->ic_data()) &&
(op_kind == Token::kNEGATE)) {
AddReceiverCheck(call);
- ConstantInstr* minus_one =
- flow_graph()->GetConstant(Double::ZoneHandle(Double::NewCanonical(-1)));
- unary_op = new BinaryDoubleOpInstr(Token::kMUL,
- new Value(input),
- new Value(minus_one),
- call->deopt_id());
+ unary_op = new UnaryDoubleOpInstr(
+ Token::kNEGATE, new Value(input), call->deopt_id());
+ } else {
+ return false;
}
- if (unary_op == NULL) return false;
-
+ ASSERT(unary_op != NULL);
ReplaceCall(call, unary_op);
return true;
}
@@ -1480,13 +1508,23 @@
ASSERT(call->ArgumentCount() == 2);
// Extract shuffle mask.
Definition* mask_definition = call->ArgumentAt(1);
+ if (!mask_definition->IsConstant()) {
+ // Not a constant.
+ return false;
+ }
ASSERT(mask_definition->IsConstant());
ConstantInstr* constant_instruction = mask_definition->AsConstant();
const Object& constant_mask = constant_instruction->value();
+ if (!constant_mask.IsSmi()) {
+ // Not a smi.
+ return false;
+ }
ASSERT(constant_mask.IsSmi());
mask = Smi::Cast(constant_mask).Value();
- ASSERT(mask >= 0);
- ASSERT(mask <= 255);
+ if (mask < 0 || mask > 255) {
+ // Not a valid mask.
+ return false;
+ }
}
Float32x4ShuffleInstr* instr = new Float32x4ShuffleInstr(
getter,
@@ -6372,6 +6410,17 @@
}
+void ConstantPropagator::VisitUnaryDoubleOp(UnaryDoubleOpInstr* instr) {
+ const Object& value = instr->value()->definition()->constant_value();
+ if (IsNonConstant(value)) {
+ SetValue(instr, non_constant_);
+ } else if (IsConstant(value)) {
+ // TODO(kmillikin): Handle unary operations.
+ SetValue(instr, non_constant_);
+ }
+}
+
+
void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
const Object& value = instr->value()->definition()->constant_value();
if (IsConstant(value) && value.IsInteger()) {
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index bbd7cd3..41e83b6 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -567,9 +567,6 @@
return false;
}
- // We should never test for an instance of null.
- ASSERT(!type.IsNullType());
-
// Consider the compile type of the value.
const AbstractType& compile_type = *ToAbstractType();
if (compile_type.IsMalformed()) {
@@ -981,6 +978,11 @@
}
+CompileType UnaryDoubleOpInstr::ComputeType() const {
+ return CompileType::FromCid(kDoubleCid);
+}
+
+
CompileType DoubleToSmiInstr::ComputeType() const {
return CompileType::FromCid(kSmiCid);
}
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 02880071..2aab9ba 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -783,6 +783,12 @@
}
+void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("%s, ", Token::Str(op_kind()));
+ value()->PrintTo(f);
+}
+
+
void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const {
value()->PrintTo(f);
PrintICData(f, unary_checks());
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index e71aba8..a3b7fc7 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -89,7 +89,7 @@
V(Float32x4, Float32x4., Float32x4Constructor, 1876089990) \
V(Float32x4, Float32x4.zero, Float32x4Zero, 1903586222) \
V(Float32x4, Float32x4.splat, Float32x4Splat, 38462589) \
- V(_Float32x4, _shuffle, Float32x4Shuffle, 2044955136) \
+ V(_Float32x4, shuffle, Float32x4Shuffle, 713523911) \
V(_Float32x4, get:x, Float32x4ShuffleX, 1019523296) \
V(_Float32x4, get:y, Float32x4ShuffleY, 710282243) \
V(_Float32x4, get:z, Float32x4ShuffleZ, 1612806041) \
@@ -581,6 +581,7 @@
M(CloneContext) \
M(BinarySmiOp) \
M(UnarySmiOp) \
+ M(UnaryDoubleOp) \
M(CheckStackOverflow) \
M(SmiToDouble) \
M(DoubleToInteger) \
@@ -920,6 +921,7 @@
friend class BinaryMintOpInstr;
friend class BinarySmiOpInstr;
friend class UnarySmiOpInstr;
+ friend class UnaryDoubleOpInstr;
friend class ShiftMintOpInstr;
friend class UnaryMintOpInstr;
friend class MathUnaryInstr;
@@ -4714,7 +4716,7 @@
: op_kind_(op_kind) {
SetInputAt(0, left);
SetInputAt(1, right);
- // Overrided generated deopt_id.
+ // Overriden generated deopt_id.
deopt_id_ = deopt_id;
}
@@ -6053,6 +6055,58 @@
};
+// Handles only NEGATE.
+class UnaryDoubleOpInstr : public TemplateDefinition<1> {
+ public:
+ UnaryDoubleOpInstr(Token::Kind op_kind,
+ Value* value,
+ intptr_t deopt_id)
+ : op_kind_(op_kind) {
+ ASSERT(op_kind == Token::kNEGATE);
+ SetInputAt(0, value);
+ // Overriden generated deopt_id.
+ deopt_id_ = deopt_id;
+ }
+
+ Value* value() const { return inputs_[0]; }
+ Token::Kind op_kind() const { return op_kind_; }
+
+ virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+ DECLARE_INSTRUCTION(UnaryDoubleOp)
+ virtual CompileType ComputeType() const;
+
+ virtual bool CanDeoptimize() const { return false; }
+
+ virtual intptr_t DeoptimizationTarget() const {
+ // Direct access since this instruction cannot deoptimize, and the deopt-id
+ // was inherited from another instruction that could deoptimize.
+ return deopt_id_;
+ }
+
+ virtual Representation representation() const {
+ return kUnboxedDouble;
+ }
+
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+ ASSERT(idx == 0);
+ return kUnboxedDouble;
+ }
+
+ virtual bool AllowsCSE() const { return true; }
+ virtual EffectSet Effects() const { return EffectSet::None(); }
+ virtual EffectSet Dependencies() const { return EffectSet::None(); }
+ virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+ virtual bool MayThrow() const { return false; }
+
+ private:
+ const Token::Kind op_kind_;
+
+ DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr);
+};
+
+
class CheckStackOverflowInstr : public TemplateInstruction<0> {
public:
CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth)
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index ffa5755..04edbc1 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -3779,6 +3779,24 @@
}
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const {
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_out(Location::RequiresFpuRegister());
+ return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ DRegister result = EvenDRegisterOf(locs()->out().fpu_reg());
+ DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
+ __ vnegd(result, value);
+}
+
+
LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 69e744c..412248c 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -3844,6 +3844,24 @@
}
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const {
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_out(Location::SameAsFirstInput());
+ return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ XmmRegister value = locs()->in(0).fpu_reg();
+ ASSERT(locs()->out().fpu_reg() == value);
+ __ DoubleNegate(value);
+}
+
+
LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 6740dbb..e84f418 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -3230,6 +3230,31 @@
}
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const {
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_out(Location::RequiresFpuRegister());
+ summary->set_temp(0, Location::RequiresFpuRegister());
+ return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ // TODO(zra): Implement vneg.
+ const Double& minus_one = Double::ZoneHandle(Double::NewCanonical(-1));
+ __ LoadObject(TMP, minus_one);
+ FpuRegister result = locs()->out().fpu_reg();
+ FpuRegister value = locs()->in(0).fpu_reg();
+ FpuRegister temp_fp = locs()->temp(0).fpu_reg();
+ __ LoadDFromOffset(temp_fp, TMP, Double::value_offset() - kHeapObjectTag);
+ __ muld(result, value, temp_fp);
+}
+
+
+
LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index a7303de..2a1a546 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -3776,6 +3776,48 @@
}
+void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register value = locs()->in(0).reg();
+ ASSERT(value == locs()->out().reg());
+ switch (op_kind()) {
+ case Token::kNEGATE: {
+ Label* deopt = compiler->AddDeoptStub(deopt_id(),
+ kDeoptUnaryOp);
+ __ negq(value);
+ __ j(OVERFLOW, deopt);
+ if (FLAG_throw_on_javascript_int_overflow) {
+ EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
+ }
+ break;
+ }
+ case Token::kBIT_NOT:
+ __ notq(value);
+ __ andq(value, Immediate(~kSmiTagMask)); // Remove inverted smi-tag.
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const {
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_out(Location::SameAsFirstInput());
+ return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ XmmRegister value = locs()->in(0).fpu_reg();
+ ASSERT(locs()->out().fpu_reg() == value);
+ __ DoubleNegate(value);
+}
+
+
LocationSummary* MathMinMaxInstr::MakeLocationSummary() const {
if (result_cid() == kDoubleCid) {
const intptr_t kNumInputs = 2;
@@ -3865,30 +3907,6 @@
}
-void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- Register value = locs()->in(0).reg();
- ASSERT(value == locs()->out().reg());
- switch (op_kind()) {
- case Token::kNEGATE: {
- Label* deopt = compiler->AddDeoptStub(deopt_id(),
- kDeoptUnaryOp);
- __ negq(value);
- __ j(OVERFLOW, deopt);
- if (FLAG_throw_on_javascript_int_overflow) {
- EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
- }
- break;
- }
- case Token::kBIT_NOT:
- __ notq(value);
- __ andq(value, Immediate(~kSmiTagMask)); // Remove inverted smi-tag.
- break;
- default:
- UNREACHABLE();
- }
-}
-
-
LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b92355e..ca2a64d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -417,8 +417,6 @@
// Allocate and initialize the null class.
cls = Class::New<Instance>(kNullCid);
- cls.set_is_finalized();
- cls.set_is_type_finalized();
isolate->object_store()->set_null_class(cls);
// Allocate and initialize the free list element class.
@@ -850,27 +848,6 @@
// well as the core implementation dictionary have been setup, preallocate
// remaining classes and register them by name in the dictionaries.
String& name = String::Handle();
- cls = Class::New<Bool>();
- object_store->set_bool_class(cls);
- RegisterClass(cls, Symbols::Bool(), core_lib);
- pending_classes.Add(cls, Heap::kOld);
-
- // TODO(12364): The class 'Null' is not registered in the class dictionary
- // because it is not exported by dart:core.
- cls = Class::New<Instance>(kNullCid);
- cls.set_name(Symbols::Null());
- // We immediately mark Null as finalized because it has no corresponding
- // source.
- cls.set_is_finalized();
- cls.set_is_type_finalized();
- object_store->set_null_class(cls);
- cls.set_library(core_lib); // A sort of fiction for the mirrors.
- // When/if we promote Null to an ordinary class, it should be added to the
- // core library, given source and added to the list of classes pending
- // finalization.
- // RegisterClass(cls, Symbols::Null(), core_lib);
- // pending_classes.Add(cls, Heap::kOld);
-
cls = object_store->array_class(); // Was allocated above.
RegisterPrivateClass(cls, Symbols::ObjectArray(), core_lib);
pending_classes.Add(cls, Heap::kOld);
@@ -938,6 +915,17 @@
type = Type::NewNonParameterizedType(cls);
object_store->set_object_type(type);
+ cls = Class::New<Bool>();
+ object_store->set_bool_class(cls);
+ RegisterClass(cls, Symbols::Bool(), core_lib);
+ pending_classes.Add(cls, Heap::kOld);
+
+ cls = Class::New<Instance>(kNullCid);
+ cls.set_is_prefinalized();
+ object_store->set_null_class(cls);
+ RegisterClass(cls, Symbols::Null(), core_lib);
+ pending_classes.Add(cls, Heap::kOld);
+
cls = object_store->type_class();
RegisterPrivateClass(cls, Symbols::Type(), core_lib);
pending_classes.Add(cls, Heap::kOld);
@@ -10476,14 +10464,14 @@
bool AbstractType::IsNullType() const {
- ASSERT(Type::Handle(Type::NullType()).IsCanonical());
- return raw() == Type::NullType();
+ return HasResolvedTypeClass() &&
+ (type_class() == Isolate::Current()->object_store()->null_class());
}
bool AbstractType::IsBoolType() const {
return HasResolvedTypeClass() &&
- (type_class() == Type::Handle(Type::BoolType()).type_class());
+ (type_class() == Isolate::Current()->object_store()->bool_class());
}
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index b7c4901..1150b81 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -26,14 +26,7 @@
const String& function_name,
const ArgumentsDescriptor& args_desc) {
// Figure out type of receiver first.
- Class& cls = Class::Handle();
- cls = receiver.clazz();
- // For lookups treat null as an instance of class Object.
- if (cls.IsNullClass()) {
- cls = Isolate::Current()->object_store()->object_class();
- }
- ASSERT(!cls.IsNull());
-
+ const Class& cls = Class::Handle(receiver.clazz());
return ResolveDynamicForReceiverClass(cls, function_name, args_desc);
}
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 3401be7..c5d9bb0 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -129,30 +129,69 @@
bool classNeedsRti(ClassElement cls);
bool methodNeedsRti(FunctionElement function);
- // The following methods are hooks for the backend to register its
- // helper methods.
+ /// Called during resolution to notify to the backend that a class is
+ /// being instantiated.
void registerInstantiatedClass(ClassElement cls,
Enqueuer enqueuer,
TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program uses string interpolation.
void registerStringInterpolation(TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program has a catch statement.
void registerCatchStatement(Enqueuer enqueuer,
TreeElements elements) {}
- void registerWrapException(TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program explicitly throws an exception.
void registerThrowExpression(TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program has a global variable with a lazy initializer.
void registerLazyField(TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program uses a type variable as an expression.
void registerTypeVariableExpression(TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program uses a type literal.
void registerTypeLiteral(Element element, TreeElements elements) {}
+
+ /// Called during resolution to notify to the backend that the
+ /// program has a catch statement with a stack trace.
void registerStackTraceInCatch(TreeElements elements) {}
+
+ /// Register an is check to the backend.
void registerIsCheck(DartType type,
Enqueuer enqueuer,
TreeElements elements) {}
+
+ /// Register an as check to the backend.
void registerAsCheck(DartType type, TreeElements elements) {}
+
+ /// Register that the application may throw a [NoSuchMethodError].
void registerThrowNoSuchMethod(TreeElements elements) {}
+
+ /// Register that the application may throw a [RuntimeError].
void registerThrowRuntimeError(TreeElements elements) {}
+
+ /// Register that the application may throw an
+ /// [AbstractClassInstantiationError].
void registerAbstractClassInstantiation(TreeElements elements) {}
+
+ /// Register that the application may throw a [FallThroughError].
void registerFallThroughError(TreeElements elements) {}
+
+ /// Register that a super call will end up calling
+ /// [: super.noSuchMethod :].
void registerSuperNoSuchMethod(TreeElements elements) {}
+
+ /// Register that the application creates a constant map.
void registerConstantMap(TreeElements elements) {}
+
/**
* Call this to register that an instantiated generic class has a call
* method.
@@ -222,6 +261,12 @@
/// Returns true if this element should be retained for reflection even if it
/// would normally be tree-shaken away.
bool isNeededForReflection(Element element) => false;
+
+ /// Returns true if global optimizations such as type inferencing
+ /// can apply to this element. One category of elements that do not
+ /// apply is runtime helpers that the backend calls, but the
+ /// optimizations don't see those calls.
+ bool canBeUsedForGlobalOptimizations(Element element) => true;
}
/**
@@ -780,6 +825,7 @@
listClass = lookupCoreClass('List');
typeClass = lookupCoreClass('Type');
mapClass = lookupCoreClass('Map');
+ nullClass = lookupCoreClass('Null');
stackTraceClass = lookupCoreClass('StackTrace');
if (!missingCoreClasses.isEmpty) {
internalErrorOnElement(coreLibrary,
@@ -804,7 +850,6 @@
boundClosureClass = lookupHelperClass('BoundClosure');
closureClass = lookupHelperClass('Closure');
dynamicClass = lookupHelperClass('Dynamic_');
- nullClass = lookupHelperClass('Null');
if (!missingHelperClasses.isEmpty) {
internalErrorOnElement(jsHelperLibrary,
'dart:_js_helper library does not contain required classes: '
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 235a943..65a4c56 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -332,6 +332,12 @@
&& (identical(element.kind, ElementKind.FUNCTION));
}
+ static bool isNativeOrExtendsNative(ClassElement element) {
+ if (element == null) return false;
+ if (element.isNative()) return true;
+ return isNativeOrExtendsNative(element.superclass);
+ }
+
static bool isInstanceSend(Send send, TreeElements elements) {
Element element = elements[send];
if (element == null) return !isClosureSend(send, element);
@@ -358,7 +364,7 @@
return new SourceString(reconstructConstructorName(element));
}
}
-
+
// TODO(johnniwinther): Remove this method.
static String reconstructConstructorName(Element element) {
String className = element.getEnclosingClass().name.slowToString();
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 3bdbe46..3ab0a44 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -1419,16 +1419,17 @@
FunctionElement get targetConstructor => superMember;
FunctionSignature computeSignature(compiler) {
+ if (functionSignature != null) return functionSignature;
if (isDefaultConstructor) {
- return new FunctionSignatureX(
+ return functionSignature = new FunctionSignatureX(
const Link<Element>(), const Link<Element>(), 0, 0, false,
getEnclosingClass().thisType);
}
if (superMember.isErroneous()) {
- return compiler.objectClass.localLookup(
+ return functionSignature = compiler.objectClass.localLookup(
const SourceString('')).computeSignature(compiler);
}
- return superMember.computeSignature(compiler);
+ return functionSignature = superMember.computeSignature(compiler);
}
get declaration => this;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index c4b8f52..ee46294 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -201,6 +201,14 @@
Element getInterceptorMethod;
Element interceptedNames;
+ /**
+ * This element is a top-level variable (in generated output) that the
+ * compiler initializes to a datastructure used to map from a Type to the
+ * interceptor. See declaration of `mapTypeToInterceptor` in
+ * `interceptors.dart`.
+ */
+ Element mapTypeToInterceptor;
+
HType stringType;
HType indexablePrimitiveType;
HType readableArrayType;
@@ -333,6 +341,9 @@
/// element must be retained.
final Set<Element> metaTargetsUsed = new Set<Element>();
+ /// List of elements that the backend may use.
+ final Set<Element> helpersUsed = new Set<Element>();
+
JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
: namer = determineNamer(compiler),
oneShotInterceptors = new Map<String, Selector>(),
@@ -354,9 +365,16 @@
new Namer(compiler);
}
+ bool canBeUsedForGlobalOptimizations(Element element) {
+ if (element.isParameter() || element.isFieldParameter()) {
+ element = element.enclosingElement;
+ }
+ return !helpersUsed.contains(element.declaration);
+ }
+
bool isInterceptorClass(ClassElement element) {
if (element == null) return false;
- if (element.isNative()) return true;
+ if (Elements.isNativeOrExtendsNative(element)) return true;
if (interceptedClasses.contains(element)) return true;
if (classesMixedIntoNativeClasses.contains(element)) return true;
return false;
@@ -412,7 +430,7 @@
Set<ClassElement> result = new Set<ClassElement>();
for (Element element in intercepted) {
ClassElement classElement = element.getEnclosingClass();
- if (classElement.isNative()
+ if (Elements.isNativeOrExtendsNative(classElement)
|| interceptedClasses.contains(classElement)) {
result.add(classElement);
}
@@ -434,7 +452,7 @@
Iterable<ClassElement> subclasses = compiler.world.subclassesOf(use);
if (subclasses != null) {
for (ClassElement subclass in subclasses) {
- if (subclass.isNative()) {
+ if (Elements.isNativeOrExtendsNative(subclass)) {
if (result == null) result = new Set<ClassElement>();
result.add(subclass);
}
@@ -454,6 +472,8 @@
compiler.findInterceptor(const SourceString('getInterceptor'));
interceptedNames =
compiler.findInterceptor(const SourceString('interceptedNames'));
+ mapTypeToInterceptor =
+ compiler.findInterceptor(const SourceString('mapTypeToInterceptor'));
dispatchPropertyName =
compiler.findInterceptor(const SourceString('dispatchPropertyName'));
getDispatchPropertyMethod =
@@ -594,7 +614,7 @@
member.name, () => new Set<Element>());
set.add(member);
if (classElement == jsInterceptorClass) return;
- if (!classElement.isNative()) {
+ if (classElement.isMixinApplication) {
MixinApplicationElement mixinApplication = classElement;
assert(member.getEnclosingClass() == mixinApplication.mixin);
classesMixedIntoNativeClasses.add(mixinApplication.mixin);
@@ -703,7 +723,7 @@
addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements);
} else if (cls == jsUnknownJavaScriptObjectClass) {
addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements);
- } else if (cls.isNative()) {
+ } else if (Elements.isNativeOrExtendsNative(cls)) {
addInterceptorsForNativeClassMembers(cls, enqueuer);
}
}
@@ -741,7 +761,7 @@
// TODO(ngeoffray): Should we have the resolver register those instead?
Element e =
compiler.findHelper(const SourceString('boolConversionCheck'));
- if (e != null) world.addToWorkList(e);
+ if (e != null) enqueue(world, e, elements);
}
}
@@ -762,11 +782,11 @@
ensure(jsUnknownJavaScriptObjectClass);
}
- void registerWrapException(TreeElements elements) {
- enqueueInResolution(getWrapExceptionHelper(), elements);
- }
-
void registerThrowExpression(TreeElements elements) {
+ // We don't know ahead of time whether we will need the throw in a
+ // statement context or an expression context, so we register both
+ // here, even though we may not need the throwExpression helper.
+ enqueueInResolution(getWrapExceptionHelper(), elements);
enqueueInResolution(getThrowExpressionHelper(), elements);
}
@@ -845,10 +865,10 @@
// need to register checked mode helpers.
if (inCheckedMode) {
CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
- if (helper != null) world.addToWorkList(helper.getElement(compiler));
+ if (helper != null) enqueue(world, helper.getElement(compiler), elements);
// We also need the native variant of the check (for DOM types).
helper = getNativeCheckedModeHelper(type, typeCast: false);
- if (helper != null) world.addToWorkList(helper.getElement(compiler));
+ if (helper != null) enqueue(world, helper.getElement(compiler), elements);
}
bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE;
if (!type.isRaw || type.containsTypeVariables) {
@@ -874,8 +894,9 @@
// We will neeed to add the "$is" and "$as" properties on the
// JavaScript object prototype, so we make sure
// [:defineProperty:] is compiled.
- world.addToWorkList(
- compiler.findHelper(const SourceString('defineProperty')));
+ enqueue(world,
+ compiler.findHelper(const SourceString('defineProperty')),
+ elements);
}
}
@@ -892,14 +913,25 @@
void registerThrowNoSuchMethod(TreeElements elements) {
enqueueInResolution(getThrowNoSuchMethod(), elements);
+ // Also register the types of the arguments passed to this method.
+ compiler.enqueuer.resolution.registerInstantiatedClass(
+ compiler.listClass, elements);
+ compiler.enqueuer.resolution.registerInstantiatedClass(
+ compiler.stringClass, elements);
}
void registerThrowRuntimeError(TreeElements elements) {
enqueueInResolution(getThrowRuntimeError(), elements);
+ // Also register the types of the arguments passed to this method.
+ compiler.enqueuer.resolution.registerInstantiatedClass(
+ compiler.stringClass, elements);
}
void registerAbstractClassInstantiation(TreeElements elements) {
enqueueInResolution(getThrowAbstractClassInstantiationError(), elements);
+ // Also register the types of the arguments passed to this method.
+ compiler.enqueuer.resolution.registerInstantiatedClass(
+ compiler.stringClass, elements);
}
void registerFallThroughError(TreeElements elements) {
@@ -976,7 +1008,15 @@
compiler.enabledRuntimeType;
}
+ // Enqueue [e] in [enqueuer].
+ //
+ // The backend must *always* call this method when enqueuing an
+ // element. Calls done by the backend are not seen by global
+ // optimizations, so they would make these optimizations unsound.
+ // Therefore we need to collect the list of helpers the backend may
+ // use.
void enqueue(Enqueuer enqueuer, Element e, TreeElements elements) {
+ helpersUsed.add(e.declaration);
enqueuer.addToWorkList(e);
elements.registerDependency(e);
}
@@ -1329,19 +1369,6 @@
return compiler.findHelper(const SourceString("throwCyclicInit"));
}
- /**
- * Remove [element] from the set of generated code, and put it back
- * into the worklist.
- *
- * Invariant: [element] must be a declaration element.
- */
- void eagerRecompile(Element element) {
- assert(invariant(element, element.isDeclaration));
- generatedCode.remove(element);
- generatedBailoutCode.remove(element);
- compiler.enqueuer.codegen.addToWorkList(element);
- }
-
bool isNullImplementation(ClassElement cls) {
return cls == jsNullClass;
}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 32d3ab8..965822e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1296,6 +1296,8 @@
/// O is the named arguments.
/// The reflection name of a constructor is similar to a regular method but
/// starts with 'new '.
+ /// The reflection name of class 'C' is 'C'.
+ /// An anonymous mixin application has no reflection name.
/// This is used by js_mirrors.dart.
String getReflectionName(elementOrSelector, String mangledName) {
SourceString name = elementOrSelector.name;
@@ -1982,7 +1984,11 @@
buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
if (backend.shouldRetainName(classElement.name)) {
String reflectionName = getReflectionName(classElement, className);
- buffer.write(',$n$n"+$reflectionName": 0');
+ List<int> interfaces = <int>[];
+ for (DartType interface in classElement.interfaces) {
+ interfaces.add(reifyType(interface));
+ }
+ buffer.write(',$n$n"+$reflectionName": $interfaces');
}
}
@@ -2631,6 +2637,8 @@
for (Element element in Elements.sortedByPosition(staticNonFinalFields)) {
// [:interceptedNames:] is handled in [emitInterceptedNames].
if (element == backend.interceptedNames) continue;
+ // `mapTypeToInterceptor` is handled in [emitMapTypeToInterceptor].
+ if (element == backend.mapTypeToInterceptor) continue;
compiler.withCurrentElement(element, () {
Constant initialValue = handler.getInitialValueFor(element);
jsAst.Expression init =
@@ -2984,7 +2992,7 @@
}
var scripts = document.scripts;
- function onLoad() {
+ function onLoad(event) {
for (var i = 0; i < scripts.length; ++i) {
scripts[i].removeEventListener('load', onLoad, false);
}
@@ -3008,8 +3016,7 @@
} else {
${mainCall};
}
-});
-""");
+})$N""");
addComment('END invoke [main].', buffer);
}
@@ -3056,6 +3063,9 @@
bool hasNumber = false;
bool hasString = false;
bool hasNative = false;
+ bool anyNativeClasses = compiler.enqueuer.codegen.nativeEnqueuer
+ .hasInstantiatedNativeClasses();
+
for (ClassElement cls in classes) {
if (cls == backend.jsArrayClass ||
cls == backend.jsMutableArrayClass ||
@@ -3068,10 +3078,18 @@
else if (cls == backend.jsNumberClass) hasNumber = true;
else if (cls == backend.jsStringClass) hasString = true;
else {
- // TODO(sra): The set of classes includes classes mixed-in to
- // interceptor classes.
- // assert(cls == compiler.objectClass || cls.isNative());
- if (cls.isNative()) hasNative = true;
+ // The set of classes includes classes mixed-in to interceptor classes
+ // and user extensions of native classes.
+ //
+ // The set of classes also includes the 'primitive' interceptor
+ // PlainJavaScriptObject even when it has not been resolved, since it is
+ // only resolved through the reference in getNativeInterceptor when
+ // getNativeInterceptor is marked as used. Guard against probing
+ // unresolved PlainJavaScriptObject by testing for anyNativeClasses.
+
+ if (anyNativeClasses) {
+ if (Elements.isNativeOrExtendsNative(cls)) hasNative = true;
+ }
}
}
if (hasDouble) {
@@ -3081,8 +3099,7 @@
if (classes == backend.interceptedClasses) {
// I.e. this is the general interceptor.
- hasNative = compiler.enqueuer.codegen.nativeEnqueuer
- .hasInstantiatedNativeClasses();
+ hasNative = anyNativeClasses;
}
jsAst.Block block = new jsAst.Block.empty();
@@ -3245,9 +3262,13 @@
for (ClassElement element in sortedClasses) {
if (rtiNeededClasses.contains(element)) {
regularClasses.add(element);
- } else if (element.isNative()) {
- // For now, native classes cannot be deferred.
+ } else if (Elements.isNativeOrExtendsNative(element)) {
+ // For now, native classes and related classes cannot be deferred.
nativeClasses.add(element);
+ if (!element.isNative()) {
+ assert(invariant(element, !isDeferred(element)));
+ regularClasses.add(element);
+ }
} else if (isDeferred(element)) {
deferredClasses.add(element);
} else {
@@ -3305,8 +3326,10 @@
return rtiNeededClasses;
}
- // Optimize performance critical one shot interceptors.
- jsAst.Statement tryOptimizeOneShotInterceptor(Selector selector,
+ // Returns a statement that takes care of performance critical
+ // common case for a one-shot interceptor, or null if there is no
+ // fast path.
+ jsAst.Statement fastPathForOneShotInterceptor(Selector selector,
Set<ClassElement> classes) {
jsAst.Expression isNumber(String variable) {
return js('typeof $variable == "number"');
@@ -3329,11 +3352,10 @@
String name = selector.name.stringValue;
if (name == '==') {
// Unfolds to:
- // [: if (receiver == null) return a0 == null;
+ // if (receiver == null) return a0 == null;
// if (typeof receiver != 'object') {
// return a0 != null && receiver === a0;
// }
- // :].
List<jsAst.Statement> body = <jsAst.Statement>[];
body.add(js.if_('receiver == null', js.return_(js('a0 == null'))));
body.add(js.if_(
@@ -3349,23 +3371,21 @@
if (selector.argumentCount == 1) {
// The following operators do not map to a JavaScript
// operator.
- if (name != '~/' && name != '<<' && name != '%' && name != '>>') {
- jsAst.Expression result = js('receiver').binary(name, js('a0'));
- if (name == '&' || name == '|' || name == '^') {
- result = tripleShiftZero(result);
- }
- // Unfolds to:
- // [: if (typeof receiver == "number" && typeof a0 == "number")
- // return receiver op a0;
- // :].
- return js.if_(
- isNumber('receiver').binary('&&', isNumber('a0')),
- js.return_(result));
+ if (name == '~/' || name == '<<' || name == '%' || name == '>>') {
+ return null;
}
- } else if (name == 'unary-') {
- // operator~ does not map to a JavaScript operator.
+ jsAst.Expression result = js('receiver').binary(name, js('a0'));
+ if (name == '&' || name == '|' || name == '^') {
+ result = tripleShiftZero(result);
+ }
// Unfolds to:
- // [: if (typeof receiver == "number") return -receiver:].
+ // if (typeof receiver == "number" && typeof a0 == "number")
+ // return receiver op a0;
+ return js.if_(
+ isNumber('receiver').binary('&&', isNumber('a0')),
+ js.return_(result));
+ } else if (name == 'unary-') {
+ // [: if (typeof receiver == "number") return -receiver :].
return js.if_(isNumber('receiver'),
js.return_(js('-receiver')));
} else {
@@ -3376,21 +3396,19 @@
} else if (selector.isIndex() || selector.isIndexSet()) {
// For an index operation, this code generates:
//
- // [: if (receiver.constructor == Array || typeof receiver == "string") {
+ // if (receiver.constructor == Array || typeof receiver == "string") {
// if (a0 >>> 0 === a0 && a0 < receiver.length) {
// return receiver[a0];
// }
// }
- // :]
//
// For an index set operation, this code generates:
//
- // [: if (receiver.constructor == Array && !receiver.immutable$list) {
+ // if (receiver.constructor == Array && !receiver.immutable$list) {
// if (a0 >>> 0 === a0 && a0 < receiver.length) {
// return receiver[a0] = a1;
// }
// }
- // :]
bool containsArray = classes.contains(backend.jsArrayClass);
bool containsString = classes.contains(backend.jsStringClass);
// The index set operator requires a check on its set value in
@@ -3463,7 +3481,7 @@
List<jsAst.Statement> body = <jsAst.Statement>[];
jsAst.Statement optimizedPath =
- tryOptimizeOneShotInterceptor(selector, classes);
+ fastPathForOneShotInterceptor(selector, classes);
if (optimizedPath != null) {
body.add(optimizedPath);
}
@@ -3511,6 +3529,37 @@
buffer.write(N);
}
+ /**
+ * Emit initializer for [mapTypeToInterceptor] data structure used by
+ * [findInterceptorForType]. See declaration of [mapTypeToInterceptor] in
+ * `interceptors.dart`.
+ */
+ void emitMapTypeToInterceptor(CodeBuffer buffer) {
+ // TODO(sra): Perhaps inject a constant instead?
+ // TODO(sra): Filter by subclasses of native types.
+ List<jsAst.Expression> elements = <jsAst.Expression>[];
+ ConstantHandler handler = compiler.constantHandler;
+ List<Constant> constants = handler.getConstantsForEmission();
+ for (Constant constant in constants) {
+ if (constant is TypeConstant) {
+ TypeConstant typeConstant = constant;
+ Element element = typeConstant.representedType.element;
+ if (element is ClassElement) {
+ ClassElement classElement = element;
+ elements.add(backend.emitter.constantReference(constant));
+ elements.add(js(namer.isolateAccess(classElement)));
+ }
+ }
+ }
+
+ jsAst.ArrayInitializer array = new jsAst.ArrayInitializer.from(elements);
+ String name = backend.namer.getName(backend.mapTypeToInterceptor);
+ jsAst.Expression assignment = js('$isolateProperties.$name = #', array);
+
+ buffer.write(jsAst.prettyPrint(assignment, compiler));
+ buffer.write(N);
+ }
+
void emitInitFunction(CodeBuffer buffer) {
jsAst.Fun fun = js.fun([], [
js('$isolateProperties = {}'),
@@ -3587,7 +3636,7 @@
if (!backend.retainMetadataOf(element)) return code;
return compiler.withCurrentElement(element, () {
List<int> metadata = <int>[];
- FunctionSignature signature = element.computeSignature(compiler);
+ FunctionSignature signature = element.functionSignature;
if (element.isConstructor()) {
metadata.add(reifyType(element.getEnclosingClass().thisType));
} else {
@@ -3843,6 +3892,7 @@
emitStaticNonFinalFieldInitializations(mainBuffer);
emitOneShotInterceptors(mainBuffer);
emitInterceptedNames(mainBuffer);
+ emitMapTypeToInterceptor(mainBuffer);
emitLazilyInitializedStaticFields(mainBuffer);
mainBuffer.add(nativeBuffer);
@@ -4013,10 +4063,17 @@
String metadataField = '"${namer.metadataField}"';
return '''
(function (reflectionData) {
+'''
+// [map] returns an object literal that V8 shouldn't try to optimize with a
+// hidden class. This prevents a potential performance problem where V8 tries
+// to build a hidden class for an object used as a hashMap.
+'''
+ function map(x){x={x:x};delete x.x;return x}
if (!init.libraries) init.libraries = [];
- if (!init.mangledNames) init.mangledNames = {};
- if (!init.mangledGlobalNames) init.mangledGlobalNames = {};
- if (!init.statics) init.statics = {};
+ if (!init.mangledNames) init.mangledNames = map();
+ if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
+ if (!init.statics) init.statics = map();
+ if (!init.interfaces) init.interfaces = map();
var libraries = init.libraries;
var mangledNames = init.mangledNames;
var mangledGlobalNames = init.mangledGlobalNames;
@@ -4052,6 +4109,8 @@
var previousProperty;
if (firstChar === "+") {
mangledGlobalNames[previousProperty] = property.substring(1);
+ if (element && element.length) ''' // Breaking long line.
+'''init.interfaces[previousProperty] = element;
} else if (firstChar === "@") {
property = property.substring(1);
${namer.CURRENT_ISOLATE}[property][$metadataField] = element;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 7d14262..7a6e6f3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -569,11 +569,11 @@
return cls.name.slowToString();
}
List<String> names = classes
- .where((cls) => !cls.isNative())
+ .where((cls) => !Elements.isNativeOrExtendsNative(cls))
.map(abbreviate)
.toList();
// There is one dispatch mechanism for all native classes.
- if (classes.any((cls) => cls.isNative())) {
+ if (classes.any((cls) => Elements.isNativeOrExtendsNative(cls))) {
names.add("x");
}
// Sort the names of the classes after abbreviating them to ensure
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 53fc608..9b3ac22 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -93,6 +93,12 @@
return backend.namer.isolateAccess(element);
}
+ String get defineNativeMethodsExtendedName {
+ Element element = compiler.findHelper(
+ const SourceString('defineNativeMethodsExtended'));
+ return backend.namer.isolateAccess(element);
+ }
+
String get defineNativeMethodsFinishName {
Element element = compiler.findHelper(
const SourceString('defineNativeMethodsFinish'));
@@ -118,6 +124,10 @@
* benefit), due to how [getNativeInterceptor] works. Finding the interceptor
* of a leaf class in the hierarchy is more efficient that a non-leaf, so it
* improves performance when more classes can be treated as leaves.
+ *
+ * [classes] contains native classes, mixin applications, and user subclasses
+ * of native classes. ONLY the native classes are generated here. [classes]
+ * is sorted in desired output order.
*/
void generateNativeClasses(List<ClassElement> classes,
CodeBuffer mainBuffer) {
@@ -127,8 +137,10 @@
List<ClassElement> preOrder = <ClassElement>[];
Set<ClassElement> seen = new Set<ClassElement>();
+ seen..add(compiler.objectClass)
+ ..add(backend.jsInterceptorClass);
void walk(ClassElement element) {
- if (seen.contains(element) || element == compiler.objectClass) return;
+ if (seen.contains(element)) return;
seen.add(element);
walk(element.superclass);
preOrder.add(element);
@@ -140,8 +152,10 @@
Map<ClassElement, ClassBuilder> builders =
new Map<ClassElement, ClassBuilder>();
for (ClassElement classElement in classes) {
- ClassBuilder builder = generateNativeClass(classElement);
- builders[classElement] = builder;
+ if (classElement.isNative()) {
+ ClassBuilder builder = generateNativeClass(classElement);
+ builders[classElement] = builder;
+ }
}
// Find which classes are needed and which are non-leaf classes. Any class
@@ -150,6 +164,10 @@
Set<ClassElement> neededClasses = new Set<ClassElement>();
Set<ClassElement> nonleafClasses = new Set<ClassElement>();
+
+ Map<ClassElement, List<ClassElement>> extensionPoints =
+ computeExtensionPoints(preOrder);
+
neededClasses.add(compiler.objectClass);
Set<ClassElement> neededByConstant =
@@ -176,6 +194,8 @@
// TODO(9556): Remove this test when [emitRuntimeTypeSupport] no longer
// adds information to a class prototype or constructor.
needed = true;
+ } else if (extensionPoints.containsKey(classElement)) {
+ needed = true;
}
if (needed || neededClasses.contains(classElement)) {
@@ -185,7 +205,7 @@
}
}
- // Collect all the tags that map to each class.
+ // Collect all the tags that map to each native class.
Map<ClassElement, Set<String>> leafTags =
new Map<ClassElement, Set<String>>();
@@ -193,9 +213,11 @@
new Map<ClassElement, Set<String>>();
for (ClassElement classElement in classes) {
+ if (!classElement.isNative()) continue;
List<String> nativeTags = nativeTagsOfClass(classElement);
- if (nonleafClasses.contains(classElement)) {
+ if (nonleafClasses.contains(classElement) ||
+ extensionPoints.containsKey(classElement)) {
nonleafTags
.putIfAbsent(classElement, () => new Set<String>())
.addAll(nativeTags);
@@ -218,10 +240,19 @@
if (compiler.enqueuer.codegen.nativeEnqueuer
.hasInstantiatedNativeClasses()) {
void generateDefines(ClassElement classElement) {
- generateDefineNativeMethods(leafTags[classElement], classElement,
- defineNativeMethodsName);
- generateDefineNativeMethods(nonleafTags[classElement], classElement,
- defineNativeMethodsNonleafName);
+ generateDefineNativeMethods(leafTags[classElement],
+ null,
+ classElement, defineNativeMethodsName);
+ List<ClassElement> extensions = extensionPoints[classElement];
+ if (extensions == null) {
+ generateDefineNativeMethods(nonleafTags[classElement],
+ null,
+ classElement, defineNativeMethodsNonleafName);
+ } else {
+ generateDefineNativeMethods(nonleafTags[classElement],
+ makeSubclassList(extensions),
+ classElement, defineNativeMethodsExtendedName);
+ }
}
generateDefines(backend.jsInterceptorClass);
for (ClassElement classElement in classes) {
@@ -231,6 +262,7 @@
// Emit the native class interceptors that were actually used.
for (ClassElement classElement in classes) {
+ if (!classElement.isNative()) continue;
if (neededClasses.contains(classElement)) {
// Define interceptor class for [classElement].
emitter.emitClassBuilderWithReflectionData(
@@ -242,6 +274,38 @@
}
}
+ /**
+ * Computes the native classes that are extended (subclassed) by non-native
+ * classes and the set non-mative classes that extend them. (A List is used
+ * instead of a Set for out stability).
+ */
+ Map<ClassElement, List<ClassElement>> computeExtensionPoints(
+ List<ClassElement> classes) {
+ ClassElement nativeSuperclassOf(ClassElement element) {
+ if (element == null) return null;
+ if (element.isNative()) return element;
+ return nativeSuperclassOf(element.superclass);
+ }
+
+ ClassElement nativeAncestorOf(ClassElement element) {
+ return nativeSuperclassOf(element.superclass);
+ }
+
+ Map<ClassElement, List<ClassElement>> map =
+ new Map<ClassElement, List<ClassElement>>();
+
+ for (ClassElement classElement in classes) {
+ if (classElement.isNative()) continue;
+ ClassElement nativeAncestor = nativeAncestorOf(classElement);
+ if (nativeAncestor != null) {
+ map
+ .putIfAbsent(nativeAncestor, () => <ClassElement>[])
+ .add(classElement);
+ }
+ }
+ return map;
+ }
+
ClassBuilder generateNativeClass(ClassElement classElement) {
assert(!classElement.hasBackendMembers);
nativeClasses.add(classElement);
@@ -249,6 +313,7 @@
ClassElement superclass = classElement.superclass;
assert(superclass != null);
// Fix superclass. TODO(sra): make native classes inherit from Interceptor.
+ assert(superclass != compiler.objectClass);
if (superclass == compiler.objectClass) {
superclass = backend.jsInterceptorClass;
}
@@ -275,18 +340,28 @@
}
void generateDefineNativeMethods(
- Set<String> tags, ClassElement classElement, String definer) {
+ Set<String> tags, jsAst.Expression extraArgument,
+ ClassElement classElement, String definer) {
if (tags == null) return;
String tagsString = (tags.toList()..sort()).join('|');
- jsAst.Expression definition =
- js(definer)(
- [js.string(tagsString),
- js(backend.namer.isolateAccess(classElement))]);
+
+ List arguments = [
+ js.string(tagsString),
+ js(backend.namer.isolateAccess(classElement))];
+ if (extraArgument != null) {
+ arguments.add(extraArgument);
+ }
+ jsAst.Expression definition = js(definer)(arguments);
nativeBuffer.add(jsAst.prettyPrint(definition, compiler));
nativeBuffer.add('$N$n');
}
+ jsAst.Expression makeSubclassList(List<ClassElement> classes) {
+ return new jsAst.ArrayInitializer.from(
+ classes.map((ClassElement classElement) =>
+ js(backend.namer.isolateAccess(classElement))));
+ }
void finishGenerateNativeClasses() {
// TODO(sra): Put specialized version of getNativeMethods on
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 2910563..74b6e56 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -90,11 +90,12 @@
return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)];
} else if (element is AbstractFieldElement) {
var members = <Dart2JsMemberMirror>[];
- if (element.getter != null) {
- members.add(new Dart2JsMethodMirror(library, element.getter));
+ AbstractFieldElement field = element;
+ if (field.getter != null) {
+ members.add(new Dart2JsMethodMirror(library, field.getter));
}
- if (element.setter != null) {
- members.add(new Dart2JsMethodMirror(library, element.setter));
+ if (field.setter != null) {
+ members.add(new Dart2JsMethodMirror(library, field.setter));
}
return members;
}
@@ -882,7 +883,7 @@
return _typeVariables;
}
- bool operator ==(Object other) {
+ bool operator ==(other) {
if (identical(this, other)) {
return true;
}
@@ -1138,7 +1139,7 @@
// TODO(johnniwinther): Substitute type arguments for type variables.
Map<String, VariableMirror> get variables => originalDeclaration.variables;
- bool operator ==(Object other) {
+ bool operator ==(other) {
if (identical(this, other)) {
return true;
}
@@ -1257,7 +1258,7 @@
bool get isVoid => true;
- bool operator ==(Object other) {
+ bool operator ==(other) {
if (identical(this, other)) {
return true;
}
@@ -1289,7 +1290,7 @@
bool get isDynamic => true;
- bool operator ==(Object other) {
+ bool operator ==(other) {
if (identical(this, other)) {
return true;
}
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 182a83f..81fcc90 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -105,7 +105,8 @@
if (owner is LibraryMirror) {
return owner;
} else if (owner is TypeMirror) {
- return owner.library;
+ TypeMirror mirror = owner;
+ return mirror.library;
}
throw new Exception('Unexpected owner: ${owner}');
}
@@ -250,16 +251,19 @@
DeclarationMirror _lookupLocal(Mirror mirror, String id) {
DeclarationMirror result;
if (mirror is ContainerMirror) {
+ ContainerMirror containerMirror = mirror;
// Try member lookup.
- result = mirror.members[id];
+ result = containerMirror.members[id];
}
if (result != null) return result;
if (mirror is ClassMirror) {
+ ClassMirror classMirror = mirror;
// Try type variables.
- result = mirror.typeVariables.firstWhere(
+ result = classMirror.typeVariables.firstWhere(
(TypeVariableMirror v) => v.simpleName == id, orElse: () => null);
} else if (mirror is MethodMirror) {
- result = mirror.parameters.firstWhere(
+ MethodMirror methodMirror = mirror;
+ result = methodMirror.parameters.firstWhere(
(ParameterMirror p) => p.simpleName == id, orElse: () => null);
}
return result;
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index ed7fb1f..724383c 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -86,6 +86,11 @@
bool hasInstantiatedNativeClasses() => !registeredClasses.isEmpty;
+ final Set<ClassElement> nativeClassesAndSubclasses = new Set<ClassElement>();
+
+ final Map<ClassElement, Set<ClassElement>> nonNativeSubclasses =
+ new Map<ClassElement, Set<ClassElement>>();
+
/**
* Records matched constraints ([SpecialType] or [DartType]). Once a type
* constraint has been matched, there is no need to match it again.
@@ -115,6 +120,9 @@
void processNativeClasses(Iterable<LibraryElement> libraries) {
libraries.forEach(processNativeClassesInLibrary);
processNativeClassesInLibrary(compiler.isolateHelperLibrary);
+
+ processSubclassesOfNativeClasses(libraries);
+
if (!enableLiveTypeAnalysis) {
nativeClasses.forEach((c) => enqueueClass(c, 'forced'));
flushQueue();
@@ -137,6 +145,124 @@
classElement.ensureResolved(compiler);
}
+ void processSubclassesOfNativeClasses(Iterable<LibraryElement> libraries) {
+ // Collect potential subclasses, e.g.
+ //
+ // class B extends foo.A {}
+ //
+ // SourceString "A" has a potential subclass B.
+
+ var potentialExtends = new Map<SourceString, Set<ClassElement>>();
+
+ libraries.forEach((library) {
+ library.implementation.forEachLocalMember((element) {
+ if (element.isClass()) {
+ SourceString name = element.name;
+ SourceString extendsName = findExtendsNameOfClass(element);
+ if (extendsName != null) {
+ Set<ClassElement> potentialSubclasses =
+ potentialExtends.putIfAbsent(
+ extendsName,
+ () => new Set<ClassElement>());
+ potentialSubclasses.add(element);
+ }
+ }
+ });
+ });
+
+ // Resolve all the native classes and any classes that might extend them in
+ // [potentialExtends], and then check that the properly resolved class is in
+ // fact a subclass of a native class.
+
+ ClassElement nativeSuperclassOf(ClassElement classElement) {
+ if (classElement.isNative()) return classElement;
+ if (classElement.superclass == null) return null;
+ return nativeSuperclassOf(classElement.superclass);
+ }
+
+ void walkPotentialSubclasses(ClassElement element) {
+ if (nativeClassesAndSubclasses.contains(element)) return;
+ element.ensureResolved(compiler);
+ ClassElement nativeSuperclass = nativeSuperclassOf(element);
+ if (nativeSuperclass != null) {
+ nativeClassesAndSubclasses.add(element);
+ if (!element.isNative()) {
+ nonNativeSubclasses.putIfAbsent(nativeSuperclass,
+ () => new Set<ClassElement>())
+ .add(element);
+ }
+ Set<ClassElement> potentialSubclasses = potentialExtends[element.name];
+ if (potentialSubclasses != null) {
+ potentialSubclasses.forEach(walkPotentialSubclasses);
+ }
+ }
+ }
+
+ nativeClasses.forEach(walkPotentialSubclasses);
+
+ nativeClasses.addAll(nativeClassesAndSubclasses);
+ unusedClasses.addAll(nativeClassesAndSubclasses);
+ }
+
+ /**
+ * Returns the source string of the class named in the extends clause, or
+ * `null` if there is no extends clause.
+ */
+ SourceString findExtendsNameOfClass(ClassElement classElement) {
+ // "class B extends A ... {}" --> "A"
+ // "class B extends foo.A ... {}" --> "A"
+ // "class B<T> extends foo.A<T,T> with M1, M2 ... {}" --> "A"
+
+ // We want to avoid calling classElement.parseNode on every class. Doing so
+ // will slightly increase parse time and size and cause compiler errors and
+ // warnings to me emitted in more unused code.
+
+ // An alternative to this code is to extend the API of ClassElement to
+ // expose the name of the extended element.
+
+ // Pattern match the above cases in the token stream.
+ // [abstract] class X extends [id.]* id
+
+ Token skipTypeParameters(Token token) {
+ BeginGroupToken beginGroupToken = token;
+ Token endToken = beginGroupToken.endGroup;
+ return endToken.next;
+ //for (;;) {
+ // token = token.next;
+ // if (token.stringValue == '>') return token.next;
+ // if (token.stringValue == '<') return skipTypeParameters(token);
+ //}
+ }
+
+ SourceString scanForExtendsName(Token token) {
+ if (token.stringValue == 'abstract') token = token.next;
+ if (token.stringValue != 'class') return null;
+ token = token.next;
+ if (!token.isIdentifier()) return null;
+ token = token.next;
+ // class F<X extends B<X>> extends ...
+ if (token.stringValue == '<') {
+ token = skipTypeParameters(token);
+ }
+ if (token.stringValue != 'extends') return null;
+ token = token.next;
+ Token id = token;
+ while (token.kind != EOF_TOKEN) {
+ token = token.next;
+ if (token.stringValue != '.') break;
+ token = token.next;
+ if (!token.isIdentifier()) return null;
+ id = token;
+ }
+ // Should be at '{', 'with', 'implements', '<' or 'native'.
+ return id.value;
+ }
+
+ return compiler.withCurrentElement(classElement, () {
+ return scanForExtendsName(classElement.position());
+ });
+ }
+
ClassElement get annotationCreatesClass {
findAnnotationClasses();
return _annotationCreatesClass;
@@ -385,6 +511,7 @@
staticUse(const SourceString('convertDartClosureToJS'));
staticUse(const SourceString('defineNativeMethods'));
staticUse(const SourceString('defineNativeMethodsNonleaf'));
+ staticUse(const SourceString('defineNativeMethodsExtended'));
// TODO(9577): Registering `defineNativeMethodsFinish` seems redundant with
// respect to the registering in the backend. When the backend registering
// is removed as part of fixing Issue 9577, this can be the sole place
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index f21f244..a2c9d1d 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -341,6 +341,10 @@
}
if (element.isSynthesized) {
Element target = element.targetConstructor;
+ // Ensure the signature of the synthesized element is
+ // resolved. This is the only place where the resolver is
+ // seeing this element.
+ element.computeSignature(compiler);
if (!target.isErroneous()) {
compiler.enqueuer.resolution.registerStaticUse(
element.targetConstructor);
@@ -1467,6 +1471,7 @@
if (malformedIsError) {
visitor.error(node, messageKind.error, messageArguments);
} else {
+ compiler.backend.registerThrowRuntimeError(visitor.mapping);
visitor.warning(node, messageKind.warning, messageArguments);
}
var erroneousElement = new ErroneousElementX(
@@ -1702,9 +1707,9 @@
// The type annotations on a typedef do not imply type checks.
// TODO(karlklose): clean this up (dartbug.com/8870).
inCheckContext = compiler.enableTypeAssertions &&
+ !element.isLibrary() &&
!element.isTypedef() &&
- (element.enclosingElement == null ||
- !element.enclosingElement.isTypedef()),
+ !element.enclosingElement.isTypedef(),
inCatchBlock = false,
super(compiler, mapping);
@@ -2280,14 +2285,14 @@
bool resolvedArguments = false;
if (node.isOperator) {
String operatorString = node.selector.asOperator().source.stringValue;
- if (operatorString == 'is') {
+ if (identical(operatorString, 'is')) {
DartType type =
resolveTypeExpression(node.typeAnnotationFromIsCheckOrCast);
if (type != null) {
compiler.enqueuer.resolution.registerIsCheck(type, mapping);
}
resolvedArguments = true;
- } else if (operatorString == 'as') {
+ } else if (identical(operatorString, 'as')) {
DartType type = resolveTypeExpression(node.arguments.head);
if (type != null) {
compiler.enqueuer.resolution.registerAsCheck(type, mapping);
@@ -2577,10 +2582,6 @@
}
visitThrow(Throw node) {
- // We don't know ahead of time whether we will need the throw in a
- // statement context or an expression context, so we register both
- // here, even though we may not need ThrowExpression.
- compiler.backend.registerWrapException(mapping);
compiler.backend.registerThrowExpression(mapping);
visit(node.expression);
}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index acf5cb9..9169282 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1153,7 +1153,9 @@
// Create the inlining state after evaluating the arguments, that
// may have an impact on the state of the current method.
InliningState state = new InliningState(
- function, returnElement, returnType, elements, stack, localsHandler);
+ function, returnElement, returnType, elements, stack,
+ localsHandler, inTryStatement);
+ inTryStatement = false;
LocalsHandler newLocalsHandler = new LocalsHandler(this);
newLocalsHandler.closureData =
compiler.closureToClassMapper.computeClosureToClassMapping(
@@ -1206,6 +1208,7 @@
state.oldStack.add(stack[0]);
stack = state.oldStack;
localsHandler = state.oldLocalsHandler;
+ inTryStatement = state.inTryStatement;
}
/**
@@ -3187,6 +3190,9 @@
} else if (name == const SourceString('JS_OBJECT_CLASS_NAME')) {
String name = backend.namer.getRuntimeTypeName(compiler.objectClass);
stack.add(addConstantString(node, name));
+ } else if (name == const SourceString('JS_NULL_CLASS_NAME')) {
+ String name = backend.namer.getRuntimeTypeName(compiler.nullClass);
+ stack.add(addConstantString(node, name));
} else if (name == const SourceString('JS_FUNCTION_CLASS_NAME')) {
String name = backend.namer.getRuntimeTypeName(compiler.functionClass);
stack.add(addConstantString(node, name));
@@ -3224,6 +3230,8 @@
handleForeignJsCurrentIsolate(node);
} else if (name == const SourceString('JS_GET_NAME')) {
handleForeignJsGetName(node);
+ } else if (name == const SourceString('JS_EFFECT')) {
+ stack.add(graph.addConstantNull(compiler));
} else {
throw "Unknown foreign: ${selector}";
}
@@ -5214,13 +5222,15 @@
final TreeElements oldElements;
final List<HInstruction> oldStack;
final LocalsHandler oldLocalsHandler;
+ final bool inTryStatement;
InliningState(this.function,
this.oldReturnElement,
this.oldReturnType,
this.oldElements,
this.oldStack,
- this.oldLocalsHandler) {
+ this.oldLocalsHandler,
+ this.inTryStatement) {
assert(function.isImplementation);
}
}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index f9d8e6a..0e592f3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -2346,8 +2346,13 @@
LibraryElement coreLibrary = compiler.coreLibrary;
ClassElement objectClass = compiler.objectClass;
Element element = type.element;
-
- if (identical(element, objectClass) || type.treatAsDynamic) {
+ if (element == compiler.nullClass) {
+ if (negative) {
+ checkNonNull(input);
+ } else {
+ checkNull(input);
+ }
+ } else if (identical(element, objectClass) || type.treatAsDynamic) {
// The constant folder also does this optimization, but we make
// it safe by assuming it may have not run.
push(newLiteralBool(!negative), node);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 2af8285..1ea358d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -168,7 +168,7 @@
// If there is an instruction that dominates all others, we can
// use only the selector of that instruction.
if (dominator != null) {
- interceptedClasses =
+ interceptedClasses =
backend.getInterceptedClassesOn(dominator.selector.name);
// If we found that we need number, we must still go through all
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 2b01077..e89ba47 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -34,21 +34,18 @@
JavaScriptItemCompilationContext context = work.compilationContext;
measure(() {
List<OptimizationPhase> phases = <OptimizationPhase>[
- // Run trivial constant folding first to optimize
+ // Run trivial instruction simplification first to optimize
// some patterns useful for type conversion.
- new SsaConstantFolder(constantSystem, backend, work),
+ new SsaInstructionSimplifier(constantSystem, backend, work),
new SsaTypeConversionInserter(compiler),
new SsaNonSpeculativeTypePropagator(compiler),
- new SsaConstantFolder(constantSystem, backend, work),
- // The constant folder affects the types of instructions, so
- // we run the type propagator again. Note that this would
- // not be necessary if types were directly stored on
- // instructions.
- new SsaNonSpeculativeTypePropagator(compiler),
+ // After type propagation, more instructions can be
+ // simplified.
+ new SsaInstructionSimplifier(constantSystem, backend, work),
new SsaCheckInserter(backend, work, context.boundsChecked),
new SsaRedundantPhiEliminator(),
new SsaDeadPhiEliminator(),
- new SsaConstantFolder(constantSystem, backend, work),
+ new SsaInstructionSimplifier(constantSystem, backend, work),
new SsaNonSpeculativeTypePropagator(compiler),
// Run a dead code eliminator before LICM because dead
// interceptors are often in the way of LICM'able instructions.
@@ -57,8 +54,8 @@
new SsaCodeMotion(),
new SsaValueRangeAnalyzer(compiler, constantSystem, work),
// Previous optimizations may have generated new
- // opportunities for constant folding.
- new SsaConstantFolder(constantSystem, backend, work),
+ // opportunities for instruction simplification.
+ new SsaInstructionSimplifier(constantSystem, backend, work),
new SsaSimplifyInterceptors(compiler, constantSystem, work),
new SsaDeadCodeEliminator()];
runPhases(graph, phases);
@@ -122,15 +119,16 @@
* If both inputs to known operations are available execute the operation at
* compile-time.
*/
-class SsaConstantFolder extends HBaseVisitor implements OptimizationPhase {
- final String name = "SsaConstantFolder";
+class SsaInstructionSimplifier extends HBaseVisitor
+ implements OptimizationPhase {
+ final String name = "SsaInstructionSimplifier";
final JavaScriptBackend backend;
final CodegenWorkItem work;
final ConstantSystem constantSystem;
HGraph graph;
Compiler get compiler => backend.compiler;
- SsaConstantFolder(this.constantSystem, this.backend, this.work);
+ SsaInstructionSimplifier(this.constantSystem, this.backend, this.work);
void visitGraph(HGraph visitee) {
graph = visitee;
@@ -583,7 +581,8 @@
// raw type.
} else if (!RuntimeTypes.hasTypeArguments(type)) {
TypeMask expressionMask = expressionType.computeMask(compiler);
- TypeMask typeMask = new TypeMask.nonNullSubtype(type);
+ TypeMask typeMask = (element == compiler.nullClass)
+ ? new TypeMask.subtype(type) : new TypeMask.nonNullSubtype(type);
if (expressionMask.union(typeMask, compiler) == typeMask) {
return graph.addConstantBool(true, compiler);
} else if (expressionMask.intersection(typeMask, compiler).isEmpty) {
@@ -1039,7 +1038,17 @@
HBasicBlock preheader = loopHeader.predecessors[0];
int dependsFlags = SideEffects.computeDependsOnFlags(changesFlags);
HInstruction instruction = block.first;
- bool firstInstructionInLoop = block == loopHeader;
+ bool isLoopAlwaysTaken() {
+ HInstruction instruction = loopHeader.last;
+ assert(instruction is HGoto || instruction is HLoopBranch);
+ return instruction is HGoto
+ || instruction.inputs[0].isConstantTrue();
+ }
+ bool firstInstructionInLoop = block == loopHeader
+ // Compensate for lack of code motion.
+ || (blockChangesFlags[loopHeader.id] == 0
+ && isLoopAlwaysTaken()
+ && loopHeader.successors[0] == block);
while (instruction != null) {
HInstruction next = instruction.next;
if (instruction.useGvn()
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 7cddf8f..257864c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -56,7 +56,7 @@
*/
abstract class Value {
final ValueRangeInfo info;
- const Value([this.info = null]);
+ const Value(this.info);
Value operator +(Value other) => const UnknownValue();
Value operator -(Value other) => const UnknownValue();
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index ab7226b..c13d7a4 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -2,7 +2,18 @@
// 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.
-part of types;
+library concrete_types_inferrer;
+
+import 'dart:collection' show Queue, IterableBase;
+import '../dart2jslib.dart' hide Selector, TypedSelector;
+import '../dart_types.dart';
+import '../elements/elements.dart';
+import '../native_handler.dart' as native;
+import '../tree/tree.dart';
+import '../universe/universe.dart';
+import '../util/util.dart';
+
+import 'types.dart' show TypeMask, TypesInferrer;
class CancelTypeInferenceException {
final Node node;
diff --git a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
index ab3f998..caf28f0 100644
--- a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
@@ -12,6 +12,7 @@
import 'simple_types_inferrer.dart'
show InferrerEngine, InferrerVisitor, LocalsHandler;
import 'types.dart';
+import 'inferrer_visitor.dart';
/**
* A set of selector names that [List] implements, that we know do not
@@ -179,7 +180,7 @@
/**
* A set of selectors that both use and update the list, for example
- * [: list[0]++; :] or [: list[0] |= 42; :].
+ * [: list[0]++; :] or [: list[0] |= 42; :].
*/
final Set<Selector> constraints = new Set<Selector>();
@@ -326,7 +327,7 @@
return analyzedNode == resolved;
} else {
assert(resolved is Element);
- return escapingElements.contains(resolved);
+ return escapingElements.contains(resolved);
}
}
@@ -335,7 +336,8 @@
}
}
-class ContainerTracerVisitor extends InferrerVisitor<TypeMask> {
+class ContainerTracerVisitor
+ extends InferrerVisitor<TypeMask, InferrerEngine<TypeMask>> {
final Element analyzedElement;
final TracerForConcreteContainer tracer;
final bool visitingClosure;
@@ -746,7 +748,7 @@
if (node.expression == null) {
return types.nullType;
}
-
+
TypeMask type;
bool isEscaping = visitAndCatchEscaping(() {
type = visit(node.expression);
@@ -761,7 +763,7 @@
}
return type;
}
-
+
TypeMask visitForIn(ForIn node) {
visit(node.expression);
Selector iteratorSelector = elements.getIteratorSelector(node);
diff --git a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
index ce86ef6..00c9295 100644
--- a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
@@ -2,7 +2,14 @@
// 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.
-part of simple_types_inferrer;
+library inferrer_visitor;
+
+import '../dart2jslib.dart' hide Selector, TypedSelector;
+import '../dart_types.dart';
+import '../elements/elements.dart';
+import '../tree/tree.dart';
+import '../universe/universe.dart';
+import '../util/util.dart';
/**
* The interface [InferrerVisitor] will use when working on types.
@@ -75,106 +82,6 @@
}
/**
- * An implementation of [TypeSystem] for [TypeMask].
- */
-class TypeMaskSystem implements TypeSystem<TypeMask> {
- final Compiler compiler;
- TypeMaskSystem(this.compiler);
-
- TypeMask narrowType(TypeMask type,
- DartType annotation,
- {bool isNullable: true}) {
- if (annotation.treatAsDynamic) return type;
- if (annotation.isVoid) return nullType;
- if (annotation.element == compiler.objectClass) return type;
- TypeMask otherType;
- if (annotation.kind == TypeKind.TYPEDEF
- || annotation.kind == TypeKind.FUNCTION) {
- otherType = functionType;
- } else if (annotation.kind == TypeKind.TYPE_VARIABLE) {
- // TODO(ngeoffray): Narrow to bound.
- return type;
- } else {
- assert(annotation.kind == TypeKind.INTERFACE);
- otherType = new TypeMask.nonNullSubtype(annotation);
- }
- if (isNullable) otherType = otherType.nullable();
- if (type == null) return otherType;
- return type.intersection(otherType, compiler);
- }
-
- TypeMask computeLUB(TypeMask firstType, TypeMask secondType) {
- if (firstType == null) {
- return secondType;
- } else if (secondType == dynamicType || firstType == dynamicType) {
- return dynamicType;
- } else if (firstType == secondType) {
- return firstType;
- } else {
- TypeMask union = firstType.union(secondType, compiler);
- // TODO(kasperl): If the union isn't nullable it seems wasteful
- // to use dynamic. Fix that.
- return union.containsAll(compiler) ? dynamicType : union;
- }
- }
-
- TypeMask allocateDiamondPhi(TypeMask firstType, TypeMask secondType) {
- return computeLUB(firstType, secondType);
- }
-
- TypeMask get dynamicType => compiler.typesTask.dynamicType;
- TypeMask get nullType => compiler.typesTask.nullType;
- TypeMask get intType => compiler.typesTask.intType;
- TypeMask get doubleType => compiler.typesTask.doubleType;
- TypeMask get numType => compiler.typesTask.numType;
- TypeMask get boolType => compiler.typesTask.boolType;
- TypeMask get functionType => compiler.typesTask.functionType;
- TypeMask get listType => compiler.typesTask.listType;
- TypeMask get constListType => compiler.typesTask.constListType;
- TypeMask get fixedListType => compiler.typesTask.fixedListType;
- TypeMask get growableListType => compiler.typesTask.growableListType;
- TypeMask get mapType => compiler.typesTask.mapType;
- TypeMask get constMapType => compiler.typesTask.constMapType;
- TypeMask get stringType => compiler.typesTask.stringType;
- TypeMask get typeType => compiler.typesTask.typeType;
-
- TypeMask nonNullSubtype(DartType type) => new TypeMask.nonNullSubtype(type);
- TypeMask nonNullSubclass(DartType type) => new TypeMask.nonNullSubclass(type);
- TypeMask nonNullExact(DartType type) => new TypeMask.nonNullExact(type);
- TypeMask nonNullEmpty() => new TypeMask.nonNullEmpty();
-
- TypeMask nullable(TypeMask type) {
- return type.nullable();
- }
-
- TypeMask allocateContainer(TypeMask type,
- Node node,
- Element enclosing,
- [TypeMask elementType, int length]) {
- ContainerTypeMask mask = new ContainerTypeMask(type, node, enclosing);
- mask.elementType = elementType;
- mask.length = length;
- return mask;
- }
-
- Selector newTypedSelector(TypeMask receiver, Selector selector) {
- return new TypedSelector(receiver, selector);
- }
-
- TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
- return computeLUB(phiType, newType);
- }
-
- TypeMask allocatePhi(Node node, Element element, TypeMask inputType) {
- return inputType;
- }
-
- TypeMask simplifyPhi(Node node, Element element, TypeMask phiType) {
- return phiType;
- }
-}
-
-/**
* A variable scope holds types for variables. It has a link to a
* parent scope, but never changes the types in that parent. Instead,
* updates to locals of a parent scope are put in the current scope.
@@ -243,8 +150,9 @@
forEachLocalUntilNode(null, f);
}
- void remove(Element element) {
- variables.remove(element);
+ bool updates(Element element) {
+ if (variables == null) return false;
+ return variables.containsKey(element);
}
String toString() {
@@ -303,12 +211,73 @@
}
/**
+ * Placeholder for inferred arguments types on sends.
+ */
+class ArgumentsTypes<T> {
+ final List<T> positional;
+ final Map<SourceString, T> named;
+ ArgumentsTypes(this.positional, named)
+ : this.named = (named == null) ? new Map<SourceString, T>() : named;
+
+ int get length => positional.length + named.length;
+
+ String toString() => "{ positional = $positional, named = $named }";
+
+ bool operator==(other) {
+ if (positional.length != other.positional.length) return false;
+ if (named.length != other.named.length) return false;
+ for (int i = 0; i < positional.length; i++) {
+ if (positional[i] != other.positional[i]) return false;
+ }
+ named.forEach((name, type) {
+ if (other.named[name] != type) return false;
+ });
+ return true;
+ }
+
+ int get hashCode => throw new UnsupportedError('ArgumentsTypes.hashCode');
+
+ bool hasNoArguments() => positional.isEmpty && named.isEmpty;
+
+ bool hasOnePositionalArgumentWithType(T type) {
+ return named.isEmpty && positional.length == 1 && positional[0] == type;
+ }
+}
+
+class CallSite {
+ final Selector selector;
+ final ArgumentsTypes arguments;
+ CallSite(this.selector, this.arguments) {
+ assert(selector != null);
+ }
+}
+
+abstract class MinimalInferrerEngine<T> {
+ /**
+ * Returns the type of [element].
+ */
+ T typeOfElement(Element element);
+
+ /**
+ * Records that [node] sets non-final field [element] to be of type
+ * [type].
+ *
+ * [constraint] is a field assignment constraint, as described in
+ * [InternalSimpleTypesInferrer].
+ */
+ void recordTypeOfNonFinalField(Node node,
+ Element field,
+ T type,
+ CallSite constraint);
+}
+
+/**
* Placeholder for inferred types of local variables.
*/
class LocalsHandler<T> {
final Compiler compiler;
final TypeSystem<T> types;
- final InferrerEngine<T> inferrer;
+ final MinimalInferrerEngine<T> inferrer;
final VariableScope<T> locals;
final Map<Element, Element> capturedAndBoxed;
final FieldInitializationScope<T> fieldScope;
@@ -399,21 +368,43 @@
&& elseBranch != null
&& elseBranch.seenBreakOrContinue;
if (aborts) return;
- if (thenBranch.aborts) {
- thenBranch = this;
- if (elseBranch == null) return;
- } else if (elseBranch == null || elseBranch.aborts) {
- elseBranch = this;
+
+ void mergeOneBranch(LocalsHandler<T> other) {
+ other.locals.forEachOwnLocal((Element local, T type) {
+ T myType = locals[local];
+ if (myType == null) return;
+ if (type == myType) return;
+ locals[local] = types.allocateDiamondPhi(myType, type);
+ });
}
- thenBranch.locals.forEachOwnLocal((Element local, T type) {
- T otherType = elseBranch.locals[local];
- if (otherType == null) return;
- T existing = locals[local];
- if (type == existing && otherType == existing) return;
- locals[local] = types.allocateDiamondPhi(type, otherType);
- });
+ if (thenBranch.aborts) {
+ if (elseBranch == null) return;
+ mergeOneBranch(elseBranch);
+ } else if (elseBranch == null || elseBranch.aborts) {
+ mergeOneBranch(thenBranch);
+ } else {
+ void mergeLocal(Element local) {
+ T myType = locals[local];
+ if (myType == null) return;
+ T elseType = elseBranch.locals[local];
+ T thenType = thenBranch.locals[local];
+ if (thenType == elseType) {
+ locals[local] = thenType;
+ } else {
+ locals[local] = types.allocateDiamondPhi(thenType, elseType);
+ }
+ }
+ thenBranch.locals.forEachOwnLocal((Element local, _) {
+ mergeLocal(local);
+ });
+ elseBranch.locals.forEachOwnLocal((Element local, _) {
+ // Discard locals we already processed when iterating over
+ // [thenBranch]'s locals.
+ if (!thenBranch.locals.updates(local)) mergeLocal(local);
+ });
+ }
}
/**
@@ -512,10 +503,11 @@
}
}
-abstract class InferrerVisitor<T> extends ResolvedVisitor<T> {
+abstract class InferrerVisitor
+ <T, E extends MinimalInferrerEngine<T>> extends ResolvedVisitor<T> {
final Element analyzedElement;
final TypeSystem<T> types;
- final InferrerEngine<T> inferrer;
+ final E inferrer;
final Compiler compiler;
final Map<TargetElement, List<LocalsHandler<T>>> breaksFor =
new Map<TargetElement, List<LocalsHandler<T>>>();
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index 5bae1d7..6fe350d 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -15,7 +15,8 @@
import '../util/util.dart' show Link;
import 'types.dart'
show TypesInferrer, FlatTypeMask, TypeMask, ContainerTypeMask,
- ElementTypeMask;
+ ElementTypeMask, TypeSystem, MinimalInferrerEngine;
+import 'inferrer_visitor.dart';
// BUG(8802): There's a bug in the analyzer that makes the re-export
// of Selector from dart2jslib.dart fail. For now, we work around that
@@ -23,7 +24,105 @@
import '../dart2jslib.dart' hide Selector, TypedSelector;
import '../universe/universe.dart' show Selector, SideEffects, TypedSelector;
-part 'inferrer_visitor.dart';
+/**
+ * An implementation of [TypeSystem] for [TypeMask].
+ */
+class TypeMaskSystem implements TypeSystem<TypeMask> {
+ final Compiler compiler;
+ TypeMaskSystem(this.compiler);
+
+ TypeMask narrowType(TypeMask type,
+ DartType annotation,
+ {bool isNullable: true}) {
+ if (annotation.treatAsDynamic) return type;
+ if (annotation.isVoid) return nullType;
+ if (annotation.element == compiler.objectClass) return type;
+ TypeMask otherType;
+ if (annotation.kind == TypeKind.TYPEDEF
+ || annotation.kind == TypeKind.FUNCTION) {
+ otherType = functionType;
+ } else if (annotation.kind == TypeKind.TYPE_VARIABLE) {
+ // TODO(ngeoffray): Narrow to bound.
+ return type;
+ } else {
+ assert(annotation.kind == TypeKind.INTERFACE);
+ otherType = new TypeMask.nonNullSubtype(annotation);
+ }
+ if (isNullable) otherType = otherType.nullable();
+ if (type == null) return otherType;
+ return type.intersection(otherType, compiler);
+ }
+
+ TypeMask computeLUB(TypeMask firstType, TypeMask secondType) {
+ if (firstType == null) {
+ return secondType;
+ } else if (secondType == dynamicType || firstType == dynamicType) {
+ return dynamicType;
+ } else if (firstType == secondType) {
+ return firstType;
+ } else {
+ TypeMask union = firstType.union(secondType, compiler);
+ // TODO(kasperl): If the union isn't nullable it seems wasteful
+ // to use dynamic. Fix that.
+ return union.containsAll(compiler) ? dynamicType : union;
+ }
+ }
+
+ TypeMask allocateDiamondPhi(TypeMask firstType, TypeMask secondType) {
+ return computeLUB(firstType, secondType);
+ }
+
+ TypeMask get dynamicType => compiler.typesTask.dynamicType;
+ TypeMask get nullType => compiler.typesTask.nullType;
+ TypeMask get intType => compiler.typesTask.intType;
+ TypeMask get doubleType => compiler.typesTask.doubleType;
+ TypeMask get numType => compiler.typesTask.numType;
+ TypeMask get boolType => compiler.typesTask.boolType;
+ TypeMask get functionType => compiler.typesTask.functionType;
+ TypeMask get listType => compiler.typesTask.listType;
+ TypeMask get constListType => compiler.typesTask.constListType;
+ TypeMask get fixedListType => compiler.typesTask.fixedListType;
+ TypeMask get growableListType => compiler.typesTask.growableListType;
+ TypeMask get mapType => compiler.typesTask.mapType;
+ TypeMask get constMapType => compiler.typesTask.constMapType;
+ TypeMask get stringType => compiler.typesTask.stringType;
+ TypeMask get typeType => compiler.typesTask.typeType;
+
+ TypeMask nonNullSubtype(DartType type) => new TypeMask.nonNullSubtype(type);
+ TypeMask nonNullSubclass(DartType type) => new TypeMask.nonNullSubclass(type);
+ TypeMask nonNullExact(DartType type) => new TypeMask.nonNullExact(type);
+ TypeMask nonNullEmpty() => new TypeMask.nonNullEmpty();
+
+ TypeMask nullable(TypeMask type) {
+ return type.nullable();
+ }
+
+ TypeMask allocateContainer(TypeMask type,
+ Node node,
+ Element enclosing,
+ [TypeMask elementType, int length]) {
+ ContainerTypeMask mask = new ContainerTypeMask(type, node, enclosing);
+ mask.elementType = elementType;
+ mask.length = length;
+ return mask;
+ }
+
+ Selector newTypedSelector(TypeMask receiver, Selector selector) {
+ return new TypedSelector(receiver, selector);
+ }
+
+ TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
+ return computeLUB(phiType, newType);
+ }
+
+ TypeMask allocatePhi(Node node, Element element, TypeMask inputType) {
+ return inputType;
+ }
+
+ TypeMask simplifyPhi(Node node, Element element, TypeMask phiType) {
+ return phiType;
+ }
+}
/**
* A work queue that ensures there are no duplicates, and adds and
@@ -223,7 +322,7 @@
* type information about visited nodes, as well as to request type
* information of elements.
*/
-abstract class InferrerEngine<T> {
+abstract class InferrerEngine<T> implements MinimalInferrerEngine<T> {
final Compiler compiler;
final TypeSystem<T> types;
final Map<Node, T> concreteTypes = new Map<Node, T>();
@@ -859,6 +958,9 @@
bool recordType(Element analyzedElement, TypeMask type) {
if (isNativeElement(analyzedElement)) return false;
+ if (!compiler.backend.canBeUsedForGlobalOptimizations(analyzedElement)) {
+ return false;
+ }
assert(type != null);
assert(analyzedElement.isField()
|| analyzedElement.isParameter()
@@ -1111,8 +1213,8 @@
}
bool updateParameterType(Element parameter) {
- FunctionTypeInformation functionInfo =
- typeInformationOf(parameter.enclosingElement);
+ Element function = parameter.enclosingElement;
+ FunctionTypeInformation functionInfo = typeInformationOf(function);
if (functionInfo.canBeClosurized) return false;
if (!isNotClosure(parameter.enclosingElement)) return false;
@@ -1472,49 +1574,8 @@
}
}
-class CallSite {
- final Selector selector;
- final ArgumentsTypes arguments;
- CallSite(this.selector, this.arguments) {
- assert(selector != null);
- }
-}
-
-/**
- * Placeholder for inferred arguments types on sends.
- */
-class ArgumentsTypes<T> {
- final List<T> positional;
- final Map<SourceString, T> named;
- ArgumentsTypes(this.positional, named)
- : this.named = (named == null) ? new Map<SourceString, T>() : named;
-
- int get length => positional.length + named.length;
-
- String toString() => "{ positional = $positional, named = $named }";
-
- bool operator==(other) {
- if (positional.length != other.positional.length) return false;
- if (named.length != other.named.length) return false;
- for (int i = 0; i < positional.length; i++) {
- if (positional[i] != other.positional[i]) return false;
- }
- named.forEach((name, type) {
- if (other.named[name] != type) return false;
- });
- return true;
- }
-
- int get hashCode => throw new UnsupportedError('ArgumentsTypes.hashCode');
-
- bool hasNoArguments() => positional.isEmpty && named.isEmpty;
-
- bool hasOnePositionalArgumentWithType(T type) {
- return named.isEmpty && positional.length == 1 && positional[0] == type;
- }
-}
-
-class SimpleTypeInferrerVisitor<T> extends InferrerVisitor<T> {
+class SimpleTypeInferrerVisitor<T>
+ extends InferrerVisitor<T, InferrerEngine<T>> {
T returnType;
bool visitingInitializers = false;
bool isConstructorRedirect = false;
@@ -2000,7 +2061,8 @@
return inferrer.typeOfNativeBehavior(nativeBehavior);
} else if (name == const SourceString('JS_OPERATOR_IS_PREFIX')
|| name == const SourceString('JS_OPERATOR_AS_PREFIX')
- || name == const SourceString('JS_OBJECT_CLASS_NAME')) {
+ || name == const SourceString('JS_OBJECT_CLASS_NAME')
+ || name == const SourceString('JS_NULL_CLASS_NAME')) {
return types.stringType;
} else {
sideEffects.setAllSideEffects();
diff --git a/sdk/lib/_internal/compiler/implementation/types/types.dart b/sdk/lib/_internal/compiler/implementation/types/types.dart
index 538b44e..3e2178a 100644
--- a/sdk/lib/_internal/compiler/implementation/types/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/types.dart
@@ -4,8 +4,6 @@
library types;
-import 'dart:collection' show Queue, IterableBase;
-
import '../dart2jslib.dart' hide Selector, TypedSelector;
import '../tree/tree.dart';
import '../elements/elements.dart';
@@ -13,9 +11,9 @@
import '../util/util.dart';
import '../universe/universe.dart';
import 'simple_types_inferrer.dart' show SimpleTypesInferrer;
+import 'concrete_types_inferrer.dart' show ConcreteTypesInferrer;
import '../dart_types.dart';
-part 'concrete_types_inferrer.dart';
part 'container_type_mask.dart';
part 'element_type_mask.dart';
part 'flat_type_mask.dart';
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 11ef337..f005351 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -2128,15 +2128,15 @@
write("# VERSION: ${new DateTime.now()}\n\n");
write("NETWORK:\n*\n\n");
write("CACHE:\n");
- var toCache = new Directory.fromPath(outputDir);
+ var toCache = new Directory(outputDir);
toCache.list(recursive: true).listen(
(FileSystemEntity entity) {
- if (entity.isFile) {
+ if (entity is File) {
var filename = entity.path;
if (filename.endsWith('appcache.manifest')) {
return;
}
- Path relativeFilePath = new Path(filename).relativeTo(outputDir);
+ String relativeFilePath = path.relative(filename, from: outputDir);
write("$relativeFilePath\n");
}
},
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 207800a..3a4f7ac 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -105,8 +105,8 @@
patch class double {
patch static double parse(String source,
- [double handleError(String source)]) {
- return Primitives.parseDouble(source, handleError);
+ [double onError(String source)]) {
+ return Primitives.parseDouble(source, onError);
}
}
diff --git a/sdk/lib/_internal/lib/foreign_helper.dart b/sdk/lib/_internal/lib/foreign_helper.dart
index 73e3c09..9ba05eb 100644
--- a/sdk/lib/_internal/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/lib/foreign_helper.dart
@@ -177,6 +177,9 @@
/// Returns the name of the class `Object` in the generated code.
String JS_OBJECT_CLASS_NAME() {}
+/// Returns the name of the class `Null` in the generated code.
+String JS_NULL_CLASS_NAME() {}
+
/// Returns the name of the class `Function` in the generated code.
String JS_FUNCTION_CLASS_NAME() {}
@@ -236,3 +239,19 @@
* Obtain [name] from Namer.
*/
String JS_GET_NAME(String name) {}
+
+/**
+ * Pretend [code] is executed. Generates no executable code. This is used to
+ * model effects at some other point in external code. For example, the
+ * following models an assignment to foo with an unknown value.
+ *
+ * var foo;
+ *
+ * main() {
+ * JS_EFFECT((_){ foo = _; })
+ * }
+ *
+ * TODO(sra): Replace this hack with something to mark the volatile or
+ * externally initialized elements.
+ */
+void JS_EFFECT(Function code) { code(null); }
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 27c2edf..fedc0f6 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -25,7 +25,7 @@
lookupDispatchRecord,
StringMatch,
firstMatchAfter;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JS_EFFECT;
part 'js_array.dart';
part 'js_number.dart';
@@ -247,6 +247,37 @@
*/
var interceptedNames;
+
+/**
+ * Data structure used to map a [Type] to the [Interceptor] for that type. It
+ * is JavaScript array of 2N entries of adjacent slots containing a [Type]
+ * followed by an [Interceptor] class for the type.
+ *
+ * The value of this variable is set by the compiler and contains only types
+ * that are user extensions of native classes where the type occurs as a
+ * constant in the program.
+ */
+// TODO(sra): Mark this as initialized to a constant with unknown value.
+var mapTypeToInterceptor;
+
+findInterceptorConstructorForType(Type type) {
+ JS_EFFECT((_){ mapTypeToInterceptor = _; });
+ if (mapTypeToInterceptor == null) return null;
+ List map = JS('JSFixedArray', '#', mapTypeToInterceptor);
+ for (int i = 0; i + 1 < map.length; i += 2) {
+ if (type == map[i]) {
+ return map[i + 1];
+ }
+ }
+ return null;
+}
+
+findInterceptorForType(Type type) {
+ var constructor = findInterceptorConstructorForType(type);
+ if (constructor == null) return null;
+ return JS('', '#.prototype', constructor);
+}
+
/**
* The base interceptor class.
*
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 6aed3a2..e41a2ce 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -289,33 +289,9 @@
patch static void initialize({String database,
String password,
- bool useBuiltinRoots: true,
- bool readOnly: true}) {
+ bool useBuiltinRoots: true}) {
throw new UnsupportedError("SecureSocket.initialize");
}
-
- patch static X509Certificate addCertificate(List<int> certificate,
- String trust) {
- throw new UnsupportedError("SecureSocket.addCertificate");
- }
-
- patch static importCertificatesWithPrivateKeys(List<int> certificates,
- String password) {
- throw new UnsupportedError(
- "SecureSocket.importCertificatesWithPrivateKeys");
- }
-
- patch static X509Certificate getCertificate(String nickname) {
- throw new UnsupportedError("SecureSocket.getCertificate");
- }
-
- patch static removeCertificate(String nickname) {
- throw new UnsupportedError("SecureSocket.removeCertificate");
- }
-
- patch static X509Certificate changeTrust(String nickname, String trust) {
- throw new UnsupportedError("SecureSocket.changeTrust");
- }
}
patch class _SecureFilter {
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index ab69f61..e5ec91f 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -23,13 +23,17 @@
JS_HAS_EQUALS,
JS_IS_INDEXABLE_FIELD_NAME,
JS_OBJECT_CLASS_NAME,
+ JS_NULL_CLASS_NAME,
JS_OPERATOR_AS_PREFIX,
JS_OPERATOR_IS_PREFIX,
JS_SIGNATURE_NAME,
RAW_DART_FUNCTION_REF;
import 'dart:_interceptors';
import 'dart:_collection-dev' as _symbol_dev;
-import 'dart:_js_names' show mangledNames, mangledGlobalNames;
+
+import 'dart:_js_names' show
+ mangledNames,
+ unmangleGlobalNameIfPreservedAnyways;
part 'constant_map.dart';
part 'native_helper.dart';
@@ -1611,18 +1615,6 @@
}
/**
- * Represents the type of Null. The compiler treats this specially.
- * TODO(lrn): Null should be defined in core. It's a class, like int.
- * It just happens to act differently in assignability tests and,
- * like int, can't be extended or implemented.
- */
-class Null {
- factory Null() {
- throw new UnsupportedError('new Null()');
- }
-}
-
-/**
* The following methods are called by the runtime to implement
* checked mode and casts. We specialize each primitive type (eg int, bool), and
* use the compiler's convention to do is-checks on regular objects.
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 3914b20..52aca10 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -24,6 +24,7 @@
RuntimeError,
createRuntimeType,
createUnmangledInvocationMirror,
+ getMangledTypeName,
runtimeTypeToString;
import 'dart:_interceptors' show
Interceptor,
@@ -398,7 +399,7 @@
// TODO(ahe): Don't discard type arguments to support
// [ClassMirror.isOriginalDeclaration] and [ClassMirror.originalDeclaration]
// correctly.
- return reflectClassByMangledName('$key'.split('<')[0]);
+ return reflectClassByMangledName(getMangledTypeName(key).split('<')[0]);
}
ClassMirror reflectClassByMangledName(String mangledName) {
@@ -522,7 +523,7 @@
throw new NoSuchMethodError(this, '${n(fieldName)}=', [arg], null);
}
- List<ClassMirror> get superinterfaces => mixin.superinterfaces;
+ List<ClassMirror> get superinterfaces => [mixin];
Map<Symbol, MethodMirror> get constructors => mixin.constructors;
@@ -688,6 +689,7 @@
UnmodifiableMapView<Symbol, VariableMirror> _cachedVariables;
UnmodifiableMapView<Symbol, Mirror> _cachedMembers;
UnmodifiableListView<InstanceMirror> _cachedMetadata;
+ UnmodifiableListView<ClassMirror> _cachedSuperinterfaces;
// Set as side-effect of accessing JsLibraryMirror.classes.
JsLibraryMirror _owner;
@@ -868,6 +870,8 @@
// Filter-out setters corresponding to variables.
if (result[s(name)] is VariableMirror) continue;
}
+ // Constructors aren't 'members'.
+ if (method.isConstructor) continue;
// Use putIfAbsent to filter-out getters corresponding to variables.
result.putIfAbsent(method.simpleName, () => method);
}
@@ -1013,8 +1017,22 @@
ClassMirror get originalDeclaration => this;
+ List<ClassMirror> get superinterfaces {
+ if (_cachedSuperinterfaces != null) return _cachedSuperinterfaces;
+ List<int> interfaces = JS('List|Null', 'init.interfaces[#]', _mangledName);
+ var result = const [];
+ if (interfaces != null) {
+ ClassMirror lookupType(int i) {
+ var type = JS('=Object', 'init.metadata[#]', i);
+ return typeMirrorFromRuntimeTypeRepresentation(type);
+ }
+ result = interfaces.map(lookupType).toList();
+ }
+ return _cachedSuperinterfaces =
+ new UnmodifiableListView<ClassMirror>(result);
+ }
+
// TODO(ahe): Implement these.
- List<ClassMirror> get superinterfaces => throw new UnimplementedError();
Map<Symbol, TypeVariableMirror> get typeVariables
=> throw new UnimplementedError();
Map<Symbol, TypeMirror> get typeArguments => throw new UnimplementedError();
diff --git a/sdk/lib/_internal/lib/js_names.dart b/sdk/lib/_internal/lib/js_names.dart
index 4b3e9a9..9eaf777 100644
--- a/sdk/lib/_internal/lib/js_names.dart
+++ b/sdk/lib/_internal/lib/js_names.dart
@@ -6,6 +6,8 @@
import 'dart:_foreign_helper' show JS, JS_GET_NAME;
+import 'dart:_js_helper' show JsCache;
+
/// No-op method that is called to inform the compiler that unmangled named
/// must be preserved.
preserveNames() {}
@@ -14,7 +16,7 @@
/// with some additional information, such as, number of required arguments.
/// This map is for mangled names used as instance members.
final Map<String, String> mangledNames =
- computeMangledNames(JS('', 'init.mangledNames'), false);
+ computeMangledNames(JS('=Object', 'init.mangledNames'), false);
/// A map from "reflective" names to mangled names (the reverse of
/// [mangledNames]).
@@ -24,7 +26,7 @@
/// A map from mangled names to "reflective" names (see [mangledNames]). This
/// map is for globals, that is, static and top-level members.
final Map<String, String> mangledGlobalNames =
- computeMangledNames(JS('', 'init.mangledGlobalNames'), true);
+ computeMangledNames(JS('=Object', 'init.mangledGlobalNames'), true);
/// A map from "reflective" names to mangled names (the reverse of
/// [mangledGlobalNames]).
@@ -71,3 +73,19 @@
return result;
})(#, Object.prototype.hasOwnProperty)''', victim);
}
+
+/**
+ * Returns the (global) unmangled version of [name].
+ *
+ * Normally, you should use [mangledGlobalNames] directly, but this method
+ * doesn't tell the compiler to preserve names. So this method only returns a
+ * non-null value if some other component has made the compiler preserve names.
+ *
+ * This is used, for example, to return unmangled names from TypeImpl.toString
+ * *if* names are being preserved for other reasons (use of dart:mirrors, for
+ * example).
+ */
+String unmangleGlobalNameIfPreservedAnyways(String name) {
+ var names = JS('=Object', 'init.mangledGlobalNames');
+ return JsCache.fetch(names, name);
+}
diff --git a/sdk/lib/_internal/lib/js_rti.dart b/sdk/lib/_internal/lib/js_rti.dart
index 4441214..f582c1a 100644
--- a/sdk/lib/_internal/lib/js_rti.dart
+++ b/sdk/lib/_internal/lib/js_rti.dart
@@ -46,10 +46,17 @@
class TypeImpl implements Type {
final String _typeName;
+ String _unmangledName;
TypeImpl(this._typeName);
- String toString() => _typeName;
+ String toString() {
+ if (_unmangledName != null) return _unmangledName;
+ String unmangledName = unmangleGlobalNameIfPreservedAnyways(_typeName);
+ // TODO(ahe): Handle type arguments.
+ if (unmangledName == null) unmangledName = _typeName;
+ return _unmangledName = unmangledName;
+ }
// TODO(ahe): This is a poor hashCode as it collides with its name.
int get hashCode => _typeName.hashCode;
@@ -59,6 +66,8 @@
}
}
+getMangledTypeName(TypeImpl type) => type._typeName;
+
/**
* Sets the runtime type information on [target]. [typeInfo] is a type
* representation of type 4 or 5, that is, either a JavaScript array or
@@ -383,7 +392,8 @@
*/
bool isSupertypeOfNull(var type) {
// `null` means `dynamic`.
- return isNull(type) || getConstructorName(type) == JS_OBJECT_CLASS_NAME();
+ return isNull(type) || getConstructorName(type) == JS_OBJECT_CLASS_NAME()
+ || getConstructorName(type) == JS_NULL_CLASS_NAME();
}
/**
@@ -677,9 +687,9 @@
return value is JSArray;
}
-hasField(var object, var name) => JS('bool', r'#[#] != null', object, name);
+hasField(var object, var name) => JS('bool', r'# in #', name, object);
-hasNoField(var object, var name) => JS('bool', r'#[#] == null', object, name);
+hasNoField(var object, var name) => !hasField(object, name);
/// Returns [:true:] if [o] is a JavaScript function.
bool isJsFunction(var o) => JS('bool', r'typeof # == "function"', o);
diff --git a/sdk/lib/_internal/lib/native_helper.dart b/sdk/lib/_internal/lib/native_helper.dart
index 5c311f4..5470611 100644
--- a/sdk/lib/_internal/lib/native_helper.dart
+++ b/sdk/lib/_internal/lib/native_helper.dart
@@ -240,10 +240,17 @@
/// A JavaScript object mapping tags to `true` or `false`.
var leafTags;
+/// A JavaScript list mapping subclass interceptor constructors to the native
+/// superclass tag.
+var interceptorToTag;
+
/**
- * Associates tags with an interceptor. Called from generated code. The tags
- * are all 'leaf' tags representing classes that have no subclasses with
- * different behaviour.
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLDivElement) with an interceptor. Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all 'leaf' tags representing classes that have no subclasses
+ * with different behaviour.
*
* [tags] is a string of `|`-separated tags.
*/
@@ -252,14 +259,45 @@
}
/**
- * Associates tags with an interceptor. Called from generated code. The tags
- * are all non-'leaf' tags, representing classes that have a subclass with
- * different behaviour.
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLElement) with an interceptor. Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all non-'leaf' tags, representing classes that have a subclass
+ * with different behaviour.
*/
void defineNativeMethodsNonleaf(String tags, interceptorClass) {
defineNativeMethodsCommon(tags, interceptorClass, false);
}
+/**
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLElement) with an interceptor. Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all non-'leaf' tags, representing classes that have a user
+ * defined subclass that requires additional dispatch.
+ * [subclassInterceptorClasses] is a list of interceptor classes
+ * (i.e. constructors) for the user defined subclasses.
+ */
+void defineNativeMethodsExtended(String tags, interceptorClass,
+ subclassInterceptorClasses) {
+ if (interceptorToTag == null) {
+ interceptorToTag = [];
+ }
+ List classes = JS('JSFixedArray', '#', subclassInterceptorClasses);
+ for (int i = 0; i < classes.length; i++) {
+ interceptorToTag.add(classes[i]);
+ // 'tags' is a single tag.
+ interceptorToTag.add(tags);
+ }
+
+ defineNativeMethodsCommon(tags, interceptorClass, false);
+}
+
+// TODO(sra): Try to encode all the calls to defineNativeMethodsXXX as pure
+// data. The challenge is that the calls remove a lot of redundancy that is
+// expanded by the loops in these methods.
void defineNativeMethodsCommon(String tags, var interceptorClass, bool isLeaf) {
var methods = JS('', '#.prototype', interceptorClass);
if (interceptorsByTag == null) interceptorsByTag = JS('=Object', '{}');
@@ -280,6 +318,14 @@
// classes over unknown.
}
+String findDispatchTagForInterceptorClass(interceptorClassConstructor) {
+ if (interceptorToTag == null) return null;
+ int i =
+ JS('int', '#.indexOf(#)', interceptorToTag, interceptorClassConstructor);
+ if (i < 0) return null;
+ return JS('', '#[#]', interceptorToTag, i + 1);
+}
+
lookupInterceptor(var hasOwnPropertyFunction, String tag) {
var map = interceptorsByTag;
if (map == null) return null;
@@ -313,11 +359,23 @@
var isLeaf =
(leafTags != null) && JS('bool', '(#[#]) === true', leafTags, tag);
if (isLeaf) {
- var fieldName = JS_IS_INDEXABLE_FIELD_NAME();
- bool indexability = JS('bool', r'!!#[#]', interceptor, fieldName);
- return makeDispatchRecord(interceptor, false, null, indexability);
+ return makeLeafDispatchRecord(interceptor);
} else {
var proto = JS('', 'Object.getPrototypeOf(#)', obj);
return makeDispatchRecord(interceptor, proto, null, null);
}
}
+
+makeLeafDispatchRecord(interceptor) {
+ var fieldName = JS_IS_INDEXABLE_FIELD_NAME();
+ bool indexability = JS('bool', r'!!#[#]', interceptor, fieldName);
+ return makeDispatchRecord(interceptor, false, null, indexability);
+}
+
+/**
+ * [proto] should have no shadowing prototypes that are not also assigned a
+ * dispatch rescord.
+ */
+setNativeSubclassDispatchRecord(proto, interceptor) {
+ setDispatchProperty(proto, makeLeafDispatchRecord(interceptor));
+}
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index f8491d1..1a3e16c 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -151,6 +151,10 @@
for (var command in PubCommand.commands.keys) {
// Hide aliases.
if (PubCommand.commands[command].aliases.indexOf(command) >= 0) continue;
+
+ // Hide undocumented commands.
+ if (PubCommand.commands[command].hidden) continue;
+
length = math.max(length, command.length);
names.add(command);
}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 97ad11ce..5c72d58 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -15,6 +15,7 @@
import 'command/help.dart';
import 'command/install.dart';
import 'command/lish.dart';
+import 'command/list_package_dirs.dart';
import 'command/serve.dart';
import 'command/update.dart';
import 'command/uploader.dart';
@@ -42,6 +43,10 @@
/// A one-line description of this command.
String get description;
+ /// If the command is undocumented and should not appear in command listings,
+ /// this will be `true`.
+ bool get hidden => false;
+
/// How to invoke this command (e.g. `"pub install [package]"`).
String get usage;
@@ -193,6 +198,7 @@
'deploy': new DeployCommand(),
'help': new HelpCommand(),
'install': new InstallCommand(),
+ 'list-package-dirs': new ListPackageDirsCommand(),
'publish': new LishCommand(),
'serve': new ServeCommand(),
'update': new UpdateCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache.dart b/sdk/lib/_internal/pub/lib/src/command/cache.dart
index b33a045..24c5124 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache.dart
@@ -16,6 +16,7 @@
class CacheCommand extends PubCommand {
String get description => "Inspect the system cache.";
String get usage => 'pub cache list';
+ bool get hidden => true;
bool get requiresEntrypoint => false;
Future onRun() {
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
new file mode 100644
index 0000000..ea5b140
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -0,0 +1,48 @@
+// 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.
+
+library pub.command.list_package_dirs;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:json' as json;
+
+import '../command.dart';
+import '../exit_codes.dart' as exit_codes;
+import '../log.dart' as log;
+
+/// Handles the `list-package-dirs` pub command.
+class ListPackageDirsCommand extends PubCommand {
+ String get description => "Print local paths to dependencies.";
+ String get usage => "pub list-package-dirs";
+ bool get hidden => true;
+
+ ListPackageDirsCommand() {
+ commandParser.addOption("format",
+ help: "How output should be displayed.",
+ allowed: ["json"]);
+ }
+
+ Future onRun() {
+ if (!entrypoint.lockFileExists) {
+ log.error(json.stringify(
+ 'Package "myapp" has no lockfile. Please run "pub install" first.'));
+ exit(exit_codes.NO_INPUT);
+ }
+
+ var output = {};
+ var futures = [];
+ entrypoint.loadLockFile().packages.forEach((name, package) {
+ var source = entrypoint.cache.sources[package.source];
+ futures.add(source.getDirectory(package).then((packageDir) {
+ output[name] = packageDir;
+ }));
+ });
+
+ return Future.wait(futures).then((_) {
+ log.message(json.stringify(output));
+ });
+ }
+}
+
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 69d92a1..ad891dc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -9,10 +9,12 @@
import 'package:barback/barback.dart';
import 'package:path/path.dart' as path;
+import 'package:watcher/watcher.dart';
import '../command.dart';
import '../entrypoint.dart';
import '../exit_codes.dart' as exit_codes;
+import '../io.dart';
import '../log.dart' as log;
import '../pub_package_provider.dart';
import '../utils.dart';
@@ -26,18 +28,58 @@
String get description => "Run a local web development server.";
String get usage => 'pub serve';
+ PubPackageProvider _provider;
+ Barback _barback;
+
+ /// The completer for the top-level future returned by the command.
+ ///
+ /// Only used to keep pub running (by not completing) and to pipe fatal
+ /// errors to pub's top-level error-handling machinery.
+ final _commandCompleter = new Completer();
+
ServeCommand() {
commandParser.addOption('port', defaultsTo: '8080',
help: 'The port to listen on.');
}
Future onRun() {
- // The completer for the top-level future returned by the command. Only
- // used to keep pub running (by not completing) and to pipe fatal errors
- // to pub's top-level error-handling machinery.
- var completer = new Completer();
+ var port = parsePort();
- return new Future.value().then((_) {
+ return ensureLockFileIsUpToDate().then((_) {
+ return PubPackageProvider.create(entrypoint);
+ }).then((provider) {
+ _provider = provider;
+
+ initBarback();
+
+ HttpServer.bind("localhost", port).then((server) {
+ watchSources();
+
+ log.message("Serving ${entrypoint.root.name} "
+ "on http://localhost:${server.port}");
+
+ server.listen(handleRequest);
+ });
+
+ return _commandCompleter.future;
+ });
+ }
+
+ /// Parses the `--port` command-line argument and exits if it isn't valid.
+ int parsePort() {
+ try {
+ return int.parse(commandOptions['port']);
+ } on FormatException catch(_) {
+ log.error('Could not parse port "${commandOptions['port']}"');
+ this.printUsage();
+ exit(exit_codes.USAGE);
+ }
+ }
+
+ /// Installs dependencies is the lockfile is out of date with respect to the
+ /// pubspec.
+ Future ensureLockFileIsUpToDate() {
+ return new Future.sync(() {
// The server relies on an up-to-date lockfile, so install first if
// needed.
if (!entrypoint.isLockFileUpToDate()) {
@@ -46,91 +88,50 @@
log.message("Dependencies installed!");
});
}
- }).then((_) {
- return PubPackageProvider.create(entrypoint);
- }).then((provider) {
- var port;
- try {
- port = int.parse(commandOptions['port']);
- } on FormatException catch(_) {
- log.error('Could not parse port "${commandOptions['port']}"');
- this.printUsage();
- exit(exit_codes.USAGE);
+ });
+ }
+
+ void handleRequest(HttpRequest request) {
+ var id = getIdFromUri(request.uri);
+ if (id == null) {
+ notFound(request, "Path ${request.uri.path} is not valid.");
+ return;
+ }
+
+ _barback.getAssetById(id).then((asset) {
+ return validateStream(asset.read()).then((stream) {
+ log.message(
+ "$_green${request.method}$_none ${request.uri} -> $asset");
+ // TODO(rnystrom): Set content-type based on asset type.
+ return request.response.addStream(stream).then((_) {
+ request.response.close();
+ });
+ }).catchError((error) {
+ log.error("$_red${request.method}$_none "
+ "${request.uri} -> $error");
+
+ // If we couldn't read the asset, handle the error gracefully.
+ if (error is FileException) {
+ // Assume this means the asset was a file-backed source asset
+ // and we couldn't read it, so treat it like a missing asset.
+ notFound(request, error);
+ return;
+ }
+
+ // Otherwise, it's some internal error.
+ request.response.statusCode = 500;
+ request.response.reasonPhrase = "Internal Error";
+ request.response.write(error);
+ request.response.close();
+ });
+ }).catchError((error) {
+ log.error("$_red${request.method}$_none ${request.uri} -> $error");
+ if (error is! AssetNotFoundException) {
+ _commandCompleter.completeError(error);
+ return;
}
- var barback = new Barback(provider);
-
- barback.results.listen((result) {
- if (result.succeeded) {
- // TODO(rnystrom): Report using growl/inotify-send where available.
- log.message("Build completed ${_green}successfully$_none");
- } else {
- log.message("Build completed with "
- "${_red}${result.errors.length}$_none errors.");
- }
- });
-
- barback.errors.listen((error) {
- log.error("${_red}Build error:\n$error$_none");
- });
-
- // TODO(rnystrom): Watch file system and update sources again when they
- // are added or modified.
-
- HttpServer.bind("localhost", port).then((server) {
- // Add all of the visible files.
- for (var package in provider.packages) {
- barback.updateSources(provider.listAssets(package));
- }
-
- log.message("Serving ${entrypoint.root.name} "
- "on http://localhost:${server.port}");
-
- server.listen((request) {
- var id = getIdFromUri(request.uri);
- if (id == null) {
- return notFound(request, "Path ${request.uri.path} is not valid.");
- }
-
- barback.getAssetById(id).then((asset) {
- return validateStream(asset.read()).then((stream) {
- log.message(
- "$_green${request.method}$_none ${request.uri} -> $asset");
- // TODO(rnystrom): Set content-type based on asset type.
- return request.response.addStream(stream).then((_) {
- request.response.close();
- });
- }).catchError((error) {
- log.error("$_red${request.method}$_none "
- "${request.uri} -> $error");
-
- // If we couldn't read the asset, handle the error gracefully.
- if (error is FileException) {
- // Assume this means the asset was a file-backed source asset
- // and we couldn't read it, so treat it like a missing asset.
- notFound(request, error);
- return;
- }
-
- // Otherwise, it's some internal error.
- request.response.statusCode = 500;
- request.response.reasonPhrase = "Internal Error";
- request.response.write(error);
- request.response.close();
- });
- }).catchError((error) {
- log.error("$_red${request.method}$_none ${request.uri} -> $error");
- if (error is! AssetNotFoundException) {
- completer.completeError(error);
- return;
- }
-
- notFound(request, error);
- });
- });
- });
-
- return completer.future;
+ notFound(request, error);
});
}
@@ -186,4 +187,97 @@
return new AssetId(entrypoint.root.name,
path.url.join("web", path.url.joinAll(parts)));
}
+
+ /// Creates the [Barback] instance and listens to its outputs.
+ void initBarback() {
+ assert(_provider != null);
+
+ _barback = new Barback(_provider);
+
+ _barback.results.listen((result) {
+ if (result.succeeded) {
+ // TODO(rnystrom): Report using growl/inotify-send where available.
+ log.message("Build completed ${_green}successfully$_none");
+ } else {
+ log.message("Build completed with "
+ "${_red}${result.errors.length}$_none errors.");
+ }
+ });
+
+ _barback.errors.listen((error) {
+ log.error("${_red}Build error:\n$error$_none");
+ });
+ }
+
+ /// Adds all of the source assets in the provided packages to barback and
+ /// then watches the public directories for changes.
+ void watchSources() {
+ assert(_provider != null);
+ assert(_barback != null);
+
+ for (var package in _provider.packages) {
+ // Add the initial sources.
+ _barback.updateSources(listAssets(package));
+
+ // Watch the visible package directories for changes.
+ var packageDir = _provider.getPackageDir(package);
+
+ for (var name in getPublicDirectories(package)) {
+ var subdirectory = path.join(packageDir, name);
+ var watcher = new DirectoryWatcher(subdirectory);
+ watcher.events.listen((event) {
+ var id = pathToAssetId(package, packageDir, event.path);
+ if (event.type == ChangeType.REMOVE) {
+ _barback.removeSources([id]);
+ } else {
+ _barback.updateSources([id]);
+ }
+ });
+ }
+ }
+ }
+
+ /// Lists all of the visible files in [package].
+ ///
+ /// This is the recursive contents of the "asset" and "lib" directories (if
+ /// present). If [package] is the entrypoint package, it also includes the
+ /// contents of "web".
+ List<AssetId> listAssets(String package) {
+ var files = <AssetId>[];
+
+ for (var dirPath in getPublicDirectories(package)) {
+ var packageDir = _provider.getPackageDir(package);
+ var dir = path.join(packageDir, dirPath);
+ if (!dirExists(dir)) continue;
+ for (var entry in listDir(dir, recursive: true)) {
+ // Ignore "packages" symlinks if there.
+ if (path.split(entry).contains("packages")) continue;
+
+ // Skip directories.
+ if (!fileExists(entry)) continue;
+
+ files.add(pathToAssetId(package, packageDir, entry));
+ }
+ }
+
+ return files;
+ }
+
+ /// Gets the names of the top-level directories in [package] whose contents
+ /// should be provided as source assets.
+ Iterable<String> getPublicDirectories(String package) {
+ var directories = ["asset", "lib"];
+ if (package == entrypoint.root.name) directories.add("web");
+ return directories;
+ }
+
+ /// Converts a local file path to an [AssetId].
+ AssetId pathToAssetId(String package, String packageDir, String filePath) {
+ var relative = path.relative(filePath, from: packageDir);
+
+ // AssetId paths use "/" on all platforms.
+ relative = path.toUri(relative).path;
+
+ return new AssetId(package, relative);
+ }
}
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 30f42f7..9ec81ec 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -53,6 +53,9 @@
/// The path to the entrypoint's "packages" directory.
String get packagesDir => path.join(root.dir, 'packages');
+ /// `true` if the entrypoint package currently has a lock file.
+ bool get lockFileExists => entryExists(_lockFilePath);
+
/// Ensures that the package identified by [id] is installed to the directory.
/// Returns the resolved [PackageId].
///
@@ -146,9 +149,8 @@
/// Loads the list of concrete package versions from the `pubspec.lock`, if it
/// exists. If it doesn't, this completes to an empty [LockFile].
LockFile loadLockFile() {
- var lockFilePath = path.join(root.dir, 'pubspec.lock');
- if (!entryExists(lockFilePath)) return new LockFile.empty();
- return new LockFile.load(lockFilePath, cache.sources);
+ if (!lockFileExists) return new LockFile.empty();
+ return new LockFile.load(_lockFilePath, cache.sources);
}
/// Determines whether or not the lockfile is out of date with respect to the
@@ -181,6 +183,9 @@
return true;
}
+ /// The path to the entrypoint package's lockfile.
+ String get _lockFilePath => path.join(root.dir, 'pubspec.lock');
+
/// Saves a list of concrete package versions to the `pubspec.lock` file.
void _saveLockFile(List<PackageId> packageIds) {
var lockFile = new LockFile.empty();
diff --git a/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
index b1c2821..0c43571 100644
--- a/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
@@ -10,14 +10,10 @@
import 'package:path/path.dart' as path;
import 'entrypoint.dart';
-import 'io.dart';
/// An implementation of barback's [PackageProvider] interface so that barback
/// can assets within pub packages.
class PubPackageProvider implements PackageProvider {
- /// The [Entrypoint] package being served.
- final Entrypoint _entrypoint;
-
/// Maps the names of all of the packages in [_entrypoint]'s transitive
/// dependency graph to the local path of the directory for that package.
final Map<String, String> _packageDirs;
@@ -30,7 +26,6 @@
// Cache package directories up front so we can have synchronous access
// to them.
- // TODO(rnystrom): Handle missing or out of date lockfile.
var futures = [];
entrypoint.loadLockFile().packages.forEach((name, package) {
var source = entrypoint.cache.sources[package.source];
@@ -40,51 +35,16 @@
});
return Future.wait(futures).then((_) {
- return new PubPackageProvider._(entrypoint, packageDirs);
+ return new PubPackageProvider._(packageDirs);
});
}
- PubPackageProvider._(this._entrypoint, this._packageDirs);
+ PubPackageProvider._(this._packageDirs);
Iterable<String> get packages => _packageDirs.keys;
- /// Lists all of the visible files in [package].
- ///
- /// This is the recursive contents of the "asset" and "lib" directories (if
- /// present). If [package] is the entrypoint package, it also includes the
- /// contents of "web".
- List<AssetId> listAssets(String package) {
- var files = <AssetId>[];
-
- addFiles(String dirPath) {
- var packageDir = _packageDirs[package];
- var dir = path.join(packageDir, dirPath);
- if (!dirExists(dir)) return;
- for (var entry in listDir(dir, recursive: true)) {
- // Ignore "packages" symlinks if there.
- if (path.split(entry).contains("packages")) continue;
-
- // Skip directories.
- if (!fileExists(entry)) continue;
-
- // AssetId paths use "/" on all platforms.
- var relative = path.relative(entry, from: packageDir);
- relative = path.toUri(relative).path;
- files.add(new AssetId(package, relative));
- }
- }
-
- // Expose the "asset" and "lib" directories.
- addFiles("asset");
- addFiles("lib");
-
- // The entrypoint's "web" directory is also visible.
- if (package == _entrypoint.root.name) {
- addFiles("web");
- }
-
- return files;
- }
+ /// Gets the root directory of [package].
+ String getPackageDir(String package) => _packageDirs[package];
// TODO(rnystrom): Actually support transformers.
Iterable<Iterable<Transformer>> getTransformers(String package) => [];
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
new file mode 100644
index 0000000..bc13c27
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+ initConfig();
+ integration("uses what's in the lockfile regardless of the pubspec", () {
+ d.dir("foo", [
+ d.libDir("foo"),
+ d.libPubspec("foo", "1.0.0")
+ ]).create();
+
+ d.dir(appPath, [
+ d.appPubspec({
+ "foo": {"path": path.join(sandboxDir, "foo")}
+ })
+ ]).create();
+
+ pubInstall();
+
+ // Add a dependency on "bar" and remove "foo", but don't run "pub install".
+ d.dir(appPath, [
+ d.appPubspec({
+ "bar": "any"
+ })
+ ]).create();
+
+ schedulePub(args: ["list-package-dirs", "--format=json"],
+ outputJson: {
+ "foo": path.join(sandboxDir, "foo")
+ });
+ });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
new file mode 100644
index 0000000..60c7786
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+ initConfig();
+ integration('includes dev dependencies in the results', () {
+ d.dir("foo", [
+ d.libDir("foo"),
+ d.libPubspec("foo", "1.0.0")
+ ]).create();
+
+ d.dir(appPath, [
+ d.pubspec({
+ "name": "myapp",
+ "dev_dependencies": {
+ "foo": {"path": path.join(sandboxDir, "foo")}
+ }
+ })
+ ]).create();
+
+ pubInstall();
+
+ schedulePub(args: ["list-package-dirs", "--format=json"],
+ outputJson: {
+ "foo": path.join(sandboxDir, "foo")
+ });
+ });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
new file mode 100644
index 0000000..b3ac39b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+ initConfig();
+ integration('prints the local paths to all packages in the lockfile', () {
+ servePackages([packageMap("bar", "1.0.0")]);
+
+ d.dir("foo", [
+ d.libDir("foo"),
+ d.libPubspec("foo", "1.0.0")
+ ]).create();
+
+ d.dir(appPath, [
+ d.appPubspec({
+ "foo": {"path": path.join(sandboxDir, "foo")},
+ "bar": "any"
+ })
+ ]).create();
+
+ pubInstall();
+
+ schedulePub(args: ["list-package-dirs", "--format=json"],
+ outputJson: {
+ "foo": path.join(sandboxDir, "foo"),
+ "bar": port.then((p) => path.join(sandboxDir, cachePath, "hosted",
+ "localhost%58$p", "bar-1.0.0"))
+ });
+ });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
new file mode 100644
index 0000000..554edd7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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 d.file.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+ initConfig();
+ integration('with no lockfile, exits with error', () {
+ d.dir(appPath, [
+ d.appPubspec()
+ ]).create();
+
+ schedulePub(args: ["list-package-dirs", "--format=json"],
+ error: '''
+ "Package \\"myapp\\" has no lockfile. Please run \\"pub install\\" first."
+ ''',
+ exitCode: exit_codes.NO_INPUT);
+ });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/pub_cache_test.dart b/sdk/lib/_internal/pub/test/pub_cache_test.dart
index 39bb79b..91bc4a0 100644
--- a/sdk/lib/_internal/pub/test/pub_cache_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_cache_test.dart
@@ -4,12 +4,19 @@
library pub_cache_test;
+import 'package:path/path.dart' as path;
+
import 'descriptor.dart' as d;
import 'test_pub.dart';
main() {
initConfig();
+ hostedDir(package) {
+ return path.join(sandboxDir, cachePath, "hosted",
+ "pub.dartlang.org", package);
+ }
+
integration('running pub cache displays error message', () {
schedulePub(args: ['cache'],
output: '''
@@ -47,7 +54,7 @@
])
]).create();
- schedulePub(args: ['cache', 'list'], output: '{"packages":{}}');
+ schedulePub(args: ['cache', 'list'], outputJson: {"packages":{}});
});
integration('running pub cache list', () {
@@ -66,10 +73,12 @@
])
]).create();
- schedulePub(args: ['cache', 'list'], output:
- new RegExp(r'\{"packages":\{"bar":\{"2\.0\.0":\{"location":'
- r'"[^"]+bar-2\.0\.0"\}},"foo":\{"1\.2\.3":\{"location":'
- r'"[^"]+foo-1\.2\.3"\}\}\}\}$'));
+ schedulePub(args: ['cache', 'list'], outputJson: {
+ "packages": {
+ "bar": {"2.0.0": {"location": hostedDir('bar-2.0.0')}},
+ "foo": {"1.2.3": {"location": hostedDir('foo-1.2.3')}}
+ }
+ });
});
integration('includes packages containing deps with bad sources', () {
@@ -85,8 +94,10 @@
])
]).create();
- schedulePub(args: ['cache', 'list'], output:
- new RegExp(r'\{"packages":\{"foo":\{"1\.2\.3":\{"location":'
- r'"[^"]+foo-1\.2\.3"\}\}\}\}$'));
+ schedulePub(args: ['cache', 'list'], outputJson: {
+ "packages": {
+ "foo": {"1.2.3": {"location": hostedDir('foo-1.2.3')}}
+ }
+ });
});
}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index ce4a4c5..f9b5c57 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -28,7 +28,6 @@
-v, --verbose Shortcut for "--verbosity=all".
Available commands:
- cache Inspect the system cache.
deploy Copy and compile all Dart entrypoints in the 'web' directory.
help Display help information for Pub.
install Install the current package's dependencies.
diff --git a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
index 1f69b6c..39efa26 100644
--- a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
@@ -4,8 +4,6 @@
library pub_tests;
-import 'dart:io';
-
import '../descriptor.dart' as d;
import '../test_pub.dart';
import 'utils.dart';
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
index ff25e6a..0d41296 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
@@ -27,8 +27,7 @@
})
]).create();
- pubInstall();
- startPubServe();
+ startPubServe(shouldInstallFirst: true);
requestShouldSucceed("assets/foo/foo.txt", "foo");
requestShouldSucceed("assets/foo/sub/bar.txt", "bar");
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
index 7067525..ae7db1b 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
@@ -27,8 +27,7 @@
})
]).create();
- pubInstall();
- startPubServe();
+ startPubServe(shouldInstallFirst: true);
requestShouldSucceed("packages/foo/lib.dart", "foo() => 'foo';");
requestShouldSucceed("packages/foo/sub/lib.dart", "bar() => 'bar';");
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 3a08392..128917a 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -67,4 +67,22 @@
expect(response.statusCode, equals(404));
});
}, "request $urlPath");
-}
\ No newline at end of file
+}
+
+/// Reads lines from pub serve's stdout until it prints the build success
+/// message.
+///
+/// The schedule will not proceed until the output is found. If not found, it
+/// will eventually time out.
+void waitForBuildSuccess() {
+ nextLine() {
+ return _pubServer.nextLine().then((line) {
+ if (line.contains("successfully")) return;
+
+ // This line wasn't it, so ignore it and keep trying.
+ return nextLine();
+ });
+ }
+
+ schedule(nextLine);
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
new file mode 100644
index 0000000..75a1718
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+ initConfig();
+ integration("picks up files added after serving started", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "body")
+ ])
+ ]).create();
+
+ startPubServe();
+ waitForBuildSuccess();
+ requestShouldSucceed("index.html", "body");
+
+ d.dir(appPath, [
+ d.dir("web", [
+ d.file("other.html", "added")
+ ])
+ ]).create();
+
+ waitForBuildSuccess();
+ requestShouldSucceed("other.html", "added");
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
new file mode 100644
index 0000000..6cf610d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+ initConfig();
+ integration("watches modifications to files", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "before")
+ ])
+ ]).create();
+
+ startPubServe();
+ requestShouldSucceed("index.html", "before");
+
+ d.dir(appPath, [
+ d.dir("web", [
+ d.file("index.html", "after")
+ ])
+ ]).create();
+
+ waitForBuildSuccess();
+ requestShouldSucceed("index.html", "after");
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
new file mode 100644
index 0000000..46fdc4c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+ initConfig();
+ integration("stop serving a file that is removed", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "body")
+ ])
+ ]).create();
+
+ startPubServe();
+ requestShouldSucceed("index.html", "body");
+
+ schedule(() => deleteEntry(
+ path.join(sandboxDir, appPath, "web", "index.html")));
+
+ waitForBuildSuccess();
+ requestShould404("index.html");
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index b018be1..f1358a9 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -366,20 +366,40 @@
'symlinking $target to $symlink');
}
-/// Schedules a call to the Pub command-line utility. Runs Pub with [args] and
-/// validates that its results match [output], [error], and [exitCode].
-void schedulePub({List args, Pattern output, Pattern error,
+/// Schedules a call to the Pub command-line utility.
+///
+/// Runs Pub with [args] and validates that its results match [output] (or
+/// [outputJson]), [error], and [exitCode]. If [outputJson] is given, validates
+/// that pub outputs stringified JSON matching that object.
+void schedulePub({List args, Pattern output, Pattern error, outputJson,
Future<Uri> tokenEndpoint, int exitCode: 0}) {
+ // Cannot pass both output and outputJson.
+ assert(output == null || outputJson == null);
+
var pub = startPub(args: args, tokenEndpoint: tokenEndpoint);
pub.shouldExit(exitCode);
+ var failures = [];
+ var stderr;
+
expect(Future.wait([
pub.remainingStdout(),
pub.remainingStderr()
]).then((results) {
- var failures = [];
- _validateOutput(failures, 'stdout', output, results[0].split('\n'));
- _validateOutput(failures, 'stderr', error, results[1].split('\n'));
+ stderr = results[1];
+
+ if (outputJson == null) {
+ _validateOutput(failures, 'stdout', output, results[0]);
+ return;
+ }
+
+ // Allow the expected JSON to contain futures.
+ return awaitObject(outputJson).then((resolved) {
+ _validateOutputJson(failures, 'stdout', resolved, results[0]);
+ });
+ }).then((_) {
+ _validateOutput(failures, 'stderr', error, stderr);
+
if (!failures.isEmpty) throw new TestFailure(failures.join('\n'));
}), completes);
}
@@ -647,13 +667,14 @@
/// report the offending difference in a nice way. For other [Pattern]s, just
/// reports whether the output contained the pattern.
void _validateOutput(List<String> failures, String pipe, Pattern expected,
- List<String> actual) {
+ String actual) {
if (expected == null) return;
+ var actualLines = actual.split("\n");
if (expected is RegExp) {
- _validateOutputRegex(failures, pipe, expected, actual);
+ _validateOutputRegex(failures, pipe, expected, actualLines);
} else {
- _validateOutputString(failures, pipe, expected, actual);
+ _validateOutputString(failures, pipe, expected, actualLines);
}
}
@@ -719,6 +740,22 @@
}
}
+void _validateOutputJson(List<String> failures, String pipe,
+ expected, String actualText) {
+ var actual;
+ try {
+ actual = json.parse(actualText);
+ } on FormatException catch(error) {
+ failures.add('Expected $pipe JSON:');
+ failures.add(expected);
+ failures.add('Got invalid JSON:');
+ failures.add(actualText);
+ }
+
+ // Do a deep comparison of the JSON objects.
+ expect(actual, equals(expected));
+}
+
/// A function that creates a [Validator] subclass.
typedef Validator ValidatorCreator(Entrypoint entrypoint);
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index 5f843b2..76c2b42 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -2,6 +2,19 @@
// 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.
+/**
+ * Support for asynchronous programming,
+ * with classes such as Future and Stream.
+ *
+ * For an introduction to using dart:async, see the
+ * [dart:async section of the language tour]
+ * (https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html#ch03-asynchronous-programming).
+ * Also see
+ * [articles](https://www.dartlang.org/articles/)
+ * such as
+ * [Using Future Based APIs]
+ * (https://www.dartlang.org/articles/using-future-based-apis/).
+ */
library dart.async;
import "dart:collection";
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index c8fbe70..7f26c4f 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -548,7 +548,7 @@
}
/** A delayed data event. */
-class _DelayedData<T> extends _DelayedEvent{
+class _DelayedData<T> extends _DelayedEvent {
final T value;
_DelayedData(this.value);
void perform(_EventDispatch<T> dispatch) {
diff --git a/sdk/lib/chrome/dart2js/chrome_dart2js.dart b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
index 0bca602..77338a8 100644
--- a/sdk/lib/chrome/dart2js/chrome_dart2js.dart
+++ b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
@@ -1,10 +1,10 @@
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-/// http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
library chrome;
import 'dart:_foreign_helper' show JS;
@@ -363,6 +363,7 @@
* Members
*/
API_ChromeApp app;
+ API_file_system fileSystem;
/*
* Constructor
@@ -376,6 +377,11 @@
if (app_object == null)
throw new UnsupportedError('Not supported by current browser.');
app = new API_ChromeApp(app_object);
+
+ var file_system_object = JS('', '#.fileSystem', this._jsObject);
+ if (file_system_object == null)
+ throw new UnsupportedError('Not supported by current browser.');
+ fileSystem = new API_file_system(file_system_object);
}
}
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index f77fc23..ba07414 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -2,6 +2,9 @@
// 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.
+/**
+ * Classes and utilities that supplement the collection support in dart:core.
+ */
library dart.collection;
import 'dart:_collection-dev';
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 4003684..3e9b6f5 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -2,6 +2,10 @@
// 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.
+/**
+ * Converters for JSON and UTF-8, as well as support for creating additional
+ * converters.
+ */
library dart.convert;
import 'dart:async';
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index 2c5da00..6155d6a 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -4,9 +4,22 @@
part of dart.core;
+/**
+ * The reserved words [:true:] and [:false:] denote objects that are the only
+ * instances of this class.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * bool.
+ */
class bool {
factory bool._uninstantiable() {
throw new UnsupportedError(
"class bool cannot be instantiated");
}
+
+ /**
+ * Returns [:"true":] if the receiver is [:true:], or [:"false":] if the
+ * receiver is [:false:].
+ */
+ String toString();
}
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index de7fc4a..89208f8 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -25,6 +25,7 @@
part "iterator.dart";
part "list.dart";
part "map.dart";
+part "null.dart";
part "num.dart";
part "object.dart";
part "pattern.dart";
diff --git a/sdk/lib/core/corelib_sources.gypi b/sdk/lib/core/corelib_sources.gypi
index faafe0a..172f2e8 100644
--- a/sdk/lib/core/corelib_sources.gypi
+++ b/sdk/lib/core/corelib_sources.gypi
@@ -22,6 +22,7 @@
'iterator.dart',
'list.dart',
'map.dart',
+ 'null.dart',
'num.dart',
'object.dart',
'pattern.dart',
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 0028f91..409e294 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -11,10 +11,14 @@
/**
* Representation of Dart doubles containing double specific constants
* and operations and specializations of operations inherited from
- * [num].
+ * [num]. Dart doubles are 64-bit floating-point numbers as specified in the
+ * IEEE 754 standard.
*
* The [double] type is contagious. Operations on [double]s return
* [double] results.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * double.
*/
abstract class double extends num {
static const double NAN = 0.0 / 0.0;
@@ -142,15 +146,16 @@
* (optional) exponent part consists of the character "e" or "E", an optional
* sign, and one or more digits.
*
- * The input string is trimmed (see [String.trim]) before conversion.
+ * Leading and trailing whitespace is ignored.
*
- * If the [source] is not a valid double literal, the [handleError]
+ * If the [source] is not a valid double literal, the [onError]
* is called with the [source] as argument, and its return value is
- * used instead. If no handleError is provided, a [FormatException]
- * is thrown.
+ * used instead. If no `onError` is provided, a [FormatException]
+ * is thrown instead.
*
- * The [onError] function is only invoked if [source] is a [String]. It is
- * not invoked if the [source] is, for example, `null`.
+ * The [onError] function is only invoked if [source] is a [String] with an
+ * invalid format. It is not invoked if the [source] is invalid for some
+ * other reason, for example by being `null`.
*
* Examples of accepted strings:
*
@@ -164,5 +169,5 @@
* "-NaN"
*/
external static double parse(String source,
- [double handleError(String source)]);
+ [double onError(String source)]);
}
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index f61cdfe..1ce7193 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -16,15 +16,48 @@
return object.toString();
}
if (object is String) {
- // TODO(ahe): Remove backslash when http://dartbug.com/4995 is fixed.
String string = object;
- const backslash = '\\';
- String escaped = string
- .replaceAll('$backslash', '$backslash$backslash')
- .replaceAll('\n', '${backslash}n')
- .replaceAll('\r', '${backslash}r')
- .replaceAll('"', '$backslash"');
- return '"$escaped"';
+ StringBuffer buffer = new StringBuffer('"');
+ const int TAB = 0x09;
+ const int NEWLINE = 0x0a;
+ const int CARRIGE_RETURN = 0x0d;
+ const int BACKSLASH = 0x5c;
+ const int DOUBLE_QUOTE = 0x22;
+ const int DIGIT_ZERO = 0x30;
+ const int LOWERCASE_A = 0x61;
+ const int MAX_CONTROL = 0x1f;
+ for (int i = 0; i < string.length; i++) {
+ int codeUnit = string.codeUnitAt(i);
+ if (codeUnit <= MAX_CONTROL) {
+ if (codeUnit == NEWLINE) {
+ buffer.write(r"\n");
+ } else if (codeUnit == CARRIGE_RETURN) {
+ buffer.write(r"\r");
+ } else if (codeUnit == TAB) {
+ buffer.write(r"\t");
+ } else {
+ buffer.write(r"\x");
+ // Convert code in range 0x00 .. 0x1f to hex a two-digit hex string.
+ if (codeUnit < 0x10) {
+ buffer.write("0");
+ } else {
+ buffer.write("1");
+ codeUnit -= 0x10;
+ }
+ // Single digit to hex.
+ buffer.writeCharCode(codeUnit < 10 ? DIGIT_ZERO + codeUnit
+ : LOWERCASE_A - 10 + codeUnit);
+ }
+ } else if (codeUnit == BACKSLASH) {
+ buffer.write(r"\\");
+ } else if (codeUnit == DOUBLE_QUOTE) {
+ buffer.write(r'\"');
+ } else {
+ buffer.writeCharCode(codeUnit);
+ }
+ }
+ buffer.write('"');
+ return buffer.toString();
}
return _objectToString(object);
}
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 2dd2be2..5d7f79a 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -17,6 +17,8 @@
* values. The behavior of the operators and methods in the [int]
* class therefore sometimes differs between the Dart VM and Dart code
* compiled to JavaScript.*
+ *
+ * It is a compile-time error for a class to attempt to extend or implement int.
*/
abstract class int extends num {
/** The bit-wise and operator. */
diff --git a/sdk/lib/core/null.dart b/sdk/lib/core/null.dart
new file mode 100644
index 0000000..dd914a3
--- /dev/null
+++ b/sdk/lib/core/null.dart
@@ -0,0 +1,21 @@
+// 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.
+
+part of dart.core;
+
+/**
+ * The reserved word [:null:] denotes an object that is the sole instance of
+ * this class.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * Null.
+ */
+class Null {
+ factory Null._uninstantiable() {
+ throw new UnsupportedError('class Null cannot be instantiated');
+ }
+
+ /** Returns the string `"null"`. */
+ String toString() => "null";
+}
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index 57bf59e..b35a5ad 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -6,6 +6,9 @@
/**
* All numbers in dart are instances of [num].
+ *
+ * It is a compile-time error for any type other than the types int and double
+ * to attempt to extend or implement num.
*/
abstract class num implements Comparable<num> {
/** Addition operator. */
diff --git a/sdk/lib/core/object.dart b/sdk/lib/core/object.dart
index 3b61927..737f916 100644
--- a/sdk/lib/core/object.dart
+++ b/sdk/lib/core/object.dart
@@ -23,6 +23,25 @@
* The default behavior for all [Object]s is to return true if and
* only if [:this:] and [other] are the same object.
*
+ * Override this method to specify a different equality relation on
+ * a class. The overriding method must still be an equivalence relation.
+ * That is, it must be:
+ *
+ * * Total: It must return a boolean for all arguments. It should never throw
+ * or return `null`.
+ *
+ * * Reflexive: For all objects `o`, `o == o` must be true.
+ *
+ * * Symmetric: For all objects `o1` and `o2`, `o1 == o2` and `o2 == o1` must
+ * either both be true, or both be false.
+ *
+ * * Transitive: For all objects `o1`, `o2`, and `o3`, if `o1 == o2` and
+ * `o2 == o3` are true, then `o1 == o3` must be true.
+ *
+ * The method should also be consistent over time, so equality of two objects
+ * should not change over time, or at least only change if one of the objects
+ * was modified.
+ *
* If a subclass overrides the equality operator it should override
* the [hashCode] method as well to maintain consistency.
*/
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index dd29d51..a515692 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -69,7 +69,7 @@
/**
- * [RegExp] represents regular expressions.
+ * A class for working with regular expressions.
*
* Dart regular expressions have the same syntax and semantics as
* JavaScript regular expressions. See
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index e2ffc23..3f1a7cc 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -16,6 +16,9 @@
* terminology to Go we use the name "rune" for an integer representing a
* Unicode code point. The runes of a string are accessible through the [runes]
* getter.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * String.
*/
abstract class String implements Comparable<String>, Pattern {
/**
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 02573c2..47d6327 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -738,10 +738,29 @@
return output.join("/");
}
- Uri resolve(String uri) {
- return resolveUri(Uri.parse(uri));
+ /**
+ * Resolve [reference] as an URI relative to `this`.
+ *
+ * First turn [reference] into a URI using [Uri.parse]. Then resolve the
+ * resulting URI relative to `this`.
+ *
+ * Returns the resolved URI.
+ *
+ * See [resolveUri] for details.
+ */
+ Uri resolve(String reference) {
+ return resolveUri(Uri.parse(reference));
}
+ /**
+ * Resolve [reference] as an URI relative to `this`.
+ *
+ * Returns the resolved URI.
+ *
+ * The algorithm for resolving a reference is described in
+ * [RFC-3986 Section 5]
+ * (http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
+ */
Uri resolveUri(Uri reference) {
// From RFC 3986.
String targetScheme;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1ff5ad4..15b960c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -18,8 +18,6 @@
import 'dart:web_audio' as web_audio;
import 'dart:web_gl' as gl;
import 'dart:web_sql';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
import 'dart:_isolate_helper' show IsolateNatives;
import 'dart:_foreign_helper' show JS;
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -32,6 +30,12 @@
// Not actually used, but imported since dart:html can generate these objects.
+import 'dart:_js_helper' show
+ convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
+ JSName, Null, Returns,
+ findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+ Interceptor, JSExtendableArray, findInterceptorConstructorForType;
@@ -62,8 +66,8 @@
// Workaround for tags like <cite> that lack their own Element subclass --
// Dart issue 1990.
-class _HTMLElement extends Element native "HTMLElement" {
- factory _HTMLElement() { throw new UnsupportedError("Not supported"); }
+class HtmlElement extends Element native "HTMLElement" {
+ factory HtmlElement() { throw new UnsupportedError("Not supported"); }
}
// Support for Send/ReceivePortSync.
@@ -154,7 +158,7 @@
@DocsEditable()
@DomName('HTMLAnchorElement')
-class AnchorElement extends _HTMLElement native "HTMLAnchorElement" {
+class AnchorElement extends HtmlElement native "HTMLAnchorElement" {
// To suppress missing implicit constructor warnings.
factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
@@ -403,7 +407,7 @@
* on MDN.
*/
@DomName('HTMLAreaElement')
-class AreaElement extends _HTMLElement native "HTMLAreaElement" {
+class AreaElement extends HtmlElement native "HTMLAreaElement" {
// To suppress missing implicit constructor warnings.
factory AreaElement._() { throw new UnsupportedError("Not supported"); }
@@ -511,7 +515,7 @@
@DocsEditable()
@DomName('HTMLBRElement')
-class BRElement extends _HTMLElement native "HTMLBRElement" {
+class BRElement extends HtmlElement native "HTMLBRElement" {
// To suppress missing implicit constructor warnings.
factory BRElement._() { throw new UnsupportedError("Not supported"); }
@@ -541,7 +545,7 @@
@DocsEditable()
@DomName('HTMLBaseElement')
-class BaseElement extends _HTMLElement native "HTMLBaseElement" {
+class BaseElement extends HtmlElement native "HTMLBaseElement" {
// To suppress missing implicit constructor warnings.
factory BaseElement._() { throw new UnsupportedError("Not supported"); }
@@ -620,7 +624,7 @@
@DocsEditable()
@DomName('HTMLBodyElement')
-class BodyElement extends _HTMLElement native "HTMLBodyElement" {
+class BodyElement extends HtmlElement native "HTMLBodyElement" {
// To suppress missing implicit constructor warnings.
factory BodyElement._() { throw new UnsupportedError("Not supported"); }
@@ -731,7 +735,7 @@
@DocsEditable()
@DomName('HTMLButtonElement')
-class ButtonElement extends _HTMLElement native "HTMLButtonElement" {
+class ButtonElement extends HtmlElement native "HTMLButtonElement" {
// To suppress missing implicit constructor warnings.
factory ButtonElement._() { throw new UnsupportedError("Not supported"); }
@@ -844,7 +848,7 @@
@DomName('HTMLCanvasElement')
-class CanvasElement extends _HTMLElement implements CanvasImageSource native "HTMLCanvasElement" {
+class CanvasElement extends HtmlElement implements CanvasImageSource native "HTMLCanvasElement" {
// To suppress missing implicit constructor warnings.
factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
@@ -1926,7 +1930,7 @@
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
-class ContentElement extends _HTMLElement native "HTMLContentElement" {
+class ContentElement extends HtmlElement native "HTMLContentElement" {
// To suppress missing implicit constructor warnings.
factory ContentElement._() { throw new UnsupportedError("Not supported"); }
@@ -6295,7 +6299,7 @@
@DocsEditable()
@DomName('HTMLDListElement')
-class DListElement extends _HTMLElement native "HTMLDListElement" {
+class DListElement extends HtmlElement native "HTMLDListElement" {
// To suppress missing implicit constructor warnings.
factory DListElement._() { throw new UnsupportedError("Not supported"); }
@@ -6314,7 +6318,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
-class DataListElement extends _HTMLElement native "HTMLDataListElement" {
+class DataListElement extends HtmlElement native "HTMLDataListElement" {
// To suppress missing implicit constructor warnings.
factory DataListElement._() { throw new UnsupportedError("Not supported"); }
@@ -6523,7 +6527,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental()
-class DetailsElement extends _HTMLElement native "HTMLDetailsElement" {
+class DetailsElement extends HtmlElement native "HTMLDetailsElement" {
// To suppress missing implicit constructor warnings.
factory DetailsElement._() { throw new UnsupportedError("Not supported"); }
@@ -6664,7 +6668,7 @@
@DocsEditable()
@DomName('HTMLDialogElement')
@Unstable()
-class DialogElement extends _HTMLElement native "HTMLDialogElement" {
+class DialogElement extends HtmlElement native "HTMLDialogElement" {
// To suppress missing implicit constructor warnings.
factory DialogElement._() { throw new UnsupportedError("Not supported"); }
@@ -6913,7 +6917,7 @@
* * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
*/
@DomName('HTMLDivElement')
-class DivElement extends _HTMLElement native "HTMLDivElement" {
+class DivElement extends HtmlElement native "HTMLDivElement" {
// To suppress missing implicit constructor warnings.
factory DivElement._() { throw new UnsupportedError("Not supported"); }
@@ -6976,7 +6980,7 @@
/// Moved to [HtmlDocument].
@DomName('Document.body')
@DocsEditable()
- Element $dom_body;
+ HtmlElement $dom_body;
@DomName('Document.charset')
@DocsEditable()
@@ -10574,7 +10578,7 @@
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class EmbedElement extends _HTMLElement native "HTMLEmbedElement" {
+class EmbedElement extends HtmlElement native "HTMLEmbedElement" {
// To suppress missing implicit constructor warnings.
factory EmbedElement._() { throw new UnsupportedError("Not supported"); }
@@ -11196,7 +11200,7 @@
@DocsEditable()
@DomName('HTMLFieldSetElement')
@Unstable()
-class FieldSetElement extends _HTMLElement native "HTMLFieldSetElement" {
+class FieldSetElement extends HtmlElement native "HTMLFieldSetElement" {
// To suppress missing implicit constructor warnings.
factory FieldSetElement._() { throw new UnsupportedError("Not supported"); }
@@ -11872,7 +11876,7 @@
@DocsEditable()
@DomName('HTMLFormElement')
-class FormElement extends _HTMLElement native "HTMLFormElement" {
+class FormElement extends HtmlElement native "HTMLFormElement" {
// To suppress missing implicit constructor warnings.
factory FormElement._() { throw new UnsupportedError("Not supported"); }
@@ -12144,7 +12148,7 @@
* An `<hr>` tag.
*/
@DomName('HTMLHRElement')
-class HRElement extends _HTMLElement native "HTMLHRElement" {
+class HRElement extends HtmlElement native "HTMLHRElement" {
// To suppress missing implicit constructor warnings.
factory HRElement._() { throw new UnsupportedError("Not supported"); }
@@ -12200,7 +12204,7 @@
@DocsEditable()
@DomName('HTMLHeadElement')
-class HeadElement extends _HTMLElement native "HTMLHeadElement" {
+class HeadElement extends HtmlElement native "HTMLHeadElement" {
// To suppress missing implicit constructor warnings.
factory HeadElement._() { throw new UnsupportedError("Not supported"); }
@@ -12215,7 +12219,7 @@
@DocsEditable()
@DomName('HTMLHeadingElement')
-class HeadingElement extends _HTMLElement native "HTMLHeadingElement" {
+class HeadingElement extends HtmlElement native "HTMLHeadingElement" {
// To suppress missing implicit constructor warnings.
factory HeadingElement._() { throw new UnsupportedError("Not supported"); }
@@ -12625,6 +12629,10 @@
@Experimental()
String get visibilityState => $dom_webkitVisibilityState;
+ @Experimental
+ void register(String tag, Type customElementClass) {
+ _registerCustomElement(JS('', 'window'), this, tag, customElementClass);
+ }
@Creates('Null') // Set from Dart code; does not instantiate a native type.
// Note: used to polyfill <template>
@@ -12636,21 +12644,6 @@
@DocsEditable()
-@DomName('HTMLHtmlElement')
-class HtmlElement extends _HTMLElement native "HTMLHtmlElement" {
- // To suppress missing implicit constructor warnings.
- factory HtmlElement._() { throw new UnsupportedError("Not supported"); }
-
- @DomName('HTMLHtmlElement.HTMLHtmlElement')
- @DocsEditable()
- factory HtmlElement() => document.$dom_createElement("html");
-}
-// Copyright (c) 2012, 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.
-
-
-@DocsEditable()
@DomName('HTMLFormControlsCollection')
class HtmlFormControlsCollection extends HtmlCollection native "HTMLFormControlsCollection" {
// To suppress missing implicit constructor warnings.
@@ -12666,6 +12659,21 @@
@DocsEditable()
+@DomName('HTMLHtmlElement')
+class HtmlHtmlElement extends HtmlElement native "HTMLHtmlElement" {
+ // To suppress missing implicit constructor warnings.
+ factory HtmlHtmlElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLHtmlElement.HTMLHtmlElement')
+ @DocsEditable()
+ factory HtmlHtmlElement() => document.$dom_createElement("html");
+}
+// Copyright (c) 2012, 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.
+
+
+@DocsEditable()
@DomName('HTMLOptionsCollection')
class HtmlOptionsCollection extends HtmlCollection native "HTMLOptionsCollection" {
// To suppress missing implicit constructor warnings.
@@ -13320,7 +13328,7 @@
@DocsEditable()
@DomName('HTMLIFrameElement')
-class IFrameElement extends _HTMLElement native "HTMLIFrameElement" {
+class IFrameElement extends HtmlElement native "HTMLIFrameElement" {
// To suppress missing implicit constructor warnings.
factory IFrameElement._() { throw new UnsupportedError("Not supported"); }
@@ -13421,7 +13429,7 @@
@DomName('HTMLImageElement')
-class ImageElement extends _HTMLElement implements CanvasImageSource native "HTMLImageElement" {
+class ImageElement extends HtmlElement implements CanvasImageSource native "HTMLImageElement" {
// To suppress missing implicit constructor warnings.
factory ImageElement._() { throw new UnsupportedError("Not supported"); }
@@ -13502,7 +13510,7 @@
@DomName('HTMLInputElement')
-class InputElement extends _HTMLElement implements
+class InputElement extends HtmlElement implements
HiddenInputElement,
SearchInputElement,
TextInputElement,
@@ -13641,7 +13649,7 @@
@DomName('HTMLInputElement.list')
@DocsEditable()
- final Element list;
+ final HtmlElement list;
@DomName('HTMLInputElement.max')
@DocsEditable()
@@ -14404,7 +14412,7 @@
@DomName('InputMethodContext.target')
@DocsEditable()
@Experimental() // untriaged
- final Element target;
+ final HtmlElement target;
@DomName('InputMethodContext.confirmComposition')
@DocsEditable()
@@ -14521,7 +14529,7 @@
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental()
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
-class KeygenElement extends _HTMLElement native "HTMLKeygenElement" {
+class KeygenElement extends HtmlElement native "HTMLKeygenElement" {
// To suppress missing implicit constructor warnings.
factory KeygenElement._() { throw new UnsupportedError("Not supported"); }
@@ -14594,7 +14602,7 @@
@DocsEditable()
@DomName('HTMLLIElement')
-class LIElement extends _HTMLElement native "HTMLLIElement" {
+class LIElement extends HtmlElement native "HTMLLIElement" {
// To suppress missing implicit constructor warnings.
factory LIElement._() { throw new UnsupportedError("Not supported"); }
@@ -14619,7 +14627,7 @@
@DocsEditable()
@DomName('HTMLLabelElement')
-class LabelElement extends _HTMLElement native "HTMLLabelElement" {
+class LabelElement extends HtmlElement native "HTMLLabelElement" {
// To suppress missing implicit constructor warnings.
factory LabelElement._() { throw new UnsupportedError("Not supported"); }
@@ -14629,7 +14637,7 @@
@DomName('HTMLLabelElement.control')
@DocsEditable()
- final Element control;
+ final HtmlElement control;
@DomName('HTMLLabelElement.form')
@DocsEditable()
@@ -14646,7 +14654,7 @@
@DocsEditable()
@DomName('HTMLLegendElement')
-class LegendElement extends _HTMLElement native "HTMLLegendElement" {
+class LegendElement extends HtmlElement native "HTMLLegendElement" {
// To suppress missing implicit constructor warnings.
factory LegendElement._() { throw new UnsupportedError("Not supported"); }
@@ -14665,7 +14673,7 @@
@DocsEditable()
@DomName('HTMLLinkElement')
-class LinkElement extends _HTMLElement native "HTMLLinkElement" {
+class LinkElement extends HtmlElement native "HTMLLinkElement" {
// To suppress missing implicit constructor warnings.
factory LinkElement._() { throw new UnsupportedError("Not supported"); }
@@ -14812,7 +14820,7 @@
@DocsEditable()
@DomName('HTMLMapElement')
-class MapElement extends _HTMLElement native "HTMLMapElement" {
+class MapElement extends HtmlElement native "HTMLMapElement" {
// To suppress missing implicit constructor warnings.
factory MapElement._() { throw new UnsupportedError("Not supported"); }
@@ -14912,7 +14920,7 @@
@DocsEditable()
@DomName('HTMLMediaElement')
@Unstable()
-class MediaElement extends _HTMLElement native "HTMLMediaElement" {
+class MediaElement extends HtmlElement native "HTMLMediaElement" {
// To suppress missing implicit constructor warnings.
factory MediaElement._() { throw new UnsupportedError("Not supported"); }
@@ -16029,7 +16037,7 @@
* * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
*/
@DomName('HTMLMenuElement')
-class MenuElement extends _HTMLElement native "HTMLMenuElement" {
+class MenuElement extends HtmlElement native "HTMLMenuElement" {
// To suppress missing implicit constructor warnings.
factory MenuElement._() { throw new UnsupportedError("Not supported"); }
@@ -16179,7 +16187,7 @@
@DocsEditable()
@DomName('HTMLMetaElement')
-class MetaElement extends _HTMLElement native "HTMLMetaElement" {
+class MetaElement extends HtmlElement native "HTMLMetaElement" {
// To suppress missing implicit constructor warnings.
factory MetaElement._() { throw new UnsupportedError("Not supported"); }
@@ -16243,7 +16251,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class MeterElement extends _HTMLElement native "HTMLMeterElement" {
+class MeterElement extends HtmlElement native "HTMLMeterElement" {
// To suppress missing implicit constructor warnings.
factory MeterElement._() { throw new UnsupportedError("Not supported"); }
@@ -16558,7 +16566,7 @@
@DocsEditable()
@DomName('HTMLModElement')
@Unstable()
-class ModElement extends _HTMLElement native "HTMLModElement" {
+class ModElement extends HtmlElement native "HTMLModElement" {
// To suppress missing implicit constructor warnings.
factory ModElement._() { throw new UnsupportedError("Not supported"); }
@@ -18155,7 +18163,7 @@
@DocsEditable()
@DomName('HTMLOListElement')
-class OListElement extends _HTMLElement native "HTMLOListElement" {
+class OListElement extends HtmlElement native "HTMLOListElement" {
// To suppress missing implicit constructor warnings.
factory OListElement._() { throw new UnsupportedError("Not supported"); }
@@ -18186,7 +18194,7 @@
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class ObjectElement extends _HTMLElement native "HTMLObjectElement" {
+class ObjectElement extends HtmlElement native "HTMLObjectElement" {
// To suppress missing implicit constructor warnings.
factory ObjectElement._() { throw new UnsupportedError("Not supported"); }
@@ -18266,7 +18274,7 @@
@DocsEditable()
@DomName('HTMLOptGroupElement')
-class OptGroupElement extends _HTMLElement native "HTMLOptGroupElement" {
+class OptGroupElement extends HtmlElement native "HTMLOptGroupElement" {
// To suppress missing implicit constructor warnings.
factory OptGroupElement._() { throw new UnsupportedError("Not supported"); }
@@ -18289,7 +18297,7 @@
@DocsEditable()
@DomName('HTMLOptionElement')
-class OptionElement extends _HTMLElement native "HTMLOptionElement" {
+class OptionElement extends HtmlElement native "HTMLOptionElement" {
// To suppress missing implicit constructor warnings.
factory OptionElement._() { throw new UnsupportedError("Not supported"); }
@@ -18354,7 +18362,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
-class OutputElement extends _HTMLElement native "HTMLOutputElement" {
+class OutputElement extends HtmlElement native "HTMLOutputElement" {
// To suppress missing implicit constructor warnings.
factory OutputElement._() { throw new UnsupportedError("Not supported"); }
@@ -18476,7 +18484,7 @@
@DocsEditable()
@DomName('HTMLParagraphElement')
-class ParagraphElement extends _HTMLElement native "HTMLParagraphElement" {
+class ParagraphElement extends HtmlElement native "HTMLParagraphElement" {
// To suppress missing implicit constructor warnings.
factory ParagraphElement._() { throw new UnsupportedError("Not supported"); }
@@ -18492,7 +18500,7 @@
@DocsEditable()
@DomName('HTMLParamElement')
@Unstable()
-class ParamElement extends _HTMLElement native "HTMLParamElement" {
+class ParamElement extends HtmlElement native "HTMLParamElement" {
// To suppress missing implicit constructor warnings.
factory ParamElement._() { throw new UnsupportedError("Not supported"); }
@@ -19116,7 +19124,7 @@
@DocsEditable()
@DomName('HTMLPreElement')
-class PreElement extends _HTMLElement native "HTMLPreElement" {
+class PreElement extends HtmlElement native "HTMLPreElement" {
// To suppress missing implicit constructor warnings.
factory PreElement._() { throw new UnsupportedError("Not supported"); }
@@ -19166,7 +19174,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
-class ProgressElement extends _HTMLElement native "HTMLProgressElement" {
+class ProgressElement extends HtmlElement native "HTMLProgressElement" {
// To suppress missing implicit constructor warnings.
factory ProgressElement._() { throw new UnsupportedError("Not supported"); }
@@ -19291,7 +19299,7 @@
@DocsEditable()
@DomName('HTMLQuoteElement')
-class QuoteElement extends _HTMLElement native "HTMLQuoteElement" {
+class QuoteElement extends HtmlElement native "HTMLQuoteElement" {
// To suppress missing implicit constructor warnings.
factory QuoteElement._() { throw new UnsupportedError("Not supported"); }
@@ -20242,7 +20250,7 @@
@DocsEditable()
@DomName('HTMLScriptElement')
-class ScriptElement extends _HTMLElement native "HTMLScriptElement" {
+class ScriptElement extends HtmlElement native "HTMLScriptElement" {
// To suppress missing implicit constructor warnings.
factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
@@ -20429,7 +20437,7 @@
@DomName('HTMLSelectElement')
-class SelectElement extends _HTMLElement native "HTMLSelectElement" {
+class SelectElement extends HtmlElement native "HTMLSelectElement" {
// To suppress missing implicit constructor warnings.
factory SelectElement._() { throw new UnsupportedError("Not supported"); }
@@ -20672,7 +20680,7 @@
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
-class ShadowElement extends _HTMLElement native "HTMLShadowElement" {
+class ShadowElement extends HtmlElement native "HTMLShadowElement" {
// To suppress missing implicit constructor warnings.
factory ShadowElement._() { throw new UnsupportedError("Not supported"); }
@@ -20890,7 +20898,7 @@
@DocsEditable()
@DomName('HTMLSourceElement')
-class SourceElement extends _HTMLElement native "HTMLSourceElement" {
+class SourceElement extends HtmlElement native "HTMLSourceElement" {
// To suppress missing implicit constructor warnings.
factory SourceElement._() { throw new UnsupportedError("Not supported"); }
@@ -20947,7 +20955,7 @@
@DocsEditable()
@DomName('HTMLSpanElement')
-class SpanElement extends _HTMLElement native "HTMLSpanElement" {
+class SpanElement extends HtmlElement native "HTMLSpanElement" {
// To suppress missing implicit constructor warnings.
factory SpanElement._() { throw new UnsupportedError("Not supported"); }
@@ -21846,7 +21854,7 @@
@DocsEditable()
@DomName('HTMLStyleElement')
-class StyleElement extends _HTMLElement native "HTMLStyleElement" {
+class StyleElement extends HtmlElement native "HTMLStyleElement" {
// To suppress missing implicit constructor warnings.
factory StyleElement._() { throw new UnsupportedError("Not supported"); }
@@ -22025,7 +22033,7 @@
@DocsEditable()
@DomName('HTMLTableCaptionElement')
-class TableCaptionElement extends _HTMLElement native "HTMLTableCaptionElement" {
+class TableCaptionElement extends HtmlElement native "HTMLTableCaptionElement" {
// To suppress missing implicit constructor warnings.
factory TableCaptionElement._() { throw new UnsupportedError("Not supported"); }
@@ -22040,7 +22048,7 @@
@DocsEditable()
@DomName('HTMLTableCellElement')
-class TableCellElement extends _HTMLElement native "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement" {
+class TableCellElement extends HtmlElement native "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement" {
// To suppress missing implicit constructor warnings.
factory TableCellElement._() { throw new UnsupportedError("Not supported"); }
@@ -22071,7 +22079,7 @@
@DocsEditable()
@DomName('HTMLTableColElement')
-class TableColElement extends _HTMLElement native "HTMLTableColElement" {
+class TableColElement extends HtmlElement native "HTMLTableColElement" {
// To suppress missing implicit constructor warnings.
factory TableColElement._() { throw new UnsupportedError("Not supported"); }
@@ -22090,7 +22098,7 @@
@DocsEditable()
@DomName('HTMLTableElement')
-class TableElement extends _HTMLElement native "HTMLTableElement" {
+class TableElement extends HtmlElement native "HTMLTableElement" {
@DomName('HTMLTableElement.tBodies')
List<TableSectionElement> get tBodies =>
@@ -22160,17 +22168,17 @@
@JSName('createCaption')
@DomName('HTMLTableElement.createCaption')
@DocsEditable()
- Element $dom_createCaption() native;
+ HtmlElement $dom_createCaption() native;
@JSName('createTFoot')
@DomName('HTMLTableElement.createTFoot')
@DocsEditable()
- Element $dom_createTFoot() native;
+ HtmlElement $dom_createTFoot() native;
@JSName('createTHead')
@DomName('HTMLTableElement.createTHead')
@DocsEditable()
- Element $dom_createTHead() native;
+ HtmlElement $dom_createTHead() native;
@DomName('HTMLTableElement.deleteCaption')
@DocsEditable()
@@ -22191,7 +22199,7 @@
@JSName('insertRow')
@DomName('HTMLTableElement.insertRow')
@DocsEditable()
- Element $dom_insertRow(int index) native;
+ HtmlElement $dom_insertRow(int index) native;
}
// 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
@@ -22200,7 +22208,7 @@
@DocsEditable()
@DomName('HTMLTableRowElement')
-class TableRowElement extends _HTMLElement native "HTMLTableRowElement" {
+class TableRowElement extends HtmlElement native "HTMLTableRowElement" {
@DomName('HTMLTableRowElement.cells')
List<TableCellElement> get cells =>
@@ -22239,7 +22247,7 @@
@JSName('insertCell')
@DomName('HTMLTableRowElement.insertCell')
@DocsEditable()
- Element $dom_insertCell(int index) native;
+ HtmlElement $dom_insertCell(int index) native;
}
// 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
@@ -22248,7 +22256,7 @@
@DocsEditable()
@DomName('HTMLTableSectionElement')
-class TableSectionElement extends _HTMLElement native "HTMLTableSectionElement" {
+class TableSectionElement extends HtmlElement native "HTMLTableSectionElement" {
@DomName('HTMLTableSectionElement.rows')
List<TableRowElement> get rows =>
@@ -22275,7 +22283,7 @@
@JSName('insertRow')
@DomName('HTMLTableSectionElement.insertRow')
@DocsEditable()
- Element $dom_insertRow(int index) native;
+ HtmlElement $dom_insertRow(int index) native;
}
// 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
@@ -22371,7 +22379,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
-class TemplateElement extends _HTMLElement native "HTMLTemplateElement" {
+class TemplateElement extends HtmlElement native "HTMLTemplateElement" {
// To suppress missing implicit constructor warnings.
factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
@@ -22621,7 +22629,7 @@
@DocsEditable()
@DomName('HTMLTextAreaElement')
-class TextAreaElement extends _HTMLElement native "HTMLTextAreaElement" {
+class TextAreaElement extends HtmlElement native "HTMLTextAreaElement" {
// To suppress missing implicit constructor warnings.
factory TextAreaElement._() { throw new UnsupportedError("Not supported"); }
@@ -23126,7 +23134,7 @@
@DocsEditable()
@DomName('HTMLTitleElement')
-class TitleElement extends _HTMLElement native "HTMLTitleElement" {
+class TitleElement extends HtmlElement native "HTMLTitleElement" {
// To suppress missing implicit constructor warnings.
factory TitleElement._() { throw new UnsupportedError("Not supported"); }
@@ -23390,7 +23398,7 @@
@SupportedBrowser(SupportedBrowser.SAFARI)
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
@Experimental()
-class TrackElement extends _HTMLElement native "HTMLTrackElement" {
+class TrackElement extends HtmlElement native "HTMLTrackElement" {
// To suppress missing implicit constructor warnings.
factory TrackElement._() { throw new UnsupportedError("Not supported"); }
@@ -23665,7 +23673,7 @@
@DocsEditable()
@DomName('HTMLUListElement')
-class UListElement extends _HTMLElement native "HTMLUListElement" {
+class UListElement extends HtmlElement native "HTMLUListElement" {
// To suppress missing implicit constructor warnings.
factory UListElement._() { throw new UnsupportedError("Not supported"); }
@@ -23680,7 +23688,7 @@
@DocsEditable()
@DomName('HTMLUnknownElement')
-class UnknownElement extends _HTMLElement native "HTMLUnknownElement" {
+class UnknownElement extends HtmlElement native "HTMLUnknownElement" {
// To suppress missing implicit constructor warnings.
factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26828,7 +26836,7 @@
@DomName('HTMLAppletElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
@deprecated // deprecated
-abstract class _HTMLAppletElement extends _HTMLElement native "HTMLAppletElement" {
+abstract class _HTMLAppletElement extends HtmlElement native "HTMLAppletElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26841,7 +26849,7 @@
@DomName('HTMLBaseFontElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
@deprecated // deprecated
-abstract class _HTMLBaseFontElement extends _HTMLElement native "HTMLBaseFontElement" {
+abstract class _HTMLBaseFontElement extends HtmlElement native "HTMLBaseFontElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLBaseFontElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26854,7 +26862,7 @@
@DomName('HTMLDirectoryElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
@deprecated // deprecated
-abstract class _HTMLDirectoryElement extends _HTMLElement native "HTMLDirectoryElement" {
+abstract class _HTMLDirectoryElement extends HtmlElement native "HTMLDirectoryElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26867,7 +26875,7 @@
@DomName('HTMLFontElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
@deprecated // deprecated
-abstract class _HTMLFontElement extends _HTMLElement native "HTMLFontElement" {
+abstract class _HTMLFontElement extends HtmlElement native "HTMLFontElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26880,7 +26888,7 @@
@DomName('HTMLFrameElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
@deprecated // deprecated
-abstract class _HTMLFrameElement extends _HTMLElement native "HTMLFrameElement" {
+abstract class _HTMLFrameElement extends HtmlElement native "HTMLFrameElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26893,7 +26901,7 @@
@DomName('HTMLFrameSetElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
@deprecated // deprecated
-abstract class _HTMLFrameSetElement extends _HTMLElement native "HTMLFrameSetElement" {
+abstract class _HTMLFrameSetElement extends HtmlElement native "HTMLFrameSetElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -26906,7 +26914,7 @@
@DomName('HTMLMarqueeElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
@deprecated // deprecated
-abstract class _HTMLMarqueeElement extends _HTMLElement native "HTMLMarqueeElement" {
+abstract class _HTMLMarqueeElement extends HtmlElement native "HTMLMarqueeElement" {
// To suppress missing implicit constructor warnings.
factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
}
@@ -30806,6 +30814,73 @@
return e;
}
}
+// 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.
+
+
+_callOnCreated(receiver) {
+ return receiver.onCreated();
+}
+
+_makeCreatedCallbackMethod() {
+ return JS('',
+ '''((function(invokeCallback) {
+ return function() {
+ return invokeCallback(this);
+ };
+ })(#))''',
+ convertDartClosureToJS(_callOnCreated, 1));
+}
+
+void _registerCustomElement(context, document, String tag, Type type) {
+ // Function follows the same pattern as the following JavaScript code for
+ // registering a custom element.
+ //
+ // var proto = Object.create(HTMLElement.prototype, {
+ // createdCallback: {
+ // value: function() {
+ // window.console.log('here');
+ // }
+ // }
+ // });
+ // document.register('x-foo', { prototype: proto });
+ // ...
+ // var e = document.createElement('x-foo');
+
+ var interceptorClass = findInterceptorConstructorForType(type);
+ if (interceptorClass == null) {
+ throw new ArgumentError(type);
+ }
+
+ String baseClassName = findDispatchTagForInterceptorClass(interceptorClass);
+ if (baseClassName == null) {
+ throw new ArgumentError(type);
+ }
+ if (baseClassName == 'Element') baseClassName = 'HTMLElement';
+
+ var baseConstructor = JS('=Object', '#[#]', context, baseClassName);
+ if (JS('bool', "typeof(#) != 'function'", baseConstructor)) {
+ throw new ArgumentError(type);
+ }
+
+ var properties = JS('=Object', '{}');
+
+ var jsCreatedCallback = _makeCreatedCallbackMethod();
+
+ JS('void', '#.createdCallback = #', properties,
+ JS('=Object', '{value: #}', jsCreatedCallback));
+
+ var baseProto = JS('=Object', '#.prototype', baseConstructor);
+ var proto = JS('=Object', 'Object.create(#, #)', baseProto, properties);
+
+ var interceptor = JS('=Object', '#.prototype', interceptorClass);
+
+ setNativeSubclassDispatchRecord(proto, interceptor);
+
+ JS('void', '#.register(#, #)',
+ document, tag, JS('', '{prototype: #}', proto));
+}
// Copyright (c) 2012, 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.
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 843ea2c..1daeb79 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -13,6 +13,7 @@
import 'dart:isolate';
import 'dart:json' as json;
import 'dart:math';
+import 'dart:mirrors';
import 'dart:nativewrappers';
import 'dart:typed_data';
import 'dart:web_gl' as gl;
@@ -27,6 +28,8 @@
// Auto-generated dart:html library.
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
// Not actually used, but imported since dart:html can generate these objects.
@@ -175,7 +178,7 @@
@DocsEditable()
@DomName('HTMLAnchorElement')
-class AnchorElement extends _HTMLElement {
+class AnchorElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
@@ -509,7 +512,7 @@
* on MDN.
*/
@DomName('HTMLAreaElement')
-class AreaElement extends _HTMLElement {
+class AreaElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory AreaElement._() { throw new UnsupportedError("Not supported"); }
@@ -650,7 +653,7 @@
@DocsEditable()
@DomName('HTMLBRElement')
-class BRElement extends _HTMLElement {
+class BRElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory BRElement._() { throw new UnsupportedError("Not supported"); }
@@ -686,7 +689,7 @@
@DocsEditable()
@DomName('HTMLBaseElement')
-class BaseElement extends _HTMLElement {
+class BaseElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory BaseElement._() { throw new UnsupportedError("Not supported"); }
@@ -785,7 +788,7 @@
@DocsEditable()
@DomName('HTMLBodyElement')
-class BodyElement extends _HTMLElement {
+class BodyElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory BodyElement._() { throw new UnsupportedError("Not supported"); }
@@ -899,7 +902,7 @@
@DocsEditable()
@DomName('HTMLButtonElement')
-class ButtonElement extends _HTMLElement {
+class ButtonElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ButtonElement._() { throw new UnsupportedError("Not supported"); }
@@ -1061,7 +1064,7 @@
@DomName('HTMLCanvasElement')
-class CanvasElement extends _HTMLElement implements CanvasImageSource {
+class CanvasElement extends HtmlElement implements CanvasImageSource {
// To suppress missing implicit constructor warnings.
factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
@@ -2308,7 +2311,7 @@
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
-class ContentElement extends _HTMLElement {
+class ContentElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ContentElement._() { throw new UnsupportedError("Not supported"); }
@@ -6846,7 +6849,7 @@
@DocsEditable()
@DomName('HTMLDListElement')
-class DListElement extends _HTMLElement {
+class DListElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory DListElement._() { throw new UnsupportedError("Not supported"); }
@@ -6868,7 +6871,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
-class DataListElement extends _HTMLElement {
+class DataListElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory DataListElement._() { throw new UnsupportedError("Not supported"); }
@@ -7103,7 +7106,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental()
-class DetailsElement extends _HTMLElement {
+class DetailsElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory DetailsElement._() { throw new UnsupportedError("Not supported"); }
@@ -7259,7 +7262,7 @@
@DocsEditable()
@DomName('HTMLDialogElement')
@Unstable()
-class DialogElement extends _HTMLElement {
+class DialogElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory DialogElement._() { throw new UnsupportedError("Not supported"); }
@@ -7441,7 +7444,7 @@
* * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
*/
@DomName('HTMLDivElement')
-class DivElement extends _HTMLElement {
+class DivElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory DivElement._() { throw new UnsupportedError("Not supported"); }
@@ -7504,12 +7507,12 @@
/// Moved to [HtmlDocument].
@DomName('Document.body')
@DocsEditable()
- Element get $dom_body native "Document_body_Getter";
+ HtmlElement get $dom_body native "Document_body_Getter";
/// Moved to [HtmlDocument].
@DomName('Document.body')
@DocsEditable()
- void set $dom_body(Element value) native "Document_body_Setter";
+ void set $dom_body(HtmlElement value) native "Document_body_Setter";
@DomName('Document.charset')
@DocsEditable()
@@ -10970,7 +10973,7 @@
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class EmbedElement extends _HTMLElement {
+class EmbedElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory EmbedElement._() { throw new UnsupportedError("Not supported"); }
@@ -11627,7 +11630,7 @@
@DocsEditable()
@DomName('HTMLFieldSetElement')
@Unstable()
-class FieldSetElement extends _HTMLElement {
+class FieldSetElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory FieldSetElement._() { throw new UnsupportedError("Not supported"); }
@@ -12365,7 +12368,7 @@
@DocsEditable()
@DomName('HTMLFormElement')
-class FormElement extends _HTMLElement {
+class FormElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory FormElement._() { throw new UnsupportedError("Not supported"); }
@@ -12663,7 +12666,7 @@
* An `<hr>` tag.
*/
@DomName('HTMLHRElement')
-class HRElement extends _HTMLElement {
+class HRElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory HRElement._() { throw new UnsupportedError("Not supported"); }
@@ -12719,7 +12722,7 @@
@DocsEditable()
@DomName('HTMLHeadElement')
-class HeadElement extends _HTMLElement {
+class HeadElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory HeadElement._() { throw new UnsupportedError("Not supported"); }
@@ -12737,7 +12740,7 @@
@DocsEditable()
@DomName('HTMLHeadingElement')
-class HeadingElement extends _HTMLElement {
+class HeadingElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory HeadingElement._() { throw new UnsupportedError("Not supported"); }
@@ -13157,6 +13160,10 @@
@Experimental()
String get visibilityState => $dom_webkitVisibilityState;
+ @Experimental
+ void register(String tag, Type custom) {
+ _Utils.register(tag, custom);
+ }
// Note: used to polyfill <template>
Document _templateContentsOwner;
@@ -13169,14 +13176,150 @@
@DocsEditable()
-@DomName('HTMLHtmlElement')
-class HtmlElement extends _HTMLElement {
+@DomName('HTMLElement')
+class HtmlElement extends Element {
// To suppress missing implicit constructor warnings.
factory HtmlElement._() { throw new UnsupportedError("Not supported"); }
- @DomName('HTMLHtmlElement.HTMLHtmlElement')
+ @DomName('HTMLElement.contentEditable')
@DocsEditable()
- factory HtmlElement() => document.$dom_createElement("html");
+ String get contentEditable native "HTMLElement_contentEditable_Getter";
+
+ @DomName('HTMLElement.contentEditable')
+ @DocsEditable()
+ void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
+
+ @DomName('HTMLElement.dir')
+ @DocsEditable()
+ String get dir native "HTMLElement_dir_Getter";
+
+ @DomName('HTMLElement.dir')
+ @DocsEditable()
+ void set dir(String value) native "HTMLElement_dir_Setter";
+
+ @DomName('HTMLElement.draggable')
+ @DocsEditable()
+ bool get draggable native "HTMLElement_draggable_Getter";
+
+ @DomName('HTMLElement.draggable')
+ @DocsEditable()
+ void set draggable(bool value) native "HTMLElement_draggable_Setter";
+
+ @DomName('HTMLElement.hidden')
+ @DocsEditable()
+ bool get hidden native "HTMLElement_hidden_Getter";
+
+ @DomName('HTMLElement.hidden')
+ @DocsEditable()
+ void set hidden(bool value) native "HTMLElement_hidden_Setter";
+
+ @DomName('HTMLElement.id')
+ @DocsEditable()
+ String get id native "HTMLElement_id_Getter";
+
+ @DomName('HTMLElement.id')
+ @DocsEditable()
+ void set id(String value) native "HTMLElement_id_Setter";
+
+ @DomName('HTMLElement.innerHTML')
+ @DocsEditable()
+ String get innerHtml native "HTMLElement_innerHTML_Getter";
+
+ @DomName('HTMLElement.innerHTML')
+ @DocsEditable()
+ void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
+
+ @DomName('HTMLElement.isContentEditable')
+ @DocsEditable()
+ bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
+
+ @DomName('HTMLElement.lang')
+ @DocsEditable()
+ String get lang native "HTMLElement_lang_Getter";
+
+ @DomName('HTMLElement.lang')
+ @DocsEditable()
+ void set lang(String value) native "HTMLElement_lang_Setter";
+
+ @DomName('HTMLElement.outerHTML')
+ @DocsEditable()
+ String get outerHtml native "HTMLElement_outerHTML_Getter";
+
+ @DomName('HTMLElement.spellcheck')
+ @DocsEditable()
+ // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+ @Experimental() // nonstandard
+ bool get spellcheck native "HTMLElement_spellcheck_Getter";
+
+ @DomName('HTMLElement.spellcheck')
+ @DocsEditable()
+ // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+ @Experimental() // nonstandard
+ void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
+
+ @DomName('HTMLElement.tabIndex')
+ @DocsEditable()
+ int get tabIndex native "HTMLElement_tabIndex_Getter";
+
+ @DomName('HTMLElement.tabIndex')
+ @DocsEditable()
+ void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
+
+ @DomName('HTMLElement.title')
+ @DocsEditable()
+ String get title native "HTMLElement_title_Getter";
+
+ @DomName('HTMLElement.title')
+ @DocsEditable()
+ void set title(String value) native "HTMLElement_title_Setter";
+
+ @DomName('HTMLElement.translate')
+ @DocsEditable()
+ bool get translate native "HTMLElement_translate_Getter";
+
+ @DomName('HTMLElement.translate')
+ @DocsEditable()
+ void set translate(bool value) native "HTMLElement_translate_Setter";
+
+ @DomName('HTMLElement.webkitdropzone')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+ String get dropzone native "HTMLElement_webkitdropzone_Getter";
+
+ @DomName('HTMLElement.webkitdropzone')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+ void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
+
+ @DomName('HTMLElement.click')
+ @DocsEditable()
+ void click() native "HTMLElement_click_Callback";
+
+ @DomName('HTMLElement.getInputContext')
+ @DocsEditable()
+ // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
+ @Experimental()
+ InputMethodContext getInputContext() native "HTMLElement_getInputContext_Callback";
+
+ @DomName('HTMLElement.insertAdjacentElement')
+ @DocsEditable()
+ @Experimental() // non-standard
+ Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
+
+ @DomName('HTMLElement.insertAdjacentHTML')
+ @DocsEditable()
+ void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
+
+ @DomName('HTMLElement.insertAdjacentText')
+ @DocsEditable()
+ @Experimental() // non-standard
+ void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -13209,6 +13352,24 @@
@DocsEditable()
+@DomName('HTMLHtmlElement')
+class HtmlHtmlElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory HtmlHtmlElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLHtmlElement.HTMLHtmlElement')
+ @DocsEditable()
+ factory HtmlHtmlElement() => document.$dom_createElement("html");
+
+}
+// Copyright (c) 2012, 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
@DomName('HTMLOptionsCollection')
class HtmlOptionsCollection extends HtmlCollection {
// To suppress missing implicit constructor warnings.
@@ -13919,7 +14080,7 @@
@DocsEditable()
@DomName('HTMLIFrameElement')
-class IFrameElement extends _HTMLElement {
+class IFrameElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory IFrameElement._() { throw new UnsupportedError("Not supported"); }
@@ -14056,7 +14217,7 @@
@DomName('HTMLImageElement')
-class ImageElement extends _HTMLElement implements CanvasImageSource {
+class ImageElement extends HtmlElement implements CanvasImageSource {
// To suppress missing implicit constructor warnings.
factory ImageElement._() { throw new UnsupportedError("Not supported"); }
@@ -14175,7 +14336,7 @@
@DomName('HTMLInputElement')
-class InputElement extends _HTMLElement implements
+class InputElement extends HtmlElement implements
HiddenInputElement,
SearchInputElement,
TextInputElement,
@@ -14389,7 +14550,7 @@
@DomName('HTMLInputElement.list')
@DocsEditable()
- Element get list native "HTMLInputElement_list_Getter";
+ HtmlElement get list native "HTMLInputElement_list_Getter";
@DomName('HTMLInputElement.max')
@DocsEditable()
@@ -15285,7 +15446,7 @@
@DomName('InputMethodContext.target')
@DocsEditable()
@Experimental() // untriaged
- Element get target native "InputMethodContext_target_Getter";
+ HtmlElement get target native "InputMethodContext_target_Getter";
@DomName('InputMethodContext.confirmComposition')
@DocsEditable()
@@ -15379,7 +15540,7 @@
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental()
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
-class KeygenElement extends _HTMLElement {
+class KeygenElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory KeygenElement._() { throw new UnsupportedError("Not supported"); }
@@ -15473,7 +15634,7 @@
@DocsEditable()
@DomName('HTMLLIElement')
-class LIElement extends _HTMLElement {
+class LIElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory LIElement._() { throw new UnsupportedError("Not supported"); }
@@ -15511,7 +15672,7 @@
@DocsEditable()
@DomName('HTMLLabelElement')
-class LabelElement extends _HTMLElement {
+class LabelElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory LabelElement._() { throw new UnsupportedError("Not supported"); }
@@ -15521,7 +15682,7 @@
@DomName('HTMLLabelElement.control')
@DocsEditable()
- Element get control native "HTMLLabelElement_control_Getter";
+ HtmlElement get control native "HTMLLabelElement_control_Getter";
@DomName('HTMLLabelElement.form')
@DocsEditable()
@@ -15545,7 +15706,7 @@
@DocsEditable()
@DomName('HTMLLegendElement')
-class LegendElement extends _HTMLElement {
+class LegendElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory LegendElement._() { throw new UnsupportedError("Not supported"); }
@@ -15567,7 +15728,7 @@
@DocsEditable()
@DomName('HTMLLinkElement')
-class LinkElement extends _HTMLElement {
+class LinkElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory LinkElement._() { throw new UnsupportedError("Not supported"); }
@@ -15774,7 +15935,7 @@
@DocsEditable()
@DomName('HTMLMapElement')
-class MapElement extends _HTMLElement {
+class MapElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory MapElement._() { throw new UnsupportedError("Not supported"); }
@@ -15918,7 +16079,7 @@
@DocsEditable()
@DomName('HTMLMediaElement')
@Unstable()
-class MediaElement extends _HTMLElement {
+class MediaElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory MediaElement._() { throw new UnsupportedError("Not supported"); }
@@ -17233,7 +17394,7 @@
* * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
*/
@DomName('HTMLMenuElement')
-class MenuElement extends _HTMLElement {
+class MenuElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory MenuElement._() { throw new UnsupportedError("Not supported"); }
@@ -17377,7 +17538,7 @@
@DocsEditable()
@DomName('HTMLMetaElement')
-class MetaElement extends _HTMLElement {
+class MetaElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory MetaElement._() { throw new UnsupportedError("Not supported"); }
@@ -17456,7 +17617,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class MeterElement extends _HTMLElement {
+class MeterElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory MeterElement._() { throw new UnsupportedError("Not supported"); }
@@ -17857,7 +18018,7 @@
@DocsEditable()
@DomName('HTMLModElement')
@Unstable()
-class ModElement extends _HTMLElement {
+class ModElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ModElement._() { throw new UnsupportedError("Not supported"); }
@@ -19450,7 +19611,7 @@
@DocsEditable()
@DomName('HTMLOListElement')
-class OListElement extends _HTMLElement {
+class OListElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory OListElement._() { throw new UnsupportedError("Not supported"); }
@@ -19496,7 +19657,7 @@
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
-class ObjectElement extends _HTMLElement {
+class ObjectElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ObjectElement._() { throw new UnsupportedError("Not supported"); }
@@ -19609,7 +19770,7 @@
@DocsEditable()
@DomName('HTMLOptGroupElement')
-class OptGroupElement extends _HTMLElement {
+class OptGroupElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory OptGroupElement._() { throw new UnsupportedError("Not supported"); }
@@ -19643,7 +19804,7 @@
@DocsEditable()
@DomName('HTMLOptionElement')
-class OptionElement extends _HTMLElement {
+class OptionElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory OptionElement._() { throw new UnsupportedError("Not supported"); }
@@ -19717,7 +19878,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
-class OutputElement extends _HTMLElement {
+class OutputElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory OutputElement._() { throw new UnsupportedError("Not supported"); }
@@ -19858,7 +20019,7 @@
@DocsEditable()
@DomName('HTMLParagraphElement')
-class ParagraphElement extends _HTMLElement {
+class ParagraphElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ParagraphElement._() { throw new UnsupportedError("Not supported"); }
@@ -19877,7 +20038,7 @@
@DocsEditable()
@DomName('HTMLParamElement')
@Unstable()
-class ParamElement extends _HTMLElement {
+class ParamElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ParamElement._() { throw new UnsupportedError("Not supported"); }
@@ -20564,7 +20725,7 @@
@DocsEditable()
@DomName('HTMLPreElement')
-class PreElement extends _HTMLElement {
+class PreElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory PreElement._() { throw new UnsupportedError("Not supported"); }
@@ -20630,7 +20791,7 @@
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
-class ProgressElement extends _HTMLElement {
+class ProgressElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ProgressElement._() { throw new UnsupportedError("Not supported"); }
@@ -20773,7 +20934,7 @@
@DocsEditable()
@DomName('HTMLQuoteElement')
-class QuoteElement extends _HTMLElement {
+class QuoteElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory QuoteElement._() { throw new UnsupportedError("Not supported"); }
@@ -21718,7 +21879,7 @@
@DocsEditable()
@DomName('HTMLScriptElement')
-class ScriptElement extends _HTMLElement {
+class ScriptElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
@@ -21952,7 +22113,7 @@
@DomName('HTMLSelectElement')
-class SelectElement extends _HTMLElement {
+class SelectElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory SelectElement._() { throw new UnsupportedError("Not supported"); }
@@ -22234,7 +22395,7 @@
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
-class ShadowElement extends _HTMLElement {
+class ShadowElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory ShadowElement._() { throw new UnsupportedError("Not supported"); }
@@ -22504,7 +22665,7 @@
@DocsEditable()
@DomName('HTMLSourceElement')
-class SourceElement extends _HTMLElement {
+class SourceElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory SourceElement._() { throw new UnsupportedError("Not supported"); }
@@ -22579,7 +22740,7 @@
@DocsEditable()
@DomName('HTMLSpanElement')
-class SpanElement extends _HTMLElement {
+class SpanElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory SpanElement._() { throw new UnsupportedError("Not supported"); }
@@ -23642,7 +23803,7 @@
@DocsEditable()
@DomName('HTMLStyleElement')
-class StyleElement extends _HTMLElement {
+class StyleElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory StyleElement._() { throw new UnsupportedError("Not supported"); }
@@ -23805,7 +23966,7 @@
@DocsEditable()
@DomName('HTMLTableCaptionElement')
-class TableCaptionElement extends _HTMLElement {
+class TableCaptionElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TableCaptionElement._() { throw new UnsupportedError("Not supported"); }
@@ -23823,7 +23984,7 @@
@DocsEditable()
@DomName('HTMLTableCellElement')
-class TableCellElement extends _HTMLElement {
+class TableCellElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TableCellElement._() { throw new UnsupportedError("Not supported"); }
@@ -23869,7 +24030,7 @@
@DocsEditable()
@DomName('HTMLTableColElement')
-class TableColElement extends _HTMLElement {
+class TableColElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TableColElement._() { throw new UnsupportedError("Not supported"); }
@@ -23893,7 +24054,7 @@
@DocsEditable()
@DomName('HTMLTableElement')
-class TableElement extends _HTMLElement {
+class TableElement extends HtmlElement {
@DomName('HTMLTableElement.tBodies')
List<TableSectionElement> get tBodies =>
@@ -23967,19 +24128,19 @@
@DomName('HTMLTableElement.createCaption')
@DocsEditable()
- Element $dom_createCaption() native "HTMLTableElement_createCaption_Callback";
+ HtmlElement $dom_createCaption() native "HTMLTableElement_createCaption_Callback";
@DomName('HTMLTableElement.createTBody')
@DocsEditable()
- Element $dom_createTBody() native "HTMLTableElement_createTBody_Callback";
+ HtmlElement $dom_createTBody() native "HTMLTableElement_createTBody_Callback";
@DomName('HTMLTableElement.createTFoot')
@DocsEditable()
- Element $dom_createTFoot() native "HTMLTableElement_createTFoot_Callback";
+ HtmlElement $dom_createTFoot() native "HTMLTableElement_createTFoot_Callback";
@DomName('HTMLTableElement.createTHead')
@DocsEditable()
- Element $dom_createTHead() native "HTMLTableElement_createTHead_Callback";
+ HtmlElement $dom_createTHead() native "HTMLTableElement_createTHead_Callback";
@DomName('HTMLTableElement.deleteCaption')
@DocsEditable()
@@ -23999,7 +24160,7 @@
@DomName('HTMLTableElement.insertRow')
@DocsEditable()
- Element $dom_insertRow(int index) native "HTMLTableElement_insertRow_Callback";
+ HtmlElement $dom_insertRow(int index) native "HTMLTableElement_insertRow_Callback";
}
// 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
@@ -24008,7 +24169,7 @@
@DocsEditable()
@DomName('HTMLTableRowElement')
-class TableRowElement extends _HTMLElement {
+class TableRowElement extends HtmlElement {
@DomName('HTMLTableRowElement.cells')
List<TableCellElement> get cells =>
@@ -24045,7 +24206,7 @@
@DomName('HTMLTableRowElement.insertCell')
@DocsEditable()
- Element $dom_insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
+ HtmlElement $dom_insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
}
// 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
@@ -24054,7 +24215,7 @@
@DocsEditable()
@DomName('HTMLTableSectionElement')
-class TableSectionElement extends _HTMLElement {
+class TableSectionElement extends HtmlElement {
@DomName('HTMLTableSectionElement.rows')
List<TableRowElement> get rows =>
@@ -24079,7 +24240,7 @@
@DomName('HTMLTableSectionElement.insertRow')
@DocsEditable()
- Element $dom_insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
+ HtmlElement $dom_insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
}
// 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
@@ -24175,7 +24336,7 @@
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental()
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
-class TemplateElement extends _HTMLElement {
+class TemplateElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
@@ -24426,7 +24587,7 @@
@DocsEditable()
@DomName('HTMLTextAreaElement')
-class TextAreaElement extends _HTMLElement {
+class TextAreaElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TextAreaElement._() { throw new UnsupportedError("Not supported"); }
@@ -25133,7 +25294,7 @@
@DocsEditable()
@DomName('HTMLTitleElement')
-class TitleElement extends _HTMLElement {
+class TitleElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TitleElement._() { throw new UnsupportedError("Not supported"); }
@@ -25386,7 +25547,7 @@
@SupportedBrowser(SupportedBrowser.SAFARI)
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
@Experimental()
-class TrackElement extends _HTMLElement {
+class TrackElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory TrackElement._() { throw new UnsupportedError("Not supported"); }
@@ -25681,7 +25842,7 @@
@DocsEditable()
@DomName('HTMLUListElement')
-class UListElement extends _HTMLElement {
+class UListElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory UListElement._() { throw new UnsupportedError("Not supported"); }
@@ -25699,7 +25860,7 @@
@DocsEditable()
@DomName('HTMLUnknownElement')
-class UnknownElement extends _HTMLElement {
+class UnknownElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
@@ -28697,7 +28858,7 @@
@DomName('HTMLAppletElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
@deprecated // deprecated
-abstract class _HTMLAppletElement extends _HTMLElement {
+abstract class _HTMLAppletElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
@@ -28713,7 +28874,7 @@
@DomName('HTMLBaseFontElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
@deprecated // deprecated
-abstract class _HTMLBaseFontElement extends _HTMLElement {
+abstract class _HTMLBaseFontElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLBaseFontElement._() { throw new UnsupportedError("Not supported"); }
@@ -28729,7 +28890,7 @@
@DomName('HTMLDirectoryElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
@deprecated // deprecated
-abstract class _HTMLDirectoryElement extends _HTMLElement {
+abstract class _HTMLDirectoryElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
@@ -28742,164 +28903,10 @@
@DocsEditable()
-@DomName('HTMLElement')
-class _HTMLElement extends Element {
- // To suppress missing implicit constructor warnings.
- factory _HTMLElement._() { throw new UnsupportedError("Not supported"); }
-
- @DomName('HTMLElement.contentEditable')
- @DocsEditable()
- String get contentEditable native "HTMLElement_contentEditable_Getter";
-
- @DomName('HTMLElement.contentEditable')
- @DocsEditable()
- void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
-
- @DomName('HTMLElement.dir')
- @DocsEditable()
- String get dir native "HTMLElement_dir_Getter";
-
- @DomName('HTMLElement.dir')
- @DocsEditable()
- void set dir(String value) native "HTMLElement_dir_Setter";
-
- @DomName('HTMLElement.draggable')
- @DocsEditable()
- bool get draggable native "HTMLElement_draggable_Getter";
-
- @DomName('HTMLElement.draggable')
- @DocsEditable()
- void set draggable(bool value) native "HTMLElement_draggable_Setter";
-
- @DomName('HTMLElement.hidden')
- @DocsEditable()
- bool get hidden native "HTMLElement_hidden_Getter";
-
- @DomName('HTMLElement.hidden')
- @DocsEditable()
- void set hidden(bool value) native "HTMLElement_hidden_Setter";
-
- @DomName('HTMLElement.id')
- @DocsEditable()
- String get id native "HTMLElement_id_Getter";
-
- @DomName('HTMLElement.id')
- @DocsEditable()
- void set id(String value) native "HTMLElement_id_Setter";
-
- @DomName('HTMLElement.innerHTML')
- @DocsEditable()
- String get innerHtml native "HTMLElement_innerHTML_Getter";
-
- @DomName('HTMLElement.innerHTML')
- @DocsEditable()
- void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
-
- @DomName('HTMLElement.isContentEditable')
- @DocsEditable()
- bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
-
- @DomName('HTMLElement.lang')
- @DocsEditable()
- String get lang native "HTMLElement_lang_Getter";
-
- @DomName('HTMLElement.lang')
- @DocsEditable()
- void set lang(String value) native "HTMLElement_lang_Setter";
-
- @DomName('HTMLElement.outerHTML')
- @DocsEditable()
- String get outerHtml native "HTMLElement_outerHTML_Getter";
-
- @DomName('HTMLElement.spellcheck')
- @DocsEditable()
- // http://blog.whatwg.org/the-road-to-html-5-spellchecking
- @Experimental() // nonstandard
- bool get spellcheck native "HTMLElement_spellcheck_Getter";
-
- @DomName('HTMLElement.spellcheck')
- @DocsEditable()
- // http://blog.whatwg.org/the-road-to-html-5-spellchecking
- @Experimental() // nonstandard
- void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
-
- @DomName('HTMLElement.tabIndex')
- @DocsEditable()
- int get tabIndex native "HTMLElement_tabIndex_Getter";
-
- @DomName('HTMLElement.tabIndex')
- @DocsEditable()
- void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
-
- @DomName('HTMLElement.title')
- @DocsEditable()
- String get title native "HTMLElement_title_Getter";
-
- @DomName('HTMLElement.title')
- @DocsEditable()
- void set title(String value) native "HTMLElement_title_Setter";
-
- @DomName('HTMLElement.translate')
- @DocsEditable()
- bool get translate native "HTMLElement_translate_Getter";
-
- @DomName('HTMLElement.translate')
- @DocsEditable()
- void set translate(bool value) native "HTMLElement_translate_Setter";
-
- @DomName('HTMLElement.webkitdropzone')
- @DocsEditable()
- @SupportedBrowser(SupportedBrowser.CHROME)
- @SupportedBrowser(SupportedBrowser.SAFARI)
- @Experimental()
- // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
- String get dropzone native "HTMLElement_webkitdropzone_Getter";
-
- @DomName('HTMLElement.webkitdropzone')
- @DocsEditable()
- @SupportedBrowser(SupportedBrowser.CHROME)
- @SupportedBrowser(SupportedBrowser.SAFARI)
- @Experimental()
- // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
- void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
-
- @DomName('HTMLElement.click')
- @DocsEditable()
- void click() native "HTMLElement_click_Callback";
-
- @DomName('HTMLElement.getInputContext')
- @DocsEditable()
- // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
- @Experimental()
- InputMethodContext getInputContext() native "HTMLElement_getInputContext_Callback";
-
- @DomName('HTMLElement.insertAdjacentElement')
- @DocsEditable()
- @Experimental() // non-standard
- Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
-
- @DomName('HTMLElement.insertAdjacentHTML')
- @DocsEditable()
- void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
-
- @DomName('HTMLElement.insertAdjacentText')
- @DocsEditable()
- @Experimental() // non-standard
- void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
-
-}
-// Copyright (c) 2012, 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
@DomName('HTMLFontElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
@deprecated // deprecated
-abstract class _HTMLFontElement extends _HTMLElement {
+abstract class _HTMLFontElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
@@ -28915,7 +28922,7 @@
@DomName('HTMLFrameElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
@deprecated // deprecated
-abstract class _HTMLFrameElement extends _HTMLElement {
+abstract class _HTMLFrameElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
@@ -28931,7 +28938,7 @@
@DomName('HTMLFrameSetElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
@deprecated // deprecated
-abstract class _HTMLFrameSetElement extends _HTMLElement {
+abstract class _HTMLFrameSetElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
@@ -28947,7 +28954,7 @@
@DomName('HTMLMarqueeElement')
// http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
@deprecated // deprecated
-abstract class _HTMLMarqueeElement extends _HTMLElement {
+abstract class _HTMLMarqueeElement extends HtmlElement {
// To suppress missing implicit constructor warnings.
factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
@@ -33270,6 +33277,39 @@
// TODO(jacobr): we need a failsafe way to determine that a Node is really a
// DOM node rather than just a class that extends Node.
static bool isNode(obj) => obj is Node;
+
+ static void register(String tag, Type type) {
+ // TODO(vsm): Move these checks into native code.
+ if (type == null) {
+ throw new UnsupportedError("Invalid null type.");
+ }
+ ClassMirror cls = reflectClass(type);
+ LibraryMirror lib = cls.owner;
+ String libName = lib.uri.toString();
+ if (libName.startsWith('dart:')) {
+ throw new UnsupportedError("Invalid custom element from $libName.");
+ }
+ ClassMirror superClass = cls.superclass;
+
+ Symbol objectName = reflectClass(Object).qualifiedName;
+ bool isRoot(ClassMirror cls) =>
+ cls == null || cls.qualifiedName == objectName;
+ // TODO(vsm): Support extending SvgElement as well.
+ Symbol elementName = reflectClass(HtmlElement).qualifiedName;
+ bool isElement(ClassMirror cls) =>
+ cls != null && cls.qualifiedName == elementName;
+
+ while(!isRoot(superClass) && !isElement(superClass)) {
+ superClass = superClass.superclass;
+ }
+
+ if (isRoot(superClass)) {
+ throw new UnsupportedError("Invalid custom element doesn't inherit from HtmlElement.");
+ }
+ _register(tag, type);
+ }
+
+ static void _register(String tag, Type type) native "Utils_register";
}
class _NPObject extends NativeFieldWrapperClass1 {
@@ -33397,7 +33437,7 @@
final _forwardingPrintClosure = _Utils.forwardingPrint;
- class _Timer implements Timer{
+ class _Timer implements Timer {
var _canceler;
_Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 7bae578..57b6568 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -16,14 +16,6 @@
factory Directory(String path) => new _Directory(path);
/**
- * Creates a directory object from a Path object. The path is either
- * an absolute path, or it is a relative path which is interpreted
- * relative to the directory in which the Dart VM was started.
- */
- @deprecated
- factory Directory.fromPath(Path path) => new _Directory.fromPath(path);
-
- /**
* Creates a directory object pointing to the current working
* directory.
*/
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index e27b610..39d36cf 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -24,8 +24,6 @@
}
}
- _Directory.fromPath(Path path) : this(path.toNativePath());
-
external static String _current();
external static _setCurrent(path);
external static _createTemp(String template);
@@ -98,11 +96,11 @@
}
Future<Directory> createRecursively() {
- var path = new Path(this.path);
+ var path = new _Path(this.path);
var dirsToCreate = [];
var terminator = path.isAbsolute ? '/' : '';
while (path.toString() != terminator) {
- dirsToCreate.add(new Directory.fromPath(path));
+ dirsToCreate.add(new Directory(path.toNativePath()));
path = path.directoryPath;
}
return _computeExistingIndex(dirsToCreate).then((index) {
@@ -139,11 +137,11 @@
}
void createRecursivelySync() {
- var path = new Path(this.path);
+ var path = new _Path(this.path);
var dirsToCreate = [];
var terminator = path.isAbsolute ? '/' : '';
while (path.toString() != terminator) {
- var dir = new Directory.fromPath(path);
+ var dir = new Directory(path.toNativePath());
if (dir.existsSync()) break;
dirsToCreate.add(dir);
path = path.directoryPath;
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index dba6931..5cbff1c 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -41,12 +41,6 @@
factory File(String path) => new _File(path);
/**
- * Create a File object from a Path object.
- */
- @deprecated
- factory File.fromPath(Path path) => new _File.fromPath(path);
-
- /**
* Create the file. Returns a [:Future<File>:] that completes with
* the file when it has been created.
*
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index cf9a7ef..f621360 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -246,9 +246,6 @@
}
}
- // Constructor from Path for file.
- _File.fromPath(Path path) : this(path.toNativePath());
-
Future<bool> exists() {
_ensureFileService();
List request = new List(2);
@@ -346,8 +343,8 @@
}
Directory get directory {
- Path path = new Path(this.path).directoryPath;
- return new Directory.fromPath(path);
+ _Path path = new _Path(this.path).directoryPath;
+ return new Directory(path.toNativePath());
}
Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) {
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 1a5e3a5..615c59a 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1590,8 +1590,8 @@
scheme = previous.uri.scheme;
}
if (!uri.path.startsWith('/')) {
- var absolute = new Path.raw(previous.uri.path).directoryPath;
- absolute = absolute.join(new Path.raw(u.path));
+ var absolute = new _Path.raw(previous.uri.path).directoryPath;
+ absolute = absolute.join(new _Path.raw(u.path));
path = absolute.canonicalize().toString();
}
replaceComponents(scheme: scheme, host: host, port: port, path: path);
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 4f61b2b..37a65c1 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/**
+ * File, socket, HTTP, and other I/O support for server applications.
+ *
* The IO library is used for Dart server applications,
* which run on a stand-alone Dart VM from the command line.
* *This library does not work in browser based applications.*
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 8b726ed..d774fa2 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -15,12 +15,6 @@
factory Link(String path) => new _Link(path);
/**
- * Creates a Link object from a Path object.
- */
- @deprecated
- factory Link.fromPath(Path path) => new _Link.fromPath(path);
-
- /**
* Creates a symbolic link. Returns a [:Future<Link>:] that completes with
* the link when it has been created. If the link exists,
* the future will complete with an error.
@@ -144,8 +138,6 @@
}
- _Link.fromPath(Path inputPath) : path = inputPath.toNativePath();
-
String toString() => "Link: '$path'";
Future<bool> exists() => FileSystemEntity.isLink(path);
diff --git a/sdk/lib/io/path.dart b/sdk/lib/io/path.dart
index 702e42e..0262e4b 100644
--- a/sdk/lib/io/path.dart
+++ b/sdk/lib/io/path.dart
@@ -16,7 +16,7 @@
* August 2013.*
*/
@deprecated
-abstract class Path {
+abstract class _Path {
/**
* Creates a Path from a String that uses the native filesystem's conventions.
*
@@ -26,7 +26,7 @@
* If the path starts with a drive letter, like 'C:', a '/' is added
* before the drive letter.
*
- * new Path(r'c:\a\b').toString() == '/c:/a/b'
+ * new _Path(r'c:\a\b').toString() == '/c:/a/b'
*
* A path starting with a drive letter is
* treated specially. Backwards links ('..') cannot cancel the drive letter.
@@ -34,14 +34,14 @@
* If the path is a share path this is recorded in the Path object and
* maintained in operations on the Path object.
*
- * var share = new Path(r'\\share\a\b\c');
+ * var share = new _Path(r'\\share\a\b\c');
* share.isWindowsShare == true
* share.toString() == '/share/a/b/c'
* share.toNativePath() == r'\\share\a\b\c'
* share.append('final').isWindowsShare == true
*/
@deprecated
- factory Path(String source) => new _Path(source);
+ factory _Path(String source) => new __Path(source);
/**
* Creates a Path from the String [source]. [source] is used as-is, so if
@@ -49,7 +49,7 @@
* behavior may not be as expected. Paths are immutable.
*/
@deprecated
- factory Path.raw(String source) => new _Path.raw(source);
+ factory _Path.raw(String source) => new __Path.raw(source);
/**
* Is this path the empty string?
@@ -86,7 +86,7 @@
* and combining consecutive '/'s. Leading '..' segments
* are kept on relative paths, and dropped from absolute paths.
*/
- Path canonicalize();
+ _Path canonicalize();
/**
* Joins the relative path [further] to this path. Canonicalizes the
@@ -97,13 +97,13 @@
* If [further] is an absolute path, an IllegalArgument exception is thrown.
*
* Examples:
- * `new Path('/a/b/c').join(new Path('d/e'))` returns the Path object
+ * `new _Path('/a/b/c').join(new _Path('d/e'))` returns the Path object
* containing `'a/b/c/d/e'`.
*
- * `new Path('a/b/../c/').join(new Path('d/./e//')` returns the Path
+ * `new _Path('a/b/../c/').join(new _Path('d/./e//')` returns the Path
* containing `'a/c/d/e/'`.
*
- * `new Path('a/b/c').join(new Path('d/../../e')` returns the Path
+ * `new _Path('a/b/c').join(new _Path('d/../../e')` returns the Path
* containing `'a/b/e'`.
*
* Note that the join operation does not drop the last segment of the
@@ -115,7 +115,7 @@
* parent directories in the base, you can check whether
* `further.canonicalize()` starts with '../' or equals '..'.
*/
- Path join(Path further);
+ _Path join(_Path further);
/**
@@ -129,7 +129,7 @@
* path component of the base is dropped unless it ends with a slash,
* call [: a.relativeTo(b.directoryPath) :] instead of [: a.relativeTo(b) :].
*/
- Path relativeTo(Path base);
+ _Path relativeTo(_Path base);
/**
* Converts a path to a string using the native filesystem's conventions.
@@ -138,14 +138,14 @@
* On Windows, converts '/'s to backwards slashes, and removes
* the leading '/' if the path starts with a drive specification.
* For most valid Windows paths, this should be the inverse of the
- * conversion that the constructor new Path() performs. If the path is
+ * conversion that the constructor new _Path() performs. If the path is
* a Windows share, restores the '\\' at the start of the path.
*/
String toNativePath();
/**
* Returns the path as a string. If this path is constructed using
- * new Path.raw(), or new Path() on a non-Windows system, the
+ * new _Path.raw(), or new _Path() on a non-Windows system, the
* returned value is the original string argument to the constructor.
*/
String toString();
@@ -156,8 +156,8 @@
* beginning does not create an empty segment before it, and a '/' at
* the end does not create an empty segment after it.
*
- * new Path('/a/b/c/d').segments() == ['a', 'b', 'c', d'];
- * new Path(' foo bar //../') == [' foo bar ', '', '..'];
+ * new _Path('/a/b/c/d').segments() == ['a', 'b', 'c', d'];
+ * new _Path(' foo bar //../') == [' foo bar ', '', '..'];
*/
List<String> segments();
@@ -167,7 +167,7 @@
* a '/'. The path is not canonicalized, and [finalSegment] may
* contain '/'s.
*/
- Path append(String finalSegment);
+ _Path append(String finalSegment);
/**
* Drops the final '/' and whatever follows it from this Path,
@@ -175,20 +175,20 @@
* this Path is the first character, returns '/' instead of the empty string.
* If there is no '/' in the Path, returns the empty string.
*
- * new Path('../images/dot.gif').directoryPath == '../images'
- * new Path('/usr/geoffrey/www/').directoryPath == '/usr/geoffrey/www'
- * new Path('lost_file_old').directoryPath == ''
- * new Path('/src').directoryPath == '/'
- * Note: new Path('/D:/src').directoryPath == '/D:'
+ * new _Path('../images/dot.gif').directoryPath == '../images'
+ * new _Path('/usr/geoffrey/www/').directoryPath == '/usr/geoffrey/www'
+ * new _Path('lost_file_old').directoryPath == ''
+ * new _Path('/src').directoryPath == '/'
+ * Note: new _Path('/D:/src').directoryPath == '/D:'
*/
- Path get directoryPath;
+ _Path get directoryPath;
/**
* The part of the path after the last '/', or the entire path if
* it contains no '/'.
*
- * new Path('images/DSC_0027.jpg).filename == 'DSC_0027.jpg'
- * new Path('users/fred/').filename == ''
+ * new _Path('images/DSC_0027.jpg).filename == 'DSC_0027.jpg'
+ * new _Path('users/fred/').filename == ''
*/
String get filename;
@@ -196,9 +196,9 @@
* The part of [filename] before the last '.', or the entire filename if it
* contains no '.'. If [filename] is '.' or '..' it is unchanged.
*
- * new Path('/c:/My Documents/Heidi.txt').filenameWithoutExtension
+ * new _Path('/c:/My Documents/Heidi.txt').filenameWithoutExtension
* would return 'Heidi'.
- * new Path('not what I would call a path').filenameWithoutExtension
+ * new _Path('not what I would call a path').filenameWithoutExtension
* would return 'not what I would call a path'.
*/
String get filenameWithoutExtension;
@@ -207,8 +207,8 @@
* The part of [filename] after the last '.', or '' if [filename]
* contains no '.'. If [filename] is '.' or '..', returns ''.
*
- * new Path('tiger.svg').extension == 'svg'
- * new Path('/src/dart/dart_secrets').extension == ''
+ * new _Path('tiger.svg').extension == 'svg'
+ * new _Path('/src/dart/dart_secrets').extension == ''
*/
String get extension;
}
diff --git a/sdk/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
index 50e4d38..9915863 100644
--- a/sdk/lib/io/path_impl.dart
+++ b/sdk/lib/io/path_impl.dart
@@ -4,16 +4,16 @@
part of dart.io;
-class _Path implements Path {
+class __Path implements _Path {
final String _path;
final bool isWindowsShare;
- _Path(String source)
+ __Path(String source)
: _path = _clean(source), isWindowsShare = _isWindowsShare(source);
- _Path.raw(String source) : _path = source, isWindowsShare = false;
+ __Path.raw(String source) : _path = source, isWindowsShare = false;
- _Path._internal(String this._path, bool this.isWindowsShare);
+ __Path._internal(String this._path, bool this.isWindowsShare);
static String _clean(String source) {
if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
@@ -44,14 +44,14 @@
String toString() => _path;
- Path relativeTo(Path base) {
+ _Path relativeTo(_Path base) {
// Returns a path "relative" such that
// base.join(relative) == this.canonicalize.
// Throws exception if an impossible case is reached.
if (base.isAbsolute != isAbsolute ||
base.isWindowsShare != isWindowsShare) {
throw new ArgumentError(
- "Invalid case of Path.relativeTo(base):\n"
+ "Invalid case of _Path.relativeTo(base):\n"
" Path and base must both be relative, or both absolute.\n"
" Arguments: $_path.relativeTo($base)");
}
@@ -71,17 +71,17 @@
if(basePath[1] != _path[1]) {
// Replace the drive letter in basePath with that from _path.
basePath = '/${_path[1]}:/${basePath.substring(4)}';
- base = new Path(basePath);
+ base = new _Path(basePath);
}
} else {
throw new ArgumentError(
- "Invalid case of Path.relativeTo(base):\n"
+ "Invalid case of _Path.relativeTo(base):\n"
" Base path and target path are on different Windows drives.\n"
" Arguments: $_path.relativeTo($base)");
}
} else if (baseHasDrive != pathHasDrive) {
throw new ArgumentError(
- "Invalid case of Path.relativeTo(base):\n"
+ "Invalid case of _Path.relativeTo(base):\n"
" Base path must start with a drive letter if and "
"only if target path does.\n"
" Arguments: $_path.relativeTo($base)");
@@ -89,7 +89,7 @@
}
if (_path.startsWith(basePath)) {
- if (_path == basePath) return new Path('.');
+ if (_path == basePath) return new _Path('.');
// There must be a '/' at the end of the match, or immediately after.
int matchEnd = basePath.length;
if (_path[matchEnd - 1] == '/' || _path[matchEnd] == '/') {
@@ -97,7 +97,7 @@
while (matchEnd < _path.length && _path[matchEnd] == '/') {
matchEnd++;
}
- return new Path(_path.substring(matchEnd)).canonicalize();
+ return new _Path(_path.substring(matchEnd)).canonicalize();
}
}
@@ -118,7 +118,7 @@
if (common < baseSegments.length && baseSegments[common] == '..') {
throw new ArgumentError(
- "Invalid case of Path.relativeTo(base):\n"
+ "Invalid case of _Path.relativeTo(base):\n"
" Base path has more '..'s than path does.\n"
" Arguments: $_path.relativeTo($base)");
}
@@ -134,11 +134,11 @@
if (hasTrailingSeparator) {
segments.add('');
}
- return new Path(segments.join('/'));
+ return new _Path(segments.join('/'));
}
- Path join(Path further) {
+ _Path join(_Path further) {
if (further.isAbsolute) {
throw new ArgumentError(
"Path.join called with absolute Path as argument.");
@@ -147,17 +147,17 @@
return further.canonicalize();
}
if (hasTrailingSeparator) {
- var joined = new _Path._internal('$_path${further}', isWindowsShare);
+ var joined = new __Path._internal('$_path${further}', isWindowsShare);
return joined.canonicalize();
}
- var joined = new _Path._internal('$_path/${further}', isWindowsShare);
+ var joined = new __Path._internal('$_path/${further}', isWindowsShare);
return joined.canonicalize();
}
// Note: The URI RFC names for canonicalize, join, and relativeTo
// are normalize, resolve, and relativize. But resolve and relativize
// drop the last segment of the base path (the filename), on URIs.
- Path canonicalize() {
+ _Path canonicalize() {
if (isCanonical) return this;
return makeCanonical();
}
@@ -184,7 +184,7 @@
return !segs.any((s) => s == '' || s == '.' || s == '..');
}
- Path makeCanonical() {
+ _Path makeCanonical() {
bool isAbs = isAbsolute;
List segs = segments();
String drive;
@@ -242,7 +242,7 @@
segmentsToJoin.add('');
}
}
- return new _Path._internal(segmentsToJoin.join('/'), isWindowsShare);
+ return new __Path._internal(segmentsToJoin.join('/'), isWindowsShare);
}
String toNativePath() {
@@ -271,13 +271,13 @@
return result;
}
- Path append(String finalSegment) {
+ _Path append(String finalSegment) {
if (isEmpty) {
- return new _Path._internal(finalSegment, isWindowsShare);
+ return new __Path._internal(finalSegment, isWindowsShare);
} else if (hasTrailingSeparator) {
- return new _Path._internal('$_path$finalSegment', isWindowsShare);
+ return new __Path._internal('$_path$finalSegment', isWindowsShare);
} else {
- return new _Path._internal('$_path/$finalSegment', isWindowsShare);
+ return new __Path._internal('$_path/$finalSegment', isWindowsShare);
}
}
@@ -294,12 +294,12 @@
return (pos < 0) ? '' : name.substring(pos + 1);
}
- Path get directoryPath {
+ _Path get directoryPath {
int pos = _path.lastIndexOf('/');
- if (pos < 0) return new Path('');
+ if (pos < 0) return new _Path('');
while (pos > 0 && _path[pos - 1] == '/') --pos;
var dirPath = (pos > 0) ? _path.substring(0, pos) : '/';
- return new _Path._internal(dirPath, isWindowsShare);
+ return new __Path._internal(dirPath, isWindowsShare);
}
String get filename {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index f2a33e2..1867050 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -204,117 +204,7 @@
*/
external static void initialize({String database,
String password,
- bool useBuiltinRoots: true,
- bool readOnly: true});
-
- /**
- * Trust strings for use in [addCertificate] and [changeTrust].
- */
- static const String TRUST_ISSUE_SERVER_CERTIFICATES = 'C,,';
- static const String TRUST_ISSUE_CLIENT_CERTIFICATES = 'T,,';
- static const String TRUST_ISSUE_CLIENT_SERVER_CERTIFICATES = 'TC,,';
- static const String TRUST_CERTIFICATE = 'P,,';
-
- /**
- * Adds a X509 certificate (for SSL and TLS secure networking) to the
- * in-memory certificate cache. Returns an X509Certificate object
- * with information about the added certificate.
- *
- * The in-memory certificate cache is different from the certificate
- * database opened by `SecureSocket.initialize`, and certificates added
- * by [addCertificate] cannot be modified or removed by [changeTrust]
- * or [removeCertificate]. However, if the certificate is already in the
- * database, then [removeCertificate] will remove it from both the database
- * and the in-memory cache.
- *
- * [certificate] must be a list of bytes encoding a certificate in
- * PEM format: a base64 encoded DER certificate, enclosed between
- * "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----".
- *
- * [trust] is a string specifying the allowed uses of this certificate.
- * For example, 'TC,,' specifies that the certificate is for a certificate
- * authority that is trusted to issue server and client certificates, so
- * that a server or client certificate signed by this authority will be
- * accepted.
- *
- * See the documentation of NSS certutil at
- * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
- * or
- * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
- * for more information about trust attributes.
- */
- external static X509Certificate addCertificate(List<int> certificate,
- String trust);
-
- /**
- * Adds a X509 certificates (for SSL and TLS secure networking) with
- * their private keys to the certificate database. SecureSocket.initialize
- * must have been called with the path to a certificate database, and with
- * readOnly set to `false`.
- *
- * [certificates] must be a list containing the bytes of a PKCS #12 encoded
- * list of certificates and private keys. These are commonly called
- * `.pfx` or `.p12` files. Only PKCS #12 files using
- * 3-key triple-DES and 40 bit RC2 encryption are accepted.
- *
- * All certificates are imported with no default trust, and the appropriate
- * uses of each certificate must be added with `SecureSocket.changeTrust`.
- *
- * See the documentation of NSS certutil at
- * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
- * or
- * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
- * for more information about trust attributes.
- *
- * Returns a CertificateError if it fails. The error code -8183 does not
- * indicate that the PKCS #12 file is corrupt. It also is returned if
- * the certificate database is read-only, or is the default internal database,
- * or if the password for the file or database is incorrect.
- */
- external static importCertificatesWithPrivateKeys(List<int> certificates,
- String password);
-
- /**
- * Changes the trust settings for the certificate with nickname [nickname].
- * This certificate must exist in the certificate database.
- * SecureSocket.initialize must have been called with the path to a
- * certificate database, and with readOnly set to false.
- *
- * [trust] is a string specifying the allowed uses of this certificate.
- * For example, 'TC,,' specifies that the certificate is for a certificate
- * authority that is trusted to issue server and client certificates, so
- * that a server or client certificate signed by this authority will be
- * accepted.
- *
- * See the documentation of NSS certutil at
- * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
- * or
- * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
- * for more information about trust attributes.
- */
- external static X509Certificate changeTrust(String nickname,
- String trust);
-
- /**
- * Gets the certificate with nickname [nickname] from
- * the certificate database. Returns an X509Certificate object with
- * information about the certificate.
- *
- * Throws a CertificateException if it cannot find the certificate with
- * the given nickname.
- */
- external static X509Certificate getCertificate(String nickname);
-
- /**
- * Removes the certificate with nickname [nickname] permanently from
- * the certificate database.
- * This certificate must exist in the certificate database.
- * SecureSocket.initialize must have been called with the path to a
- * certificate database, and with readOnly set to false.
- *
- * Returns null if it cannot find the certificate with that nickname.
- */
- external static removeCertificate(String nickname);
+ bool useBuiltinRoots: true});
}
@@ -522,8 +412,7 @@
static final int NUM_BUFFERS = 4;
// Is a buffer identifier for an encrypted buffer?
- static bool _isBufferEncrypted(int identifier) =>
- identifier >= READ_ENCRYPTED;
+ static bool _isBufferEncrypted(int identifier) => identifier >= READ_ENCRYPTED;
RawSocket _socket;
final Completer<_RawSecureSocket> _handshakeComplete =
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 8c2a21b..c5b4b8d 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -417,9 +417,10 @@
}
/**
- * A high-level class for communicating over a TCP socket. The [Socket] exposes
- * both a [Stream] and a [IOSink] interface, making it ideal for
- * using together with other [Stream]s.
+ * A high-level class for communicating over a TCP socket.
+ *
+ * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it
+ * ideal for using together with other [Stream]s.
*/
abstract class Socket implements Stream<List<int>>, IOSink {
/**
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index b67f89e..a3f2b25 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -76,9 +76,10 @@
/**
- * A client or server web socket connection. The stream exposes the
- * messages received. A text message will be of type [:String:] and a
- * binary message will be of type [:List<int>:].
+ * A two-way HTTP communication object for client or server applications.
+ *
+ * The stream exposes the messages received. A text message will be of type
+ * [:String:] and a binary message will be of type [:List<int>:].
*/
abstract class WebSocket implements Stream, StreamSink {
/**
diff --git a/sdk/lib/json/json.dart b/sdk/lib/json/json.dart
index 28d3df9..5fd3a6a 100644
--- a/sdk/lib/json/json.dart
+++ b/sdk/lib/json/json.dart
@@ -2,6 +2,10 @@
// 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.
+/**
+ * Utilities for encoding and decoding JSON (JavaScript Object Notation) data.
+ */
+
library dart.json;
// JSON parsing and serialization.
@@ -57,7 +61,7 @@
* The optional [reviver] function, if provided, is called once for each
* object or list property parsed. The arguments are the property name
* ([String]) or list index ([int]), and the value is the parsed value.
- * The return value of the revivier will be used as the value of that property
+ * The return value of the reviver will be used as the value of that property
* instead the parsed value.
*
* Throws [FormatException] if the input is not valid JSON text.
@@ -177,7 +181,7 @@
void handleString(String value) { this.value = value; }
void handleNumber(num value) { this.value = value; }
void handleBool(bool value) { this.value = value; }
- void handleNull() { this.value = value; }
+ void handleNull() { this.value = null; }
void beginObject() {
pushContainer();
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index 6cea069..0c1f67f 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -2,6 +2,9 @@
// 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.
+/**
+ * Mathematical constants and functions, plus a random number generator.
+ */
library dart.math;
part "random.dart";
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index c41c6c2..b0d39d9 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -13,37 +13,37 @@
// setters for the purposes of member lookup.
/**
- * The mirrors library provides basic reflection support for Dart.
- * Reflection here is limited to introspection and dynamic
- * evaluation.
+ * Basic reflection in Dart,
+ * with support for introspection and dynamic evaluation.
*
- * Introspection is that subset of reflection by which a running
+ * *Introspection* is that subset of reflection by which a running
* program can examine its own structure. For example, a function
* that prints out the names of all the members of an arbitrary object.
*
- * Dynamic evaluation refers the ability to evaluate code that
+ * *Dynamic evaluation* refers the ability to evaluate code that
* has not been literally specified at compile time, such as calling a method
* whose name is provided as an argument (because it is looked up
* in a database, or provided interactively by the user).
*
- * How to Interpret the Dartdoc specifications below
+ * ## How to interpret this library's documentation
*
* As a rule, the names of Dart declarations are represented using
- * instances of class [Symbol]. Whenever we speak of an object *s*
- * of class [Symbol] denoting a name, we mean the string that
+ * instances of class [Symbol]. Whenever the doc speaks of an object *s*
+ * of class [Symbol] denoting a name, it means the string that
* was used to construct *s*.
*
- * We will also frequently abuse notation and write
- * Dart pseudo-code such as [:o.x(a):], where we have defined
- * o and a to be objects; what is actually meant in these
+ * The documentation frequently abuses notation with
+ * Dart pseudo-code such as [:o.x(a):], where
+ * o and a are defined to be objects; what is actually meant in these
* cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables
* bound to *o* and *a* respectively. Furthermore, *o'* and *a'*
* are assumed to be fresh variables (meaning that they are
* distinct from any other variables in the program).
*
+ * Sometimes the documentation refers to *serializable* objects.
* An object is serializable across isolates if and only if it is an instance of
- * either num, bool, String, a list of objects that are serializable
- * across isolates or a map whose keys and values are all serializable across
+ * num, bool, String, a list of objects that are serializable
+ * across isolates, or a map with keys and values that are all serializable across
* isolates.
*/
library dart.mirrors;
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index 0c761ff..a145ff2 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -2,7 +2,10 @@
// 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.
-/// The Dart TypedData library.
+/**
+ * Specialized integers and floating point numbers,
+ * with SIMD support and efficient lists.
+ */
library dart.typed_data;
import 'dart:collection';
@@ -931,264 +934,270 @@
/// Extracted w value.
double get w => _storage[3];
- Float32x4 get xxxx => _shuffle(0x0);
- Float32x4 get xxxy => _shuffle(0x40);
- Float32x4 get xxxz => _shuffle(0x80);
- Float32x4 get xxxw => _shuffle(0xC0);
- Float32x4 get xxyx => _shuffle(0x10);
- Float32x4 get xxyy => _shuffle(0x50);
- Float32x4 get xxyz => _shuffle(0x90);
- Float32x4 get xxyw => _shuffle(0xD0);
- Float32x4 get xxzx => _shuffle(0x20);
- Float32x4 get xxzy => _shuffle(0x60);
- Float32x4 get xxzz => _shuffle(0xA0);
- Float32x4 get xxzw => _shuffle(0xE0);
- Float32x4 get xxwx => _shuffle(0x30);
- Float32x4 get xxwy => _shuffle(0x70);
- Float32x4 get xxwz => _shuffle(0xB0);
- Float32x4 get xxww => _shuffle(0xF0);
- Float32x4 get xyxx => _shuffle(0x4);
- Float32x4 get xyxy => _shuffle(0x44);
- Float32x4 get xyxz => _shuffle(0x84);
- Float32x4 get xyxw => _shuffle(0xC4);
- Float32x4 get xyyx => _shuffle(0x14);
- Float32x4 get xyyy => _shuffle(0x54);
- Float32x4 get xyyz => _shuffle(0x94);
- Float32x4 get xyyw => _shuffle(0xD4);
- Float32x4 get xyzx => _shuffle(0x24);
- Float32x4 get xyzy => _shuffle(0x64);
- Float32x4 get xyzz => _shuffle(0xA4);
- Float32x4 get xyzw => _shuffle(0xE4);
- Float32x4 get xywx => _shuffle(0x34);
- Float32x4 get xywy => _shuffle(0x74);
- Float32x4 get xywz => _shuffle(0xB4);
- Float32x4 get xyww => _shuffle(0xF4);
- Float32x4 get xzxx => _shuffle(0x8);
- Float32x4 get xzxy => _shuffle(0x48);
- Float32x4 get xzxz => _shuffle(0x88);
- Float32x4 get xzxw => _shuffle(0xC8);
- Float32x4 get xzyx => _shuffle(0x18);
- Float32x4 get xzyy => _shuffle(0x58);
- Float32x4 get xzyz => _shuffle(0x98);
- Float32x4 get xzyw => _shuffle(0xD8);
- Float32x4 get xzzx => _shuffle(0x28);
- Float32x4 get xzzy => _shuffle(0x68);
- Float32x4 get xzzz => _shuffle(0xA8);
- Float32x4 get xzzw => _shuffle(0xE8);
- Float32x4 get xzwx => _shuffle(0x38);
- Float32x4 get xzwy => _shuffle(0x78);
- Float32x4 get xzwz => _shuffle(0xB8);
- Float32x4 get xzww => _shuffle(0xF8);
- Float32x4 get xwxx => _shuffle(0xC);
- Float32x4 get xwxy => _shuffle(0x4C);
- Float32x4 get xwxz => _shuffle(0x8C);
- Float32x4 get xwxw => _shuffle(0xCC);
- Float32x4 get xwyx => _shuffle(0x1C);
- Float32x4 get xwyy => _shuffle(0x5C);
- Float32x4 get xwyz => _shuffle(0x9C);
- Float32x4 get xwyw => _shuffle(0xDC);
- Float32x4 get xwzx => _shuffle(0x2C);
- Float32x4 get xwzy => _shuffle(0x6C);
- Float32x4 get xwzz => _shuffle(0xAC);
- Float32x4 get xwzw => _shuffle(0xEC);
- Float32x4 get xwwx => _shuffle(0x3C);
- Float32x4 get xwwy => _shuffle(0x7C);
- Float32x4 get xwwz => _shuffle(0xBC);
- Float32x4 get xwww => _shuffle(0xFC);
- Float32x4 get yxxx => _shuffle(0x1);
- Float32x4 get yxxy => _shuffle(0x41);
- Float32x4 get yxxz => _shuffle(0x81);
- Float32x4 get yxxw => _shuffle(0xC1);
- Float32x4 get yxyx => _shuffle(0x11);
- Float32x4 get yxyy => _shuffle(0x51);
- Float32x4 get yxyz => _shuffle(0x91);
- Float32x4 get yxyw => _shuffle(0xD1);
- Float32x4 get yxzx => _shuffle(0x21);
- Float32x4 get yxzy => _shuffle(0x61);
- Float32x4 get yxzz => _shuffle(0xA1);
- Float32x4 get yxzw => _shuffle(0xE1);
- Float32x4 get yxwx => _shuffle(0x31);
- Float32x4 get yxwy => _shuffle(0x71);
- Float32x4 get yxwz => _shuffle(0xB1);
- Float32x4 get yxww => _shuffle(0xF1);
- Float32x4 get yyxx => _shuffle(0x5);
- Float32x4 get yyxy => _shuffle(0x45);
- Float32x4 get yyxz => _shuffle(0x85);
- Float32x4 get yyxw => _shuffle(0xC5);
- Float32x4 get yyyx => _shuffle(0x15);
- Float32x4 get yyyy => _shuffle(0x55);
- Float32x4 get yyyz => _shuffle(0x95);
- Float32x4 get yyyw => _shuffle(0xD5);
- Float32x4 get yyzx => _shuffle(0x25);
- Float32x4 get yyzy => _shuffle(0x65);
- Float32x4 get yyzz => _shuffle(0xA5);
- Float32x4 get yyzw => _shuffle(0xE5);
- Float32x4 get yywx => _shuffle(0x35);
- Float32x4 get yywy => _shuffle(0x75);
- Float32x4 get yywz => _shuffle(0xB5);
- Float32x4 get yyww => _shuffle(0xF5);
- Float32x4 get yzxx => _shuffle(0x9);
- Float32x4 get yzxy => _shuffle(0x49);
- Float32x4 get yzxz => _shuffle(0x89);
- Float32x4 get yzxw => _shuffle(0xC9);
- Float32x4 get yzyx => _shuffle(0x19);
- Float32x4 get yzyy => _shuffle(0x59);
- Float32x4 get yzyz => _shuffle(0x99);
- Float32x4 get yzyw => _shuffle(0xD9);
- Float32x4 get yzzx => _shuffle(0x29);
- Float32x4 get yzzy => _shuffle(0x69);
- Float32x4 get yzzz => _shuffle(0xA9);
- Float32x4 get yzzw => _shuffle(0xE9);
- Float32x4 get yzwx => _shuffle(0x39);
- Float32x4 get yzwy => _shuffle(0x79);
- Float32x4 get yzwz => _shuffle(0xB9);
- Float32x4 get yzww => _shuffle(0xF9);
- Float32x4 get ywxx => _shuffle(0xD);
- Float32x4 get ywxy => _shuffle(0x4D);
- Float32x4 get ywxz => _shuffle(0x8D);
- Float32x4 get ywxw => _shuffle(0xCD);
- Float32x4 get ywyx => _shuffle(0x1D);
- Float32x4 get ywyy => _shuffle(0x5D);
- Float32x4 get ywyz => _shuffle(0x9D);
- Float32x4 get ywyw => _shuffle(0xDD);
- Float32x4 get ywzx => _shuffle(0x2D);
- Float32x4 get ywzy => _shuffle(0x6D);
- Float32x4 get ywzz => _shuffle(0xAD);
- Float32x4 get ywzw => _shuffle(0xED);
- Float32x4 get ywwx => _shuffle(0x3D);
- Float32x4 get ywwy => _shuffle(0x7D);
- Float32x4 get ywwz => _shuffle(0xBD);
- Float32x4 get ywww => _shuffle(0xFD);
- Float32x4 get zxxx => _shuffle(0x2);
- Float32x4 get zxxy => _shuffle(0x42);
- Float32x4 get zxxz => _shuffle(0x82);
- Float32x4 get zxxw => _shuffle(0xC2);
- Float32x4 get zxyx => _shuffle(0x12);
- Float32x4 get zxyy => _shuffle(0x52);
- Float32x4 get zxyz => _shuffle(0x92);
- Float32x4 get zxyw => _shuffle(0xD2);
- Float32x4 get zxzx => _shuffle(0x22);
- Float32x4 get zxzy => _shuffle(0x62);
- Float32x4 get zxzz => _shuffle(0xA2);
- Float32x4 get zxzw => _shuffle(0xE2);
- Float32x4 get zxwx => _shuffle(0x32);
- Float32x4 get zxwy => _shuffle(0x72);
- Float32x4 get zxwz => _shuffle(0xB2);
- Float32x4 get zxww => _shuffle(0xF2);
- Float32x4 get zyxx => _shuffle(0x6);
- Float32x4 get zyxy => _shuffle(0x46);
- Float32x4 get zyxz => _shuffle(0x86);
- Float32x4 get zyxw => _shuffle(0xC6);
- Float32x4 get zyyx => _shuffle(0x16);
- Float32x4 get zyyy => _shuffle(0x56);
- Float32x4 get zyyz => _shuffle(0x96);
- Float32x4 get zyyw => _shuffle(0xD6);
- Float32x4 get zyzx => _shuffle(0x26);
- Float32x4 get zyzy => _shuffle(0x66);
- Float32x4 get zyzz => _shuffle(0xA6);
- Float32x4 get zyzw => _shuffle(0xE6);
- Float32x4 get zywx => _shuffle(0x36);
- Float32x4 get zywy => _shuffle(0x76);
- Float32x4 get zywz => _shuffle(0xB6);
- Float32x4 get zyww => _shuffle(0xF6);
- Float32x4 get zzxx => _shuffle(0xA);
- Float32x4 get zzxy => _shuffle(0x4A);
- Float32x4 get zzxz => _shuffle(0x8A);
- Float32x4 get zzxw => _shuffle(0xCA);
- Float32x4 get zzyx => _shuffle(0x1A);
- Float32x4 get zzyy => _shuffle(0x5A);
- Float32x4 get zzyz => _shuffle(0x9A);
- Float32x4 get zzyw => _shuffle(0xDA);
- Float32x4 get zzzx => _shuffle(0x2A);
- Float32x4 get zzzy => _shuffle(0x6A);
- Float32x4 get zzzz => _shuffle(0xAA);
- Float32x4 get zzzw => _shuffle(0xEA);
- Float32x4 get zzwx => _shuffle(0x3A);
- Float32x4 get zzwy => _shuffle(0x7A);
- Float32x4 get zzwz => _shuffle(0xBA);
- Float32x4 get zzww => _shuffle(0xFA);
- Float32x4 get zwxx => _shuffle(0xE);
- Float32x4 get zwxy => _shuffle(0x4E);
- Float32x4 get zwxz => _shuffle(0x8E);
- Float32x4 get zwxw => _shuffle(0xCE);
- Float32x4 get zwyx => _shuffle(0x1E);
- Float32x4 get zwyy => _shuffle(0x5E);
- Float32x4 get zwyz => _shuffle(0x9E);
- Float32x4 get zwyw => _shuffle(0xDE);
- Float32x4 get zwzx => _shuffle(0x2E);
- Float32x4 get zwzy => _shuffle(0x6E);
- Float32x4 get zwzz => _shuffle(0xAE);
- Float32x4 get zwzw => _shuffle(0xEE);
- Float32x4 get zwwx => _shuffle(0x3E);
- Float32x4 get zwwy => _shuffle(0x7E);
- Float32x4 get zwwz => _shuffle(0xBE);
- Float32x4 get zwww => _shuffle(0xFE);
- Float32x4 get wxxx => _shuffle(0x3);
- Float32x4 get wxxy => _shuffle(0x43);
- Float32x4 get wxxz => _shuffle(0x83);
- Float32x4 get wxxw => _shuffle(0xC3);
- Float32x4 get wxyx => _shuffle(0x13);
- Float32x4 get wxyy => _shuffle(0x53);
- Float32x4 get wxyz => _shuffle(0x93);
- Float32x4 get wxyw => _shuffle(0xD3);
- Float32x4 get wxzx => _shuffle(0x23);
- Float32x4 get wxzy => _shuffle(0x63);
- Float32x4 get wxzz => _shuffle(0xA3);
- Float32x4 get wxzw => _shuffle(0xE3);
- Float32x4 get wxwx => _shuffle(0x33);
- Float32x4 get wxwy => _shuffle(0x73);
- Float32x4 get wxwz => _shuffle(0xB3);
- Float32x4 get wxww => _shuffle(0xF3);
- Float32x4 get wyxx => _shuffle(0x7);
- Float32x4 get wyxy => _shuffle(0x47);
- Float32x4 get wyxz => _shuffle(0x87);
- Float32x4 get wyxw => _shuffle(0xC7);
- Float32x4 get wyyx => _shuffle(0x17);
- Float32x4 get wyyy => _shuffle(0x57);
- Float32x4 get wyyz => _shuffle(0x97);
- Float32x4 get wyyw => _shuffle(0xD7);
- Float32x4 get wyzx => _shuffle(0x27);
- Float32x4 get wyzy => _shuffle(0x67);
- Float32x4 get wyzz => _shuffle(0xA7);
- Float32x4 get wyzw => _shuffle(0xE7);
- Float32x4 get wywx => _shuffle(0x37);
- Float32x4 get wywy => _shuffle(0x77);
- Float32x4 get wywz => _shuffle(0xB7);
- Float32x4 get wyww => _shuffle(0xF7);
- Float32x4 get wzxx => _shuffle(0xB);
- Float32x4 get wzxy => _shuffle(0x4B);
- Float32x4 get wzxz => _shuffle(0x8B);
- Float32x4 get wzxw => _shuffle(0xCB);
- Float32x4 get wzyx => _shuffle(0x1B);
- Float32x4 get wzyy => _shuffle(0x5B);
- Float32x4 get wzyz => _shuffle(0x9B);
- Float32x4 get wzyw => _shuffle(0xDB);
- Float32x4 get wzzx => _shuffle(0x2B);
- Float32x4 get wzzy => _shuffle(0x6B);
- Float32x4 get wzzz => _shuffle(0xAB);
- Float32x4 get wzzw => _shuffle(0xEB);
- Float32x4 get wzwx => _shuffle(0x3B);
- Float32x4 get wzwy => _shuffle(0x7B);
- Float32x4 get wzwz => _shuffle(0xBB);
- Float32x4 get wzww => _shuffle(0xFB);
- Float32x4 get wwxx => _shuffle(0xF);
- Float32x4 get wwxy => _shuffle(0x4F);
- Float32x4 get wwxz => _shuffle(0x8F);
- Float32x4 get wwxw => _shuffle(0xCF);
- Float32x4 get wwyx => _shuffle(0x1F);
- Float32x4 get wwyy => _shuffle(0x5F);
- Float32x4 get wwyz => _shuffle(0x9F);
- Float32x4 get wwyw => _shuffle(0xDF);
- Float32x4 get wwzx => _shuffle(0x2F);
- Float32x4 get wwzy => _shuffle(0x6F);
- Float32x4 get wwzz => _shuffle(0xAF);
- Float32x4 get wwzw => _shuffle(0xEF);
- Float32x4 get wwwx => _shuffle(0x3F);
- Float32x4 get wwwy => _shuffle(0x7F);
- Float32x4 get wwwz => _shuffle(0xBF);
- Float32x4 get wwww => _shuffle(0xFF);
+ /// Mask passed to [shuffle].
+ static const int XXXX = 0x0;
+ static const int XXXY = 0x40;
+ static const int XXXZ = 0x80;
+ static const int XXXW = 0xC0;
+ static const int XXYX = 0x10;
+ static const int XXYY = 0x50;
+ static const int XXYZ = 0x90;
+ static const int XXYW = 0xD0;
+ static const int XXZX = 0x20;
+ static const int XXZY = 0x60;
+ static const int XXZZ = 0xA0;
+ static const int XXZW = 0xE0;
+ static const int XXWX = 0x30;
+ static const int XXWY = 0x70;
+ static const int XXWZ = 0xB0;
+ static const int XXWW = 0xF0;
+ static const int XYXX = 0x4;
+ static const int XYXY = 0x44;
+ static const int XYXZ = 0x84;
+ static const int XYXW = 0xC4;
+ static const int XYYX = 0x14;
+ static const int XYYY = 0x54;
+ static const int XYYZ = 0x94;
+ static const int XYYW = 0xD4;
+ static const int XYZX = 0x24;
+ static const int XYZY = 0x64;
+ static const int XYZZ = 0xA4;
+ static const int XYZW = 0xE4;
+ static const int XYWX = 0x34;
+ static const int XYWY = 0x74;
+ static const int XYWZ = 0xB4;
+ static const int XYWW = 0xF4;
+ static const int XZXX = 0x8;
+ static const int XZXY = 0x48;
+ static const int XZXZ = 0x88;
+ static const int XZXW = 0xC8;
+ static const int XZYX = 0x18;
+ static const int XZYY = 0x58;
+ static const int XZYZ = 0x98;
+ static const int XZYW = 0xD8;
+ static const int XZZX = 0x28;
+ static const int XZZY = 0x68;
+ static const int XZZZ = 0xA8;
+ static const int XZZW = 0xE8;
+ static const int XZWX = 0x38;
+ static const int XZWY = 0x78;
+ static const int XZWZ = 0xB8;
+ static const int XZWW = 0xF8;
+ static const int XWXX = 0xC;
+ static const int XWXY = 0x4C;
+ static const int XWXZ = 0x8C;
+ static const int XWXW = 0xCC;
+ static const int XWYX = 0x1C;
+ static const int XWYY = 0x5C;
+ static const int XWYZ = 0x9C;
+ static const int XWYW = 0xDC;
+ static const int XWZX = 0x2C;
+ static const int XWZY = 0x6C;
+ static const int XWZZ = 0xAC;
+ static const int XWZW = 0xEC;
+ static const int XWWX = 0x3C;
+ static const int XWWY = 0x7C;
+ static const int XWWZ = 0xBC;
+ static const int XWWW = 0xFC;
+ static const int YXXX = 0x1;
+ static const int YXXY = 0x41;
+ static const int YXXZ = 0x81;
+ static const int YXXW = 0xC1;
+ static const int YXYX = 0x11;
+ static const int YXYY = 0x51;
+ static const int YXYZ = 0x91;
+ static const int YXYW = 0xD1;
+ static const int YXZX = 0x21;
+ static const int YXZY = 0x61;
+ static const int YXZZ = 0xA1;
+ static const int YXZW = 0xE1;
+ static const int YXWX = 0x31;
+ static const int YXWY = 0x71;
+ static const int YXWZ = 0xB1;
+ static const int YXWW = 0xF1;
+ static const int YYXX = 0x5;
+ static const int YYXY = 0x45;
+ static const int YYXZ = 0x85;
+ static const int YYXW = 0xC5;
+ static const int YYYX = 0x15;
+ static const int YYYY = 0x55;
+ static const int YYYZ = 0x95;
+ static const int YYYW = 0xD5;
+ static const int YYZX = 0x25;
+ static const int YYZY = 0x65;
+ static const int YYZZ = 0xA5;
+ static const int YYZW = 0xE5;
+ static const int YYWX = 0x35;
+ static const int YYWY = 0x75;
+ static const int YYWZ = 0xB5;
+ static const int YYWW = 0xF5;
+ static const int YZXX = 0x9;
+ static const int YZXY = 0x49;
+ static const int YZXZ = 0x89;
+ static const int YZXW = 0xC9;
+ static const int YZYX = 0x19;
+ static const int YZYY = 0x59;
+ static const int YZYZ = 0x99;
+ static const int YZYW = 0xD9;
+ static const int YZZX = 0x29;
+ static const int YZZY = 0x69;
+ static const int YZZZ = 0xA9;
+ static const int YZZW = 0xE9;
+ static const int YZWX = 0x39;
+ static const int YZWY = 0x79;
+ static const int YZWZ = 0xB9;
+ static const int YZWW = 0xF9;
+ static const int YWXX = 0xD;
+ static const int YWXY = 0x4D;
+ static const int YWXZ = 0x8D;
+ static const int YWXW = 0xCD;
+ static const int YWYX = 0x1D;
+ static const int YWYY = 0x5D;
+ static const int YWYZ = 0x9D;
+ static const int YWYW = 0xDD;
+ static const int YWZX = 0x2D;
+ static const int YWZY = 0x6D;
+ static const int YWZZ = 0xAD;
+ static const int YWZW = 0xED;
+ static const int YWWX = 0x3D;
+ static const int YWWY = 0x7D;
+ static const int YWWZ = 0xBD;
+ static const int YWWW = 0xFD;
+ static const int ZXXX = 0x2;
+ static const int ZXXY = 0x42;
+ static const int ZXXZ = 0x82;
+ static const int ZXXW = 0xC2;
+ static const int ZXYX = 0x12;
+ static const int ZXYY = 0x52;
+ static const int ZXYZ = 0x92;
+ static const int ZXYW = 0xD2;
+ static const int ZXZX = 0x22;
+ static const int ZXZY = 0x62;
+ static const int ZXZZ = 0xA2;
+ static const int ZXZW = 0xE2;
+ static const int ZXWX = 0x32;
+ static const int ZXWY = 0x72;
+ static const int ZXWZ = 0xB2;
+ static const int ZXWW = 0xF2;
+ static const int ZYXX = 0x6;
+ static const int ZYXY = 0x46;
+ static const int ZYXZ = 0x86;
+ static const int ZYXW = 0xC6;
+ static const int ZYYX = 0x16;
+ static const int ZYYY = 0x56;
+ static const int ZYYZ = 0x96;
+ static const int ZYYW = 0xD6;
+ static const int ZYZX = 0x26;
+ static const int ZYZY = 0x66;
+ static const int ZYZZ = 0xA6;
+ static const int ZYZW = 0xE6;
+ static const int ZYWX = 0x36;
+ static const int ZYWY = 0x76;
+ static const int ZYWZ = 0xB6;
+ static const int ZYWW = 0xF6;
+ static const int ZZXX = 0xA;
+ static const int ZZXY = 0x4A;
+ static const int ZZXZ = 0x8A;
+ static const int ZZXW = 0xCA;
+ static const int ZZYX = 0x1A;
+ static const int ZZYY = 0x5A;
+ static const int ZZYZ = 0x9A;
+ static const int ZZYW = 0xDA;
+ static const int ZZZX = 0x2A;
+ static const int ZZZY = 0x6A;
+ static const int ZZZZ = 0xAA;
+ static const int ZZZW = 0xEA;
+ static const int ZZWX = 0x3A;
+ static const int ZZWY = 0x7A;
+ static const int ZZWZ = 0xBA;
+ static const int ZZWW = 0xFA;
+ static const int ZWXX = 0xE;
+ static const int ZWXY = 0x4E;
+ static const int ZWXZ = 0x8E;
+ static const int ZWXW = 0xCE;
+ static const int ZWYX = 0x1E;
+ static const int ZWYY = 0x5E;
+ static const int ZWYZ = 0x9E;
+ static const int ZWYW = 0xDE;
+ static const int ZWZX = 0x2E;
+ static const int ZWZY = 0x6E;
+ static const int ZWZZ = 0xAE;
+ static const int ZWZW = 0xEE;
+ static const int ZWWX = 0x3E;
+ static const int ZWWY = 0x7E;
+ static const int ZWWZ = 0xBE;
+ static const int ZWWW = 0xFE;
+ static const int WXXX = 0x3;
+ static const int WXXY = 0x43;
+ static const int WXXZ = 0x83;
+ static const int WXXW = 0xC3;
+ static const int WXYX = 0x13;
+ static const int WXYY = 0x53;
+ static const int WXYZ = 0x93;
+ static const int WXYW = 0xD3;
+ static const int WXZX = 0x23;
+ static const int WXZY = 0x63;
+ static const int WXZZ = 0xA3;
+ static const int WXZW = 0xE3;
+ static const int WXWX = 0x33;
+ static const int WXWY = 0x73;
+ static const int WXWZ = 0xB3;
+ static const int WXWW = 0xF3;
+ static const int WYXX = 0x7;
+ static const int WYXY = 0x47;
+ static const int WYXZ = 0x87;
+ static const int WYXW = 0xC7;
+ static const int WYYX = 0x17;
+ static const int WYYY = 0x57;
+ static const int WYYZ = 0x97;
+ static const int WYYW = 0xD7;
+ static const int WYZX = 0x27;
+ static const int WYZY = 0x67;
+ static const int WYZZ = 0xA7;
+ static const int WYZW = 0xE7;
+ static const int WYWX = 0x37;
+ static const int WYWY = 0x77;
+ static const int WYWZ = 0xB7;
+ static const int WYWW = 0xF7;
+ static const int WZXX = 0xB;
+ static const int WZXY = 0x4B;
+ static const int WZXZ = 0x8B;
+ static const int WZXW = 0xCB;
+ static const int WZYX = 0x1B;
+ static const int WZYY = 0x5B;
+ static const int WZYZ = 0x9B;
+ static const int WZYW = 0xDB;
+ static const int WZZX = 0x2B;
+ static const int WZZY = 0x6B;
+ static const int WZZZ = 0xAB;
+ static const int WZZW = 0xEB;
+ static const int WZWX = 0x3B;
+ static const int WZWY = 0x7B;
+ static const int WZWZ = 0xBB;
+ static const int WZWW = 0xFB;
+ static const int WWXX = 0xF;
+ static const int WWXY = 0x4F;
+ static const int WWXZ = 0x8F;
+ static const int WWXW = 0xCF;
+ static const int WWYX = 0x1F;
+ static const int WWYY = 0x5F;
+ static const int WWYZ = 0x9F;
+ static const int WWYW = 0xDF;
+ static const int WWZX = 0x2F;
+ static const int WWZY = 0x6F;
+ static const int WWZZ = 0xAF;
+ static const int WWZW = 0xEF;
+ static const int WWWX = 0x3F;
+ static const int WWWY = 0x7F;
+ static const int WWWZ = 0xBF;
+ static const int WWWW = 0xFF;
- Float32x4 _shuffle(int m) {
+
+ /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
+ Float32x4 shuffle(int m) {
+ if (m < 0 || m > 255) {
+ throw new RangeError('mask $m must be in the range [0..256)');
+ }
double _x = _storage[m & 0x3];
double _y = _storage[(m >> 2) & 0x3];
double _z = _storage[(m >> 4) & 0x3];
@@ -1246,6 +1255,7 @@
return new Float32x4(_x, _y, _z, _w);
}
+ /// Copy [this] and replace the [x] lane.
Float32x4 withX(double x) {
double _x = x;
double _y = _storage[1];
@@ -1254,6 +1264,7 @@
return new Float32x4(_x, _y, _z, _w);
}
+ /// Copy [this] and replace the [y] lane.
Float32x4 withY(double y) {
double _x = _storage[0];
double _y = y;
@@ -1262,6 +1273,7 @@
return new Float32x4(_x, _y, _z, _w);
}
+ /// Copy [this] and replace the [z] lane.
Float32x4 withZ(double z) {
double _x = _storage[0];
double _y = _storage[1];
@@ -1270,6 +1282,7 @@
return new Float32x4(_x, _y, _z, _w);
}
+ /// Copy [this] and replace the [w] lane.
Float32x4 withW(double w) {
double _x = _storage[0];
double _y = _storage[1];
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index f75b4bb..7184e47 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -876,518 +876,266 @@
/// Extracted w value.
double get w;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xxww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xywx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xywy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xywz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xyww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xzww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get xwww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yxww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yywx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yywy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yywz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yyww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get yzww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get ywww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zxww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zywx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zywy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zywz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zyww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zzww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get zwww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wxww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wywx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wywy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wywz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wyww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wzww;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwxx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwxy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwxz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwxw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwyx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwyy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwyz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwyw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwzx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwzy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwzz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwzw;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwwx;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwwy;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwwz;
- /// Returns a new [Float32x4] with lane values reordered.
- Float32x4 get wwww;
+ /// Mask passed to [shuffle].
+ static const int XXXX = 0x0;
+ static const int XXXY = 0x40;
+ static const int XXXZ = 0x80;
+ static const int XXXW = 0xC0;
+ static const int XXYX = 0x10;
+ static const int XXYY = 0x50;
+ static const int XXYZ = 0x90;
+ static const int XXYW = 0xD0;
+ static const int XXZX = 0x20;
+ static const int XXZY = 0x60;
+ static const int XXZZ = 0xA0;
+ static const int XXZW = 0xE0;
+ static const int XXWX = 0x30;
+ static const int XXWY = 0x70;
+ static const int XXWZ = 0xB0;
+ static const int XXWW = 0xF0;
+ static const int XYXX = 0x4;
+ static const int XYXY = 0x44;
+ static const int XYXZ = 0x84;
+ static const int XYXW = 0xC4;
+ static const int XYYX = 0x14;
+ static const int XYYY = 0x54;
+ static const int XYYZ = 0x94;
+ static const int XYYW = 0xD4;
+ static const int XYZX = 0x24;
+ static const int XYZY = 0x64;
+ static const int XYZZ = 0xA4;
+ static const int XYZW = 0xE4;
+ static const int XYWX = 0x34;
+ static const int XYWY = 0x74;
+ static const int XYWZ = 0xB4;
+ static const int XYWW = 0xF4;
+ static const int XZXX = 0x8;
+ static const int XZXY = 0x48;
+ static const int XZXZ = 0x88;
+ static const int XZXW = 0xC8;
+ static const int XZYX = 0x18;
+ static const int XZYY = 0x58;
+ static const int XZYZ = 0x98;
+ static const int XZYW = 0xD8;
+ static const int XZZX = 0x28;
+ static const int XZZY = 0x68;
+ static const int XZZZ = 0xA8;
+ static const int XZZW = 0xE8;
+ static const int XZWX = 0x38;
+ static const int XZWY = 0x78;
+ static const int XZWZ = 0xB8;
+ static const int XZWW = 0xF8;
+ static const int XWXX = 0xC;
+ static const int XWXY = 0x4C;
+ static const int XWXZ = 0x8C;
+ static const int XWXW = 0xCC;
+ static const int XWYX = 0x1C;
+ static const int XWYY = 0x5C;
+ static const int XWYZ = 0x9C;
+ static const int XWYW = 0xDC;
+ static const int XWZX = 0x2C;
+ static const int XWZY = 0x6C;
+ static const int XWZZ = 0xAC;
+ static const int XWZW = 0xEC;
+ static const int XWWX = 0x3C;
+ static const int XWWY = 0x7C;
+ static const int XWWZ = 0xBC;
+ static const int XWWW = 0xFC;
+ static const int YXXX = 0x1;
+ static const int YXXY = 0x41;
+ static const int YXXZ = 0x81;
+ static const int YXXW = 0xC1;
+ static const int YXYX = 0x11;
+ static const int YXYY = 0x51;
+ static const int YXYZ = 0x91;
+ static const int YXYW = 0xD1;
+ static const int YXZX = 0x21;
+ static const int YXZY = 0x61;
+ static const int YXZZ = 0xA1;
+ static const int YXZW = 0xE1;
+ static const int YXWX = 0x31;
+ static const int YXWY = 0x71;
+ static const int YXWZ = 0xB1;
+ static const int YXWW = 0xF1;
+ static const int YYXX = 0x5;
+ static const int YYXY = 0x45;
+ static const int YYXZ = 0x85;
+ static const int YYXW = 0xC5;
+ static const int YYYX = 0x15;
+ static const int YYYY = 0x55;
+ static const int YYYZ = 0x95;
+ static const int YYYW = 0xD5;
+ static const int YYZX = 0x25;
+ static const int YYZY = 0x65;
+ static const int YYZZ = 0xA5;
+ static const int YYZW = 0xE5;
+ static const int YYWX = 0x35;
+ static const int YYWY = 0x75;
+ static const int YYWZ = 0xB5;
+ static const int YYWW = 0xF5;
+ static const int YZXX = 0x9;
+ static const int YZXY = 0x49;
+ static const int YZXZ = 0x89;
+ static const int YZXW = 0xC9;
+ static const int YZYX = 0x19;
+ static const int YZYY = 0x59;
+ static const int YZYZ = 0x99;
+ static const int YZYW = 0xD9;
+ static const int YZZX = 0x29;
+ static const int YZZY = 0x69;
+ static const int YZZZ = 0xA9;
+ static const int YZZW = 0xE9;
+ static const int YZWX = 0x39;
+ static const int YZWY = 0x79;
+ static const int YZWZ = 0xB9;
+ static const int YZWW = 0xF9;
+ static const int YWXX = 0xD;
+ static const int YWXY = 0x4D;
+ static const int YWXZ = 0x8D;
+ static const int YWXW = 0xCD;
+ static const int YWYX = 0x1D;
+ static const int YWYY = 0x5D;
+ static const int YWYZ = 0x9D;
+ static const int YWYW = 0xDD;
+ static const int YWZX = 0x2D;
+ static const int YWZY = 0x6D;
+ static const int YWZZ = 0xAD;
+ static const int YWZW = 0xED;
+ static const int YWWX = 0x3D;
+ static const int YWWY = 0x7D;
+ static const int YWWZ = 0xBD;
+ static const int YWWW = 0xFD;
+ static const int ZXXX = 0x2;
+ static const int ZXXY = 0x42;
+ static const int ZXXZ = 0x82;
+ static const int ZXXW = 0xC2;
+ static const int ZXYX = 0x12;
+ static const int ZXYY = 0x52;
+ static const int ZXYZ = 0x92;
+ static const int ZXYW = 0xD2;
+ static const int ZXZX = 0x22;
+ static const int ZXZY = 0x62;
+ static const int ZXZZ = 0xA2;
+ static const int ZXZW = 0xE2;
+ static const int ZXWX = 0x32;
+ static const int ZXWY = 0x72;
+ static const int ZXWZ = 0xB2;
+ static const int ZXWW = 0xF2;
+ static const int ZYXX = 0x6;
+ static const int ZYXY = 0x46;
+ static const int ZYXZ = 0x86;
+ static const int ZYXW = 0xC6;
+ static const int ZYYX = 0x16;
+ static const int ZYYY = 0x56;
+ static const int ZYYZ = 0x96;
+ static const int ZYYW = 0xD6;
+ static const int ZYZX = 0x26;
+ static const int ZYZY = 0x66;
+ static const int ZYZZ = 0xA6;
+ static const int ZYZW = 0xE6;
+ static const int ZYWX = 0x36;
+ static const int ZYWY = 0x76;
+ static const int ZYWZ = 0xB6;
+ static const int ZYWW = 0xF6;
+ static const int ZZXX = 0xA;
+ static const int ZZXY = 0x4A;
+ static const int ZZXZ = 0x8A;
+ static const int ZZXW = 0xCA;
+ static const int ZZYX = 0x1A;
+ static const int ZZYY = 0x5A;
+ static const int ZZYZ = 0x9A;
+ static const int ZZYW = 0xDA;
+ static const int ZZZX = 0x2A;
+ static const int ZZZY = 0x6A;
+ static const int ZZZZ = 0xAA;
+ static const int ZZZW = 0xEA;
+ static const int ZZWX = 0x3A;
+ static const int ZZWY = 0x7A;
+ static const int ZZWZ = 0xBA;
+ static const int ZZWW = 0xFA;
+ static const int ZWXX = 0xE;
+ static const int ZWXY = 0x4E;
+ static const int ZWXZ = 0x8E;
+ static const int ZWXW = 0xCE;
+ static const int ZWYX = 0x1E;
+ static const int ZWYY = 0x5E;
+ static const int ZWYZ = 0x9E;
+ static const int ZWYW = 0xDE;
+ static const int ZWZX = 0x2E;
+ static const int ZWZY = 0x6E;
+ static const int ZWZZ = 0xAE;
+ static const int ZWZW = 0xEE;
+ static const int ZWWX = 0x3E;
+ static const int ZWWY = 0x7E;
+ static const int ZWWZ = 0xBE;
+ static const int ZWWW = 0xFE;
+ static const int WXXX = 0x3;
+ static const int WXXY = 0x43;
+ static const int WXXZ = 0x83;
+ static const int WXXW = 0xC3;
+ static const int WXYX = 0x13;
+ static const int WXYY = 0x53;
+ static const int WXYZ = 0x93;
+ static const int WXYW = 0xD3;
+ static const int WXZX = 0x23;
+ static const int WXZY = 0x63;
+ static const int WXZZ = 0xA3;
+ static const int WXZW = 0xE3;
+ static const int WXWX = 0x33;
+ static const int WXWY = 0x73;
+ static const int WXWZ = 0xB3;
+ static const int WXWW = 0xF3;
+ static const int WYXX = 0x7;
+ static const int WYXY = 0x47;
+ static const int WYXZ = 0x87;
+ static const int WYXW = 0xC7;
+ static const int WYYX = 0x17;
+ static const int WYYY = 0x57;
+ static const int WYYZ = 0x97;
+ static const int WYYW = 0xD7;
+ static const int WYZX = 0x27;
+ static const int WYZY = 0x67;
+ static const int WYZZ = 0xA7;
+ static const int WYZW = 0xE7;
+ static const int WYWX = 0x37;
+ static const int WYWY = 0x77;
+ static const int WYWZ = 0xB7;
+ static const int WYWW = 0xF7;
+ static const int WZXX = 0xB;
+ static const int WZXY = 0x4B;
+ static const int WZXZ = 0x8B;
+ static const int WZXW = 0xCB;
+ static const int WZYX = 0x1B;
+ static const int WZYY = 0x5B;
+ static const int WZYZ = 0x9B;
+ static const int WZYW = 0xDB;
+ static const int WZZX = 0x2B;
+ static const int WZZY = 0x6B;
+ static const int WZZZ = 0xAB;
+ static const int WZZW = 0xEB;
+ static const int WZWX = 0x3B;
+ static const int WZWY = 0x7B;
+ static const int WZWZ = 0xBB;
+ static const int WZWW = 0xFB;
+ static const int WWXX = 0xF;
+ static const int WWXY = 0x4F;
+ static const int WWXZ = 0x8F;
+ static const int WWXW = 0xCF;
+ static const int WWYX = 0x1F;
+ static const int WWYY = 0x5F;
+ static const int WWYZ = 0x9F;
+ static const int WWYW = 0xDF;
+ static const int WWZX = 0x2F;
+ static const int WWZY = 0x6F;
+ static const int WWZZ = 0xAF;
+ static const int WWZW = 0xEF;
+ static const int WWWX = 0x3F;
+ static const int WWWY = 0x7F;
+ static const int WWWZ = 0xBF;
+ static const int WWWW = 0xFF;
+
+ /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
+ Float32x4 shuffle(int mask);
/// Returns a new [Float32x4] with values in the X and Y lanes
/// replaced with the values in the Z and W lanes of [other].
diff --git a/sdk/lib/utf/utf.dart b/sdk/lib/utf/utf.dart
index 940ce68..43a2944 100644
--- a/sdk/lib/utf/utf.dart
+++ b/sdk/lib/utf/utf.dart
@@ -2,6 +2,10 @@
// 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.
+/**
+ * Support for encoding and decoding Unicode characters in UTF-8, UTF-16, and
+ * UTF-32.
+ */
library dart.utf;
import "dart:async";
import "dart:collection";
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index d69253a1..08ddefd 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -1,3 +1,6 @@
+/**
+ * High-fidelity audio programming in the browser.
+ */
library dart.dom.web_audio;
import 'dart:async';
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 65c742b..010c2db 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1,3 +1,6 @@
+/**
+ * 3D programming in the browser.
+ */
library dart.dom.web_gl;
import 'dart:collection';
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index a7f309b..cb4f01a 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -12,52 +12,21 @@
# invalid argument for constant constructor
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
-Language/11_Expressions/01_Constants_A16_t03: fail
-
-# final instance variable created instance of the enclosing class
-Language/11_Expressions/01_Constants_A17_t03: fail
-
-# analyzer problem: forward reference of typedef with type parameters
-Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
-
-# not clear: typedef int func2(int);
-Language/14_Types/6_Type_dynamic_A04_t01: fail
# TBF: _f is private, so does not collide
Language/07_Classes/1_Instance_Methods_A05_t08: fail
-# TBF: return without value is not a warning
-Language/12_Statements/11_Return_A07_t01: fail
-
-
# co19 issue #380, Strings class has been removed
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
-# co19 issue #382, Deprecated parts of String interface is being removed.
-LibTest/core/String/charCodes_A01_t01: fail, OK
-LibTest/core/String/charCodeAt_A02_t01: fail, OK
-LibTest/core/String/charCodeAt_A03_t01: fail, OK
-LibTest/core/String/charCodeAt_A01_t01: fail, OK
-LibTest/core/String/splitChars_A01_t01: fail, OK
-
# co19 issue #389, ceil, floor, truncate and round return integers
LibTest/core/int/operator_division_A01_t01: fail, OK
-# co19 issue #395, uses dart:io API (outdated)
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK
-
# co19 issue #397, List.addLast removed
-Language/11_Expressions/06_Lists_A06_t01: fail, OK
LibTest/core/Iterable/where_A01_t07: fail, OK
-LibTest/core/List/addLast_A01_t01: fail, OK
-LibTest/core/List/addLast_A01_t03: fail, OK
-LibTest/core/List/addLast_A02_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: fail, OK
# co19 issue #400, collection library reorg
-LibTest/core/List/List.fixedLength_A01_t01: fail, OK
-LibTest/core/List/operator_subscript_A01_t02: fail, OK
LibTest/core/String/String_class_A01_t01: fail, OK
LibTest/core/String/concat_A01_t01: fail, OK
LibTest/core/String/concat_A02_t01: fail, OK
@@ -66,51 +35,20 @@
LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
# co19 issue #403
-LibTest/core/List/List_A01_t02: fail, OK
LibTest/core/List/every_A01_t01: fail, OK
-LibTest/core/List/insertRange_A01_t01: fail, OK
-LibTest/core/List/insertRange_A02_t01: fail, OK
-LibTest/core/List/insertRange_A03_t01: fail, OK
-LibTest/core/List/insertRange_A04_t01: fail, OK
-LibTest/core/List/insertRange_A05_t01: fail, OK
-LibTest/core/List/insertRange_A06_t01: fail, OK
-LibTest/core/List/insertRange_A07_t01: fail, OK
-LibTest/core/List/insertRange_A08_t01: fail, OK
-
-# co19 issue #412, using 'null' as operand
-Language/11_Expressions/01_Constants_A11_t01: fail, OK
-Language/11_Expressions/01_Constants_A12_t01: fail, OK
-Language/11_Expressions/01_Constants_A13_t06: fail, OK
# co19 issue #414, extra @compile-error
Language/03_Overview/1_Scoping_A02_t28: fail, OK
# co19 issue #416, function name is declared the parameter scope
Language/03_Overview/1_Scoping_A02_t07: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
-
-# co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
-Language/11_Expressions/08_Throw_A05_t01: fail, OK
-Language/11_Expressions/08_Throw_A05_t02: fail, OK
-Language/11_Expressions/08_Throw_A05_t03: fail, OK
-
-# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
-Language/14_Types/4_Interface_Types_A11_t01: skip
-Language/14_Types/4_Interface_Types_A11_t02: skip
# co19 issue #424, Uninitialized finals are warnings not errors
-Language/05_Variables/05_Variables_A05_t05: fail, OK
-Language/05_Variables/05_Variables_A05_t06: fail, OK
-Language/05_Variables/05_Variables_A05_t07: fail, OK
-Language/05_Variables/05_Variables_A05_t08: fail, OK
-Language/05_Variables/05_Variables_A05_t09: fail, OK
-Language/05_Variables/05_Variables_A05_t10: fail, OK
Language/05_Variables/05_Variables_A07_t05: fail, OK
Language/05_Variables/05_Variables_A07_t06: fail, OK
Language/05_Variables/05_Variables_A07_t07: fail, OK
Language/05_Variables/05_Variables_A07_t08: fail, OK
Language/05_Variables/05_Variables_A08_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
# co19 issue #425, Only static fields can be declared as 'const'
Language/05_Variables/05_Variables_A12_t01: fail, OK
@@ -128,242 +66,24 @@
# co19 issue #431, it is OK to use 'double' argument for const constructor
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail, OK
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail, OK
# co19 issue #428, number literals with a + prefix
-Language/11_Expressions/01_Constants_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t02: fail, OK
-Language/11_Expressions/03_Numbers_A01_t03: fail, OK
-Language/11_Expressions/03_Numbers_A01_t04: fail, OK
-Language/11_Expressions/03_Numbers_A01_t08: fail, OK
-Language/11_Expressions/03_Numbers_A01_t10: fail, OK
-Language/12_Statements/02_Expression_Statements_A01_t06: fail, OK
LibTest/core/double/ceil_A01_t05: fail, OK
LibTest/core/double/floor_A01_t05: fail, OK
-# co19 issue #385, library name is not required
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: fail, OK
-
-# co19 issue #388, StringBuffer renamed add to write
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A03_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t02: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t02: fail, OK
-LibTest/core/StringBuffer/isEmpty_A01_t01: fail, OK
-LibTest/core/StringBuffer/toString_A01_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A07_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A09_t01: fail, OK
-
-#co19 issue #432, missing @static-warning annotation
-Language/14_Types/8_Parameterized_Types_A03_t03: fail, OK
-Language/14_Types/8_Parameterized_Types_A03_t05: fail, OK
-
-# co19 issue #433, missing @static-warning annotation
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail, OK
-
-# co19 issue #434, argument definition was dropped
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: fail, OK
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail, OK (this is passing for the wrong reason)
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail, OK (this is passing for the wrong reason)
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: fail, OK
-
-# co19 issue #435, AssertionError has not properties
-LibTest/core/AssertionError/column_A01_t02: fail, OK
-LibTest/core/AssertionError/failedAssertion_A01_t01: fail, OK
-LibTest/core/AssertionError/line_A01_t02: fail, OK
-LibTest/core/AssertionError/url_A01_t01: fail, OK
-
# co19 issue 459, FallThroughError is no longer const
-LibTest/core/FallThroughError/toString_A01_t01: fail, OK
LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail, OK
# co19 issue #437, annotation should be constant _variable_ or constant constructor invocation
Language/07_Classes/07_Classes_A01_t20: fail, OK
Language/07_Classes/07_Classes_A02_t34: fail, OK
Language/07_Classes/07_Classes_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A01_t17: fail, OK
-
-# co19 issue 438, Static variables are initialized lazily, need not be constants
-Language/11_Expressions/01_Constants_A16_t01: fail, OK
-Language/11_Expressions/01_Constants_A16_t02: fail, OK
-
-# co19 issue 439, it is warning, not error to import two different libraries with the same name
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: fail, OK
-
-# co19 issue #440, adj strings is not a string interpolation
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: fail, OK
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: fail, OK
-
-# co19 issue #441, assignment in constructor is not initializing
-Language/05_Variables/05_Variables_A05_t04: fail, OK
-
-# co19 issue #462, const instance creation with invalid arguments is error
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: fail, OK
# co19 issue #464, not initialized final instance variable is warning, not error
Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
# co19 issue #442, undefined name "Expect"
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t03: fail, OK
-Language/09_Generics/09_Generics_A05_t02: fail, OK
-Language/09_Generics/09_Generics_A05_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A02_t01: fail, OK
-Language/11_Expressions/06_Lists_A09_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: fail, OK
-Language/11_Expressions/18_Assignment_A02_t01: fail, OK
-Language/11_Expressions/18_Assignment_A04_t06: fail, OK
-Language/11_Expressions/18_Assignment_A06_t01: fail, OK
-Language/11_Expressions/19_Conditional_A02_t03: fail, OK
-Language/11_Expressions/19_Conditional_A02_t04: fail, OK
-Language/11_Expressions/19_Conditional_A04_t03: fail, OK
-Language/11_Expressions/27_Unary_Expressions_A02_t03: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t01: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t02: fail, OK
-Language/12_Statements/05_If_A02_t01: fail, OK
-Language/12_Statements/05_If_A02_t02: fail, OK
-Language/12_Statements/10_Try_A01_t01: fail, OK
-Language/12_Statements/11_Return_A03_t02: fail, OK
-Language/12_Statements/11_Return_A04_t01: fail, OK
-Language/12_Statements/15_Assert_A03_t03: fail, OK
-Language/12_Statements/15_Assert_A03_t09: fail, OK
-Language/12_Statements/15_Assert_A03_t08: fail, OK
-Language/12_Statements/15_Assert_A04_t02: fail, OK
-Language/14_Types/2_Dynamic_Type_System_A01_t01: fail, OK
-Language/14_Types/4_Interface_Types_A08_t03: fail, OK
-Language/14_Types/7_Type_Void_A04_t02: fail, OK
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail, OK
-LibTest/core/AssertionError/toString_A01_t01: fail, OK
-LibTest/core/Date/add_A01_t01: fail, OK
-LibTest/core/Date/add_A03_t01: fail, OK
-LibTest/core/Date/add_A02_t01: fail, OK
-LibTest/core/Date/add_A05_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t01: fail, OK
-LibTest/core/Date/compareTo_A02_t01: fail, OK
-LibTest/core/Date/compareTo_A03_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t02: fail, OK
-LibTest/core/Date/Date.fromString_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A03_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t02: fail, OK
-LibTest/core/Date/Date.now_A01_t03: fail, OK
-LibTest/core/Date/Date.utc_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t03: fail, OK
-LibTest/core/Date/Date_A01_t02: fail, OK
-LibTest/core/Date/Date_A01_t04: fail, OK
-LibTest/core/Date/day_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t02: fail, OK
-LibTest/core/Date/difference_A02_t01: fail, OK
-LibTest/core/Date/hour_A01_t01: fail, OK
-LibTest/core/Date/isUtc_A01_t01: fail, OK
-LibTest/core/Date/millisecond_A01_t01: fail, OK
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/minute_A01_t01: fail, OK
-LibTest/core/Date/month_A01_t01: fail, OK
-LibTest/core/Date/operator_equality_A01_t01: fail, OK
-LibTest/core/Date/operator_GE_A01_t01: fail, OK
-LibTest/core/Date/operator_GT_A01_t01: fail, OK
-LibTest/core/Date/operator_LE_A01_t01: fail, OK
-LibTest/core/Date/operator_LT_A01_t01: fail, OK
-LibTest/core/Date/second_A01_t01: fail, OK
-LibTest/core/Date/subtract_A01_t01: fail, OK
-LibTest/core/Date/subtract_A03_t01: fail, OK
-LibTest/core/Date/subtract_A02_t01: fail, OK
-LibTest/core/Date/subtract_A05_t01: fail, OK
-LibTest/core/Date/timeZoneName_A01_t01: fail, OK
-LibTest/core/Date/timeZoneOffset_A01_t01: fail, OK
-LibTest/core/Date/toLocal_A01_t01: fail, OK
-LibTest/core/Date/toString_A01_t01: fail, OK
-LibTest/core/Date/toString_A02_t01: fail, OK
-LibTest/core/Date/toUtc_A01_t01: fail, OK
-LibTest/core/Date/year_A01_t01: fail, OK
-LibTest/core/Date/weekday_A01_t01: fail, OK
-LibTest/core/List/getRange_A06_t01: fail, OK
-LibTest/core/List/indexOf_A06_t01: fail, OK
-LibTest/core/List/operator_subscript_A03_t01: fail, OK
-LibTest/core/List/operator_subscripted_assignment_A03_t01: fail, OK
-LibTest/core/Map/putIfAbsent_A01_t04: fail, OK
-LibTest/core/Strings/concatAll_A04_t01: fail, OK
-LibTest/core/Strings/join_A04_t01: fail, OK
-
-# co19 issue #443, Undefined class 'InvocationMirror'
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t01: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t02: fail, OK
-
-# co19 issue #444, AsyncError has been removed
-LibTest/async/Completer/complete_A02_t02: fail, OK
-LibTest/async/Completer/completeError_A01_t01: fail, OK
-LibTest/async/Completer/completeError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A01_t01: fail, OK
-LibTest/async/Future/catchError_A01_t02: fail, OK
-LibTest/async/Future/catchError_A02_t01: fail, OK
-LibTest/async/Future/catchError_A03_t01: fail, OK
-LibTest/async/Future/catchError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A03_t03: fail, OK
-LibTest/async/Future/forEach_A03_t01: fail, OK
-LibTest/async/Future/Future.delayed_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t02: fail, OK
-LibTest/async/Future/then_A03_t01: fail, OK
-LibTest/async/Future/then_A04_t01: fail, OK
-LibTest/async/Future/whenComplete_A03_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t02: fail, OK
-
-# co19 issue #445, Future.immediate was repalce with Future.value
-LibTest/async/Future/asStream_A01_t01: fail, OK
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/Future.immediate_A01_t01: fail, OK
-LibTest/async/Future/Future.immediateError_A01_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-
-# co19 issue #446, Date was replaced with DateTime
-Language/14_Types/6_Type_dynamic_A03_t01: fail, OK
-
-# co19 issue 447, In Future delayed int replaced with Duration
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/forEach_A01_t01: fail, OK
-LibTest/async/Future/forEach_A02_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-LibTest/async/Future/wait_A01_t01: fail, OK
-LibTest/async/Future/wait_A01_t04: fail, OK
-LibTest/async/Future/wait_A01_t05: fail, OK
-LibTest/async/Future/wait_A01_t06: fail, OK
-LibTest/async/Future/whenComplete_A01_t01: fail, OK
-LibTest/async/Future/whenComplete_A02_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t01: fail, OK
+Language/15_Types/4_Interface_Types_A08_t03: fail, OK
# co19 issue #448, Collection was removed
LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
@@ -374,83 +94,14 @@
LibTest/core/RegExp/allMatches_A01_t01: fail, OK
LibTest/core/Set/intersection_A01_t02: fail, OK
-# co19 issue #449, Strings was removed
-LibTest/core/Strings/concatAll_A01_t01: fail, OK
-LibTest/core/Strings/concatAll_A02_t01: fail, OK
-LibTest/core/Strings/concatAll_A03_t01: fail, OK
-LibTest/core/Strings/join_A01_t01: fail, OK
-LibTest/core/Strings/join_A02_t01: fail, OK
-LibTest/core/Strings/join_A03_t01: fail, OK
-
-# co19 issue #450, The class 'List' does not have a constructor 'fixedLength'
-LibTest/core/List/add_A02_t01: fail, OK
-LibTest/core/List/addAll_A02_t01: fail, OK
-LibTest/core/List/clear_A02_t01: fail, OK
-LibTest/core/List/length_A04_t01: fail, OK
-LibTest/core/List/removeLast_A02_t01: fail, OK
-LibTest/core/List/removeRange_A02_t01: fail, OK
-
-# co19 issue 451, Set.intersection() requires Set argument
-LibTest/core/Set/intersection_A01_t01: fail, OK
-LibTest/core/Set/intersection_A01_t03: fail, OK
-LibTest/core/Set/intersection_A03_t01: fail, OK
-
# co19 issue 452, more method in Iterable
LibTest/core/Set/Set.from_A01_t02: fail, OK
-# co19 issue #453, abstract member in concrete class
-Language/07_Classes/07_Classes_A07_t10: fail, OK
-
-# co19 issue #454, should be static warning
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: fail, OK
-
# co19 issue #455, undeclared identifier is static warning
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: fail, OK
-
-# co19 issue #456
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: fail, OK
-
-# co19 issue 457, malformed type is static warning
-Language/11_Expressions/31_Type_Test_A05_t01: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t02: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t03: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t01: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t02: fail, OK
-
-# co19 issue #465, any use of a malbounded type gives rise to a static warning.
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: fail, OK
-Language/11_Expressions/11_Instance_Creation_A03_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t02: fail, OK
-
-# co19 issue #481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: fail, OK
-
-# co19 issue 483, instance access to static member
-Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: fail, OK
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
+Language/13_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
# co19 issue #486, some override errors are now warnings
Language/07_Classes/1_Instance_Methods_A01_t01: fail, OK
@@ -472,5 +123,190 @@
Language/07_Classes/4_Abstract_Instance_Members_A04_t05: fail, OK
Language/07_Classes/4_Abstract_Instance_Members_A04_t06: fail, OK
-# co19 issue #487, Function type T may be assigned to function type T iff T <: S
-Language/14_Types/5_Function_Types_A01_t01: fail, OK
+# co19-roll r546 (11.08.2013) caused these failures
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A01_t17: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/5_Function_Types_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/EventTransformStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/whenComplete_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/contains_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/sink_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/StreamController.broadcast_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleData_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleDone_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_minus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_mult_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_plus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/FallThroughError/toString_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/asMap_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/every_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/forEach_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/lastWhere_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.filled_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.from_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/map_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 116302e..67c183c 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -12,52 +12,21 @@
# invalid argument for constant constructor
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
-Language/11_Expressions/01_Constants_A16_t03: fail
-
-# final instance variable created instance of the enclosing class
-Language/11_Expressions/01_Constants_A17_t03: fail
-
-# analyzer problem: forward reference of typedef with type parameters
-Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
-
-# not clear: typedef int func2(int);
-Language/14_Types/6_Type_dynamic_A04_t01: fail
# TBF: _f is private, so does not collide
Language/07_Classes/1_Instance_Methods_A05_t08: fail
-# TBF: return without value is not a warning
-Language/12_Statements/11_Return_A07_t01: fail
-
-
# co19 issue #380, Strings class has been removed
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
-# co19 issue #382, Deprecated parts of String interface is being removed.
-LibTest/core/String/charCodes_A01_t01: fail, OK
-LibTest/core/String/charCodeAt_A02_t01: fail, OK
-LibTest/core/String/charCodeAt_A03_t01: fail, OK
-LibTest/core/String/charCodeAt_A01_t01: fail, OK
-LibTest/core/String/splitChars_A01_t01: fail, OK
-
# co19 issue #389, ceil, floor, truncate and round return integers
-LibTest/core/int/operator_division_A01_t01: fail
-
-# co19 issue #395, uses dart:io API (outdated)
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK
+LibTest/core/int/operator_division_A01_t01: fail, OK
# co19 issue #397, List.addLast removed
-Language/11_Expressions/06_Lists_A06_t01: fail, OK
LibTest/core/Iterable/where_A01_t07: fail, OK
-LibTest/core/List/addLast_A01_t01: fail, OK
-LibTest/core/List/addLast_A01_t03: fail, OK
-LibTest/core/List/addLast_A02_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: fail, OK
# co19 issue #400, collection library reorg
-LibTest/core/List/List.fixedLength_A01_t01: fail, OK
-LibTest/core/List/operator_subscript_A01_t02: fail, OK
LibTest/core/String/String_class_A01_t01: fail, OK
LibTest/core/String/concat_A01_t01: fail, OK
LibTest/core/String/concat_A02_t01: fail, OK
@@ -66,51 +35,24 @@
LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
# co19 issue #403
-LibTest/core/List/List_A01_t02: fail, OK
LibTest/core/List/every_A01_t01: fail, OK
-LibTest/core/List/insertRange_A01_t01: fail, OK
-LibTest/core/List/insertRange_A02_t01: fail, OK
-LibTest/core/List/insertRange_A03_t01: fail, OK
-LibTest/core/List/insertRange_A04_t01: fail, OK
-LibTest/core/List/insertRange_A05_t01: fail, OK
-LibTest/core/List/insertRange_A06_t01: fail, OK
-LibTest/core/List/insertRange_A07_t01: fail, OK
-LibTest/core/List/insertRange_A08_t01: fail, OK
-
-# co19 issue #412, using 'null' as operand
-Language/11_Expressions/01_Constants_A11_t01: fail, OK
-Language/11_Expressions/01_Constants_A12_t01: fail, OK
-Language/11_Expressions/01_Constants_A13_t06: fail, OK
# co19 issue #414, extra @compile-error
Language/03_Overview/1_Scoping_A02_t28: fail, OK
# co19 issue #416, function name is declared the parameter scope
Language/03_Overview/1_Scoping_A02_t07: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
-
-# co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
-Language/11_Expressions/08_Throw_A05_t01: fail, OK
-Language/11_Expressions/08_Throw_A05_t02: fail, OK
-Language/11_Expressions/08_Throw_A05_t03: fail, OK
# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
-Language/14_Types/4_Interface_Types_A11_t01: skip
-Language/14_Types/4_Interface_Types_A11_t02: skip
+Language/15_Types/4_Interface_Types_A11_t01: Skip
+Language/15_Types/4_Interface_Types_A11_t02: Skip
# co19 issue #424, Uninitialized finals are warnings not errors
-Language/05_Variables/05_Variables_A05_t05: fail, OK
-Language/05_Variables/05_Variables_A05_t06: fail, OK
-Language/05_Variables/05_Variables_A05_t07: fail, OK
-Language/05_Variables/05_Variables_A05_t08: fail, OK
-Language/05_Variables/05_Variables_A05_t09: fail, OK
-Language/05_Variables/05_Variables_A05_t10: fail, OK
Language/05_Variables/05_Variables_A07_t05: fail, OK
Language/05_Variables/05_Variables_A07_t06: fail, OK
Language/05_Variables/05_Variables_A07_t07: fail, OK
Language/05_Variables/05_Variables_A07_t08: fail, OK
Language/05_Variables/05_Variables_A08_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
# co19 issue #425, Only static fields can be declared as 'const'
Language/05_Variables/05_Variables_A12_t01: fail, OK
@@ -128,243 +70,26 @@
# co19 issue #431, it is OK to use 'double' argument for const constructor
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail, OK
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail, OK
# co19 issue #428, number literals with a + prefix
-Language/11_Expressions/01_Constants_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t02: fail, OK
-Language/11_Expressions/03_Numbers_A01_t03: fail, OK
-Language/11_Expressions/03_Numbers_A01_t04: fail, OK
-Language/11_Expressions/03_Numbers_A01_t08: fail, OK
-Language/11_Expressions/03_Numbers_A01_t10: fail, OK
-Language/12_Statements/02_Expression_Statements_A01_t06: fail, OK
LibTest/core/double/ceil_A01_t05: fail, OK
LibTest/core/double/floor_A01_t05: fail, OK
-# co19 issue #385, library name is not required
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: fail, OK
-
-# co19 issue #388, StringBuffer renamed add to write
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A03_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t02: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t02: fail, OK
-LibTest/core/StringBuffer/isEmpty_A01_t01: fail, OK
-LibTest/core/StringBuffer/toString_A01_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A07_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A09_t01: fail, OK
-
-#co19 issue #432, missing @static-warning annotation
-Language/14_Types/8_Parameterized_Types_A03_t03: fail,OK
-Language/14_Types/8_Parameterized_Types_A03_t05: fail,OK
-
-# co19 issue #433, missing @static-warning annotation
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail, OK
-
# co19 issue #434, argument definition was dropped
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: fail, OK
#Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail, OK (this is passing for the wrong reason)
#Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail, OK (this is passing for the wrong reason)
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: fail, OK
-
-# co19 issue #435, AssertionError has not properties
-LibTest/core/AssertionError/column_A01_t02: fail, OK
-LibTest/core/AssertionError/failedAssertion_A01_t01: fail, OK
-LibTest/core/AssertionError/line_A01_t02: fail, OK
-LibTest/core/AssertionError/url_A01_t01: fail, OK
# co19 issue 459, FallThroughError is no longer const
-LibTest/core/FallThroughError/toString_A01_t01: Fail
-LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail
+LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail, OK
# co19 issue #437, annotation should be constant _variable_ or constant constructor invocation
Language/07_Classes/07_Classes_A01_t20: fail, OK
Language/07_Classes/07_Classes_A02_t34: fail, OK
Language/07_Classes/07_Classes_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A01_t17: fail, OK
-
-# co19 issue 438, Static variables are initialized lazily, need not be constants
-Language/11_Expressions/01_Constants_A16_t01: fail, OK
-Language/11_Expressions/01_Constants_A16_t02: fail, OK
-
-# co19 issue 439, it is warning, not error to import two different libraries with the same name
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: fail, OK
-
-# co19 issue #440, adj strings is not a string interpolation
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: fail, OK
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: fail, OK
-
-# co19 issue #441, assignment in constructor is not initializing
-Language/05_Variables/05_Variables_A05_t04: fail, OK
-
-# co19 issue #462, const instance creation with invalid arguments is error
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: fail, OK
# co19 issue #464, not initialized final instance variable is warning, not error
Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
-# co19 issue #442, undefined name "Expect"
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t03: fail, OK
-Language/09_Generics/09_Generics_A05_t02: fail, OK
-Language/09_Generics/09_Generics_A05_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A02_t01: fail, OK
-Language/11_Expressions/06_Lists_A09_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: fail, OK
-Language/11_Expressions/18_Assignment_A02_t01: fail, OK
-Language/11_Expressions/18_Assignment_A04_t06: fail, OK
-Language/11_Expressions/18_Assignment_A06_t01: fail, OK
-Language/11_Expressions/19_Conditional_A02_t03: fail, OK
-Language/11_Expressions/19_Conditional_A02_t04: fail, OK
-Language/11_Expressions/19_Conditional_A04_t03: fail, OK
-Language/11_Expressions/27_Unary_Expressions_A02_t03: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t01: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t02: fail, OK
-Language/12_Statements/05_If_A02_t01: fail, OK
-Language/12_Statements/05_If_A02_t02: fail, OK
-Language/12_Statements/10_Try_A01_t01: fail, OK
-Language/12_Statements/11_Return_A03_t02: fail, OK
-Language/12_Statements/11_Return_A04_t01: fail, OK
-Language/12_Statements/15_Assert_A03_t03: fail, OK
-Language/12_Statements/15_Assert_A03_t09: fail, OK
-Language/12_Statements/15_Assert_A03_t08: fail, OK
-Language/12_Statements/15_Assert_A04_t02: fail, OK
-Language/14_Types/2_Dynamic_Type_System_A01_t01: fail, OK
-Language/14_Types/4_Interface_Types_A08_t03: fail, OK
-Language/14_Types/7_Type_Void_A04_t02: fail, OK
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail, OK
-LibTest/core/AssertionError/toString_A01_t01: fail, OK
-LibTest/core/Date/add_A01_t01: fail, OK
-LibTest/core/Date/add_A03_t01: fail, OK
-LibTest/core/Date/add_A02_t01: fail, OK
-LibTest/core/Date/add_A05_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t01: fail, OK
-LibTest/core/Date/compareTo_A02_t01: fail, OK
-LibTest/core/Date/compareTo_A03_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t02: fail, OK
-LibTest/core/Date/Date.fromString_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A03_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t02: fail, OK
-LibTest/core/Date/Date.now_A01_t03: fail, OK
-LibTest/core/Date/Date.utc_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t03: fail, OK
-LibTest/core/Date/Date_A01_t02: fail, OK
-LibTest/core/Date/Date_A01_t04: fail, OK
-LibTest/core/Date/day_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t02: fail, OK
-LibTest/core/Date/difference_A02_t01: fail, OK
-LibTest/core/Date/hour_A01_t01: fail, OK
-LibTest/core/Date/isUtc_A01_t01: fail, OK
-LibTest/core/Date/millisecond_A01_t01: fail, OK
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/minute_A01_t01: fail, OK
-LibTest/core/Date/month_A01_t01: fail, OK
-LibTest/core/Date/operator_equality_A01_t01: fail, OK
-LibTest/core/Date/operator_GE_A01_t01: fail, OK
-LibTest/core/Date/operator_GT_A01_t01: fail, OK
-LibTest/core/Date/operator_LE_A01_t01: fail, OK
-LibTest/core/Date/operator_LT_A01_t01: fail, OK
-LibTest/core/Date/second_A01_t01: fail, OK
-LibTest/core/Date/subtract_A01_t01: fail, OK
-LibTest/core/Date/subtract_A03_t01: fail, OK
-LibTest/core/Date/subtract_A02_t01: fail, OK
-LibTest/core/Date/subtract_A05_t01: fail, OK
-LibTest/core/Date/timeZoneName_A01_t01: fail, OK
-LibTest/core/Date/timeZoneOffset_A01_t01: fail, OK
-LibTest/core/Date/toLocal_A01_t01: fail, OK
-LibTest/core/Date/toString_A01_t01: fail, OK
-LibTest/core/Date/toString_A02_t01: fail, OK
-LibTest/core/Date/toUtc_A01_t01: fail, OK
-LibTest/core/Date/year_A01_t01: fail, OK
-LibTest/core/Date/weekday_A01_t01: fail, OK
-LibTest/core/List/getRange_A06_t01: fail, OK
-LibTest/core/List/indexOf_A06_t01: fail, OK
-LibTest/core/List/operator_subscript_A03_t01: fail, OK
-LibTest/core/List/operator_subscripted_assignment_A03_t01: fail, OK
-LibTest/core/Map/putIfAbsent_A01_t04: fail, OK
-LibTest/core/Strings/concatAll_A04_t01: fail, OK
-LibTest/core/Strings/join_A04_t01: fail, OK
-
-# co19 issue #443, Undefined class 'InvocationMirror'
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t01: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t02: fail, OK
-
-# co19 issue #444, AsyncError has been removed
-LibTest/async/Completer/complete_A02_t02: fail, OK
-LibTest/async/Completer/completeError_A01_t01: fail, OK
-LibTest/async/Completer/completeError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A01_t01: fail, OK
-LibTest/async/Future/catchError_A01_t02: fail, OK
-LibTest/async/Future/catchError_A02_t01: fail, OK
-LibTest/async/Future/catchError_A03_t01: fail, OK
-LibTest/async/Future/catchError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A03_t03: fail, OK
-LibTest/async/Future/forEach_A03_t01: fail, OK
-LibTest/async/Future/Future.delayed_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t02: fail, OK
-LibTest/async/Future/then_A03_t01: fail, OK
-LibTest/async/Future/then_A04_t01: fail, OK
-LibTest/async/Future/whenComplete_A03_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t02: fail, OK
-
-# co19 issue #445, Future.immediate was repalce with Future.value
-LibTest/async/Future/asStream_A01_t01: fail, OK
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/Future.immediate_A01_t01: fail, OK
-LibTest/async/Future/Future.immediateError_A01_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-
-# co19 issue #446, Date was replaced with DateTime
-Language/14_Types/6_Type_dynamic_A03_t01: fail, OK
-
-# co19 issue 447, In Future delayed int replaced with Duration
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/forEach_A01_t01: fail, OK
-LibTest/async/Future/forEach_A02_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-LibTest/async/Future/wait_A01_t01: fail, OK
-LibTest/async/Future/wait_A01_t04: fail, OK
-LibTest/async/Future/wait_A01_t05: fail, OK
-LibTest/async/Future/wait_A01_t06: fail, OK
-LibTest/async/Future/whenComplete_A01_t01: fail, OK
-LibTest/async/Future/whenComplete_A02_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t01: fail, OK
-
# co19 issue #448, Collection was removed
LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
LibTest/collection/Queue/Queue.from_A01_t02: fail, OK
@@ -374,81 +99,189 @@
LibTest/core/RegExp/allMatches_A01_t01: fail, OK
LibTest/core/Set/intersection_A01_t02: fail, OK
-# co19 issue #449, Strings was removed
-LibTest/core/Strings/concatAll_A01_t01: fail, OK
-LibTest/core/Strings/concatAll_A02_t01: fail, OK
-LibTest/core/Strings/concatAll_A03_t01: fail, OK
-LibTest/core/Strings/join_A01_t01: fail, OK
-LibTest/core/Strings/join_A02_t01: fail, OK
-LibTest/core/Strings/join_A03_t01: fail, OK
-
-# co19 issue #450, The class 'List' does not have a constructor 'fixedLength'
-LibTest/core/List/add_A02_t01: fail, OK
-LibTest/core/List/addAll_A02_t01: fail, OK
-LibTest/core/List/clear_A02_t01: fail, OK
-LibTest/core/List/length_A04_t01: fail, OK
-LibTest/core/List/removeLast_A02_t01: fail, OK
-LibTest/core/List/removeRange_A02_t01: fail, OK
-
-# co19 issue 451, Set.intersection() requires Set argument
-LibTest/core/Set/intersection_A01_t01: fail, OK
-LibTest/core/Set/intersection_A01_t03: fail, OK
-LibTest/core/Set/intersection_A03_t01: fail, OK
-
# co19 issue 452, more method in Iterable
LibTest/core/Set/Set.from_A01_t02: fail, OK
-# co19 issue #453, abstract member in concrete class
-Language/07_Classes/07_Classes_A07_t10: fail, OK
-
-# co19 issue #454, should be static warning
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: fail, OK
-
-# co19 issue #455, undeclared identifier is static warning
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
-
-# co19 issue #456
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: fail, OK
-
-# co19 issue 457, malformed type is static warning
-Language/11_Expressions/31_Type_Test_A05_t01: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t02: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t03: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t01: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t02: fail, OK
-
-# co19 issue #465, any use of a malbounded type gives rise to a static warning.
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: fail, OK
-Language/11_Expressions/11_Instance_Creation_A03_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t02: fail, OK
-
-# co19 issue #481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: fail, OK
+# co19-roll r546 (11.08.2013) caused these failures
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A01_t17: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/EventTransformStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/whenComplete_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/contains_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/sink_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/StreamController.broadcast_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleData_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleDone_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_minus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_mult_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_plus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/FallThroughError/toString_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/asMap_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/every_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/forEach_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/lastWhere_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.filled_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.from_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/map_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 2e5df38..13a1129 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -4,96 +4,24 @@
[ $compiler == dart2dart ]
-Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
-
LibTest/math/max_A01_t03: Fail # co19 issue 467
LibTest/math/min_A01_t03: Fail # co19 issue 467
# The following tests fail because they contain number literals with a + prefix (co19 issue 428)
LibTest/core/double/floor_A01_t05: Fail # issue 428
LibTest/core/double/ceil_A01_t05: Fail # issue 428
-Language/12_Statements/02_Expression_Statements_A01_t06: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t10: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t08: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t04: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t03: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t02: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t01: Fail # co19 issue 428
-Language/11_Expressions/01_Constants_A01_t01: Fail # co19 issue 428
Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(dart2dart-team): Please triage this failure.
Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Expressions/01_Constants_A18_t06: Fail # # co19 issue 468
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 478
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # Issue 7025
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/09_Switch_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail # co19 issue 470
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 392
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 392
-
Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # http://dartbug.com/7202
-
-Language/12_Statements/02_Expression_Statements_A01_t08: Fail # co 19 issue 370
Language/03_Overview/2_Privacy_A01_t19: Fail # Calling unresolved class constructor.
Language/03_Overview/2_Privacy_A01_t20: Fail # Calling unresolved class constructor.
Language/07_Classes/6_Constructors_A03_t03: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t04: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t05: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # Calling unresolved class constructor.
Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/5519
Language/03_Overview/1_Scoping_A01_t40: Fail # http://dartbug.com/5519
@@ -108,13 +36,6 @@
Language/05_Variables/05_Variables_A01_t13: Fail # http://dartbug.com/5519
Language/05_Variables/05_Variables_A01_t14: Fail # http://dartbug.com/5519
Language/05_Variables/05_Variables_A01_t15: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A05_t04: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t05: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t06: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t07: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t08: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t09: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t10: Fail # Inherited from dart2js
Language/05_Variables/05_Variables_A07_t05: Fail # Inherited from dart2js
Language/05_Variables/05_Variables_A07_t06: Fail # Inherited from dart2js
Language/05_Variables/05_Variables_A07_t07: Fail # Inherited from dart2js
@@ -179,141 +100,6 @@
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # inherited from VM
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # inherited from VM
Language/07_Classes/6_Constructors_A02_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t05: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A05_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A05_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A05_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A08_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A09_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A10_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A10_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A12_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A12_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t05: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A14_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A15_t06: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t07: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t08: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t09: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t10: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t11: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t12: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t13: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t14: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t15: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t16: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t17: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t18: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t20: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t21: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t31: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A16_t01: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # inherited from VM
-Language/11_Expressions/01_Constants_A16_t02: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A16_t03: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A17_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A17_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A17_t03: Crash # inherited from VM
-Language/11_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A19_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A19_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A20_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A20_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
-Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/11_Expressions/05_Strings_A02_t46: Fail # inherited from VM
-Language/11_Expressions/05_Strings_A02_t48: Fail # inherited from VM
-Language/11_Expressions/05_Strings_A20_t01: Fail # inherited from VM
-Language/11_Expressions/06_Lists_A03_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/06_Lists_A03_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
-Language/11_Expressions/07_Maps_A02_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/07_Maps_A02_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A03_t01: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A03_t02: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A04_t01: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A06_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # inherited from VM
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # inherited from VM
-Language/11_Expressions/18_Assignment_A05_t04: Fail, Pass, OK # Fails in minified, depends on method names.
-Language/11_Expressions/22_Equality_A01_t01: Fail # inherited from VM
-Language/11_Expressions/22_Equality_A01_t15: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t16: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t19: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t20: Fail, OK # co19 issue 241
-Language/11_Expressions/22_Equality_A05_t01: Fail # inherited from VM
-Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # http://dartbug.com/5519
-Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # inherited from VM
-Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
-Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # Inhertited from VM.
-Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # http://dartbug.com/5519
-Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # Inherited from dart2js
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # Inherited from dart2js
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # Inherited from dart2js
-Language/12_Statements/06_For_A01_t11: Fail # Inherited from dart2js
-Language/12_Statements/09_Switch_A01_t02: Fail # Inherited from VM (switch case with several labels).
-Language/12_Statements/09_Switch_A06_t02: Fail # Inherited from VM (does not throw NSME).
-Language/12_Statements/10_Try_A06_t01: Fail, Pass # Passes in conservative renaming mode. Test depends on function names.
-Language/12_Statements/10_Try_A07_t03: Fail # Test depends on out file name.
-Language/12_Statements/11_Return_A05_t01: Fail # Inherited from dart2js
-Language/12_Statements/11_Return_A05_t02: Fail # Inherited from dart2js
-Language/12_Statements/11_Return_A05_t03: Fail # Inherited from dart2js
-Language/12_Statements/12_Labels_A01_t03: Fail # Inherited from VM (Multiple labels fail).
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5519
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5519
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # Inherited from dart2js
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # Inherited from dart2js
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # Inherited from dart2js
-Language/14_Types/5_Function_Types_A06_t01: Fail # Inherited from dart2js
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # inherited from dart2js
-Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # inherited from dart2js
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # Inherited from dart2js
-LibTest/core/Date/Date.fromString_A03_t01: Pass, OK # Issue co19 - 121 (currently passing due to co19 issues 373 and 374)
-LibTest/core/Date/toString_A02_t01: Fail, OK # inherited from VM
-LibTest/core/Date/year_A01_t01: Fail, OK # inherited from VM
LibTest/core/Match/operator_subscript_A01_t01: Fail # inherited from VM
LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
LibTest/core/Match/pattern_A01_t01: Fail, OK # Issue 400
@@ -337,7 +123,6 @@
LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail # Inherited from VM.
LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail, OK # Problems with the test: encoded file name
LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail, OK # Problems with the test: encoded file name
LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail, OK # Problems with the test: encoded file name
@@ -350,43 +135,11 @@
LibTest/math/sin_A01_t01: Fail # Inherited from VM.
LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
-LibTest/core/StringBuffer/isEmpty_A01_t01: Fail, OK # co19 issue 355
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # co19 issue 463
-
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # co19 issue 466
-
-[ $compiler == dart2dart && $minified ]
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 396
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 396
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 396
-
[ $compiler == dart2dart && $system == windows ]
LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -401,96 +154,6 @@
[ $compiler == dart2dart ]
Language/03_Overview/2_Privacy_A01_t06: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # co19 issue 463
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # co19 issue 463
-Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
-Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
-
-LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379
-
-Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: pass
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A03_t01: pass
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
@@ -501,68 +164,10 @@
LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
-LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
-
LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
-
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Issue 397
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-LibTest/core/List/addLast_A01_t01: Fail # Issue 397
-LibTest/core/List/addLast_A01_t03: Fail # Issue 397
-LibTest/core/List/addLast_A02_t01: Fail # Issue 397
-LibTest/core/List/List.fixedLength_A01_t01: Fail # Issue 400
-LibTest/core/List/addAll_A02_t01: Fail # Issue 400
-LibTest/core/List/add_A02_t01: Fail # Issue 400
-LibTest/core/List/clear_A02_t01: Fail # Issue 400
-LibTest/core/List/insertRange_A02_t01: Fail # Issue 400
-LibTest/core/List/length_A04_t01: Fail # Issue 400
-LibTest/core/List/removeLast_A02_t01: Fail # Issue 400
-LibTest/core/List/removeRange_A02_t01: Fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t01: Fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t02: Fail # Issue 400
@@ -573,17 +178,240 @@
Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Override rules have been relaxed. Issue
Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Override rules have been relaxed. Issue
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # 481
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2dart ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A10_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A10_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A14_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t14: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t17: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t18: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t20: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t21: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t31: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t19: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t20: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/27_Unary_Expressions_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t48: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t68: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
+Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: timeout # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: timeout # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+[ $compiler == dart2dart && $minified ]
+Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 335f686..1cbc686 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -22,13 +22,6 @@
Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t07: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t08: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t09: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t10: Fail # TODO(ahe): Please triage this failure.
Language/05_Variables/05_Variables_A07_t05: Fail # TODO(ahe): Please triage this failure.
Language/05_Variables/05_Variables_A07_t06: Fail # TODO(ahe): Please triage this failure.
Language/05_Variables/05_Variables_A07_t07: Fail # TODO(ahe): Please triage this failure.
@@ -40,97 +33,11 @@
Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(ahe): Please triage this failure.
Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # TODO(ahe): Please triage this failure.
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A18_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/08_Throw_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/08_Throw_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A11_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # Issue 7025
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/02_Expression_Statements_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/09_Switch_A06_t02: Fail # co19 issue 413
-Language/12_Statements/10_Try_A06_t01: Fail # Issue 11850: dart2js inlining results in stack traces not as accurate
-Language/12_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # TODO(ahe): Please triage this failure.
-Language/14_Types/5_Function_Types_A01_t10: Pass # co19 issue 392, issue 9058
-Language/14_Types/5_Function_Types_A02_t06: Pass # co19 issue 392, issue 9058
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
LibTest/core/List/List_A03_t01: Fail # TODO(kasperl): Please triage this failure.
LibTest/core/double/INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
LibTest/core/double/NEGATIVE_INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477.
LibTest/math/pow_A01_t01: Fail # TODO(ahe): Please triage this failure.
LibTest/math/pow_A11_t01: Fail # TODO(ahe): Please triage this failure.
@@ -139,7 +46,6 @@
[ $compiler == dart2js && $runtime == jsshell ]
-Language/11_Expressions/12_Spawning_an_Isolate_A01_t01: Fail, Pass # TODO(ahe): Please triage this failure.
LibTest/isolate/SendPort/send_A02_t05: Fail, Pass # TODO(ahe): Please triage this failure.
LibTest/isolate/SendPort/send_A02_t06: Fail, Pass # TODO(ahe): Please triage this failure.
LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail, Pass # TODO(ahe): Please triage this failure.
@@ -157,28 +63,16 @@
[ $compiler == dart2js ]
-Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
-Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
LibTest/isolate/ReceivePort/receive_A01_t02: Fail # Issue 6750
-LibTest/core/StringBuffer/isEmpty_A01_t01: Fail, OK # co19 issue 355
-
Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Partially implemented rediriecting constructors makes this fail.
[ $compiler == dart2js && $runtime == ie9 ]
-Language/11_Expressions/03_Numbers_A01_t06: Fail # Issue: 8920
-Language/11_Expressions/03_Numbers_A01_t09: Fail # Issue: 8920
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # Issue: 8920
-LibTest/core/Date/Date_A01_t03: Fail # Issue: 8920
-LibTest/core/Date/Date.fromString_A03_t01: Fail # Issue: 8920
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Issue: 8920
-LibTest/core/Date/year_A01_t01: Fail # Issue: 8920
LibTest/core/double/round_A01_t01: Fail # Issue: 8920
LibTest/core/double/toRadixString_A01_t01: Fail # Issue: 8920
LibTest/core/double/toStringAsExponential_A01_t04: Fail # Issue: 8920
LibTest/core/double/toStringAsPrecision_A01_t04: Fail # Issue: 8920
-LibTest/core/Expect/identical_A01_t01: Fail # Issue: 8920
LibTest/core/int/compareTo_A01_t01: Fail # Issue: 8920
LibTest/core/int/operator_left_shift_A01_t01: Fail # Issue: 8920
LibTest/core/int/operator_remainder_A01_t03: Fail # Issue: 8920
@@ -204,8 +98,6 @@
[ $compiler == dart2js && $runtime == jsshell ]
LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # TODO(ngeoaffray): Please triage these failure.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # TODO(ngeoaffray): Please triage these failure.
LibTest/core/double/round_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
LibTest/core/int/operator_truncating_division_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # TODO(ngeoaffray): Please triage these failure.
@@ -213,49 +105,9 @@
LibTest/math/acos_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
LibTest/math/asin_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
-[ $compiler == dart2js && $minified ]
-# These tests assume that the invocation mirror gets the original name of the
-# method, but that information is not present when minifying. They could be
-# fixed by using the invocation mirror to invoke a method on a different object
-# and checking that the correct method is invoked.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK
-
-[ $compiler == dart2js && ($minified || $runtime == ie9) ]
-Language/12_Statements/10_Try_A06_t01: Fail # BUG(11480): Triage.
-
[ $compiler == dart2js && $checked ]
Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t03: Fail # TODO(ahe): Please triage this failure.
Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/03_Numbers_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/06_Lists_A09_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/06_Lists_A09_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/07_Maps_A10_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/07_Maps_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A07_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/column_A01_t02: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/url_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 480
LibTest/core/TypeError/column_A01_t01: Fail # TODO(ahe): Please triage this failure.
LibTest/core/TypeError/dstName_A01_t01: Fail # TODO(ahe): Please triage this failure.
LibTest/core/TypeError/dstType_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -264,15 +116,6 @@
LibTest/core/TypeError/srcType_A01_t01: Fail # TODO(ahe): Please triage this failure.
LibTest/core/TypeError/url_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # http://dartbug.com/3970
-
-
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 405
-
[ $compiler == dart2js ]
LibTest/core/int/operator_GT_A01_t01: Fail, OK # co19 issue 200
@@ -304,14 +147,10 @@
Language/06_Functions/2_Formal_Parameters_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/11_Expressions/01_Constants_A03_t01: Fail # Compile-time error: error: not a compile-time constant
-Language/11_Expressions/01_Constants_A11_t01: Fail # Compile-time error: error: not a compile-time constant
LibTest/isolate/SendPort/send_A02_t01: Fail # Compile-time error: error: not a compile-time constant
LibTest/isolate/SendPort/send_A02_t02: Fail # Compile-time error: error: not a compile-time constant
LibTest/isolate/SendPort/send_A02_t03: Fail # Compile-time error: error: not a compile-time constant
-Language/11_Expressions/01_Constants_A18_t03: Fail # Compile-time error: unexpected token 'equals'
-Language/11_Expressions/05_Strings_A20_t01: Fail # Runtime error: Expect.identical(expected: <abyr, abyr
LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail # Runtime error: Expect.throws() fails
LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
@@ -327,7 +166,6 @@
LibTest/core/int/operator_OR_A01_t01: Fail, OK # Requires bigints.
LibTest/core/int/operator_remainder_A01_t01: Fail, OK # Requires bigints.
-LibTest/core/Date/toString_A02_t01: Fail # Argument error. Year 999999 is out of range. Needs to be specified (and then potentially reported to co19): issue 1878.
LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 212
@@ -340,34 +178,15 @@
# can understand so he can file a bug later.
#
[ $compiler == dart2js ]
-LibTest/core/List/List.fixedLength_A01_t01: fail # Issue 400
-LibTest/core/List/addAll_A02_t01: fail # Issue 400
-LibTest/core/List/add_A02_t01: fail # Issue 400
-LibTest/core/List/clear_A02_t01: fail # Issue 400
-LibTest/core/List/insertRange_A02_t01: fail # Issue 400
-LibTest/core/List/length_A04_t01: fail # Issue 400
-LibTest/core/List/removeLast_A02_t01: fail # Issue 400
-LibTest/core/List/removeRange_A02_t01: fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
-
-Language/11_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
-
Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail, OK # co19 issue 210
Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
Language/03_Overview/1_Scoping_A01_t40: Fail, OK # co19 issue 188
Language/03_Overview/1_Scoping_A01_t41: Fail, OK # co19 issue 188
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
-
Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # http://dartbug.com/5021
Language/03_Overview/2_Privacy_A01_t09: Fail, OK # co19 issue 198
@@ -375,87 +194,6 @@
LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 308
Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Pass, OK # co19 issue 316
-
-LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379.
-
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: pass
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A03_t01: pass
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-Language/12_Statements/10_Try_A03_t01: Fail # co19 issue 381
-Language/12_Statements/10_Try_A03_t02: Fail # co19 issue 381
-Language/12_Statements/10_Try_A03_t03: Fail # co19 issue 381
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
@@ -466,76 +204,15 @@
LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Issue 397
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-LibTest/core/List/addLast_A01_t01: Fail # Issue 397
-LibTest/core/List/addLast_A01_t03: Fail # Issue 397
-LibTest/core/List/addLast_A02_t01: Fail # Issue 397
-
-LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
-LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
LibTest/core/double/parse_A02_t01: Fail # Issue 418
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
-
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 410
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 410
-
LibTest/core/Match/pattern_A01_t01: Fail # co19 Issue 400, 422
LibTest/core/RegExp/allMatches_A01_t01: Fail # co19 Issue 400, 422
-Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
@@ -543,81 +220,9 @@
LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
-Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # co19 issue 463
-
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # co19 issue 466
-
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # 481
-
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # co19 issue 481
-
-[ $compiler == dart2js && $checked ]
-
-Language/03_Overview/1_Scoping_A02_t30: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t04: Fail # co19 issue 463
-Language/14_Types/8_Parameterized_Types_A02_t01: Fail # co19 issue 463
-
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # 481
-
-[ $compiler == dart2js && $unchecked ]
-LibTest/core/List/setRange_A05_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-# Issues with co19 test suite in checked mode.
-[ $compiler == dart2js && $checked ]
-Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail, OK # test should be marked type-error
-LibTest/core/Set/intersection_A01_t01: Fail # issue 390
-LibTest/core/Set/intersection_A01_t02: Fail # issue 390
-LibTest/core/Set/intersection_A01_t03: Fail # issue 390
-LibTest/core/List/every_A01_t01: fail # Issue 400
-
-
-# Issues with co19 test suite in browsers.
-[ $compiler == dart2js && $browser ]
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK # co19 issue 395
-
-# Issues with co19 test suite in minified mode.
-[ $compiler == dart2js && $minified ]
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 396
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 396
-
-
[ $compiler == dart2js && $jscl ]
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail, Pass # issue 3333
-
-Language/11_Expressions/03_Numbers_A01_t06: Fail, OK # Requires bigint.
-Language/11_Expressions/03_Numbers_A01_t09: Fail, OK # Requires bigint.
-LibTest/core/Date/Date_A01_t03: Fail, OK # co19 issue 180
-LibTest/core/Date/year_A01_t01: Fail, OK # Requires big int.
LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail, OK # This is not rejected by V8.
LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 92.
LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # Bad test, use Match.regexp, not Match.pattern.
@@ -652,39 +257,15 @@
Language/03_Overview/1_Scoping_A02_t07: Fail # duplicate definition of f(var f){f();}
Language/03_Overview/2_Privacy_A01_t06: Fail # cannot resolve type _inaccessibleFuncType
-Language/11_Expressions/01_Constants_A12_t01: Fail # internal error: CompileTimeConstantEvaluator not implemented
-Language/11_Expressions/22_Equality_A05_t01: Fail # != cannot be called on super
-Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
-
-Language/12_Statements/06_For_A01_t11: Fail # http://dartbug.com/9824
-
-
-# BUG(11331): Renamed Date to DateTime (issue 373, 374) but this only has an
-# impact on V8, because of the way method calls are evaluated. Needs more
-# investigation.
-[ $compiler == dart2js && $runtime == d8 ]
-Language/14_Types/6_Type_dynamic_A03_t01: Fail
-
-
[ $compiler == dart2js && $jscl ]
-LibTest/core/Date/Date.fromString_A03_t01: Pass # Issue co19 - 121 (currently passing due to co19 issues 373 and 374)
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Expect.fail('Some exception expected')
LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Expect.fail('Some exception expected')
LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Expect.fail('Some exception expected')
-
-#
-# The following tests may be broken, but require further review.
-#
-[ $compiler == dart2js && $jscl ]
-LibTest/core/Expect/identical_A01_t01: Fail # TODO(floitsch): Is NaN identical to NaN?
-
-
[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == opera) ]
*: Skip
-
#
# Missing compile-time errors.
#
@@ -720,21 +301,7 @@
Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Checks that a compile-time error is produced when the overriding abstract method has fewer named parameters than the instance method being overridden (2 vs 3) and neither have any required parameters.
Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Checks that a compile-time error is produced when the overriding non-abstract instance method has the same set of named parameters as the abstract method being overriden, but in a different order.
Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Checks that a compile-time error is produced when the overriding non-abstract instance method has almost the same set of named parameters as the abstract method being overriden, except for one that has a different name.
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Fail # Checks that error is produced if a final variable is not initialized in one of the specified ways.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # Checks that a compile-time error is produced when a class with constant constructor also declares a non-final instance variable.
Language/07_Classes/6_Constructors_A02_t01: Fail # Checks that a compile-error is produced when a named constructor definition does not begin with the name of its class.
-Language/11_Expressions/01_Constants_A16_t01: Fail # Checks that an IntegerDivisionByZeroException raised during evaluation of a compile-time constant causes a compile-time error.
-Language/11_Expressions/01_Constants_A16_t02: Fail # Checks that an OutOfMemoryException raised during evaluation of a compile-time constant causes a compile-time error.
-Language/11_Expressions/05_Strings_A02_t46: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/11_Expressions/05_Strings_A02_t48: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/11_Expressions/22_Equality_A01_t15: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/11_Expressions/22_Equality_A01_t16: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that if the variable declaration is prefixed with the const modifier, then variable must be initialized to a constant expression.
-Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
#
# Unexpected compile-time errors.
@@ -748,9 +315,6 @@
Language/07_Classes/3_Setters_A04_t06: Fail # http://dartbug.com/5023
Language/07_Classes/3_Setters_A04_t07: Fail # http://dartbug.com/5023
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5683
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5683
-
Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
@@ -758,26 +322,280 @@
# Unexpected runtime errors.
#
[ $compiler == dart2js ]
-#Language/11_Expressions/32_Type_Cast_A01_t01: Fail # http://dartbug.com/9074
-
-#Language/14_Types/4_Interface_Types_A08_t06: Fail # class Queue cannot be resolved.
-
-Language/14_Types/4_Interface_Types_A11_t04: Fail # http://dartbug.com/5020
-Language/14_Types/4_Interface_Types_A12_t10: Fail # http://dartbug.com/5020
-
Language/03_Overview/1_Scoping_A01_t39: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # dartbug.com/7202
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t48: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t68: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/run_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js && $checked ]
+Language/10_Generics/09_Generics_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/10_Generics/09_Generics_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A09_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A09_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A10_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/19_Conditional_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/27_Unary_Expressions_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For/1_For_Loop_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t26: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t04: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/map_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/skip_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/bind_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/getRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+
+
+# Could this be dart issue 7728?
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
+LibTest/async/Future/Future.delayed_A01_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/Future.delayed_A01_t02: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/Future.delayed_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/first_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/first_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 94e2291..96d4ddb 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,12 +3,6 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == none]
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
-
LibTest/math/max_A01_t03: Fail # co19 issue 467
LibTest/math/min_A01_t03: Fail # co19 issue 467
@@ -17,72 +11,20 @@
LibTest/core/Stopwatch/elapsed_A01_t03: Pass, Fail # Issue 12383.
[ $runtime == vm ]
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Crash, Pass # Issue 9597 (question-mark operator)
Language/07_Classes/6_Constructors_A02_t01: Skip # co19 issue 415.
[ $compiler == none && $runtime == vm ]
-
# The following tests fail because they contain number literals with a + prefix (co19 issue 428)
LibTest/core/double/floor_A01_t05: Fail # co19 issue 428
LibTest/core/double/ceil_A01_t05: Fail # co19 issue 428
-Language/12_Statements/02_Expression_Statements_A01_t06: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t10: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t08: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t04: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t03: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t02: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t01: Fail # co19 issue 428
-Language/11_Expressions/01_Constants_A01_t01: Fail # co19 issue 428
Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # Dart issue 5743
-Language/11_Expressions/01_Constants_A18_t06: Fail # co19 issue 468
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # co19 issue 469
-Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # Issue 6871
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # Issue 11982
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # Issue 11982
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail # co19 issue 470
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477
-LibTest/core/Match/pattern_A01_t01: Fail # Issue 422
-LibTest/core/RegExp/allMatches_A01_t01: Fail # Issue 422
-
-Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # Dart issue 6060
-Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # Dart issue 6060
-
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: Fail # co19 issue 385
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: Fail # co19 issue 385
+LibTest/core/Match/pattern_A01_t01: Fail # co19 issue 422
+LibTest/core/RegExp/allMatches_A01_t01: Fail # co19 issue 422
Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # Dart issue 978
Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # Dart issue 978
@@ -92,296 +34,71 @@
Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Dart issue 978
Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # Dart issue 6954
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # co19 issue 426
-Language/11_Expressions/05_Strings_A02_t46: Fail # Dart issue 4009
-Language/11_Expressions/05_Strings_A02_t48: Fail # Dart issue 4009
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # Dart issue 1372
-Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # Dart issue 5775
-Language/11_Expressions/30_Identifier_Reference_A05_t02: Fail # Dart issue 2492
-Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # Dart issue 5802
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # Dart issue 7305
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # Dart issue 5773
-Language/12_Statements/06_For_A01_t11: Fail # Dart issue 5675
-Language/12_Statements/09_Switch_A01_t02: Fail # Dart issue 2238
-Language/12_Statements/09_Switch_A02_t01: Fail # Dart issue 7306
-Language/12_Statements/09_Switch_A02_t02: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A03_t01: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A03_t02: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A04_t01: Fail # Dart issue 6897
-Language/12_Statements/09_Switch_A06_t02: Fail # Dart issue 5837
-Language/12_Statements/10_Try_A03_t01: Fail # Dart issue 7311
-Language/12_Statements/10_Try_A03_t02: Fail # Dart issue 7311
-Language/12_Statements/10_Try_A03_t03: Fail # Dart issue 7311
-Language/12_Statements/12_Labels_A01_t03: Fail # Dart issue 2238
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # Dart issue 5839
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # Dart issue 3206
-Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # Dart issue 6134
-Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Fail # Dart issue 6134
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # Dart issue 6352
-Language/13_Libraries_and_Scripts/5_URIs_A01_t04: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t05: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # Dart issue 6352
-Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Dart issue 6352
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 392
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 392
LibTest/core/double/parse_A02_t01: Fail # co19 issue 418
-LibTest/math/pow_A01_t01: Fail # Dart issue 7318
+LibTest/math/pow_A01_t01: Fail # co19 issue 44
LibTest/math/pow_A11_t01: Fail # Dart issue 449
LibTest/math/pow_A13_t01: Fail # Dart issue 449
-Language/05_Variables/05_Variables_A05_t04: Fail # Dart issue 5881
Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # Dart issue 5802
Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # Dart issue 5894
-LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/floor_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
+LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/floor_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
-LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # Issue 6085
-LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379
-
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # issue 6085
-
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
-
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
-
-Language/11_Expressions/01_Constants_A16_t01: Fail # Not properly reporting exception in initializer expressions
-Language/11_Expressions/01_Constants_A16_t02: Fail # Not properly reporting exception in initializer expressions
-
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # co19 issue 458, potentially constant expression analysis
-
-Language/11_Expressions/01_Constants_A17_t03: Crash # issue 1681 (recursion in compile-time constant expression)
-Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # Should result in OOM
+LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # co19 issue 408
# Some of these tests are expected to fail for another reason. These are marked as Skip.
-Language/07_Classes/07_Classes_A02_t29: Skip # must not instantiate an abstract class, co19 issue 183
-Language/07_Classes/07_Classes_A02_t31: Skip # must not instantiate an abstract class, co19 issue 183
+Language/07_Classes/07_Classes_A02_t29: Skip # co19 issue 490
+Language/07_Classes/07_Classes_A02_t31: Skip # co19 issue 490
-# co19 175 - related to issue 4522, all need fixing, some passes because of temporary warning.
-Language/11_Expressions/07_Maps_A03_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A04_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A04_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A06_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A06_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A07_t04: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A07_t03: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A08_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t03: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t04: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t05: Pass, Fail # co19 175
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue 12508
-Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
+LibTest/core/Match/operator_subscript_A01_t01: Fail # Issue 12508
+LibTest/core/RegExp/firstMatch_A01_t01: Fail # Issue 12508
+LibTest/core/double/toRadixString_A01_t01: Fail # co19 issue 491
+LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # issue 1604.
+LibTest/math/sin_A01_t01: Pass, Fail, OK # co19 issue 44
-LibTest/core/List/every_A03_t01: Skip # Promise removed (co19 issue #79)
+LibTest/isolate/SendPort/send_A02_t02: Skip # co19 issue 493
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail
+LibTest/core/String/contains_A01_t02: Fail # Issue 12508
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
+LibTest/isolate/SendPort/send_A02_t03: Skip # co19 issue 495
-LibTest/core/Date/Date.fromString_A03_t01: Pass # Issue co19 - 121 (currently passing due to co19 issues 373 and 374)
-LibTest/core/Match/operator_subscript_A01_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail
-LibTest/core/RegExp/firstMatch_A01_t01: Fail
-LibTest/core/double/toRadixString_A01_t01: Fail # Issue 463
-LibTest/core/int/toRadixString_A01_t01: Fail # Issue 461
+LibTest/isolate/ReceivePort/receive_A01_t02: Fail # VM triage, check spec.
+LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail # VM triage, check spec.
+LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail # VM triage, check spec.
-LibTest/math/sin_A01_t01: Pass, Fail, OK # Issue co19 - 44
-LibTest/core/Date/toString_A02_t01: Fail # Argument error. Year 999999 is out of range. Needs to be specified (and then potentially reported to co19): issue 1878.
-LibTest/core/Date/year_A01_t01: Fail # Year out of range. Needs to be specified: issue 8808. Possibly a co19 bug.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail $ co19 issue 494
-LibTest/isolate/SendPort/send_A02_t02: Skip # co19 issue 293
-LibTest/isolate/SendPort/send_A02_t03: Skip # co19 issue 293
-
-LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
-
-Language/11_Expressions/07_Maps_A07_t03: Fail, OK # co19 issue 287
-Language/11_Expressions/07_Maps_A04_t02: Fail, OK # co19 issue 287
-
-LibTest/core/String/contains_A01_t03: Skip # Times out.
-
-LibTest/core/String/contains_A01_t02: Fail
-
-Language/07_Classes/07_Classes_A02_t29: Fail
-Language/07_Classes/07_Classes_A02_t31: Fail
-Language/11_Expressions/05_Strings_A20_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail
-
-LibTest/core/StringBuffer/isEmpty_A01_t01: Fail, OK # co19 issue 355
-
-# parameter name or type expected
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
-
-Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail # co19 issue 461
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Issue 397
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-LibTest/core/List/addLast_A01_t01: Fail # Issue 397
-LibTest/core/List/addLast_A01_t03: Fail # Issue 397
-LibTest/core/List/addLast_A02_t01: Fail # Issue 397
-LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
-LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/List/List.fixedLength_A01_t01: fail # Issue 400
-LibTest/core/List/addAll_A02_t01: fail # Issue 400
-LibTest/core/List/add_A02_t01: fail # Issue 400
-LibTest/core/List/clear_A02_t01: fail # Issue 400
-LibTest/core/List/insertRange_A02_t01: fail # Issue 400
-LibTest/core/List/length_A04_t01: fail # Issue 400
-LibTest/core/List/removeLast_A02_t01: fail # Issue 400
-LibTest/core/List/removeRange_A02_t01: fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
@@ -404,66 +121,15 @@
Language/03_Overview/1_Scoping_A02_t28: Fail # Issue 463
Language/03_Overview/2_Privacy_A01_t06: Fail # Issue 463
-Language/09_Generics/09_Generics_A05_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: Fail # Issue 463
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # Issue 463
# end [ $compiler == none && $runtime == vm ]
-[ $compiler == none && $runtime == vm && $unchecked ]
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 478
-
-LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
-
-
[ $compiler == none && $runtime == vm && $checked ]
-Language/03_Overview/1_Scoping_A02_t30: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t02: Fail # co19 issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # co19 issue 463
-Language/14_Types/8_Parameterized_Types_A02_t01: Fail # co19 issue 463
-
+LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
+LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
+LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 480
-
-LibTest/core/AssertionError/column_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # co19 issue 479
-LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/url_A01_t01: Fail # co19 issue 479
LibTest/core/TypeError/column_A01_t01: Fail # co19 issue 479
LibTest/core/TypeError/dstName_A01_t01: Fail # co19 issue 479
LibTest/core/TypeError/dstType_A01_t01: Fail # co19 issue 479
@@ -471,38 +137,8 @@
LibTest/core/TypeError/line_A01_t01: Fail # co19 issue 479
LibTest/core/TypeError/srcType_A01_t01: Fail # co19 issue 479
LibTest/core/TypeError/url_A01_t01: Fail # co19 issue 479
-
-LibTest/core/Strings/concatAll_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
-LibTest/core/Strings/join_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
-
LibTest/core/int/operator_division_A01_t01: Fail # ~/ returns ints, issue 361
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 405
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail, OK # co19 issue 460
-
-# Passing for the wrong reasons:
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Pass # co19 issues 405 and 463
-Language/11_Expressions/17_Getter_Invocation_A02_t02: Pass # co19 issues 405 and 463
-
-Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t04: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t05: Fail # co19 issue 463
-
-Language/12_Statements/09_Switch_A05_t01: Fail # co19 issue 442
-
LibTest/core/Set/intersection_A01_t01: Fail # issue 390
LibTest/core/Set/intersection_A01_t02: Fail # issue 390
LibTest/core/Set/intersection_A01_t03: Fail # issue 390
@@ -520,9 +156,12 @@
#end [ $compiler == none && $runtime == vm && $checked ]
-
[ $compiler == none && $runtime == vm && $mode == debug ]
LibTest/isolate/isolate_api/spawnFunction_A02_t01: Crash
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: Crash # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19-roll r546: Please triage this failure
[ $compiler == none && $runtime == vm && $system == macos ]
LibTest/math/exp_A01_t01: Fail, OK # Issue co19 - 44
@@ -552,3 +191,211 @@
[ $compiler == none && $runtime == vm && $arch == simmips ]
LibTest/math/cos_A01_t01: Pass, Fail # Fail on Mac
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: crash # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t21: crash # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t22: crash # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t14: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/forEach_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/run_A01_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/getRange_A04_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm && $checked ]
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t26: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t04: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/map_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/skip_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/bind_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t03: pass # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm && $unchecked ]
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: Fail # co19-roll r546: Please triage this failure
+
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index abb669a..bbe7d38 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -3,9 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart';
import "parser_helper.dart";
import "compiler_helper.dart";
diff --git a/tests/compiler/dart2js/licm_test.dart b/tests/compiler/dart2js/licm_test.dart
new file mode 100644
index 0000000..0b16cba
--- /dev/null
+++ b/tests/compiler/dart2js/licm_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// Check that we hoist instructions in a loop condition, even if that
+// condition involves control flow.
+
+import 'package:expect/expect.dart';
+
+import 'compiler_helper.dart';
+
+const String TEST = '''
+var a = [1];
+
+main() {
+ int count = int.parse('42') == 42 ? 42 : null;
+ for (int i = 0; i < count && i < a[0]; i++) {
+ print(i);
+ }
+ a.removeLast();
+ // Ensure we don't try to generate a bailout method based on a check
+ // of [count].
+ count.removeLast();
+}
+''';
+
+main() {
+ compileAndMatch(
+ TEST, 'main', new RegExp("if \\(count == null\\)(.|\\n)*while"));
+}
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/list_tracer_test.dart
index 691c95b..c9b9791 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/list_tracer_test.dart
@@ -154,14 +154,14 @@
listOnlySetWithConstraint[0]++;
listEscapingInSetterValue[0] = anInt;
- new A().callSetter = listEscapingInSetterValue;
+ new A(null).callSetter = listEscapingInSetterValue;
listEscapingInIndex[0] = anInt;
- new A()[listEscapingInIndex];
+ new A(null)[listEscapingInIndex];
- new A()[listEscapingInIndexSet] = 42;
+ new A(null)[listEscapingInIndexSet] = 42;
- new A()[listEscapingTwiceInIndexSet] = listEscapingTwiceInIndexSet;
+ new A(null)[listEscapingTwiceInIndexSet] = listEscapingTwiceInIndexSet;
listPassedAsOptionalParameter[0] = anInt;
takeOptional(listPassedAsOptionalParameter);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index ec113a8..2d72fc5 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -164,6 +164,7 @@
getInterceptor(x) {}
getNativeInterceptor(x) {}
var dispatchPropertyName;
+ var mapTypeToInterceptor;
getDispatchProperty(o) {}
initializeDispatchProperty(f,p,i) {}
initializeDispatchPropertyCSP(f,p,i) {}
diff --git a/tests/compiler/dart2js/no_such_method_codegen_test.dart b/tests/compiler/dart2js/no_such_method_codegen_test.dart
new file mode 100644
index 0000000..85777ad
--- /dev/null
+++ b/tests/compiler/dart2js/no_such_method_codegen_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// The mock compiler of dart2js used to make the compiler crash on
+// this program.
+//
+// The SSA backend generates a call to a throwNoSuchMethod helper for
+// the access to `foo`, and we used to not infer return types of
+// helpers, so we did not know throwNoSuchMethod was not returning.
+// As a consequence, all operator[] had to be compiled, and due to
+// missing backend dependencies, some of them were not resolved.
+
+import 'compiler_helper.dart';
+
+const String TEST = '''
+main() => foo[42];
+''';
+
+main() {
+ Uri uri = new Uri(scheme: 'source');
+ var compiler = compilerFor(TEST, uri);
+ compiler.runCompiler(uri);
+}
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 112ba50..8587e3e 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -76,6 +76,7 @@
testIncrementsAndDecrements();
testOverrideHashCodeCheck();
testSupertypeOrder();
+ testConstructorArgumentMismatch();
}
testSupertypeOrder() {
@@ -575,6 +576,20 @@
Expect.isTrue(element.isSynthesized);
}
+testConstructorArgumentMismatch() {
+ String script = "class A {} foo() { print(new A(42)); }";
+ MockCompiler compiler = new MockCompiler();
+ compiler.parseScript(script);
+ FunctionElement fooElement = compiler.mainApp.find(buildSourceString('foo'));
+ Expect.isNotNull(fooElement);
+ fooElement.parseNode(compiler);
+ compiler.resolver.resolve(fooElement);
+
+ compareWarningKinds(
+ script, [MessageKind.INVALID_ARGUMENTS.warning], compiler.warnings);
+ compareWarningKinds(script, [], compiler.errors);
+}
+
testTopLevelFields() {
MockCompiler compiler = new MockCompiler();
compiler.parseScript("int a;");
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index b62a220..74194b5 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -233,6 +233,24 @@
}
}
+testIf1(a) {
+ var c = null;
+ if (a) {
+ c = 10;
+ } else {
+ }
+ return c;
+}
+
+testIf2(a) {
+ var c = null;
+ if (a) {
+ } else {
+ c = 10;
+ }
+ return c;
+}
+
returnAsString() {
return topLevelGetter() as String;
}
@@ -503,6 +521,8 @@
testIsCheck18(topLevelGetter());
testIsCheck19(topLevelGetter());
testIsCheck20();
+ testIf1(topLevelGetter());
+ testIf2(topLevelGetter());
returnAsString();
returnIntAsNum();
returnAsTypedef();
@@ -602,6 +622,8 @@
checkReturn('testIsCheck18', typesTask.dynamicType);
checkReturn('testIsCheck19', typesTask.dynamicType);
checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable());
+ checkReturn('testIf1', typesTask.intType.nullable());
+ checkReturn('testIf2', typesTask.intType.nullable());
checkReturn('returnAsString',
new TypeMask.subtype(compiler.stringClass.computeType(compiler)));
checkReturn('returnIntAsNum', typesTask.intType);
diff --git a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
new file mode 100644
index 0000000..7d821c3
--- /dev/null
+++ b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
@@ -0,0 +1,32 @@
+// 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 "package:expect/expect.dart";
+import 'dart:_js_helper' show intTypeCheck;
+
+bool get inCheckedMode {
+ try {
+ String a = 42;
+ } on TypeError catch (e) {
+ return true;
+ }
+ return false;
+}
+
+main() {
+ var a = [];
+ a.add(42);
+ a.add('foo');
+ // By calling direclty [intTypeCheck] with an int, we're making the
+ // type inferrer infer that the parameter type of [intTypeCheck] is
+ // always an int, and therefore the method will be compiled to
+ // never throw. So when the backend actually uses the helper for
+ // implementing checked mode semantics (like in the check below),
+ // the check won't fail at runtime.
+ intTypeCheck(42);
+ if (inCheckedMode) {
+ int value;
+ Expect.throws(() => value = a[1], (e) => e is TypeError);
+ }
+}
diff --git a/tests/compiler/dart2js_native/subclassing_1_test.dart b/tests/compiler/dart2js_native/subclassing_1_test.dart
new file mode 100644
index 0000000..b90366a
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_1_test.dart
@@ -0,0 +1,58 @@
+// 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 "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show findInterceptorForType;
+
+// Test that subclasses of native classes can be defined by setting the dispatch
+// record.
+
+class A native "A" {
+ foo(x) => '$x,${this.oof()}';
+ oof() => 'A';
+}
+
+class B extends A {
+ oof() => 'B';
+}
+
+B makeB1() native;
+B makeB2() native;
+B makeC() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+@Creates('=Object')
+getCPrototype() native;
+
+void setup() native r"""
+function A() {}
+function B() {}
+function C() {}
+makeA = function(){return new A;};
+makeB1 = function(){return new B;};
+makeB2 = function(){return new B;};
+makeC = function(){return new C;};
+
+getBPrototype = function(){return B.prototype;};
+getCPrototype = function(){return C.prototype;};
+""";
+
+main() {
+ setup();
+
+ setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+ setNativeSubclassDispatchRecord(getCPrototype(), findInterceptorForType(B));
+
+ B b1 = makeB1();
+ Expect.equals('1,B', b1.foo(1));
+
+ B b2 = makeB2();
+ Expect.equals('2,B', b2.foo(2));
+
+ B b3 = makeC();
+ Expect.equals('3,B', b3.foo(3));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_2_test.dart b/tests/compiler/dart2js_native/subclassing_2_test.dart
new file mode 100644
index 0000000..f8b93aa
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_2_test.dart
@@ -0,0 +1,45 @@
+// 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 "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show findInterceptorForType;
+
+// Test calling convention of methods introduced on subclasses of native
+// classes.
+
+doFoo(r, x) => '$x,${r.oof()}';
+
+class A native "A" {
+ foo(x) => (doFoo)(this, x);
+}
+
+class B extends A {
+ // [oof] is introduced only on this subclass of a native class. It should
+ // have interceptor calling convention.
+ oof() => 'B';
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function A() {}
+function B() {}
+makeA = function(){return new A;};
+makeB = function(){return new B;};
+
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+ setup();
+
+ setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+ B b = makeB();
+ Expect.equals('1,B', b.foo(1));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_3_test.dart b/tests/compiler/dart2js_native/subclassing_3_test.dart
new file mode 100644
index 0000000..d73f0c8
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_3_test.dart
@@ -0,0 +1,50 @@
+// 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 "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show Interceptor, findInterceptorForType;
+
+// Test calling convention of methods introduced on subclasses of native
+// class of mixin.
+
+doFoo(r, x) => '$x,${r.oof()},${r.miz()}';
+
+class M {
+ miz() => 'M';
+}
+
+class N native "N" {
+ foo(x) => (doFoo)(this, x);
+}
+
+class A extends N {}
+
+class B extends A with M {
+ // [oof] is introduced only on this subclass of a native class. It should
+ // have interceptor calling convention.
+ oof() => 'B';
+ // [miz] is introduced only on the mixin-application A+M.
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function B() {}
+makeB = function(){return new B;};
+
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+ setup();
+
+ setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+ B b = makeB();
+ Expect.equals('1,B,M', b.foo(1));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_4_test.dart b/tests/compiler/dart2js_native/subclassing_4_test.dart
new file mode 100644
index 0000000..9d25e1a
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_4_test.dart
@@ -0,0 +1,47 @@
+// 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 "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show Interceptor, findInterceptorForType;
+
+// Test calling convention on subclasses of native classes.
+
+class M {
+ miz() => 'M';
+}
+
+class N native "N" {}
+
+class A extends N {}
+
+class B extends A with M {
+ // The call to [miz] has a know type [B]. The call is in an intercepted
+ // method and to an intercepted method, so the ambient interceptor can be
+ // used. For correct optimization of the interceptor, the compiler needs to
+ // (1) correctly determine that B is an intercepted type (because it extends a
+ // native class) and (2) realize that the intersection of [B] and subclasses
+ // of mixin applications of [M] is non-empty.
+ callMiz() => this.miz();
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function B() {}
+makeB = function(){return new B;};
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+ setup();
+
+ setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+ B b = makeB();
+ Expect.equals('M', b.callMiz());
+}
diff --git a/tests/corelib/safe_to_string_test.dart b/tests/corelib/safe_to_string_test.dart
index 10be1f7..233eb5d 100644
--- a/tests/corelib/safe_to_string_test.dart
+++ b/tests/corelib/safe_to_string_test.dart
@@ -15,6 +15,16 @@
Expect.stringEquals(r'"\\\"\n\r"', Error.safeToString('\\"\n\r'));
+ Expect.stringEquals(r'"\x00\x01\x02\x03\x04\x05\x06\x07"',
+ Error.safeToString('\x00\x01\x02\x03\x04\x05\x06\x07'));
+ Expect.stringEquals(r'"\x08\t\n\x0b\x0c\r\x0e\x0f"',
+ Error.safeToString('\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'));
+ Expect.stringEquals(r'"\x10\x11\x12\x13\x14\x15\x16\x17"',
+ Error.safeToString('\x10\x11\x12\x13\x14\x15\x16\x17'));
+ Expect.stringEquals(r'"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"',
+ Error.safeToString('\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'));
+ Expect.stringEquals('" "', Error.safeToString(" "));
+
Expect.stringEquals('null', Error.safeToString(null));
Expect.stringEquals('true', Error.safeToString(true));
Expect.stringEquals('false', Error.safeToString(false));
diff --git a/tests/html/custom_elements_test.dart b/tests/html/custom_elements_test.dart
index 666a0a3..a78892b 100644
--- a/tests/html/custom_elements_test.dart
+++ b/tests/html/custom_elements_test.dart
@@ -7,18 +7,32 @@
import '../../pkg/unittest/lib/html_individual_config.dart';
import 'dart:html';
-class CustomType extends Element {
- factory CustomType() => null;
+class CustomMixin {
+ var mixinMethodCalled;
- bool onCreatedCalled = false;
+ void mixinMethod() {
+ mixinMethodCalled = true;
+ }
+}
+
+class CustomType extends HtmlElement with CustomMixin{
+ factory CustomType() => null;
+ bool onCreatedCalled; // = false;
void onCreated() {
onCreatedCalled = true;
customCreatedCount++;
}
+
+ void invokeMixinMethod() {
+ mixinMethod();
+ }
}
int customCreatedCount = 0;
+int nextTagId = 0;
+String get nextTag => 'x-type${nextTagId++}';
+
class NotAnElement {}
main() {
@@ -26,42 +40,45 @@
group('register', () {
test('register', () {
- document.register('x-type1', CustomType);
+ var tag = nextTag;
+ document.register(tag, CustomType);
- var element = new Element.tag('x-type1');
+ var element = new Element.tag(tag);
expect(element, isNotNull);
expect(element is CustomType, isTrue);
expect(element.onCreatedCalled, isTrue);
});
test('register twice', () {
- document.register('x-type2', CustomType);
+ var tag = nextTag;
+ document.register(tag, CustomType);
expect(() {
- document.register('x-type2', CustomType);
+ document.register(tag, CustomType);
}, throws, reason: 'Cannot register a tag more than once.');
- document.register('x-type3', CustomType);
+ var newTag = nextTag;
+ document.register(newTag, CustomType);
- var element = new Element.tag('x-type3');
+ var element = new Element.tag(newTag);
expect(element, isNotNull);
expect(element is CustomType, isTrue);
});
test('register null', () {
expect(() {
- document.register('x-type4', null);
+ document.register(nextTag, null);
}, throws, reason: 'Cannot register a null type.');
});
test('register native', () {
expect(() {
- document.register('x-type5', BodyElement);
+ document.register(nextTag, BodyElement);
}, throws, reason: 'Cannot register a native element.');
});
test('register non-element', () {
expect(() {
- document.register('x-type6', NotAnElement);
+ document.register(nextTag, NotAnElement);
}, throws, reason: 'Cannot register a non-element.');
});
});
@@ -69,16 +86,18 @@
group('preregister', () {
// TODO(vsm): Modify this test once we agree on the proper semantics.
test('pre-registration construction', () {
- var dom = new Element.html('<div><x-type7></x-type7></div>');
+ var tag = nextTag;
+ var dom = new Element.html('<div><$tag></$tag></div>');
var preElement = dom.children[0];
expect(preElement, isNotNull);
- expect(preElement is UnknownElement, isTrue);
+ expect(preElement is HtmlElement, isTrue);
+ expect(preElement is CustomType, isFalse);
var firedOnPre = false;
preElement.onFocus.listen((_) {
firedOnPre = true;
});
- document.register('x-type7', CustomType);
+ document.register(tag, CustomType);
var postElement = dom.children[0];
expect(postElement, isNotNull);
@@ -86,44 +105,69 @@
expect(postElement.onCreatedCalled, isTrue);
// Element from first query remains an UnknownElement.
- expect(preElement is UnknownElement, isTrue);
- expect(preElement.parent, isNull);
+ expect(preElement is HtmlElement, isTrue);
+ expect(preElement.parent, dom);
expect(dom.children.length, 1);
var firedOnPost = false;
postElement.onFocus.listen((_) {
firedOnPost = true;
});
- // Event handlers should not persist to new element.
+ // Event handlers persist on old and new element.
postElement.dispatchEvent(new Event('focus'));
- expect(firedOnPre, isFalse);
+ expect(firedOnPre, isTrue);
expect(firedOnPost, isTrue);
});
});
group('innerHtml', () {
test('query', () {
- document.register('x-type8', CustomType);
+ var tag = nextTag;
+ document.register(tag, CustomType);
var element = new DivElement();
- element.innerHtml = '<x-type8></x-type8>';
+ element.innerHtml = '<$tag></$tag>';
document.body.nodes.add(element);
- var queried = query('x-type8');
+ var queried = query(tag);
expect(queried, isNotNull);
expect(queried is CustomType, isTrue);
expect(queried.onCreatedCalled, isTrue);
});
+
+ test('query id', () {
+ var tag = nextTag;
+ document.register(tag, CustomType);
+ var element = new DivElement();
+ element.innerHtml = '<$tag id="someid"></$tag>';
+ document.body.nodes.add(element);
+ var queried = query('#someid');
+
+ expect(queried, isNotNull);
+ expect(queried is CustomType, isTrue);
+ expect(queried.id, "someid");
+ });
});
group('lifecycle', () {
test('onCreated', () {
int oldCount = customCreatedCount;
-
- document.register('x-type9', CustomType);
+ var tag = nextTag;
+ document.register(tag, CustomType);
var element = new DivElement();
- element.innerHtml = '<x-type9></x-type9>';
+ element.innerHtml = '<$tag></$tag>';
document.body.nodes.add(element);
expect(customCreatedCount, oldCount + 1);
});
});
+
+ group('mixins', () {
+ test('can invoke mixin methods', () {
+ var tag = nextTag;
+ document.register(tag, CustomType);
+
+ var element = new Element.tag(tag);
+ element.invokeMixinMethod();
+ expect(element.mixinMethodCalled, isTrue);
+ });
+ });
}
diff --git a/tests/html/element_types_test.dart b/tests/html/element_types_test.dart
index 2638d3a..960bb16 100644
--- a/tests/html/element_types_test.dart
+++ b/tests/html/element_types_test.dart
@@ -116,7 +116,7 @@
check('form', () => new FormElement() is FormElement);
check('head', () => new HeadElement() is HeadElement);
check('hr', () => new HRElement() is HRElement);
- check('html', () => new HtmlElement() is HtmlElement);
+ check('html', () => new HtmlHtmlElement() is HtmlHtmlElement);
check('h1', () => new HeadingElement.h1() is HeadingElement);
check('h2', () => new HeadingElement.h2() is HeadingElement);
check('h3', () => new HeadingElement.h3() is HeadingElement);
diff --git a/tests/html/html.status b/tests/html/html.status
index a39b862..8cdf46d 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -6,16 +6,7 @@
event_test: Skip # Issue 1996
interactive_test: Skip # Must be run manually.
-# Issue 9326
-custom_elements_test/preregister: Fail
-custom_elements_test/lifecycle: Fail
-
-[ $compiler == dart2js ]
-# Document.register is unimplemented.
-custom_elements_test: Skip
-
-[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-# Document.register is unimplemented.
+[ $compiler == dart2js && $runtime != drt ]
custom_elements_test: Skip
[ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
@@ -24,6 +15,8 @@
[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
# postMessage in dartium always transfers the typed array buffer, never a view
postmessage_structured_test/typed_arrays: Fail
+events_test: Pass, Fail # Issue 12489
+custom_elements_test/lifecycle: Fail # Issue 9326 - Implement "extends Element" in dartium
[ $compiler == none && $runtime == drt && $system == windows ]
worker_test/functional: Pass, Crash # Issue 9929.
diff --git a/tests/language/closure_in_initializer2_test.dart b/tests/language/closure_in_initializer2_test.dart
index b44b0c7..a782c64 100644
--- a/tests/language/closure_in_initializer2_test.dart
+++ b/tests/language/closure_in_initializer2_test.dart
@@ -2,12 +2,16 @@
// 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.
+// Test that a parameter used in a closure is properly boxed.
+
import "package:expect/expect.dart";
-class S {
+abstract class S {
S() {
Expect.equals(2, this.f());
}
+
+ get f;
}
class A extends S {
diff --git a/tests/language/closure_in_initializer_test.dart b/tests/language/closure_in_initializer_test.dart
index 04f1033..7697bbe 100644
--- a/tests/language/closure_in_initializer_test.dart
+++ b/tests/language/closure_in_initializer_test.dart
@@ -2,6 +2,9 @@
// 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.
+// Test that a parameter used in two different closures defined in a
+// constructor initializer, is properly boxed.
+
import "package:expect/expect.dart";
class A {
diff --git a/tests/language/create_unresolved_type_test.dart b/tests/language/create_unresolved_type_test.dart
new file mode 100644
index 0000000..ceaf6dc
--- /dev/null
+++ b/tests/language/create_unresolved_type_test.dart
@@ -0,0 +1,7 @@
+// 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.
+
+main() {
+ new F<int>(); /// 01: runtime error, static type warning
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 97d31b4..a16ddfb 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -299,3 +299,12 @@
prefix22_test: Pass
invocation_mirror_test: Fail, OK # hardcoded names.
super_call4_test: Fail, OK # hardcoded names.
+
+[ $compiler == dart2js || $compiler == dart2dart]
+null_test/03: Fail # Issue 12445.
+
+[ $compiler == dart2js ]
+null_test/none: Fail # Issue 12482
+
+[ $compiler == dartanalyzer ]
+null_test/03: Fail # Issue 12484
diff --git a/tests/language/no_such_constructor2_test.dart b/tests/language/no_such_constructor2_test.dart
new file mode 100644
index 0000000..1c2236e
--- /dev/null
+++ b/tests/language/no_such_constructor2_test.dart
@@ -0,0 +1,13 @@
+// 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 "package:expect/expect.dart";
+
+class A {
+ A();
+}
+
+main() {
+ Expect.throws(() => new A(42), (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/no_such_constructor_test.dart b/tests/language/no_such_constructor_test.dart
new file mode 100644
index 0000000..40ade74
--- /dev/null
+++ b/tests/language/no_such_constructor_test.dart
@@ -0,0 +1,13 @@
+// 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 "package:expect/expect.dart";
+
+class A {
+ A();
+}
+
+main() {
+ new A(42); /// 01: static type warning, runtime error
+}
diff --git a/tests/language/null_is_test.dart b/tests/language/null_is_test.dart
index 395d474..380dbce 100644
--- a/tests/language/null_is_test.dart
+++ b/tests/language/null_is_test.dart
@@ -6,10 +6,41 @@
main() {
Expect.isTrue(null is Object);
+ Expect.isTrue(null is Null);
Expect.isFalse(null is int);
Expect.isFalse(null is bool);
Expect.isFalse(null is num);
Expect.isFalse(null is String);
Expect.isFalse(null is List);
Expect.isFalse(null is Expect);
+
+ test(null);
+
+ Expect.isFalse(1 is Null);
+ Expect.isFalse("1" is Null);
+ Expect.isFalse(true is Null);
+ Expect.isFalse(false is Null);
+ Expect.isFalse(new Object() is Null);
+
+ testNegative(1);
+ testNegative("1");
+ testNegative(true);
+ testNegative(false);
+ testNegative(new Object());
+}
+
+test(n) {
+ // Test where the argument is not a compile-time constant.
+ Expect.isTrue(n is Object);
+ Expect.isTrue(n is Null);
+ Expect.isFalse(n is int);
+ Expect.isFalse(n is bool);
+ Expect.isFalse(n is num);
+ Expect.isFalse(n is String);
+ Expect.isFalse(n is List);
+ Expect.isFalse(n is Expect);
+}
+
+testNegative(n){
+ Expect.isFalse(n is Null);
}
diff --git a/tests/language/null_test.dart b/tests/language/null_test.dart
index 6ce22ee..c499c50 100644
--- a/tests/language/null_test.dart
+++ b/tests/language/null_test.dart
@@ -1,54 +1,204 @@
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
+// 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.
// Second dart test program.
+// VMOptions=--optimization-counter-threshold=5
+
+import "dart:mirrors";
import "package:expect/expect.dart";
-class NullTest {
- static int foo(var obj) {
- Expect.equals(null, obj);
- }
+class BadInherit
+ extends Null /// 01: compile-time error
+ implements Null /// 02: compile-time error
+ extends Object with Null /// 03: compile-time error
+ {}
- static bool compareToNull(var value) {
- return null == value;
- }
-
- static bool compareWithNull(var value) {
- return value == null;
- }
-
- static int testMain() {
- var val = 1;
- var obj = null;
-
- Expect.equals(null, obj);
- Expect.equals(null, null);
-
- foo(obj);
- foo(null);
-
- if (obj != null) {
- foo(null);
- } else {
- foo(obj);
- }
-
- Expect.isFalse(compareToNull(val));
- Expect.isTrue(compareToNull(obj));
- Expect.isFalse(compareWithNull(val));
- Expect.isTrue(compareWithNull(obj));
- Expect.isTrue(obj is Object);
- Expect.isFalse(obj is String);
- Expect.isTrue(obj is !String);
- Expect.isFalse(obj is !Object);
- Expect.isFalse(val is !Object);
-
- return 0;
+class EqualsNotCalled {
+ int get hashCode => throw "And don't warn!";
+ bool operator==(Object other) {
+ throw "SHOULD NOT GET HERE";
}
}
+class Generic<T> {
+ bool test(o) => o is T;
+ T cast(o) => o as T;
+ Type get type => T;
+}
-main() {
- NullTest.testMain();
+class Generic2<T, S> {
+ bool test(o) => new Generic<T>().test(o);
+ T cast(o) => new Generic<T>().cast(o);
+ Type get type => new Generic<T>().type;
+}
+
+// Magic incantation to avoid the compiler recognizing the constant values
+// at compile time. If the result is computed at compile time, the dynamic code
+// will not be tested.
+confuse(x) {
+ try { throw [x]; } on dynamic catch (e) { return e[0]; }
+ return 42;
+}
+
+void main() {
+ for (int i = 0; i < 10; i++) {
+ test();
+ }
+}
+
+void test() {
+ new BadInherit(); // Make sure class is referenced.
+
+ int foo(var obj) {
+ Expect.equals(null, obj);
+ }
+
+ bool compareToNull(var value) {
+ return null == value;
+ }
+
+ bool compareWithNull(var value) {
+ return value == null;
+ }
+
+ var val = 1;
+ var obj = confuse(null); // Null value that isn't known at compile-time.
+ Expect.isTrue(identical(obj, null), "identical");
+
+ Expect.isTrue(null == null);
+ Expect.isTrue(null == obj);
+ Expect.isTrue(obj == null);
+ Expect.isTrue(obj == obj);
+
+ // Using == null or null == will not call any equality method.
+ Expect.isFalse(new EqualsNotCalled() == null);
+ Expect.isFalse(null == new EqualsNotCalled());
+ Expect.isFalse(new EqualsNotCalled() == obj);
+ Expect.isFalse(obj == new EqualsNotCalled());
+
+ Expect.isFalse(null == false);
+ Expect.isFalse(null == 0);
+ Expect.isFalse(null == "");
+ Expect.isFalse(null == []);
+ Expect.isFalse(null == 0.0);
+ Expect.isFalse(null == -0.0);
+ Expect.isFalse(null == double.NAN);
+
+ Expect.isFalse(obj == false);
+ Expect.isFalse(obj == 0);
+ Expect.isFalse(obj == "");
+ Expect.isFalse(obj == []);
+ Expect.isFalse(obj == 0.0);
+ Expect.isFalse(obj == -0.0);
+ Expect.isFalse(obj == double.NAN);
+
+ // Explicit constant expressions.
+ const t1 = null == null;
+ const t2 = null == 0;
+ const t3 = false == null;
+ Expect.isTrue(t1);
+ Expect.isFalse(t2);
+ Expect.isFalse(t3);
+
+ foo(obj);
+ foo(null);
+ if (obj != null) {
+ foo(null);
+ } else {
+ foo(obj);
+ }
+
+ // Test "is" operator.
+ Expect.isTrue(null is Null);
+ Expect.isTrue(obj is Null);
+ Expect.isTrue(null is Object);
+ Expect.isTrue(obj is Object);
+ Expect.isTrue(null is dynamic);
+ Expect.isTrue(obj is dynamic);
+ Expect.isFalse(null is String);
+ Expect.isFalse(obj is String);
+ Expect.isFalse(0 is Null); // It's only assignable.
+ Expect.isFalse(null is! Null);
+ Expect.isFalse(obj is! Null);
+ Expect.isFalse(null is! Object);
+ Expect.isFalse(obj is! Object);
+ Expect.isFalse(null is! dynamic);
+ Expect.isFalse(obj is! dynamic);
+ Expect.isTrue(null is! String);
+ Expect.isTrue(obj is! String);
+ Expect.isTrue(0 is! Null); // It's only assignable.
+
+ // Test "is" operator with generic type variable.
+ Expect.isTrue(new Generic<Null>().test(null));
+ Expect.isFalse(new Generic<Null>().test(42));
+ Expect.isTrue(new Generic2<Null, int>().test(null));
+ Expect.isFalse(new Generic2<Null, int>().test(42));
+
+ // Test cast, "as", operator.
+ Expect.equals(null, null as Null);
+ Expect.equals(null, null as Object);
+ Expect.equals(null, null as int);
+ Expect.throws(() => 42 as Null, (e) => e is CastError);
+ Expect.equals(null, new Generic<Null>().cast(null));
+ Expect.equals(null, new Generic<Object>().cast(null));
+ Expect.equals(null, new Generic<int>().cast(null));
+
+ Expect.equals(null, obj as Null);
+ Expect.equals(null, obj as Object);
+ Expect.equals(null, obj as int);
+ Expect.equals(null, new Generic<Null>().cast(obj));
+ Expect.equals(null, new Generic<Object>().cast(obj));
+ Expect.equals(null, new Generic<int>().cast(obj));
+
+ Expect.equals("null", null.toString());
+ Expect.equals("null", "${null}");
+ Expect.equals("null", obj.toString());
+ Expect.equals("null", "${obj}");
+
+ Expect.equals(Null, null.runtimeType);
+ Expect.equals(Null, obj.runtimeType);
+ Expect.equals(Null, new Generic<Null>().type);
+ Expect.equals(Null, new Generic2<Null, int>().type);
+
+ Expect.isFalse(compareToNull(val));
+ Expect.isTrue(compareToNull(obj));
+ Expect.isFalse(compareWithNull(val));
+ Expect.isTrue(compareWithNull(obj));
+
+ ClassMirror cm = reflectClass(Null);
+
+ InstanceMirror im1 = reflect(null);
+ Expect.equals(cm, im1.type);
+ Expect.isTrue(im1.invoke(const Symbol("=="), [null]).reflectee);
+ Expect.isFalse(im1.invoke(const Symbol("=="), [42]).reflectee);
+
+ InstanceMirror im2 = reflect(obj);
+ Expect.equals(cm, im2.type);
+ Expect.isTrue(im2.invoke(const Symbol("=="), [null]).reflectee);
+ Expect.isFalse(im2.invoke(const Symbol("=="), [42]).reflectee);
+
+ // Method/value extraction. The runtimeType was checked above, and operator==
+ // cannot be extracted.
+ // Currently fails in VM.
+ Expect.equals(null.toString, obj.toString);
+ Expect.equals(null.noSuchMethod, obj.noSuchMethod);
+ Expect.equals(null.hashCode, obj.hashCode);
+
+ var toString = null.toString;
+ Expect.equals("null", toString());
+ Expect.equals("null", Function.apply(toString, []));
+
+ Expect.throws(() => obj.notDeclared());
+ var noSuchMethod = null.noSuchMethod;
+ // Assing to "var" to prevent warning.
+ var capture = new CaptureInvocationMirror();
+ var mirror = capture.notDeclared();
+ Expect.throws(() => noSuchMethod(mirror));
+ Expect.throws(() => Function.apply(noSuchMethod, [mirror]));
+}
+
+
+class CaptureInvocationMirror {
+ noSuchMethod(mirror) => mirror;
}
diff --git a/tests/lib/analyzer/analyze_tests.status b/tests/lib/analyzer/analyze_tests.status
index ca318fe..de9d41a 100644
--- a/tests/lib/analyzer/analyze_tests.status
+++ b/tests/lib/analyzer/analyze_tests.status
@@ -17,6 +17,7 @@
standalone/io/secure_socket_argument_test: fail
standalone/io/stdout_bad_argument_test: fail
standalone/io/skipping_dart2js_compilations_test: fail
+standalone/io/dependency_graph_test: fail # http/dartbug.com/12449
standalone/io/url_encoding_test: fail
standalone/io/web_socket_protocol_processor_test: fail
standalone/io/test_runner_test: fail
@@ -45,6 +46,7 @@
standalone/io/secure_socket_argument_test: fail
standalone/io/stdout_bad_argument_test: fail
standalone/io/skipping_dart2js_compilations_test: fail
+standalone/io/dependency_graph_test: fail # http/dartbug.com/12449
standalone/io/url_encoding_test: fail
standalone/io/web_socket_protocol_processor_test: fail
standalone/io/test_runner_test: fail
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 41d369f..97c4189 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -17,7 +17,6 @@
mirrors/method_mirror_name_test: Fail # Issue 6335
mirrors/method_mirror_properties_test: Fail # Issue 11861
mirrors/method_mirror_returntype_test : Fail # Issue 11928
-mirrors/mixin_members_test : Fail # Issue 11863
mirrors/mirrors_test: Fail # TODO(ahe): I'm working on fixing this.
mirrors/null_test : Fail # Issue 12129
mirrors/library_metadata_test: Fail # Issue 10905
@@ -102,6 +101,7 @@
async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
mirrors/operator_test: Fail # http://dartbug.com/11944
mirrors/mixin_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
+mirrors/hierarchy_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
[ $compiler == none && $runtime == drt ]
async/timer_isolate_test: Skip # See Issue 4997
diff --git a/tests/lib/mirrors/hierarchy_test.dart b/tests/lib/mirrors/hierarchy_test.dart
new file mode 100644
index 0000000..44ad0f2
--- /dev/null
+++ b/tests/lib/mirrors/hierarchy_test.dart
@@ -0,0 +1,56 @@
+// 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.
+
+library hierarchy_test;
+
+@MirrorsUsed(targets: 'hierarchy_test, Object')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FooMixin {
+ foo() => print('foo');
+}
+
+class Qux {
+ qux() => print('qux');
+}
+
+class Bar extends Qux implements FooMixin {
+ bar() => print('bar');
+ foo() => print('foo');
+}
+
+class Baz extends Qux with FooMixin {
+ bar() => print('bar');
+}
+
+stringifyHierarchy(mirror) {
+ var sb = new StringBuffer();
+ for (var type = mirror.type; type != null; type = type.superclass) {
+ sb.write('> ${MirrorSystem.getName(type.qualifiedName)}\n');
+ for (var i in type.superinterfaces) {
+ sb.write(' + ${MirrorSystem.getName(i.qualifiedName)}\n');
+ }
+ }
+ return '$sb';
+}
+
+main() {
+ Expect.stringEquals('''
+> hierarchy_test.Bar
+ + hierarchy_test.FooMixin
+> hierarchy_test.Qux
+> dart.core.Object
+''', stringifyHierarchy(reflect(new Bar()..foo()..bar()..qux())));
+
+ // TODO(ahe): Using wrong mixin syntax, see http://dartbug.com/12464.
+ Expect.stringEquals('''
+> hierarchy_test.Baz
+> hierarchy_test.FooMixin(hierarchy_test.Qux)
+ + hierarchy_test.FooMixin
+> hierarchy_test.Qux
+> dart.core.Object
+''', stringifyHierarchy(reflect(new Baz()..foo()..bar()..qux())));
+}
diff --git a/tests/lib/mirrors/library_uri_io_test.dart b/tests/lib/mirrors/library_uri_io_test.dart
index 1ee7b4c..c7ff851 100644
--- a/tests/lib/mirrors/library_uri_io_test.dart
+++ b/tests/lib/mirrors/library_uri_io_test.dart
@@ -24,10 +24,8 @@
var mirrors = currentMirrorSystem();
test("Test current library uri", () {
String appendSlash(String path) => path.endsWith('/') ? path : '$path/';
- Uri cwd = new Uri(
- scheme: 'file',
- path: appendSlash(new Path(new File('.').fullPathSync()).toString()));
- Uri uri = cwd.resolve(new Path(Platform.script).toString());
+ Uri cwd = new Uri.file(appendSlash(new File('.').fullPathSync()));
+ Uri uri = cwd.resolveUri(new Uri.file(Platform.script));
testLibraryUri(new Class(), uri);
});
}
diff --git a/tests/lib/mirrors/mixin_members_test.dart b/tests/lib/mirrors/mixin_members_test.dart
index 4b82534..eca7166 100644
--- a/tests/lib/mirrors/mixin_members_test.dart
+++ b/tests/lib/mirrors/mixin_members_test.dart
@@ -2,10 +2,16 @@
// 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.
+library mixin_members_test;
+
+// TODO(ahe): Don't add mirrors used, the test doesn't work without it.
+@MirrorsUsed(targets: 'mixin_members_test', override: '*')
import "dart:mirrors";
import "package:expect/expect.dart";
+import 'stringify.dart';
+
class Fooer {
foo1();
}
@@ -29,21 +35,24 @@
main() {
ClassMirror cm = reflectClass(C);
- Classmirror sM1M2 = cm.superclass;
- Classmirror sM1 = sM1M2.superclass;
+ ClassMirror sM1M2 = cm.superclass;
+ ClassMirror sM1 = sM1M2.superclass;
ClassMirror s = sM1.superclass;
- Expect.equals(0, cm.members.length);
- Expect.setEquals(sM1M2.members.keys,
- [const Symbol("baz1"), const Symbol("baz2")]);
- Expect.setEquals(sM1M2.superinterfaces.map((e) => e.simpleName),
- [const Symbol("M2")]);
- Expect.setEquals(sM1.members.keys,
- [const Symbol("bar1"), const Symbol("bar2")]);
- Expect.setEquals(sM1.superinterfaces.map((e) => e.simpleName),
- [const Symbol("M1")]);
- Expect.setEquals(s.members.keys.toSet(),
- [const Symbol("foo1"), const Symbol("foo2")]);
- Expect.setEquals(s.superinterfaces.map((e) => e.simpleName),
- [const Symbol("Fooer")]);
- Expect.equals(true, reflectClass(S) == s);
+ expect('{}', cm.members);
+ expect('[s(baz1), s(baz2)]',
+ // TODO(ahe): Shouldn't have to sort.
+ sort(sM1M2.members.keys),
+ '(S with M1, M2).members');
+ expect('[s(M2)]', simpleNames(sM1M2.superinterfaces),
+ '(S with M1, M2).superinterfaces');
+ expect('[s(bar1), s(bar2)]',
+ // TODO(ahe): Shouldn't have to sort.
+ sort(sM1.members.keys), '(S with M1).members');
+ expect('[s(M1)]', simpleNames(sM1.superinterfaces),
+ '(S with M1).superinterfaces');
+ expect('[s(foo1), s(foo2)]',
+ // TODO(ahe): Shouldn't have to sort.
+ sort(s.members.keys), 's.members');
+ expect('[s(Fooer)]', simpleNames(s.superinterfaces), 's.superinterfaces');
+ Expect.equals(s, reflectClass(S));
}
diff --git a/tests/lib/mirrors/mixin_test.dart b/tests/lib/mirrors/mixin_test.dart
index 86ca0c8..eb70034 100644
--- a/tests/lib/mirrors/mixin_test.dart
+++ b/tests/lib/mirrors/mixin_test.dart
@@ -65,11 +65,14 @@
'Class(s(Mixin) in s(test.mixin_test), top-level)',
'Class(s(Object) in s(dart.core), top-level)',
]);
+
expect(
- '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
- ' i: Variable(s(i) in s(Mixin)),'
+ '{i: Variable(s(i) in s(Mixin)),'
' m: Method(s(m) in s(Mixin))}',
reflectClass(Mixin).members);
+
+ expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+ reflectClass(Mixin).constructors);
}
testMixin2() {
@@ -77,11 +80,14 @@
'Class(s(Mixin2) in s(test.mixin_test), top-level)',
'Class(s(Object) in s(dart.core), top-level)',
]);
+
expect(
- '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor),'
- ' i2: Variable(s(i2) in s(Mixin2)),'
+ '{i2: Variable(s(i2) in s(Mixin2)),'
' m2: Method(s(m2) in s(Mixin2))}',
reflectClass(Mixin2).members);
+
+ expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+ reflectClass(Mixin2).constructors);
}
testMixinApplication() {
@@ -94,12 +100,14 @@
]);
expect(
- '{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
- ' constructor),'
- ' i: Variable(s(i) in s(MixinApplication)),'
+ '{i: Variable(s(i) in s(MixinApplication)),'
' m: Method(s(m) in s(MixinApplication))}',
reflectClass(MixinApplication).members);
+ expect('{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
+ ' constructor)}',
+ reflectClass(MixinApplication).constructors);
+
expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
}
@@ -114,19 +122,26 @@
]);
expect(
- '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
- ' constructor),'
- ' i2: Variable(s(i2) in s(MixinApplicationA)),'
+ // TODO(ahe): The owner should be the mixin.
+ '{i2: Variable(s(i2) in s(MixinApplicationA)),'
' m2: Method(s(m2) in s(MixinApplicationA))}',
reflectClass(MixinApplicationA).members);
expect(
- // TODO(ahe): The owner should probably be the mixin application.
- '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
- ' i: Variable(s(i) in s(Mixin)),'
+ '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
+ ' constructor)}',
+ reflectClass(MixinApplicationA).constructors);
+
+ expect(
+ '{i: Variable(s(i) in s(Mixin)),'
' m: Method(s(m) in s(Mixin))}',
reflectClass(MixinApplicationA).superclass.members);
+ expect(
+ // TODO(ahe): The owner should be the mixin application.
+ '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+ reflectClass(MixinApplicationA).superclass.constructors);
+
expectSame(
reflectClass(C),
reflectClass(MixinApplicationA).superclass.superclass);
@@ -142,12 +157,15 @@
]);
expect(
- '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
- ' in s(UnusedMixinApplication), constructor),'
- ' i: Variable(s(i) in s(UnusedMixinApplication)),'
+ '{i: Variable(s(i) in s(UnusedMixinApplication)),'
' m: Method(s(m) in s(UnusedMixinApplication))}',
reflectClass(UnusedMixinApplication).members);
+ expect(
+ '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
+ ' in s(UnusedMixinApplication), constructor)}',
+ reflectClass(UnusedMixinApplication).constructors);
+
expectSame(reflectClass(C), reflectClass(UnusedMixinApplication).superclass);
}
@@ -162,17 +180,23 @@
]);
expect(
- '{Subclass: Method(s(Subclass) in s(Subclass), constructor),'
- ' f: Method(s(f) in s(Subclass))}',
+ '{f: Method(s(f) in s(Subclass))}',
reflectClass(Subclass).members);
expect(
- // TODO(ahe): The owner should probably be the mixin application.
- '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
- ' i: Variable(s(i) in s(Mixin)),'
+ '{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
+ reflectClass(Subclass).constructors);
+
+ expect(
+ '{i: Variable(s(i) in s(Mixin)),'
' m: Method(s(m) in s(Mixin))}',
reflectClass(Subclass).superclass.members);
+ expect(
+ // TODO(ahe): The owner should be the mixin application.
+ '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+ reflectClass(Subclass).superclass.constructors);
+
expectSame(
reflectClass(C),
reflectClass(Subclass).superclass.superclass);
@@ -189,10 +213,13 @@
]);
expect(
- '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor),'
- ' g: Method(s(g) in s(Subclass2))}',
+ '{g: Method(s(g) in s(Subclass2))}',
reflectClass(Subclass2).members);
+ expect(
+ '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
+ reflectClass(Subclass2).constructors);
+
expectSame(
reflectClass(MixinApplication),
reflectClass(Subclass2).superclass);
@@ -211,24 +238,33 @@
]);
expect(
- '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor),'
- ' fa: Method(s(fa) in s(SubclassA))}',
+ '{fa: Method(s(fa) in s(SubclassA))}',
reflectClass(SubclassA).members);
expect(
- // TODO(ahe): The owner should probably be the mixin application.
- '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor),'
- ' i2: Variable(s(i2) in s(Mixin2)),'
+ '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
+ reflectClass(SubclassA).constructors);
+
+ expect(
+ '{i2: Variable(s(i2) in s(Mixin2)),'
' m2: Method(s(m2) in s(Mixin2))}',
reflectClass(SubclassA).superclass.members);
expect(
- // TODO(ahe): The owner should probably be the mixin application.
- '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
- ' i: Variable(s(i) in s(Mixin)),'
+ // TODO(ahe): The owner should be the mixin application.
+ '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+ reflectClass(SubclassA).superclass.constructors);
+
+ expect(
+ '{i: Variable(s(i) in s(Mixin)),'
' m: Method(s(m) in s(Mixin))}',
reflectClass(SubclassA).superclass.superclass.members);
+ expect(
+ // TODO(ahe): The owner should be the mixin application.
+ '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+ reflectClass(SubclassA).superclass.superclass.constructors);
+
expectSame(
reflectClass(C),
reflectClass(SubclassA).superclass.superclass.superclass);
@@ -246,10 +282,13 @@
]);
expect(
- '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor),'
- ' ga: Method(s(ga) in s(Subclass2A))}',
+ '{ga: Method(s(ga) in s(Subclass2A))}',
reflectClass(Subclass2A).members);
+ expect(
+ '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
+ reflectClass(Subclass2A).constructors);
+
expectSame(reflectClass(MixinApplicationA),
reflectClass(Subclass2A).superclass);
}
diff --git a/tests/lib/mirrors/null_test.dart b/tests/lib/mirrors/null_test.dart
index 2a8a8ba..10b92f3 100644
--- a/tests/lib/mirrors/null_test.dart
+++ b/tests/lib/mirrors/null_test.dart
@@ -26,6 +26,7 @@
'noSuchMethod');
ClassMirror NullMirror = nullMirror.type;
+ Expect.equals(reflectClass(Null), NullMirror);
Expect.equals(const Symbol('Null'), NullMirror.simpleName);
Expect.equals(const Symbol('Object'), NullMirror.superclass.simpleName);
Expect.equals(null, NullMirror.superclass.superclass);
diff --git a/tests/lib/mirrors/stringify.dart b/tests/lib/mirrors/stringify.dart
index 731403b..9778772 100644
--- a/tests/lib/mirrors/stringify.dart
+++ b/tests/lib/mirrors/stringify.dart
@@ -26,7 +26,7 @@
return '{$buffer}';
}
-stringifyList(List list) {
+stringifyIterable(Iterable list) {
var buffer = new StringBuffer();
bool first = true;
for (String value in list.map(stringify)) {
@@ -100,7 +100,7 @@
stringify(value) {
if (value is Map) return stringifyMap(value);
- if (value is List) return stringifyList(value);
+ if (value is Iterable) return stringifyIterable(value);
if (value is ParameterMirror) return stringifyParameter(value);
if (value is VariableMirror) return stringifyVariable(value);
if (value is MethodMirror) return stringifyMethod(value);
@@ -111,8 +111,14 @@
throw 'Unexpected value: $value';
}
-expect(expected, actual) => Expect.stringEquals(expected, stringify(actual));
+expect(expected, actual, [String reason]) {
+ Expect.stringEquals(expected, stringify(actual), reason);
+}
compareSymbols(Symbol a, Symbol b) {
return MirrorSystem.getName(a).compareTo(MirrorSystem.getName(b));
}
+
+simpleNames(Iterable<Mirror> i) => i.map((e) => e.simpleName);
+
+sort(Iterable<Symbol> symbols) => symbols.toList()..sort(compareSymbols);
diff --git a/tests/lib/mirrors/unmangled_type_test.dart b/tests/lib/mirrors/unmangled_type_test.dart
new file mode 100644
index 0000000..dbc6b62
--- /dev/null
+++ b/tests/lib/mirrors/unmangled_type_test.dart
@@ -0,0 +1,15 @@
+// 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:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Foo {
+}
+
+main() {
+ Expect.stringEquals('Foo', '${new Foo().runtimeType}');
+ Expect.stringEquals('foo', MirrorSystem.getName(new Symbol('foo')));
+}
diff --git a/tests/lib/typed_data/float32x4_cross_test.dart b/tests/lib/typed_data/float32x4_cross_test.dart
index 0816846..3268488 100644
--- a/tests/lib/typed_data/float32x4_cross_test.dart
+++ b/tests/lib/typed_data/float32x4_cross_test.dart
@@ -10,11 +10,11 @@
import 'package:expect/expect.dart';
Float32x4 cross(Float32x4 a, Float32x4 b) {
- var t0 = a.yzxw;
- var t1 = b.zxyw;
+ var t0 = a.shuffle(Float32x4.YZXW);
+ var t1 = b.shuffle(Float32x4.ZXYW);
var l = t0 * t1;
- t0 = a.zxyw;
- t1 = b.yzxw;
+ t0 = a.shuffle(Float32x4.ZXYW);
+ t1 = b.shuffle(Float32x4.YZXW);
var r = t0 * t1;
return l-r;
}
diff --git a/tests/lib/typed_data/float32x4_shuffle_test.dart b/tests/lib/typed_data/float32x4_shuffle_test.dart
index a863f12..d12f86d 100644
--- a/tests/lib/typed_data/float32x4_shuffle_test.dart
+++ b/tests/lib/typed_data/float32x4_shuffle_test.dart
@@ -9,1300 +9,1360 @@
import "package:expect/expect.dart";
import 'dart:typed_data';
-void testShuffle0() {
+void testShuffle00() {
var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
var c;
- c = m.xxxx;
+ c = m.shuffle(Float32x4.XXXX);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xxxy;
+ c = m.shuffle(Float32x4.XXXY);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xxxz;
+ c = m.shuffle(Float32x4.XXXZ);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xxxw;
+ c = m.shuffle(Float32x4.XXXW);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xxyx;
+ c = m.shuffle(Float32x4.XXYX);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xxyy;
+ c = m.shuffle(Float32x4.XXYY);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xxyz;
+ c = m.shuffle(Float32x4.XXYZ);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xxyw;
+ c = m.shuffle(Float32x4.XXYW);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xxzx;
+ c = m.shuffle(Float32x4.XXZX);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xxzy;
+ c = m.shuffle(Float32x4.XXZY);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xxzz;
+ c = m.shuffle(Float32x4.XXZZ);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xxzw;
+ c = m.shuffle(Float32x4.XXZW);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xxwx;
+ c = m.shuffle(Float32x4.XXWX);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xxwy;
+ c = m.shuffle(Float32x4.XXWY);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xxwz;
+ c = m.shuffle(Float32x4.XXWZ);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xxww;
+ c = m.shuffle(Float32x4.XXWW);
Expect.equals(1.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xyxx;
+}
+
+void testShuffle01() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.XYXX);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xyxy;
+ c = m.shuffle(Float32x4.XYXY);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xyxz;
+ c = m.shuffle(Float32x4.XYXZ);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xyxw;
+ c = m.shuffle(Float32x4.XYXW);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xyyx;
+ c = m.shuffle(Float32x4.XYYX);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xyyy;
+ c = m.shuffle(Float32x4.XYYY);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xyyz;
+ c = m.shuffle(Float32x4.XYYZ);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xyyw;
+ c = m.shuffle(Float32x4.XYYW);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xyzx;
+ c = m.shuffle(Float32x4.XYZX);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xyzy;
+ c = m.shuffle(Float32x4.XYZY);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xyzz;
+ c = m.shuffle(Float32x4.XYZZ);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xyzw;
+ c = m.shuffle(Float32x4.XYZW);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xywx;
+ c = m.shuffle(Float32x4.XYWX);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xywy;
+ c = m.shuffle(Float32x4.XYWY);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xywz;
+ c = m.shuffle(Float32x4.XYWZ);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xyww;
+ c = m.shuffle(Float32x4.XYWW);
Expect.equals(1.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xzxx;
+}
+
+void testShuffle02() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.XZXX);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xzxy;
+ c = m.shuffle(Float32x4.XZXY);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xzxz;
+ c = m.shuffle(Float32x4.XZXZ);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xzxw;
+ c = m.shuffle(Float32x4.XZXW);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xzyx;
+ c = m.shuffle(Float32x4.XZYX);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xzyy;
+ c = m.shuffle(Float32x4.XZYY);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xzyz;
+ c = m.shuffle(Float32x4.XZYZ);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xzyw;
+ c = m.shuffle(Float32x4.XZYW);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xzzx;
+ c = m.shuffle(Float32x4.XZZX);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xzzy;
+ c = m.shuffle(Float32x4.XZZY);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xzzz;
+ c = m.shuffle(Float32x4.XZZZ);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xzzw;
+ c = m.shuffle(Float32x4.XZZW);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xzwx;
+ c = m.shuffle(Float32x4.XZWX);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xzwy;
+ c = m.shuffle(Float32x4.XZWY);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xzwz;
+ c = m.shuffle(Float32x4.XZWZ);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xzww;
+ c = m.shuffle(Float32x4.XZWW);
Expect.equals(1.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xwxx;
+}
+
+void testShuffle03() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.XWXX);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xwxy;
+ c = m.shuffle(Float32x4.XWXY);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xwxz;
+ c = m.shuffle(Float32x4.XWXZ);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xwxw;
+ c = m.shuffle(Float32x4.XWXW);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xwyx;
+ c = m.shuffle(Float32x4.XWYX);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xwyy;
+ c = m.shuffle(Float32x4.XWYY);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xwyz;
+ c = m.shuffle(Float32x4.XWYZ);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xwyw;
+ c = m.shuffle(Float32x4.XWYW);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xwzx;
+ c = m.shuffle(Float32x4.XWZX);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xwzy;
+ c = m.shuffle(Float32x4.XWZY);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xwzz;
+ c = m.shuffle(Float32x4.XWZZ);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xwzw;
+ c = m.shuffle(Float32x4.XWZW);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.xwwx;
+ c = m.shuffle(Float32x4.XWWX);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.xwwy;
+ c = m.shuffle(Float32x4.XWWY);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.xwwz;
+ c = m.shuffle(Float32x4.XWWZ);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.xwww;
+ c = m.shuffle(Float32x4.XWWW);
Expect.equals(1.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
}
-void testShuffle1() {
+void testShuffle10() {
var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
var c;
- c = m.yxxx;
+ c = m.shuffle(Float32x4.YXXX);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yxxy;
+ c = m.shuffle(Float32x4.YXXY);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yxxz;
+ c = m.shuffle(Float32x4.YXXZ);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yxxw;
+ c = m.shuffle(Float32x4.YXXW);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yxyx;
+ c = m.shuffle(Float32x4.YXYX);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yxyy;
+ c = m.shuffle(Float32x4.YXYY);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yxyz;
+ c = m.shuffle(Float32x4.YXYZ);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yxyw;
+ c = m.shuffle(Float32x4.YXYW);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yxzx;
+ c = m.shuffle(Float32x4.YXZX);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yxzy;
+ c = m.shuffle(Float32x4.YXZY);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yxzz;
+ c = m.shuffle(Float32x4.YXZZ);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yxzw;
+ c = m.shuffle(Float32x4.YXZW);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yxwx;
+ c = m.shuffle(Float32x4.YXWX);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yxwy;
+ c = m.shuffle(Float32x4.YXWY);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yxwz;
+ c = m.shuffle(Float32x4.YXWZ);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yxww;
+ c = m.shuffle(Float32x4.YXWW);
Expect.equals(2.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yyxx;
+}
+
+void testShuffle11() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.YYXX);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yyxy;
+ c = m.shuffle(Float32x4.YYXY);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yyxz;
+ c = m.shuffle(Float32x4.YYXZ);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yyxw;
+ c = m.shuffle(Float32x4.YYXW);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yyyx;
+ c = m.shuffle(Float32x4.YYYX);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yyyy;
+ c = m.shuffle(Float32x4.YYYY);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yyyz;
+ c = m.shuffle(Float32x4.YYYZ);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yyyw;
+ c = m.shuffle(Float32x4.YYYW);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yyzx;
+ c = m.shuffle(Float32x4.YYZX);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yyzy;
+ c = m.shuffle(Float32x4.YYZY);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yyzz;
+ c = m.shuffle(Float32x4.YYZZ);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yyzw;
+ c = m.shuffle(Float32x4.YYZW);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yywx;
+ c = m.shuffle(Float32x4.YYWX);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yywy;
+ c = m.shuffle(Float32x4.YYWY);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yywz;
+ c = m.shuffle(Float32x4.YYWZ);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yyww;
+ c = m.shuffle(Float32x4.YYWW);
Expect.equals(2.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yzxx;
+}
+
+void testShuffle12() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.YZXX);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yzxy;
+ c = m.shuffle(Float32x4.YZXY);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yzxz;
+ c = m.shuffle(Float32x4.YZXZ);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yzxw;
+ c = m.shuffle(Float32x4.YZXW);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yzyx;
+ c = m.shuffle(Float32x4.YZYX);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yzyy;
+ c = m.shuffle(Float32x4.YZYY);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yzyz;
+ c = m.shuffle(Float32x4.YZYZ);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yzyw;
+ c = m.shuffle(Float32x4.YZYW);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yzzx;
+ c = m.shuffle(Float32x4.YZZX);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yzzy;
+ c = m.shuffle(Float32x4.YZZY);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yzzz;
+ c = m.shuffle(Float32x4.YZZZ);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yzzw;
+ c = m.shuffle(Float32x4.YZZW);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.yzwx;
+ c = m.shuffle(Float32x4.YZWX);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.yzwy;
+ c = m.shuffle(Float32x4.YZWY);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.yzwz;
+ c = m.shuffle(Float32x4.YZWZ);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.yzww;
+ c = m.shuffle(Float32x4.YZWW);
Expect.equals(2.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.ywxx;
+}
+
+void testShuffle13() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.YWXX);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.ywxy;
+ c = m.shuffle(Float32x4.YWXY);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.ywxz;
+ c = m.shuffle(Float32x4.YWXZ);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.ywxw;
+ c = m.shuffle(Float32x4.YWXW);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.ywyx;
+ c = m.shuffle(Float32x4.YWYX);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.ywyy;
+ c = m.shuffle(Float32x4.YWYY);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.ywyz;
+ c = m.shuffle(Float32x4.YWYZ);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.ywyw;
+ c = m.shuffle(Float32x4.YWYW);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.ywzx;
+ c = m.shuffle(Float32x4.YWZX);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.ywzy;
+ c = m.shuffle(Float32x4.YWZY);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.ywzz;
+ c = m.shuffle(Float32x4.YWZZ);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.ywzw;
+ c = m.shuffle(Float32x4.YWZW);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.ywwx;
+ c = m.shuffle(Float32x4.YWWX);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.ywwy;
+ c = m.shuffle(Float32x4.YWWY);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.ywwz;
+ c = m.shuffle(Float32x4.YWWZ);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.ywww;
+ c = m.shuffle(Float32x4.YWWW);
Expect.equals(2.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
}
-void testShuffle2() {
+void testShuffle20() {
var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
var c;
- c = m.zxxx;
+ c = m.shuffle(Float32x4.ZXXX);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zxxy;
+ c = m.shuffle(Float32x4.ZXXY);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zxxz;
+ c = m.shuffle(Float32x4.ZXXZ);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zxxw;
+ c = m.shuffle(Float32x4.ZXXW);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zxyx;
+ c = m.shuffle(Float32x4.ZXYX);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zxyy;
+ c = m.shuffle(Float32x4.ZXYY);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zxyz;
+ c = m.shuffle(Float32x4.ZXYZ);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zxyw;
+ c = m.shuffle(Float32x4.ZXYW);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zxzx;
+ c = m.shuffle(Float32x4.ZXZX);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zxzy;
+ c = m.shuffle(Float32x4.ZXZY);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zxzz;
+ c = m.shuffle(Float32x4.ZXZZ);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zxzw;
+ c = m.shuffle(Float32x4.ZXZW);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zxwx;
+ c = m.shuffle(Float32x4.ZXWX);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zxwy;
+ c = m.shuffle(Float32x4.ZXWY);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zxwz;
+ c = m.shuffle(Float32x4.ZXWZ);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zxww;
+ c = m.shuffle(Float32x4.ZXWW);
Expect.equals(3.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zyxx;
+}
+
+void testShuffle21() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.ZYXX);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zyxy;
+ c = m.shuffle(Float32x4.ZYXY);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zyxz;
+ c = m.shuffle(Float32x4.ZYXZ);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zyxw;
+ c = m.shuffle(Float32x4.ZYXW);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zyyx;
+ c = m.shuffle(Float32x4.ZYYX);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zyyy;
+ c = m.shuffle(Float32x4.ZYYY);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zyyz;
+ c = m.shuffle(Float32x4.ZYYZ);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zyyw;
+ c = m.shuffle(Float32x4.ZYYW);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zyzx;
+ c = m.shuffle(Float32x4.ZYZX);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zyzy;
+ c = m.shuffle(Float32x4.ZYZY);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zyzz;
+ c = m.shuffle(Float32x4.ZYZZ);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zyzw;
+ c = m.shuffle(Float32x4.ZYZW);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zywx;
+ c = m.shuffle(Float32x4.ZYWX);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zywy;
+ c = m.shuffle(Float32x4.ZYWY);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zywz;
+ c = m.shuffle(Float32x4.ZYWZ);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zyww;
+ c = m.shuffle(Float32x4.ZYWW);
Expect.equals(3.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zzxx;
+}
+
+void testShuffle22() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.ZZXX);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zzxy;
+ c = m.shuffle(Float32x4.ZZXY);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zzxz;
+ c = m.shuffle(Float32x4.ZZXZ);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zzxw;
+ c = m.shuffle(Float32x4.ZZXW);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zzyx;
+ c = m.shuffle(Float32x4.ZZYX);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zzyy;
+ c = m.shuffle(Float32x4.ZZYY);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zzyz;
+ c = m.shuffle(Float32x4.ZZYZ);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zzyw;
+ c = m.shuffle(Float32x4.ZZYW);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zzzx;
+ c = m.shuffle(Float32x4.ZZZX);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zzzy;
+ c = m.shuffle(Float32x4.ZZZY);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zzzz;
+ c = m.shuffle(Float32x4.ZZZZ);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zzzw;
+ c = m.shuffle(Float32x4.ZZZW);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zzwx;
+ c = m.shuffle(Float32x4.ZZWX);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zzwy;
+ c = m.shuffle(Float32x4.ZZWY);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zzwz;
+ c = m.shuffle(Float32x4.ZZWZ);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zzww;
+ c = m.shuffle(Float32x4.ZZWW);
Expect.equals(3.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zwxx;
+}
+
+void testShuffle23() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.ZWXX);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zwxy;
+ c = m.shuffle(Float32x4.ZWXY);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zwxz;
+ c = m.shuffle(Float32x4.ZWXZ);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zwxw;
+ c = m.shuffle(Float32x4.ZWXW);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zwyx;
+ c = m.shuffle(Float32x4.ZWYX);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zwyy;
+ c = m.shuffle(Float32x4.ZWYY);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zwyz;
+ c = m.shuffle(Float32x4.ZWYZ);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zwyw;
+ c = m.shuffle(Float32x4.ZWYW);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zwzx;
+ c = m.shuffle(Float32x4.ZWZX);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zwzy;
+ c = m.shuffle(Float32x4.ZWZY);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zwzz;
+ c = m.shuffle(Float32x4.ZWZZ);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zwzw;
+ c = m.shuffle(Float32x4.ZWZW);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.zwwx;
+ c = m.shuffle(Float32x4.ZWWX);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.zwwy;
+ c = m.shuffle(Float32x4.ZWWY);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.zwwz;
+ c = m.shuffle(Float32x4.ZWWZ);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.zwww;
+ c = m.shuffle(Float32x4.ZWWW);
Expect.equals(3.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
}
-void testShuffle3() {
+void testShuffle30() {
var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
var c;
- c = m.wxxx;
+ c = m.shuffle(Float32x4.WXXX);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wxxy;
+ c = m.shuffle(Float32x4.WXXY);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wxxz;
+ c = m.shuffle(Float32x4.WXXZ);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wxxw;
+ c = m.shuffle(Float32x4.WXXW);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wxyx;
+ c = m.shuffle(Float32x4.WXYX);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wxyy;
+ c = m.shuffle(Float32x4.WXYY);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wxyz;
+ c = m.shuffle(Float32x4.WXYZ);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wxyw;
+ c = m.shuffle(Float32x4.WXYW);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wxzx;
+ c = m.shuffle(Float32x4.WXZX);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wxzy;
+ c = m.shuffle(Float32x4.WXZY);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wxzz;
+ c = m.shuffle(Float32x4.WXZZ);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wxzw;
+ c = m.shuffle(Float32x4.WXZW);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wxwx;
+ c = m.shuffle(Float32x4.WXWX);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wxwy;
+ c = m.shuffle(Float32x4.WXWY);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wxwz;
+ c = m.shuffle(Float32x4.WXWZ);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wxww;
+ c = m.shuffle(Float32x4.WXWW);
Expect.equals(4.0, c.x);
Expect.equals(1.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wyxx;
+}
+
+void testShuffle31() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.WYXX);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wyxy;
+ c = m.shuffle(Float32x4.WYXY);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wyxz;
+ c = m.shuffle(Float32x4.WYXZ);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wyxw;
+ c = m.shuffle(Float32x4.WYXW);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wyyx;
+ c = m.shuffle(Float32x4.WYYX);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wyyy;
+ c = m.shuffle(Float32x4.WYYY);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wyyz;
+ c = m.shuffle(Float32x4.WYYZ);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wyyw;
+ c = m.shuffle(Float32x4.WYYW);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wyzx;
+ c = m.shuffle(Float32x4.WYZX);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wyzy;
+ c = m.shuffle(Float32x4.WYZY);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wyzz;
+ c = m.shuffle(Float32x4.WYZZ);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wyzw;
+ c = m.shuffle(Float32x4.WYZW);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wywx;
+ c = m.shuffle(Float32x4.WYWX);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wywy;
+ c = m.shuffle(Float32x4.WYWY);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wywz;
+ c = m.shuffle(Float32x4.WYWZ);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wyww;
+ c = m.shuffle(Float32x4.WYWW);
Expect.equals(4.0, c.x);
Expect.equals(2.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wzxx;
+}
+
+void testShuffle32() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.WZXX);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wzxy;
+ c = m.shuffle(Float32x4.WZXY);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wzxz;
+ c = m.shuffle(Float32x4.WZXZ);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wzxw;
+ c = m.shuffle(Float32x4.WZXW);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wzyx;
+ c = m.shuffle(Float32x4.WZYX);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wzyy;
+ c = m.shuffle(Float32x4.WZYY);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wzyz;
+ c = m.shuffle(Float32x4.WZYZ);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wzyw;
+ c = m.shuffle(Float32x4.WZYW);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wzzx;
+ c = m.shuffle(Float32x4.WZZX);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wzzy;
+ c = m.shuffle(Float32x4.WZZY);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wzzz;
+ c = m.shuffle(Float32x4.WZZZ);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wzzw;
+ c = m.shuffle(Float32x4.WZZW);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wzwx;
+ c = m.shuffle(Float32x4.WZWX);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wzwy;
+ c = m.shuffle(Float32x4.WZWY);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wzwz;
+ c = m.shuffle(Float32x4.WZWZ);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wzww;
+ c = m.shuffle(Float32x4.WZWW);
Expect.equals(4.0, c.x);
Expect.equals(3.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wwxx;
+}
+
+void testShuffle33() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.WWXX);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wwxy;
+ c = m.shuffle(Float32x4.WWXY);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wwxz;
+ c = m.shuffle(Float32x4.WWXZ);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wwxw;
+ c = m.shuffle(Float32x4.WWXW);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(1.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wwyx;
+ c = m.shuffle(Float32x4.WWYX);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wwyy;
+ c = m.shuffle(Float32x4.WWYY);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wwyz;
+ c = m.shuffle(Float32x4.WWYZ);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wwyw;
+ c = m.shuffle(Float32x4.WWYW);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(2.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wwzx;
+ c = m.shuffle(Float32x4.WWZX);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wwzy;
+ c = m.shuffle(Float32x4.WWZY);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wwzz;
+ c = m.shuffle(Float32x4.WWZZ);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wwzw;
+ c = m.shuffle(Float32x4.WWZW);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(3.0, c.z);
Expect.equals(4.0, c.w);
- c = m.wwwx;
+ c = m.shuffle(Float32x4.WWWX);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(1.0, c.w);
- c = m.wwwy;
+ c = m.shuffle(Float32x4.WWWY);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(2.0, c.w);
- c = m.wwwz;
+ c = m.shuffle(Float32x4.WWWZ);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
Expect.equals(3.0, c.w);
- c = m.wwww;
+ c = m.shuffle(Float32x4.WWWW);
Expect.equals(4.0, c.x);
Expect.equals(4.0, c.y);
Expect.equals(4.0, c.z);
@@ -1310,11 +1370,68 @@
}
+void testShuffleNonConstant(mask) {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(mask);
+ if (mask == 1) {
+ Expect.equals(2.0, c.x);
+ Expect.equals(1.0, c.y);
+ Expect.equals(1.0, c.z);
+ Expect.equals(1.0, c.w);
+ } else {
+ Expect.equals(Float32x4.YYYY + 1, mask);
+ Expect.equals(3.0, c.x);
+ Expect.equals(2.0, c.y);
+ Expect.equals(2.0, c.z);
+ Expect.equals(2.0, c.w);
+ }
+}
+
+void testInvalidShuffle(mask) {
+ // Not a valid mask.
+ Expect.isFalse(mask <= 255 && mask >= 0);
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ Expect.throws(() {
+ c = m.shuffle(mask);
+ });
+}
+
+void testShuffle() {
+ var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+ var c;
+ c = m.shuffle(Float32x4.WZYX);
+ Expect.equals(4.0, c.x);
+ Expect.equals(3.0, c.y);
+ Expect.equals(2.0, c.z);
+ Expect.equals(1.0, c.w);
+}
+
main() {
+ var xxxx = Float32x4.XXXX + 1;
+ var yyyy = Float32x4.YYYY + 1;
for (int i = 0; i < 20; i++) {
- testShuffle0();
- testShuffle1();
- testShuffle2();
- testShuffle3();
+ testShuffle();
+ testShuffle00();
+ testShuffle01();
+ testShuffle02();
+ testShuffle03();
+ testShuffle10();
+ testShuffle11();
+ testShuffle12();
+ testShuffle13();
+ testShuffle20();
+ testShuffle21();
+ testShuffle22();
+ testShuffle23();
+ testShuffle30();
+ testShuffle31();
+ testShuffle32();
+ testShuffle33();
+ testShuffleNonConstant(xxxx);
+ testShuffleNonConstant(yyyy);
+ testInvalidShuffle(256);
+ testInvalidShuffle(-1);
}
}
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index cc24455..41401b8 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -130,42 +130,42 @@
testShuffle() {
var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
- var xxxx = m.xxxx;
+ var xxxx = m.shuffle(Float32x4.XXXX);
Expect.equals(1.0, xxxx.x);
Expect.equals(1.0, xxxx.y);
Expect.equals(1.0, xxxx.z);
Expect.equals(1.0, xxxx.w);
- var yyyy = m.yyyy;
+ var yyyy = m.shuffle(Float32x4.YYYY);
Expect.equals(2.0, yyyy.x);
Expect.equals(2.0, yyyy.y);
Expect.equals(2.0, yyyy.z);
Expect.equals(2.0, yyyy.w);
- var zzzz = m.zzzz;
+ var zzzz = m.shuffle(Float32x4.ZZZZ);
Expect.equals(3.0, zzzz.x);
Expect.equals(3.0, zzzz.y);
Expect.equals(3.0, zzzz.z);
Expect.equals(3.0, zzzz.w);
- var wwww = m.wwww;
+ var wwww = m.shuffle(Float32x4.WWWW);
Expect.equals(4.0, wwww.x);
Expect.equals(4.0, wwww.y);
Expect.equals(4.0, wwww.z);
Expect.equals(4.0, wwww.w);
- var wzyx = m.wzyx;
+ var wzyx = m.shuffle(Float32x4.WZYX);
Expect.equals(4.0, wzyx.x);
Expect.equals(3.0, wzyx.y);
Expect.equals(2.0, wzyx.z);
Expect.equals(1.0, wzyx.w);
- var wwzz = m.wwzz;
+ var wwzz = m.shuffle(Float32x4.WWZZ);
Expect.equals(4.0, wwzz.x);
Expect.equals(4.0, wwzz.y);
Expect.equals(3.0, wwzz.z);
Expect.equals(3.0, wwzz.w);
- var xxyy = m.xxyy;
+ var xxyy = m.shuffle(Float32x4.XXYY);
Expect.equals(1.0, xxyy.x);
Expect.equals(1.0, xxyy.y);
Expect.equals(2.0, xxyy.z);
Expect.equals(2.0, xxyy.w);
- var yyww = m.yyww;
+ var yyww = m.shuffle(Float32x4.YYWW);
Expect.equals(2.0, yyww.x);
Expect.equals(2.0, yyww.y);
Expect.equals(4.0, yyww.z);
diff --git a/tests/standalone/io/certificate_test.dart b/tests/standalone/io/certificate_test.dart
deleted file mode 100644
index b4c8796..0000000
--- a/tests/standalone/io/certificate_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-// This test verifies that a server certificate can be verified by a client
-// that loads the certificate authority certificate it depends on at runtime.
-
-import "package:path/path.dart";
-import "dart:io";
-import "dart:async";
-
-String scriptDir = dirname(new Options().script);
-
-void main() {
- SecureSocket.initialize(database: join(scriptDir, 'pkcert'),
- password: 'dartdart');
- runServer().then((SecureServerSocket server) {
- return Process.run(new Options().executable,
- ['--checked',
- join(scriptDir, 'certificate_test_client.dart'),
- server.port.toString(),
- join(scriptDir, 'pkcert', 'myauthority.pem')]);
- }).then((ProcessResult result) {
- if (result.exitCode != 0 || !result.stdout.contains("SUCCESS")) {
- print("Client failed with exit code ${result.exitCode}");
- print(" stdout (expects \"SUCCESS\\n\"):");
- print(result.stdout);
- print(" stderr:");
- print(result.stderr);
- throw new AssertionError();
- }
- });
-}
-
-Future<SecureServerSocket> runServer() =>
- SecureServerSocket.bind("localhost", 0, "localhost_cert")
- .then((server) => server..listen(
- (socket) => socket.pipe(socket).then((_) => server.close())));
diff --git a/tests/standalone/io/certificate_test_client.dart b/tests/standalone/io/certificate_test_client.dart
deleted file mode 100644
index 4e3262d..0000000
--- a/tests/standalone/io/certificate_test_client.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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.
-//
-// Client that tests that a certificate authority certificate loaded
-// at runtime can be used to verify a certificate chain. The server it
-// connects to uses localhost_cert, signed by myauthority_cert, to connect
-// securely.
-
-import 'dart:io';
-
-void main() {
- int port = int.parse(new Options().arguments[0]);
- String certificate = new Options().arguments[1];
- SecureSocket.initialize();
- var mycert = new File(certificate).readAsBytesSync();
- bool threw = false;
- try {
- SecureSocket.addCertificate("I am not a cert".codeUnits,
- SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
- } on CertificateException catch (e) {
- threw = true;
- }
- if (!threw) throw "Expected bad certificate to throw";
-
- threw = false;
- try {
- SecureSocket.addCertificate(mycert, "Trust me, I'm a string");
- } on CertificateException catch (e) {
- threw = true;
- }
- if (!threw) throw "Expected bad trust string to throw";
-
- SecureSocket.addCertificate(mycert,
- SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
-
- SecureSocket.connect('localhost', port).then((SecureSocket socket) {
- socket.writeln('hello world');
- socket.listen((data) { });
- return socket.close();
- }).then((_) {
- SecureSocket.changeTrust('myauthority_cert', ',,');
- return SecureSocket.connect('localhost', port);
- }).then((_) {
- throw "Expected untrusted authority to stop connection";
- }, onError: (e) {
- if (e is! CertificateException) throw e;
- }).then((_) {
- SecureSocket.changeTrust('myauthority_cert', 'C,,');
- return SecureSocket.connect('localhost', port);
- }).then((SecureSocket socket) {
- socket.writeln('hello world');
- socket.listen((data) { });
- return socket.close();
- }).then((_) {
- SecureSocket.removeCertificate('myauthority_cert');
- return SecureSocket.connect('localhost', port);
- }).then((_) {
- throw "Expected untrusted root to stop connection";
- }, onError: (e) {
- if (e is! CertificateException) throw e;
- }).then((_) {
- print('SUCCESS'); // Checked by parent process.
- });
-}
diff --git a/tests/standalone/io/certificate_test_client_database.dart b/tests/standalone/io/certificate_test_client_database.dart
deleted file mode 100644
index 9723a6a..0000000
--- a/tests/standalone/io/certificate_test_client_database.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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.
-//
-// Client that tests that a certificate authority certificate loaded
-// at runtime can be used to verify a certificate chain. The server it
-// connects to uses localhost_cert, signed by myauthority_cert, to connect
-// securely. This client tests that addCertificate works if a certificate
-// database has been specified.
-
-import 'dart:io';
-
-void main() {
- int port = int.parse(new Options().arguments[0]);
- String certificate = new Options().arguments[1];
- String database = new Options().arguments[2];
- SecureSocket.initialize(database: database,
- password: 'dartdart',
- readOnly: false);
- SecureSocket.removeCertificate('localhost_cert');
- SecureSocket.removeCertificate('myauthority_cert');
- var mycert = new File(certificate).readAsBytesSync();
- SecureSocket.addCertificate(mycert,
- SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
- if (null != SecureSocket.getCertificate('myauthority_cert')) {
- throw "Expected getCertificate to return null";
- }
- SecureSocket.connect('localhost', port).then((SecureSocket socket) {
- socket.writeln('hello world');
- socket.listen((data) { });
- return socket.close();
- }).then((_) {
- // The certificate is only in the in-memory cache, so cannot be removed.
- try {
- SecureSocket.removeCertificate('myauthority_cert');
- } catch (e) {
- if (e is! CertificateException) throw "error $e";
- }
- }).then((_) {
- print('SUCCESS'); // Checked by parent process.
- });
-}
diff --git a/tests/standalone/io/delete_a_directory_later.dart b/tests/standalone/io/delete_a_directory_later.dart
deleted file mode 100644
index 5e6da0d..0000000
--- a/tests/standalone/io/delete_a_directory_later.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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:io";
-import "dart:async";
-
-main() {
- new Timer(new Duration(seconds: 2), () {
- new Directory(new Options().arguments[0]).delete(recursive: true);
- });
-}
diff --git a/tests/standalone/io/pkcert/myauthority.pem b/tests/standalone/io/pkcert/myauthority.pem
deleted file mode 100644
index 3aebea4..0000000
--- a/tests/standalone/io/pkcert/myauthority.pem
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIBpDCCAQ2gAwIBAgIFAJq4IS0wDQYJKoZIhvcNAQEFBQAwFjEUMBIGA1UEAxML
-bXlhdXRob3JpdHkwHhcNMTMwMjE1MTA0MzA5WhcNMTgwMjE1MTA0MzA5WjAWMRQw
-EgYDVQQDEwtteWF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-tnrkyrXF1SEUeOdIiULWs0dOEUlX6t73UDVbbTorF6R66fkjkEK3vW9ekZFUWq5+
-HVku4LUViJR140+F+CzUYtN73Ur28GqLa6LY4XtzHfPSfgecgayI1mEU+0f/2l8B
-4RiE9V8mW9RqPM6Lb69QrwXSYdzStl6ltuLJhgPGqAMCAwEAATANBgkqhkiG9w0B
-AQUFAAOBgQBdBUQTUR5oIRdqBGR87qW7caLAuPoVmzikOrSBNoyamVF0lwFFxgNw
-sj5VWdMn0SJhXd3EUMVlHr+4B/c3jUy1PlvBQGURn2cp5c4tj3FMOqkemuA0ywOF
-gbt2lqi7/RW4bHITqfPi7CDzE36n25vXc64Ylk7vEi3hUfjYfIqNcA==
------END CERTIFICATE-----
diff --git a/tests/standalone/io/user_certificate_test.dart b/tests/standalone/io/user_certificate_test.dart
deleted file mode 100644
index c44ca96..0000000
--- a/tests/standalone/io/user_certificate_test.dart
+++ /dev/null
@@ -1,116 +0,0 @@
-// 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.
-
-// This test verifies the SecureSocket functions addCertificate,
-// importCertificatesWithPrivateKeys, changeTrust, getCertificate, and
-// removeCertificate.
-
-// It loads a copy of the test certificate database,
-// removes all certificates and keys, then imports the certificates and keys
-// again. Then it runs a secure server, using the user certificate (a
-// certificate with private key), and starts client processes that use
-// addCertificate to trust the certificate that signed the server's certificate.
-// The clients then test that they can successfully connect to the server.
-
-import "package:expect/expect.dart";
-import "package:path/path.dart";
-import "dart:io";
-import "dart:async";
-
-void main() {
- Directory tempDirectory = new Directory('').createTempSync();
- String scriptDirectory = dirname(Platform.script);
- String database = join(scriptDirectory, 'pkcert');
- String serverDatabase = join(tempDirectory.path, 'server');
- String clientDatabase = join(tempDirectory.path, 'client');
- new Directory(serverDatabase).createSync();
- new Directory(clientDatabase).createSync();
-
- cleanUp() {
- if (Platform.isWindows) {
- // Delay directory deletion until after this script exits.
- // The certificate database files are locked until then.
- Process.start('start', // Starts a detatched process.
- [Platform.executable,
- join(scriptDirectory, 'delete_a_directory_later.dart'),
- tempDirectory.path],
- runInShell: true);
- } else {
- tempDirectory.delete(recursive: true);
- }
- }
-
- Future.wait([
- copyFileToDirectory(join(database, 'cert9.db'), serverDatabase),
- copyFileToDirectory(join(database, 'key4.db'), serverDatabase),
- copyFileToDirectory(join(database, 'cert9.db'), clientDatabase),
- copyFileToDirectory(join(database, 'key4.db'), clientDatabase),
- ]).then((_) {
- SecureSocket.initialize(database: serverDatabase,
- password: 'dartdart',
- readOnly: false);
- for (var nickname in ['localhost_cert', 'myauthority_cert']) {
- Expect.isNotNull(SecureSocket.getCertificate(nickname));
- SecureSocket.removeCertificate(nickname);
- Expect.isNull(SecureSocket.getCertificate(nickname));
- }
-
- var mycerts = new File(join(database, 'localhost.p12')).readAsBytesSync();
- SecureSocket.importCertificatesWithPrivateKeys(mycerts, 'dartdart');
-
- checkCertificate('localhost_cert', 'CN=localhost', 'CN=myauthority');
- checkCertificate('myauthority_cert', 'CN=myauthority', 'CN=myauthority');
-
- SecureSocket.removeCertificate('myauthority_cert');
- return runServer().then((server) {
- var tests = ['certificate_test_client.dart',
- 'certificate_test_client_database.dart'];
- return Future.wait(tests.map((test) =>
- Process.run(Platform.executable,
- ['--checked',
- join(scriptDirectory, test),
- server.port.toString(),
- join(database, 'myauthority.pem'),
- clientDatabase])))
- .then(verifyResults)
- .whenComplete(server.close);
- });
- })
- .whenComplete(cleanUp);
-}
-
-checkCertificate(nickname, subject, issuer) {
- var cert = SecureSocket.getCertificate(nickname);
- Expect.isTrue(cert is X509Certificate);
- Expect.equals(subject, cert.subject);
- Expect.equals(issuer, cert.issuer);
-}
-
-Future<SecureServerSocket> runServer() =>
- SecureServerSocket.bind("localhost", 0, "localhost_cert")
- .then((server) => server..listen((socket) => socket.pipe(socket)));
-
-verifyResults(results) => results.map(verifyResult);
-verifyResult(ProcessResult result) {
- if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) {
- print("Client failed with exit code ${result.exitCode}");
- print(" stdout (expected \"SUCCESS\\n\"):");
- print(result.stdout);
- print(" stderr:");
- print(result.stderr);
- Expect.fail("Client failed");
- }
-}
-
-Future copyFileToDirectory(String file, String directory) {
- switch (Platform.operatingSystem) {
- case 'linux':
- case 'macos':
- return Process.run('cp', [file, directory]);
- case 'windows':
- return Process.run('cmd.exe', ['/C', 'copy $file $directory']);
- default:
- Expect.fail('Unknown operating system ${Platform.operatingSystem}');
- }
-}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 25e362a4..e15eaf5 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -7,6 +7,10 @@
# listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
# prefix.
+# The testing infrastructure is using the dart:io Path class.
+io/skipping_dart2js_compilations_test: Skip # http/dartbug.com/12449
+io/dependency_graph_test: Skip # http/dartbug.com/12449
+
package/invalid_uri_test: Fail, OK # Fails intentionally
[ $runtime == vm ]
@@ -147,7 +151,7 @@
*: Skip
[ $arch == arm ]
-*: Skip # Shared libraries problem.
+io/internet_address_test: Fail # localhost is an Unknown name?
[ $arch == simarm ]
out_of_memory_test: Skip # passes on Mac, crashes on Linux
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index f341977..f95a289 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -76,7 +76,8 @@
class JSBool {}
getInterceptor(o){}
getDispatchProperty(o) {}
-setDispatchProperty(o, v) {}""";
+setDispatchProperty(o, v) {}
+var mapTypeToInterceptor;""";
} else if (uri.path.endsWith('js_helper.dart')) {
source = 'library jshelper; class JSInvocationMirror {} '
'class ConstantMap {} class TypeImpl {} '
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index f827089..db0eff3 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -47,7 +47,7 @@
add(x) { }
}
class JSMutableArray extends JSArray {}
-class JSExtendableArray extends JSMutableArray{}
+class JSExtendableArray extends JSMutableArray {}
class JSFixedArray extends JSMutableArray {}
class JSString {
split(x) => null;
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 7bc1414..6fdf0e2 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -11,6 +11,9 @@
dart2js_test: Skip # Uses dart:io.
txt_layout_test: Skip # Might just go away.
+[ $compiler == none && $runtime == drt && $mode == debug ]
+recursive_import_test: Fail # 12501
+
[ $compiler == dart2js && $browser ]
*: Skip
diff --git a/tools/VERSION b/tools/VERSION
index 5265791..01d318f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
MAJOR 0
MINOR 6
-BUILD 18
+BUILD 19
PATCH 0
diff --git a/tools/coverage.dart b/tools/coverage.dart
index 3f51f00..20811d1 100644
--- a/tools/coverage.dart
+++ b/tools/coverage.dart
@@ -104,7 +104,7 @@
}
});
- String srcPath = new Path(Uri.parse(url).path).toNativePath();
+ String srcPath = Uri.parse(url).toFilePath();
List lines = new File(srcPath).readAsLinesSync();
for (int line = 1; line <= lines.length; line++) {
String prefix = " ";
diff --git a/tools/dom/dom.py b/tools/dom/dom.py
index 4e3240a..c362f55 100755
--- a/tools/dom/dom.py
+++ b/tools/dom/dom.py
@@ -96,18 +96,6 @@
os.chdir(os.path.join('..', '..', '..'))
return result
-def http_server():
- print('Browse tests at '
- '\033[94mhttp://localhost:5400/root_build/generated_tests/\033[0m')
- return call([
- utils.DartBinary(),
- os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
- '--port=5400',
- '--crossOriginPort=5401',
- '--network=0.0.0.0',
- '--build-directory=%s' % os.path.join('out', 'ReleaseIA32')
- ])
-
def size_check():
''' Displays the dart2js size of swarm. '''
dart_file = os.path.join('samples', 'swarm', 'swarm.dart')
@@ -151,6 +139,25 @@
cmd.append('html')
return call(cmd)
+def test_server():
+ start_test_server(5400, os.path.join('out', 'ReleaseIA32'))
+
+def test_server_dartium():
+ start_test_server(5500, os.path.join('..', 'out', 'Release'))
+
+def start_test_server(port, build_directory):
+ print('Browse tests at '
+ '\033[94mhttp://localhost:%d/root_build/generated_tests/\033[0m' % port)
+ return call([
+ utils.DartBinary(),
+ os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
+ '--port=%d' % port,
+ '--crossOriginPort=%d' % (port + 1),
+ '--network=0.0.0.0',
+ '--build-directory=%s' % build_directory
+ ])
+
+
def call(args):
print ' '.join(args)
pipe = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -176,8 +183,10 @@
'\t\tOptionally provide name of test to run.'],
'test_ff': [test_ff, 'Run tests in checked mode in Firefox.\n'
'\t\tOptionally provide name of test to run.'],
- 'http_server': [http_server, 'Starts the testing server for manually '
+ 'test_server': [test_server, 'Starts the testing server for manually '
'running browser tests.'],
+ 'test_server_dartium': [test_server_dartium, 'Starts the testing server for '
+ 'manually running browser tests from a dartium enlistment.'],
}
def main():
diff --git a/tools/dom/scripts/chromegenerator.py b/tools/dom/scripts/chromegenerator.py
index 2093d15..73d504c 100755
--- a/tools/dom/scripts/chromegenerator.py
+++ b/tools/dom/scripts/chromegenerator.py
@@ -36,13 +36,13 @@
// DO NOT EDIT
// Auto-generated dart:chrome library.
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-/// http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
library chrome;
import 'dart:_foreign_helper' show JS;
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index d264a5c..396b7b3 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -736,8 +736,6 @@
def implementation_name(self):
implementation_name = self._dart_interface_name
- if self.merged_into():
- return '_%s' % self.idl_type()
if not self.has_generated_interface():
implementation_name = '_%s' % implementation_name
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 23882c6..c58b21b 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -39,6 +39,8 @@
'FileSystemCallback': '_FileSystemCallback',
'FileWriterCallback': '_FileWriterCallback',
'HTMLDocument' : 'HtmlDocument',
+ 'HTMLElement' : 'HtmlElement',
+ 'HTMLHtmlElement' : 'HtmlHtmlElement',
'IDBFactory': 'IdbFactory', # Manual to avoid name conflicts.
'Key': 'CryptoKey',
'NamedNodeMap': '_NamedNodeMap',
diff --git a/tools/dom/src/chrome/chrome.dart b/tools/dom/src/chrome/chrome.dart
index 221ee5e..2c02ae9 100644
--- a/tools/dom/src/chrome/chrome.dart
+++ b/tools/dom/src/chrome/chrome.dart
@@ -44,6 +44,7 @@
* Members
*/
API_ChromeApp app;
+ API_file_system fileSystem;
/*
* Constructor
@@ -57,6 +58,11 @@
if (app_object == null)
throw new UnsupportedError('Not supported by current browser.');
app = new API_ChromeApp(app_object);
+
+ var file_system_object = JS('', '#.fileSystem', this._jsObject);
+ if (file_system_object == null)
+ throw new UnsupportedError('Not supported by current browser.');
+ fileSystem = new API_file_system(file_system_object);
}
}
diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart
new file mode 100644
index 0000000..a40e81c
--- /dev/null
+++ b/tools/dom/src/dart2js_CustomElementSupport.dart
@@ -0,0 +1,68 @@
+// 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.
+
+part of dart.dom.html;
+
+_callOnCreated(receiver) {
+ return receiver.onCreated();
+}
+
+_makeCreatedCallbackMethod() {
+ return JS('',
+ '''((function(invokeCallback) {
+ return function() {
+ return invokeCallback(this);
+ };
+ })(#))''',
+ convertDartClosureToJS(_callOnCreated, 1));
+}
+
+void _registerCustomElement(context, document, String tag, Type type) {
+ // Function follows the same pattern as the following JavaScript code for
+ // registering a custom element.
+ //
+ // var proto = Object.create(HTMLElement.prototype, {
+ // createdCallback: {
+ // value: function() {
+ // window.console.log('here');
+ // }
+ // }
+ // });
+ // document.register('x-foo', { prototype: proto });
+ // ...
+ // var e = document.createElement('x-foo');
+
+ var interceptorClass = findInterceptorConstructorForType(type);
+ if (interceptorClass == null) {
+ throw new ArgumentError(type);
+ }
+
+ String baseClassName = findDispatchTagForInterceptorClass(interceptorClass);
+ if (baseClassName == null) {
+ throw new ArgumentError(type);
+ }
+ if (baseClassName == 'Element') baseClassName = 'HTMLElement';
+
+ var baseConstructor = JS('=Object', '#[#]', context, baseClassName);
+ if (JS('bool', "typeof(#) != 'function'", baseConstructor)) {
+ throw new ArgumentError(type);
+ }
+
+ var properties = JS('=Object', '{}');
+
+ var jsCreatedCallback = _makeCreatedCallbackMethod();
+
+ JS('void', '#.createdCallback = #', properties,
+ JS('=Object', '{value: #}', jsCreatedCallback));
+
+ var baseProto = JS('=Object', '#.prototype', baseConstructor);
+ var proto = JS('=Object', 'Object.create(#, #)', baseProto, properties);
+
+ var interceptor = JS('=Object', '#.prototype', interceptorClass);
+
+ setNativeSubclassDispatchRecord(proto, interceptor);
+
+ JS('void', '#.register(#, #)',
+ document, tag, JS('', '{prototype: #}', proto));
+}
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 8cdf24d..a7c0e97 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -211,7 +211,8 @@
Symbol objectName = reflectClass(Object).qualifiedName;
bool isRoot(ClassMirror cls) =>
cls == null || cls.qualifiedName == objectName;
- Symbol elementName = reflectClass(Element).qualifiedName;
+ // TODO(vsm): Support extending SvgElement as well.
+ Symbol elementName = reflectClass(HtmlElement).qualifiedName;
bool isElement(ClassMirror cls) =>
cls != null && cls.qualifiedName == elementName;
@@ -220,7 +221,7 @@
}
if (isRoot(superClass)) {
- throw new UnsupportedError("Invalid custom element doesn't inherit from Element.");
+ throw new UnsupportedError("Invalid custom element doesn't inherit from HtmlElement.");
}
_register(tag, type);
}
@@ -353,7 +354,7 @@
final _forwardingPrintClosure = _Utils.forwardingPrint;
- class _Timer implements Timer{
+ class _Timer implements Timer {
var _canceler;
_Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
diff --git a/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
index 3798c9c..2ea934d 100644
--- a/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
@@ -6,13 +6,13 @@
// DO NOT EDIT
// Auto-generated dart:chrome library.
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-/// http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
library chrome;
import 'dart:_foreign_helper' show JS;
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index bfe368c..62fcb28 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -27,8 +27,12 @@
import 'dart:web_audio' as web_audio;
import 'dart:web_gl' as gl;
import 'dart:web_sql';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_js_helper' show
+ convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
+ JSName, Null, Returns,
+ findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+ Interceptor, JSExtendableArray, findInterceptorConstructorForType;
import 'dart:_isolate_helper' show IsolateNatives;
import 'dart:_foreign_helper' show JS;
@@ -57,6 +61,7 @@
part '$AUXILIARY_DIR/WrappedEvent.dart';
part '$AUXILIARY_DIR/WrappedList.dart';
part '$AUXILIARY_DIR/dart2js_Conversions.dart';
+part '$AUXILIARY_DIR/dart2js_CustomElementSupport.dart';
part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
part '$AUXILIARY_DIR/dart2js_KeyEvent.dart';
part '$AUXILIARY_DIR/dart2js_LocationWrapper.dart';
@@ -89,8 +94,8 @@
// Workaround for tags like <cite> that lack their own Element subclass --
// Dart issue 1990.
-class _HTMLElement extends Element native "HTMLElement" {
- factory _HTMLElement() { throw new UnsupportedError("Not supported"); }
+class HtmlElement extends Element native "HTMLElement" {
+ factory HtmlElement() { throw new UnsupportedError("Not supported"); }
}
// Support for Send/ReceivePortSync.
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index af28eef..7cb895e 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -2,6 +2,9 @@
// https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
// Auto-generated dart:audio library.
+/**
+ * High-fidelity audio programming in the browser.
+ */
library dart.dom.web_audio;
import 'dart:async';
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index 6383511..147f61c 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -2,6 +2,9 @@
// https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
// Auto-generated dart:web_gl library.
+/**
+ * 3D programming in the browser.
+ */
library dart.dom.web_gl;
import 'dart:collection';
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 227131a..8f1a4ca 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -168,8 +168,8 @@
@Experimental
$if DART2JS
- void register(String tag, Type custom) {
- throw new UnsupportedError("Custom DOM types not supported");
+ void register(String tag, Type customElementClass) {
+ _registerCustomElement(JS('', 'window'), this, tag, customElementClass);
}
$else
void register(String tag, Type custom) {
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index 5e429bd..37920a3 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -6,9 +6,9 @@
Future<String> getVersion(var options, var rootPath) {
var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
- var printVersionScript =
- rootPath.append("tools").append("print_version.py").toNativePath();
- return Process.run("python$suffix", [printVersionScript]).then((result) {
+ var printVersionScript = rootPath.resolve("tools/print_version.py");
+ return Process.run("python$suffix",
+ [printVersionScript.toFilePath()]).then((result) {
if (result.exitCode != 0) {
throw "Could not generate version";
}
@@ -17,14 +17,13 @@
}
Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
- var dart2js = rootPath.append(args["dart2js_main"]);
- var dartdoc = rootPath.append(args["dartdoc_main"]);
-
+ var dart2js = rootPath.resolve(args["dart2js_main"]);
+ var dartdoc = rootPath.resolve(args["dartdoc_main"]);
return getVersion(options, rootPath).then((version) {
var snapshotGenerationText =
"""
-import '${dart2js}' as dart2jsMain;
-import '${dartdoc}' as dartdocMain;
+import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
+import '${dartdoc.toFilePath(windows: false)}' as dartdocMain;
import 'dart:io';
void main() {
@@ -86,9 +85,9 @@
if (!args.containsKey("output_dir")) throw "Please specify output_dir";
if (!args.containsKey("package_root")) throw "Please specify package_root";
- var scriptFile = new File(new File(options.script).fullPathSync());
- var path = new Path(scriptFile.directory.path);
- var rootPath = path.directoryPath.directoryPath;
+ var scriptFile = new Uri.file(new File(options.script).fullPathSync());
+ var path = scriptFile.resolve(".");
+ var rootPath = path.resolve("../..");
getSnapshotGenerationFile(options, args, rootPath).then((result) {
var wrapper = "${args['output_dir']}/utils_wrapper.dart";
writeSnapshotFile(wrapper, result);
diff --git a/utils/testrunner/standard_test_runner.dart b/utils/testrunner/standard_test_runner.dart
index 89fcc2f..7429259 100644
--- a/utils/testrunner/standard_test_runner.dart
+++ b/utils/testrunner/standard_test_runner.dart
@@ -41,7 +41,7 @@
/**
* A special marker string used to separate group names and
* identify non-debug output.
- */
+ */
final marker = '###';
class Macros {
@@ -53,7 +53,7 @@
static const String testStacktrace = '<STACK>';
}
-class TestRunnerConfiguration extends Configuration {
+class TestRunnerConfiguration extends SimpleConfiguration {
get name => 'Minimal test runner configuration';
get autoStart => false;
@@ -191,7 +191,7 @@
// Support for running in isolates.
-class TestRunnerChildConfiguration extends Configuration {
+class TestRunnerChildConfiguration extends SimpleConfiguration {
get name => 'Test runner child configuration';
get autoStart => false;