Version 0.8.10.10
svn merge -r29786:29787 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
R=kasperl@google.com
Review URL: https://codereview.chromium.org//66373002
git-svn-id: http://dart.googlecode.com/svn/trunk@30104 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/lib/compiler/implementation/lib/web.dart b/lib/compiler/implementation/lib/web.dart
new file mode 100644
index 0000000..a75db7b
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dart
@@ -0,0 +1,9 @@
+// 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.
+
+#library("web");
+
+String htmlEscape(String text) {
+ throw "Unimplemented: web::htmlEscape(String).";
+}
diff --git a/lib/compiler/implementation/lib/web.dartp b/lib/compiler/implementation/lib/web.dartp
new file mode 100644
index 0000000..c3ba2ad
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dartp
@@ -0,0 +1,13 @@
+// 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.
+
+// Patch file for dart:web
+
+/*patch*/ String htmlEscape(String text) {
+ return text.replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'"); // Different from original.
+}
diff --git a/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// 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.
+
+class _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..1b4a00d
--- /dev/null
+++ b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
@@ -0,0 +1,106 @@
+// 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.
+
+class _EventsImpl implements Events {
+ // TODO(podivilov): add type.
+ final _ptr;
+
+ final Map<String, EventListenerList> _listenerMap;
+
+ _EventsImpl(this._ptr) : _listenerMap = <EventListenerList>{};
+
+ EventListenerList operator [](String type) {
+ return _listenerMap.putIfAbsent(type,
+ () => new _EventListenerListImpl(_ptr, type));
+ }
+}
+
+class _EventListenerWrapper {
+ final EventListener raw;
+ final Function wrapped;
+ final bool useCapture;
+ _EventListenerWrapper(this.raw, this.wrapped, this.useCapture);
+}
+
+class _EventListenerListImpl implements EventListenerList {
+ // TODO(podivilov): add type.
+ final _ptr;
+ final String _type;
+ List<_EventListenerWrapper> _wrappers;
+
+ _EventListenerListImpl(this._ptr, this._type) :
+ // TODO(jacobr): switch to <_EventListenerWrapper>[] when the VM allow it.
+ _wrappers = new List<_EventListenerWrapper>();
+
+ EventListenerList add(EventListener listener, [bool useCapture = false]) {
+ _add(listener, useCapture);
+ return this;
+ }
+
+ EventListenerList remove(EventListener listener, [bool useCapture = false]) {
+ _remove(listener, useCapture);
+ return this;
+ }
+
+ bool dispatch(Event evt) {
+ // TODO(jacobr): what is the correct behavior here. We could alternately
+ // force the event to have the expected type.
+ assert(evt.type == _type);
+ return _ptr.$dom_dispatchEvent(evt);
+ }
+
+ void _add(EventListener listener, bool useCapture) {
+ _ptr.$dom_addEventListener(_type,
+ _findOrAddWrapper(listener, useCapture),
+ useCapture);
+ }
+
+ void _remove(EventListener listener, bool useCapture) {
+ Function wrapper = _removeWrapper(listener, useCapture);
+ if (wrapper !== null) {
+ _ptr.$dom_removeEventListener(_type, wrapper, useCapture);
+ }
+ }
+
+ Function _removeWrapper(EventListener listener, bool useCapture) {
+ if (_wrappers === null) {
+ return null;
+ }
+ for (int i = 0; i < _wrappers.length; i++) {
+ _EventListenerWrapper wrapper = _wrappers[i];
+ if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+ // Order doesn't matter so we swap with the last element instead of
+ // performing a more expensive remove from the middle of the list.
+ if (i + 1 != _wrappers.length) {
+ _wrappers[i] = _wrappers.removeLast();
+ } else {
+ _wrappers.removeLast();
+ }
+ return wrapper.wrapped;
+ }
+ }
+ return null;
+ }
+
+ Function _findOrAddWrapper(EventListener listener, bool useCapture) {
+ if (_wrappers === null) {
+ _wrappers = <_EventListenerWrapper>[];
+ } else {
+ for (_EventListenerWrapper wrapper in _wrappers) {
+ if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+ return wrapper.wrapped;
+ }
+ }
+ }
+ final wrapped = (e) { listener(e); };
+ _wrappers.add(new _EventListenerWrapper(listener, wrapped, useCapture));
+ return wrapped;
+ }
+}
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+/*
+$!MEMBERS
+*/
+}
diff --git a/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// 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.
+
+class _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/frog/impl_EventTarget.darttemplate b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..893f3d2
--- /dev/null
+++ b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
@@ -0,0 +1,61 @@
+// 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.
+
+class _EventsImpl implements Events {
+ /* Raw event target. */
+ // TODO(jacobr): it would be nice if we could specify this as
+ // _EventTargetImpl or EventTarget
+ final Dynamic _ptr;
+
+ _EventsImpl(this._ptr);
+
+ _EventListenerListImpl operator [](String type) {
+ return new _EventListenerListImpl(_ptr, type);
+ }
+}
+
+class _EventListenerListImpl implements EventListenerList {
+
+ // TODO(jacobr): make this _EventTargetImpl
+ final Dynamic _ptr;
+ final String _type;
+
+ _EventListenerListImpl(this._ptr, this._type);
+
+ // TODO(jacobr): implement equals.
+
+ _EventListenerListImpl add(EventListener listener,
+ [bool useCapture = false]) {
+ _add(listener, useCapture);
+ return this;
+ }
+
+ _EventListenerListImpl remove(EventListener listener,
+ [bool useCapture = false]) {
+ _remove(listener, useCapture);
+ return this;
+ }
+
+ bool dispatch(Event evt) {
+ // TODO(jacobr): what is the correct behavior here. We could alternately
+ // force the event to have the expected type.
+ assert(evt.type == _type);
+ return _ptr.$dom_dispatchEvent(evt);
+ }
+
+ void _add(EventListener listener, bool useCapture) {
+ _ptr.$dom_addEventListener(_type, listener, useCapture);
+ }
+
+ void _remove(EventListener listener, bool useCapture) {
+ _ptr.$dom_removeEventListener(_type, listener, useCapture);
+ }
+}
+
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+ Events get on() => new _EventsImpl(this);
+$!MEMBERS
+}
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 7f79c5d..c7beef7 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -12,7 +12,6 @@
import 'generated/source_io.dart';
import 'generated/sdk.dart';
import 'generated/sdk_io.dart';
-import 'generated/ast.dart';
import 'generated/element.dart';
import '../options.dart';
@@ -51,22 +50,8 @@
var sourceFile = new JavaFile(sourcePath);
var uriKind = getUriKind(sourceFile);
var librarySource = new FileBasedSource.con2(contentCache, sourceFile, uriKind);
- // prepare context
- prepareAnalysisContext(sourceFile);
- // don't try to analyzer parts
- var unit = context.parseCompilationUnit(librarySource);
- var hasLibraryDirective = false;
- var hasPartOfDirective = false;
- for (var directive in unit.directives) {
- if (directive is LibraryDirective) hasLibraryDirective = true;
- if (directive is PartOfDirective) hasPartOfDirective = true;
- }
- if (hasPartOfDirective && !hasLibraryDirective) {
- print("Only libraries can be analyzed.");
- print("$sourceFile is a part and can not be analyzed.");
- return;
- }
// resolve library
+ prepareAnalysisContext(sourceFile);
var libraryElement = context.computeLibraryElement(librarySource);
// prepare source and errors
prepareSources(libraryElement);
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index ae88fb2..4e444ce 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,11 +1,13 @@
name: analyzer
-version: 0.10.0
+version: 0.10.1
author: Dart Team <misc@dartlang.org>
description: Static analyzer for Dart.
homepage: http://www.dartlang.org
dependencies:
- args: ">=0.8.9 <1.0.0"
- logging: ">=0.8.9 <1.0.0"
- path: ">=0.8.9 <1.0.0"
+ args: ">=0.9.0 <0.10.0"
+ logging: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: ">=0.8.9 <1.0.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
new file mode 100644
index 0000000..df37f7b
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
@@ -0,0 +1,157 @@
+// 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.
+
+/// A library for code coverage support for Dart.
+library runtime.coverage_impl;
+
+import "dart:io";
+
+import "package:logging/logging.dart" as log;
+import "package:pathos/path.dart" as po;
+
+import 'package:analyzer_experimental/src/generated/source.dart' show Source;
+import 'package:analyzer_experimental/src/generated/scanner.dart' show StringScanner;
+import 'package:analyzer_experimental/src/generated/parser.dart' show Parser;
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/engine.dart' show RecordingErrorListener;
+
+
+log.Logger logger = log.Logger.root;
+
+/// Abstract server that listens requests and serves files, may be rewriting them.
+abstract class RewriteServer {
+ String _basePath;
+ RewriteServer(this._basePath);
+ void start() {
+ HttpServer.bind("127.0.0.1", 3445).then((HttpServer server) {
+ logger.info('RewriteServer is listening at: ${server.port}.');
+ server.listen((HttpRequest request) {
+ var response = request.response;
+ // Prepare path.
+ var path = _basePath + '/' + request.uri.path;
+ path = po.normalize(path);
+ logger.info('[$path] Requested.');
+ // May be serve using just path.
+ {
+ String content = rewritePathContent(path);
+ if (content != null) {
+ logger.info('[$path] Request served by path.');
+ response.write(content);
+ response.close();
+ return;
+ }
+ }
+ // Serve from file.
+ logger.info('[$path] Serving file.');
+ var file = new File(path);
+ file.exists().then((bool found) {
+ if (found) {
+ logger.finest('[$path] Found file.');
+ file.readAsString().then((String content) {
+ logger.finest('[$path] Got file content.');
+ var sw = new Stopwatch();
+ sw.start();
+ try {
+ content = rewriteFileContent(path, content);
+ } finally {
+ sw.stop();
+ logger.fine('[$path] Rewritten in ${sw.elapsedMilliseconds} ms.');
+ }
+ response.write(content);
+ response.close();
+ });
+ } else {
+ logger.severe('[$path] File not found.');
+ response.statusCode = HttpStatus.NOT_FOUND;
+ response.close();
+ }
+ });
+ });
+ });
+ }
+
+ /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+ /// Returns some content or `null` if file content should be requested.
+ String rewritePathContent(String path);
+
+ /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+ String rewriteFileContent(String path, String code);
+}
+
+/// Server that rewrites Dart code so that it reports execution of statements and other nodes.
+class CoverageServer extends RewriteServer {
+ CoverageServer(String basePath) : super(basePath);
+
+ String rewritePathContent(String path) {
+ if (path.endsWith('__coverage_impl.dart')) {
+ String implPath = po.joinAll([
+ po.dirname(new Options().script),
+ '..', 'lib', 'src', 'services', 'runtime', 'coverage_lib.dart']);
+ return new File(implPath).readAsStringSync();
+ }
+ return null;
+ }
+
+ String rewriteFileContent(String path, String code) {
+ if (po.extension(path).toLowerCase() != '.dart') return code;
+ if (path.contains('packages')) return code;
+ var unit = _parseCode(code);
+ var injector = new StringInjector(code);
+ // Inject coverage library import.
+ var directives = unit.directives;
+ if (directives.isNotEmpty && directives[0] is LibraryDirective) {
+ injector.inject(directives[0].end, 'import "__coverage_impl.dart" as __cc;');
+ } else {
+ throw new Exception('Only single library coverage is implemented.');
+ }
+ // Insert touch() invocations.
+ unit.accept(new InsertTouchInvocationsVisitor(injector));
+ // Done.
+ code = injector.code;
+ logger.finest('[$path] Rewritten content\n$code');
+ return code;
+ }
+
+ CompilationUnit _parseCode(String code) {
+ var source = null;
+ var errorListener = new RecordingErrorListener();
+ var parser = new Parser(source, errorListener);
+ var scanner = new StringScanner(source, code, errorListener);
+ var token = scanner.tokenize();
+ return parser.parseCompilationUnit(token);
+ }
+}
+
+/// The visitor that inserts `touch` method invocations.
+class InsertTouchInvocationsVisitor extends GeneralizingASTVisitor {
+ StringInjector injector;
+ InsertTouchInvocationsVisitor(this.injector);
+ visitStatement(Statement node) {
+ super.visitStatement(node);
+ var offset = node.end;
+ if (node is Block) {
+ offset--;
+ }
+ if (node is Block && node.parent is BlockFunctionBody) return null;
+ injector.inject(offset, '__cc.touch(${node.offset});');
+ return null;
+ }
+}
+
+/// Helper for injecting fragments into some existing [String].
+class StringInjector {
+ String code;
+ int _lastOffset = -1;
+ int _delta = 0;
+ StringInjector(this.code);
+ void inject(int offset, String fragment) {
+ if (offset < _lastOffset) {
+ throw new ArgumentError('Only forward inserts are supported, was $_lastOffset given $offset');
+ }
+ _lastOffset = offset;
+ offset += _delta;
+ code = code.substring(0, offset) + fragment + code.substring(offset);
+ _delta += fragment.length;
+ }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
new file mode 100644
index 0000000..945b38f
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
@@ -0,0 +1,11 @@
+// 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 library is injected into the applications under coverage.
+library coverage_lib;
+
+/// Notifies that the object with the given [id] - statement, token, etc was executed.
+touch(int id) {
+ print('touch: $id');
+}
diff --git a/pkg/analyzer_experimental/lib/src/utils.dart b/pkg/analyzer_experimental/lib/src/utils.dart
new file mode 100644
index 0000000..2b5053e
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/utils.dart
@@ -0,0 +1,22 @@
+// 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 utils;
+
+import 'dart:io';
+
+import 'package:pathos/path.dart' as pathos;
+
+/// Converts a local path string to a `file:` [Uri].
+Uri pathToFileUri(String pathString) {
+ pathString = pathos.absolute(pathString);
+ if (Platform.operatingSystem != 'windows') {
+ return Uri.parse('file://$pathString');
+ } else if (pathos.rootPrefix(pathString).startsWith('\\\\')) {
+ // Network paths become "file://hostname/path/to/file".
+ return Uri.parse('file:${pathString.replaceAll("\\", "/")}');
+ } else {
+ // Drive-letter paths become "file:///C:/path/to/file".
+ return Uri.parse('file:///${pathString.replaceAll("\\", "/")}');
+ }
+}
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index 5e460f3..2d7a086 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,4 +1,5 @@
name: args
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/args
@@ -7,6 +8,8 @@
a set of options and values using GNU and POSIX style options.
dependencies:
- unmodifiable_collection: any
+ unmodifiable_collection: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index e4f33de..2dc33fd 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -1,4 +1,5 @@
name: async_helper
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -7,3 +8,5 @@
language tests.
Third parties are discouraged from using this, and should use
the facilities provided in the unittest library.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 9cebb0b..3c51019 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -1,4 +1,5 @@
name: barback
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -12,9 +13,11 @@
Runs transforms asynchronously and in parallel when possible to maximize
responsiveness.
dependencies:
- path: any
- source_maps: any
- stack_trace: any
+ path: ">=0.9.0 <0.10.0"
+ source_maps: ">=0.9.0 <0.10.0"
+ stack_trace: ">=0.9.0 <0.10.0"
dev_dependencies:
- scheduled_test: any
- unittest: any
+ scheduled_test: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/browser/pubspec.yaml b/pkg/browser/pubspec.yaml
index be2a78d..635ca17 100644
--- a/pkg/browser/pubspec.yaml
+++ b/pkg/browser/pubspec.yaml
@@ -1,5 +1,8 @@
name: browser
+version: 0.9.0
authors: ["Dart Team <misc@dartlang.org>"]
homepage: http://www.dartlang.org
description: >
The bootstrap dart.js script for Dart apps running in the browser.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/collection_helpers/pubspec.yaml b/pkg/collection_helpers/pubspec.yaml
index a0513ef..a9a23cf 100644
--- a/pkg/collection_helpers/pubspec.yaml
+++ b/pkg/collection_helpers/pubspec.yaml
@@ -1,6 +1,9 @@
name: collection_helpers
+version: 0.9.0
author: '"Dart Team <misc@dartlang.org>"'
description: Utility functions and classes for working with collections.
homepage: http://www.dartlang.org
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/crypto/pubspec.yaml b/pkg/crypto/pubspec.yaml
index 3fd7917..f9d7d93 100644
--- a/pkg/crypto/pubspec.yaml
+++ b/pkg/crypto/pubspec.yaml
@@ -1,6 +1,9 @@
name: crypto
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/crypto
description: >
Library of cryptographic functions.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index b821941..a995672 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,12 +1,15 @@
name: csslib
+version: 0.9.0
author: "Web UI Team <web-ui-dev@dartlang.org>"
description: A library for parsing CSS.
homepage: https://www.dartlang.org
dependencies:
- args: any
- logging: any
- path: any
- source_maps: any
+ args: ">=0.9.0 <0.10.0"
+ logging: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ source_maps: ">=0.9.0 <0.10.0"
dev_dependencies:
- browser: any
- unittest: any
+ browser: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index 7bdb00c..ab285ae 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -35,7 +35,6 @@
/** The web component element wrapped by this class. */
Element _host;
List _shadowRoots;
- _AttributeMap _attributes;
/**
* Shadow roots generated by dwc for each custom element, indexed by the
@@ -107,7 +106,8 @@
void leftView() {}
/** Invoked when any attribute of the component is modified. */
- void attributeChanged(String name, String oldValue) {}
+ void attributeChanged(String name, String oldValue, String newValue) =>
+ host.attributeChanged(name, oldValue, newValue);
// TODO(efortuna): Update these when we decide what to do with these
// properties.
@@ -155,7 +155,7 @@
String get nodeName => host.nodeName;
- Document get document => host.document;
+ Document get ownerDocument => host.ownerDocument;
Node get previousNode => host.previousNode;
@@ -173,12 +173,9 @@
Node insertAllBefore(Iterable<Node> newChild, Node refChild) =>
host.insertAllBefore(newChild, refChild);
- Map<String, String> get attributes {
- if (_attributes == null) _attributes = new _AttributeMap(this);
- return _attributes;
- }
+ Map<String, String> get attributes => host.attributes;
set attributes(Map<String, String> value) {
- (attributes as _AttributeMap)._replaceAll(value);
+ host.attributes = value;
}
List<Element> get elements => host.children;
@@ -237,12 +234,6 @@
String get id => host.id;
set id(String v) { host.id = v; }
- String get innerHTML => host.innerHtml;
-
- void set innerHTML(String v) {
- host.innerHtml = v;
- }
-
String get innerHtml => host.innerHtml;
void set innerHtml(String v) {
host.innerHtml = v;
@@ -253,10 +244,6 @@
host.setInnerHtml(html, validator: validator, treeSanitizer: treeSanitizer);
}
- void set unsafeInnerHtml(String html) {
- host.unsafeInnerHtml = html;
- }
-
DocumentFragment createFragment(String html,
{NodeValidator validator, NodeTreeSanitizer treeSanitizer}) =>
host.createFragment(html,
@@ -359,9 +346,16 @@
void requestPointerLock() { host.requestPointerLock(); }
- Element query(String selectors) => host.query(selectors);
+ Element querySelector(String selectors) => host.querySelector(selectors);
- ElementList queryAll(String selectors) => host.queryAll(selectors);
+ ElementList querySelectorAll(String selectors) =>
+ host.querySelectorAll(selectors);
+
+ @deprecated
+ Element query(String selectors) => host.querySelector(selectors);
+
+ @deprecated
+ ElementList queryAll(String selectors) => host.querySelectorAll(selectors);
String get className => host.className;
set className(String value) { host.className = value; }
@@ -423,16 +417,16 @@
int get nodeType => host.nodeType;
- void $dom_addEventListener(String type, EventListener listener,
- [bool useCapture]) {
- host.$dom_addEventListener(type, listener, useCapture);
+ void addEventListener(String type, EventListener listener,
+ [bool useCapture]) {
+ host.addEventListener(type, listener, useCapture);
}
bool dispatchEvent(Event event) => host.dispatchEvent(event);
- void $dom_removeEventListener(String type, EventListener listener,
- [bool useCapture]) {
- host.$dom_removeEventListener(type, listener, useCapture);
+ void removeEventListener(String type, EventListener listener,
+ [bool useCapture]) {
+ host.removeEventListener(type, listener, useCapture);
}
get xtag => host.xtag;
diff --git a/pkg/custom_element/pubspec.yaml b/pkg/custom_element/pubspec.yaml
index b4b268b..772a543 100644
--- a/pkg/custom_element/pubspec.yaml
+++ b/pkg/custom_element/pubspec.yaml
@@ -1,4 +1,5 @@
name: custom_element
+version: 0.9.0
author: "Web UI Team <web-ui-dev@dartlang.org>"
homepage: http://www.dartlang.org/
description: >
@@ -6,7 +7,8 @@
with custom tag names, and then use those custom tag names as they would any
standard tag.
dependencies:
- meta: any
- mutation_observer: any
+ mutation_observer: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/docgen/README.md b/pkg/docgen/README.md
index ff0fac7..343d9c0 100644
--- a/pkg/docgen/README.md
+++ b/pkg/docgen/README.md
@@ -8,19 +8,6 @@
about all classes, variables, functions, and methods defined in the library and
its imported libraries.
-### Quick Start: Common Commands
-
-While standing in the `bin` directory:
-
-`dartdoc.py` generates all documentation and runs a local server with your html
-pages.
-
-`dartdoc.py -d` ONLY generates documentation for the SDK and all packages (no
-html pages generated and no server).
-
-`dartdoc.py -d -o package/to/document` ONLY generates documenation for the
-specified package.
-
### Generating files & uploading to Cloud Storage
The viewer uses YAML files generated by the docgen package as the data
diff --git a/pkg/docgen/bin/dartdoc.py b/pkg/docgen/bin/dartdoc.py
index da20cd8..7fa875b 100644
--- a/pkg/docgen/bin/dartdoc.py
+++ b/pkg/docgen/bin/dartdoc.py
@@ -2,12 +2,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.
+# BSD-style license that can be found in the LICENSE file.
-# Run this script to generate documentation for a directory and serve
-# the results to localhost for viewing in the browser.
+""" Run this script to generate documentation for a directory and serve
+ the results to localhost for viewing in the browser.
+"""
-import optparse
+import argparse
import os
from os.path import join, dirname, abspath, exists
import platform
@@ -18,142 +19,55 @@
from upload_sdk import ExecuteCommand
DIRECTORY = abspath(dirname(__file__))
-DART_DIR = dirname(dirname(dirname(DIRECTORY)))
-DART_EXECUTABLE = join(DART_DIR,
- '%s/%s/dart-sdk/bin/dart' % (utils.BUILD_ROOT[utils.GuessOS()],
- utils.GetBuildConf('release', utils.GuessArchitecture())))
-PUB = join(DART_DIR, 'sdk/bin/pub')
-DART2JS = join(DART_DIR, 'sdk/bin/dart2js')
-PACKAGE_ROOT = join(dirname(dirname(dirname(DART_EXECUTABLE[:-(len('dart'))]))),
- 'packages/')
-EXCLUDED_PACKAGES = ['browser', 'html_import', 'mutation_observer',
- 'pkg.xcodeproj', 'shadow_dom']
-
+DART = join(DIRECTORY, '../../../%s/%s/dart-sdk/bin/dart'
+ % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
+ utils.GuessArchitecture())))
+PUB = join(DIRECTORY, '../../../sdk/bin/pub')
+DART2JS = join(DIRECTORY, '../../../sdk/bin/dart2js')
+PACKAGE_ROOT = join(DART[:-(len('dart'))], '../../packages/')
def SetPackageRoot(path):
global PACKAGE_ROOT
if exists(path):
PACKAGE_ROOT = abspath(path)
-
-def ParseArgs():
- parser = optparse.OptionParser(description='Generate documentation and '
- 'display the resulting documentation in the browser.')
- parser.add_option('--full-docs-only', '-d', dest='just_docs',
- action='store_true', default=False,
- help='Only generate documentation, no html output. (If no other '
- 'options are specified, will document the SDK and all packages in the '
- 'repository.)')
- parser.add_option('--package-root', '-p', dest='pkg_root',
- help='The package root for dart (default is in the build directory).',
- action='store', default=PACKAGE_ROOT)
- parser.add_option('--docgen-options', '-o',
- dest='docgen_options', help='Options to pass to docgen. If no file to '
- 'document is specified, by default we generate all documenation for the '
- 'SDK and all packages in the dart repository in JSON.',
- default='--json')
- parser.add_option('--gae-sdk',
- help='The path to the Google App Engine SDK. Defaults to the top level '
- 'dart directory.', default=PACKAGE_ROOT)
- options, _ = parser.parse_args()
+def GetOptions():
+ parser = argparse.ArgumentParser(description='Runs docgen on the specified '
+ 'library and displays the resulting documentation in the browser')
+ parser.add_argument('--package-root', dest='pkg_root',
+ help='The package root for dart (default is in the build directory).',
+ action='store', default=PACKAGE_ROOT)
+ docgen = [DART, '--checked', '--package-root=' + PACKAGE_ROOT,
+ join(DIRECTORY, 'docgen.dart'), '-h']
+ process = subprocess.Popen(docgen, stdout=subprocess.PIPE)
+ out, error = process.communicate()
+ parser.add_argument('--options', help=out)
+ parser.add_argument('--gae-sdk',
+ help='The path to the Google App Engine SDK.')
+ options = parser.parse_args()
SetPackageRoot(options.pkg_root)
return options
-
-def AddUserDocgenOptions(sdk_cmd, docgen_options, all_docs=False):
- '''Expand the command with user specified docgen options.'''
- specified_pkg = False
- remove_append = False
- append = '--append'
- for option in docgen_options:
- if '--package-root' in option:
- specified_pkg = True
- if option == append and all_docs:
- remove_append = True
- if remove_append:
- docgen_options.remove(append)
- if not specified_pkg:
- sdk_cmd.extend(['--package-root=%s' % PACKAGE_ROOT])
- sdk_cmd.extend(docgen_options)
- return sdk_cmd
-
-
-def GenerateAllDocs(docgen_options):
- '''Generate all documentation for the SDK and all packages in the repository.
- We first attempt to run the quickest path to generate all docs, but if that
- fails, we fall back on a slower option.'''
- sdk_cmd = [DART_EXECUTABLE, 'docgen.dart', '--parse-sdk']
- ExecuteCommand(AddUserDocgenOptions(sdk_cmd, docgen_options))
-
- doc_dir = join(DART_DIR, 'pkg')
- cmd_lst = [DART_EXECUTABLE, '--old_gen_heap_size=1024',
- '--package-root=%s' % PACKAGE_ROOT, 'docgen.dart', '--append']
- cmd_str = ' '.join(AddUserDocgenOptions(cmd_lst, docgen_options, True))
- # Try to run all pkg docs together at once as it's fastest.
- (return_code, _) = ExecuteCommandString('%s %s' % (cmd_str, doc_dir))
- if return_code != 0:
- # We failed to run all the pkg docs, so try to generate docs for each pkg
- # individually.
- failed_pkgs = []
- for directory in os.listdir(join(DART_DIR, 'pkg')):
- doc_dir = join(DART_DIR, 'pkg', directory)
- if (directory not in EXCLUDED_PACKAGES and
- os.path.isdir(doc_dir)):
- (return_code, output) = ExecuteCommandString('%s %s' % (cmd_str,
- doc_dir))
- if return_code != 0:
- failed_pkgs += [directory]
- print ('Generated documentation, but failed to generate documentation for '
- 'the following packages, please investigate: %r' % failed_pkgs)
-
-
-def ExecuteCommandString(cmd):
- '''A variant of the ExecuteCommand function that specifically executes a
- particular command string in the shell context. When you execute a string, you
- must execute in the shell.'''
- print 'Executing: %s ' % cmd
- pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
- shell=True)
- output = pipe.communicate()
- return (pipe.returncode, output)
-
-
def main():
- options = ParseArgs()
- generate_all_docs = True
- docgen_options = []
- if options.docgen_options:
- # If the user specified particular files to generate docs for, then don't
- # generate docs for everything.
- docgen_options = options.docgen_options.split()
- last_option = docgen_options[-1]
- if '=' not in last_option and exists(last_option):
- generate_all_docs = False
- docgen = [DART_EXECUTABLE, '--checked',
- '--package-root=' + PACKAGE_ROOT, join(DIRECTORY, 'docgen.dart')]
- docgen.extend(options.options.split())
- ExecuteCommand(docgen)
- if generate_all_docs:
- GenerateAllDocs(docgen_options)
- if not options.just_docs:
- cwd = os.getcwd()
- try:
- ExecuteCommand(['git', 'clone', '-b', 'master',
- 'git://github.com/dart-lang/dartdoc-viewer.git'])
- ExecuteCommand(['mv', 'docs', 'dartdoc-viewer/client/local'])
- os.chdir('dartdoc-viewer/client/')
- subprocess.call([PUB, 'install'])
- subprocess.call([DART_EXECUTABLE, 'deploy.dart'])
- server = subprocess.Popen(['python',
- join(abspath(join(dirname(__file__), options.gae_sdk)),
- 'dev_appserver.py'), '..'])
- print (
- "\nPoint your browser to the address of the 'default' server below.")
- raw_input("Press <RETURN> to terminate the server.\n\n")
- server.terminate()
- finally:
- os.chdir(cwd)
- subprocess.call(['rm', '-rf', 'dartdoc-viewer'])
+ options = GetOptions()
+ docgen = [DART, '--checked', '--package-root=' + PACKAGE_ROOT,
+ join(DIRECTORY, 'docgen.dart'), '--json', '--package-root=' + PACKAGE_ROOT]
+ docgen.extend(options.options.split())
+ ExecuteCommand(docgen)
+ ExecuteCommand(['git', 'clone', '-b', 'master',
+ 'git://github.com/dart-lang/dartdoc-viewer.git'])
+ ExecuteCommand(['mv', 'docs', 'dartdoc-viewer/client/local'])
+ os.chdir('dartdoc-viewer/client/')
+ subprocess.call([PUB, 'install'])
+ subprocess.call([DART, 'deploy.dart'])
+ server = subprocess.Popen(['python',
+ join(abspath(join(dirname(__file__), options.gae_sdk)), 'dev_appserver.py'),
+ '..'])
+ print("\nPoint your browser to the address of the 'default' server below.")
+ raw_input("Press <RETURN> to terminate the server.\n\n")
+ server.terminate()
+ os.chdir('../..')
+ subprocess.call(['rm', '-rf', 'dartdoc-viewer'])
if __name__ == '__main__':
main()
diff --git a/pkg/docgen/bin/generate_all_docs.sh b/pkg/docgen/bin/generate_all_docs.sh
new file mode 100755
index 0000000..8d5d82c
--- /dev/null
+++ b/pkg/docgen/bin/generate_all_docs.sh
@@ -0,0 +1,6 @@
+# A simple shell script to generate all docs for the sdk and pkg directories
+# into the docs folder in this directory.
+# TODO(alanknight): This should get subsumed into the python scripts
+dart --package-root=$DART_SDK/../packages/ docgen.dart --parse-sdk --json
+dart --old_gen_heap_size=1024 --package-root=$DART_SDK/../packages/ docgen.dart \
+ --package-root=$DART_SDK/../packages/ --append --json $DART_SDK/../../../pkg
diff --git a/pkg/docgen/bin/upload_docgen.py b/pkg/docgen/bin/upload_docgen.py
index b598394..6a3ea08 100644
--- a/pkg/docgen/bin/upload_docgen.py
+++ b/pkg/docgen/bin/upload_docgen.py
@@ -4,13 +4,13 @@
# 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 file will run docgen.dart on the SDK libraries, and upload them to
- Google Cloud Storage for the documentation viewer.
+""" This file will run docgen.dart on the SDK libraries, and upload them to
+ Google Cloud Storage for the documentation viewer.
"""
import optparse
import os
-from os.path import join, dirname, abspath, exists
+from os.path import join, dirname, abspath, exists
import platform
import subprocess
import sys
@@ -19,18 +19,18 @@
from upload_sdk import ExecuteCommand
-DART = abspath(join(dirname(__file__), '../../../%s/%s/dart-sdk/bin/dart'
- % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
+DART = abspath(join(dirname(__file__), '../../../%s/%s/dart-sdk/bin/dart'
+ % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
utils.GuessArchitecture()))))
-PACKAGE_ROOT = abspath(join(dirname(__file__), '../../../%s/%s/packages/'
- % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
+PACKAGE_ROOT = abspath(join(dirname(__file__), '../../../%s/%s/packages/'
+ % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
utils.GuessArchitecture()))))
GSUTIL = utils.GetBuildbotGSUtilPath()
GS_SITE = 'gs://dartlang-docgen'
DESCRIPTION='Runs docgen.dart on the SDK libraries, and uploads them to Google \
Cloud Storage for the dartdoc-viewer. '
# Allow us to override checking SVN's revision number. Useful for development
-# so we can upload docs from a branch using an SDK that was built on a
+# so we can upload docs from a branch using an SDK that was built on a
# revision newer than when the branch was forked.
trustSVN = None
@@ -49,14 +49,14 @@
def SetPackageRoot(path):
global PACKAGE_ROOT
if exists(path):
- PACKAGE_ROOT = abspath(path)
+ PACKAGE_ROOT = abspath(path)
def SetGsutil():
""" If not on buildbots, find gsutil relative to docgen. """
global GSUTIL
if not exists(GSUTIL):
- GSUTIL = abspath(join(dirname(__file__),
+ GSUTIL = abspath(join(dirname(__file__),
'../../../third_party/gsutil/gsutil'))
@@ -73,42 +73,42 @@
SetGsutil()
# Execute Docgen.dart on the SDK.
- ExecuteCommand(['python', 'dartdoc.py', '-d'])
-
+ ExecuteCommand(['sh', './generate_all_docs.sh'])
+
# Use SVN Revision to get the revision number.
revision = None
if trustSVN:
revision = utils.GetSVNRevision()
if revision is None:
- # Try to find the version from the dart-sdk folder.
- revision_file_location = abspath(join(dirname(__file__),
+ # Try to find the version from the dart-sdk folder.
+ revision_file_location = abspath(join(dirname(__file__),
'../../../%s/%s/dart-sdk/revision' % (utils.BUILD_ROOT[utils.GuessOS()],
utils.GetBuildConf('release', utils.GuessArchitecture()))))
with open(revision_file_location, 'r') as revision_file:
revision = revision_file.readline(5)
revision_file.close()
-
+
if revision is None:
raise Exception("Unable to find revision. ")
- # Upload the all files in Docs into a folder based off Revision number on
+ # Upload the all files in Docs into a folder based off Revision number on
# Cloud Storage.
- # TODO(alanknight): If we give it ./docs/* it fails to upload files in the
+ # TODO(alanknight): If we give it ./docs/* it fails to upload files in the
# subdirectory, probably due to escaping. Work around it by changing dir.
- # Better, generalize this to be less dependent on the working directory.
+ # Better, generalize this to be less dependent on the working directory.
os.chdir('docs')
Upload('.', GS_SITE + '/' + revision + '/')
os.chdir('..')
- # Update VERSION file in Cloud Storage.
+ # Update VERSION file in Cloud Storage.
with open('VERSION', 'w') as version_file:
version_file.write(revision)
version_file.close()
Upload('./VERSION', GS_SITE + '/VERSION')
Upload('./VERSION', GS_SITE + '/' + revision + '/' + 'VERSION')
- # Clean up the files it creates.
+ # Clean up the files it creates.
ExecuteCommand(['rm', '-rf', './docs'])
ExecuteCommand(['rm', '-f', './VERSION'])
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index b4aead3..4c1f85d 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -2,15 +2,17 @@
// 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.
-/// **docgen** is a tool for creating machine readable representations of Dart
-/// code metadata, including: classes, members, comments and annotations.
-///
-/// docgen is run on a `.dart` file or a directory containing `.dart` files.
-///
-/// $ dart docgen.dart [OPTIONS] [FILE/DIR]
-///
-/// This creates files called `docs/<library_name>.yaml` in your current
-/// working directory.
+/**
+ * **docgen** is a tool for creating machine readable representations of Dart
+ * code metadata, including: classes, members, comments and annotations.
+ *
+ * docgen is run on a `.dart` file or a directory containing `.dart` files.
+ *
+ * $ dart docgen.dart [OPTIONS] [FILE/DIR]
+ *
+ * This creates files called `docs/<library_name>.yaml` in your current
+ * working directory.
+ */
library docgen;
import 'dart:convert';
@@ -34,11 +36,12 @@
var logger = new Logger('Docgen');
-const String USAGE = 'Usage: dart docgen.dart [OPTIONS] fooDir/barFile';
+const String USAGE = 'Usage: dart docgen.dart [OPTIONS] [fooDir/barFile]';
-List<String> skippedAnnotations = const [
- 'metadata.DocsEditable', 'metadata.DomName'];
+List<String> validAnnotations = const ['metadata.Experimental',
+ 'metadata.DomName', 'metadata.Deprecated', 'metadata.Unstable',
+ 'meta.deprecated', 'metadata.SupportedBrowser'];
/// Current library being documented to be used for comment links.
LibraryMirror _currentLibrary;
@@ -68,16 +71,18 @@
/// 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.
-///
-/// [packageRoot] is the packages directory of the directory being analyzed.
-/// If [includeSdk] is `true`, then any SDK libraries explicitly imported will
-/// also be documented.
-/// If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
-/// This option is useful when only the SDK libraries are needed.
-///
-/// Returned Future completes with true if document generation is successful.
+/**
+ * Docgen constructor initializes the link resolver for markdown parsing.
+ * Also initializes the command line arguments.
+ *
+ * [packageRoot] is the packages directory of the directory being analyzed.
+ * If [includeSdk] is `true`, then any SDK libraries explicitly imported will
+ * also be documented.
+ * If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
+ * This option is useful when only the SDK libraries are needed.
+ *
+ * Returns `true` if docgen sucessfuly completes.
+ */
Future<bool> docgen(List<String> files, {String packageRoot,
bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
bool parseSdk: false, bool append: false, String introduction: ''}) {
@@ -106,16 +111,16 @@
throw new StateError('No library mirrors were created.');
}
var librariesWeAskedFor = _listLibraries(files);
- var librariesWeGot = mirrorSystem.libraries.values.where(
- (each) => each.uri.scheme == 'file');
+ var librariesWeGot = mirrorSystem.libraries.values.where((each)
+ => each.uri.scheme == 'file');
var sdkLibraries = mirrorSystem.libraries.values.where(
(each) => each.uri.scheme == 'dart');
var librariesWeGotByPath = new Map.fromIterables(
librariesWeGot.map((each) => each.uri.toFilePath()),
librariesWeGot);
- var librariesToDocument = librariesWeAskedFor.map(
- (each) => librariesWeGotByPath.putIfAbsent(each,
- () => throw "Missing library $each")).toList();
+ var librariesToDocument = librariesWeAskedFor.map((each) =>
+ librariesWeGotByPath
+ .putIfAbsent(each, () => throw "Missing library $each")).toList();
librariesToDocument.addAll((includeSdk || parseSdk) ? sdkLibraries : []);
_documentLibraries(librariesToDocument, includeSdk: includeSdk,
outputToYaml: outputToYaml, append: append, parseSdk: parseSdk,
@@ -213,7 +218,9 @@
return packageRoot;
}
-/// Read a pubspec and return the library name.
+/**
+ * Read a pubspec and return the library name.
+ */
String _packageName(String pubspecName) {
File pubspec = new File(pubspecName);
if (!pubspec.existsSync()) return '';
@@ -233,8 +240,10 @@
return sdk;
}
-/// Analyzes set of libraries by getting a mirror system and triggers the
-/// documentation of the libraries.
+/**
+ * Analyzes set of libraries by getting a mirror system and triggers the
+ * documentation of the libraries.
+ */
Future<MirrorSystem> getMirrorSystem(List<String> args, {String packageRoot,
bool parseSdk: false}) {
var libraries = !parseSdk ? _listLibraries(args) : _listSdk();
@@ -256,8 +265,10 @@
return root;
}
-/// Analyzes set of libraries and provides a mirror system which can be used
-/// for static inspection of the source code.
+/**
+ * Analyzes set of libraries and provides a mirror system which can be used
+ * for static inspection of the source code.
+ */
Future<MirrorSystem> _analyzeLibraries(List<String> libraries,
String libraryRoot, {String packageRoot}) {
SourceFileProvider provider = new CompilerSourceFileProvider();
@@ -288,7 +299,9 @@
});
}
-/// Creates documentation for filtered libraries.
+/**
+ * Creates documentation for filtered libraries.
+ */
void _documentLibraries(List<LibraryMirror> libs, {bool includeSdk: false,
bool outputToYaml: true, bool append: false, bool parseSdk: false,
String introduction: ''}) {
@@ -386,11 +399,13 @@
_writeToFile(output, outputFile);
}
-/// Returns true if a library name starts with an underscore, and false
-/// otherwise.
-///
-/// An example that starts with _ is _js_helper.
-/// An example that contains ._ is dart._collection.dev
+/**
+ * Returns true if a library name starts with an underscore, and false
+ * otherwise.
+ *
+ * An example that starts with _ is _js_helper.
+ * An example that contains ._ is dart._collection.dev
+ */
// This is because LibraryMirror.isPrivate returns `false` all the time.
bool _isLibraryPrivate(LibraryMirror mirror) {
var sdkLibrary = LIBRARIES[mirror.simpleName];
@@ -403,7 +418,9 @@
return false;
}
-/// A declaration is private if itself is private, or the owner is private.
+/**
+ * A declaration is private if itself is private, or the owner is private.
+ */
// Issue(12202) - A declaration is public even if it's owner is private.
bool _isHidden(DeclarationMirror mirror) {
if (mirror is LibraryMirror) {
@@ -419,7 +436,9 @@
return _includePrivate || !item.isPrivate;
}
-/// Returns a list of meta annotations assocated with a mirror.
+/**
+ * Returns a list of meta annotations assocated with a mirror.
+ */
List<Annotation> _annotations(DeclarationMirror mirror) {
var annotationMirrors = mirror.metadata.where((e) =>
e is dart2js.Dart2JsConstructedConstantMirror);
@@ -430,7 +449,7 @@
.map((e) => annotation.getField(e.simpleName).reflectee)
.where((e) => e != null)
.toList();
- if (!skippedAnnotations.contains(docName(annotation.type))) {
+ if (validAnnotations.contains(docName(annotation.type))) {
annotations.add(new Annotation(docName(annotation.type),
parameterList));
}
@@ -438,8 +457,10 @@
return annotations;
}
-/// Returns any documentation comments associated with a mirror with
-/// simple markdown converted to html.
+/**
+ * Returns any documentation comments associated with a mirror with
+ * simple markdown converted to html.
+ */
String _commentToHtml(DeclarationMirror mirror) {
String commentText;
mirror.metadata.forEach((metadata) {
@@ -461,7 +482,9 @@
return commentText;
}
-/// Generates MDN comments from database.json.
+/**
+ * Generates MDN comments from database.json.
+ */
void _mdnComment(Indexable item) {
//Check if MDN is loaded.
if (_mdn == null) {
@@ -480,7 +503,9 @@
if (parts.length == 1) item.comment = _mdnTypeComment(parts[0]);
}
-/// Generates the MDN Comment for variables and method DOM elements.
+/**
+ * Generates the MDN Comment for variables and method DOM elements.
+ */
String _mdnMemberComment(String type, String member) {
var mdnType = _mdn[type];
if (mdnType == null) return '';
@@ -492,7 +517,9 @@
return _htmlMdn(mdnMember['help'], mdnMember['url']);
}
-/// Generates the MDN Comment for class DOM elements.
+/**
+ * Generates the MDN Comment for class DOM elements.
+ */
String _mdnTypeComment(String type) {
var mdnType = _mdn[type];
if (mdnType == null) return '';
@@ -506,7 +533,9 @@
'<a href="' + url.trim() + '">from Mdn</a></p></div>';
}
-/// Converts all [foo] references in comments to <a>libraryName.foo</a>.
+/**
+ * Converts all [foo] references in comments to <a>libraryName.foo</a>.
+ */
markdown.Node fixReference(String name, LibraryMirror currentLibrary,
ClassMirror currentClass, MemberMirror currentMember) {
var reference;
@@ -528,7 +557,9 @@
return new markdown.Element.text('a', reference);
}
-/// Returns a map of [Variable] objects constructed from [mirrorMap].
+/**
+ * Returns a map of [Variable] objects constructed from [mirrorMap].
+ */
Map<String, Variable> _variables(Map<String, VariableMirror> mirrorMap) {
var data = {};
// TODO(janicejl): When map to map feature is created, replace the below with
@@ -546,7 +577,9 @@
return data;
}
-/// Returns a map of [Method] objects constructed from [mirrorMap].
+/**
+ * Returns a map of [Method] objects constructed from [mirrorMap].
+ */
MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
var group = new MethodGroup();
mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
@@ -557,8 +590,10 @@
return group;
}
-/// Returns the [Class] for the given [mirror] has already been created, and if
-/// it does not exist, creates it.
+/**
+ * Returns the [Class] for the given [mirror] has already been created, and if
+ * it does not exist, creates it.
+ */
Class _class(ClassMirror mirror) {
var clazz = entityMap[docName(mirror)];
if (clazz == null) {
@@ -578,7 +613,9 @@
return clazz;
}
-/// Returns a map of [Class] objects constructed from [mirrorMap].
+/**
+ * Returns a map of [Class] objects constructed from [mirrorMap].
+ */
ClassGroup _classes(Map<String, ClassMirror> mirrorMap) {
var group = new ClassGroup();
mirrorMap.forEach((String mirrorName, ClassMirror mirror) {
@@ -587,7 +624,9 @@
return group;
}
-/// Returns a map of [Parameter] objects constructed from [mirrorList].
+/**
+ * Returns a map of [Parameter] objects constructed from [mirrorList].
+ */
Map<String, Parameter> _parameters(List<ParameterMirror> mirrorList) {
var data = {};
mirrorList.forEach((ParameterMirror mirror) {
@@ -600,20 +639,26 @@
return data;
}
-/// Returns a map of [Generic] objects constructed from the class mirror.
+/**
+ * Returns a map of [Generic] objects constructed from the class mirror.
+ */
Map<String, Generic> _generics(ClassMirror mirror) {
return new Map.fromIterable(mirror.typeVariables,
key: (e) => e.toString(),
value: (e) => new Generic(e.toString(), e.upperBound.qualifiedName));
}
-/// Returns a single [Type] object constructed from the Method.returnType
-/// Type mirror.
+/**
+ * Returns a single [Type] object constructed from the Method.returnType
+ * Type mirror.
+ */
Type _type(TypeMirror mirror) {
return new Type(docName(mirror), _typeGenerics(mirror));
}
-/// Returns a list of [Type] objects constructed from TypeMirrors.
+/**
+ * Returns a list of [Type] objects constructed from TypeMirrors.
+ */
List<Type> _typeGenerics(TypeMirror mirror) {
if (mirror is ClassMirror && !mirror.isTypedef) {
var innerList = [];
@@ -625,7 +670,9 @@
return [];
}
-/// Writes text to a file in the 'docs' directory.
+/**
+ * Writes text to a file in the 'docs' directory.
+ */
void _writeToFile(String text, String filename, {bool append: false}) {
Directory dir = new Directory('docs');
if (!dir.existsSync()) {
@@ -646,7 +693,9 @@
file.writeAsStringSync(text, mode: append ? FileMode.APPEND : FileMode.WRITE);
}
-/// Transforms the map by calling toMap on each value in it.
+/**
+ * Transforms the map by calling toMap on each value in it.
+ */
Map recurseMap(Map inputMap) {
var outputMap = {};
inputMap.forEach((key, value) {
@@ -659,7 +708,9 @@
return outputMap;
}
-/// A class representing all programming constructs, like library or class.
+/**
+ * A class representing all programming constructs, like library or class.
+ */
class Indexable {
String name;
String get qualifiedName => fileName;
@@ -691,7 +742,9 @@
/// The type of this member to be used in index.txt.
String get typeName => '';
- /// Creates a [Map] with this [Indexable]'s name and a preview comment.
+ /**
+ * Creates a [Map] with this [Indexable]'s name and a preview comment.
+ */
Map get previewMap {
var finalMap = { 'name' : name, 'qualifiedName' : qualifiedName };
if (comment != '') {
@@ -708,7 +761,9 @@
Map toMap() {}
}
-/// A class containing contents of a Dart library.
+/**
+ * A class containing contents of a Dart library.
+ */
class Library extends Indexable {
/// Top-level variables in the library.
@@ -756,7 +811,9 @@
String get typeName => 'library';
}
-/// A class containing contents of a Dart class.
+/**
+ * A class containing contents of a Dart class.
+ */
class Class extends Indexable {
/// List of the names of interfaces that this class implements.
@@ -795,26 +852,32 @@
String get typeName => 'class';
- /// Returns a list of all the parent classes.
+ /**
+ * Returns a list of all the parent classes.
+ */
List<Class> parent() {
var parent = superclass == null ? [] : [superclass];
parent.addAll(interfaces);
return parent;
}
- /// Add all inherited variables and methods from the provided superclass.
- /// If [_includePrivate] is true, it also adds the variables and methods from
- /// the superclass.
+ /**
+ * Add all inherited variables and methods from the provided superclass.
+ * If [_includePrivate] is true, it also adds the variables and methods from
+ * the superclass.
+ */
void addInherited(Class superclass) {
inheritedVariables.addAll(superclass.inheritedVariables);
inheritedVariables.addAll(superclass.variables);
inheritedMethods.addInherited(superclass);
}
- /// Add the subclass to the class.
- ///
- /// If [this] is private, it will add the subclass to the list of subclasses in
- /// the superclasses.
+ /**
+ * Add the subclass to the class.
+ *
+ * If [this] is private, it will add the subclass to the list of subclasses in
+ * the superclasses.
+ */
void addSubclass(Class subclass) {
if (!_includePrivate && isPrivate) {
if (superclass != null) superclass.addSubclass(subclass);
@@ -826,7 +889,9 @@
}
}
- /// Check if this [Class] is an error or exception.
+ /**
+ * Check if this [Class] is an error or exception.
+ */
bool isError() {
if (qualifiedName == 'dart-core.Error' ||
qualifiedName == 'dart-core.Exception')
@@ -838,10 +903,12 @@
return superclass.isError();
}
- /// Check that the class exists in the owner library.
- ///
- /// If it does not exist in the owner library, it is a mixin applciation and
- /// should be removed.
+ /**
+ * Check that the class exists in the owner library.
+ *
+ * If it does not exist in the owner library, it is a mixin applciation and
+ * should be removed.
+ */
void makeValid() {
var library = entityMap[owner];
if (library != null && !library.classes.containsKey(name)) {
@@ -855,7 +922,9 @@
}
}
- /// Makes sure that all methods with inherited equivalents have comments.
+ /**
+ * Makes sure that all methods with inherited equivalents have comments.
+ */
void ensureComments() {
inheritedMethods.forEach((qualifiedName, inheritedMethod) {
var method = methods[qualifiedName];
@@ -863,8 +932,10 @@
});
}
- /// If a class extends a private superclass, find the closest public superclass
- /// of the private superclass.
+ /**
+ * If a class extends a private superclass, find the closest public superclass
+ * of the private superclass.
+ */
String validSuperclass() {
if (superclass == null) return 'dart.core.Object';
if (_isVisible(superclass)) return superclass.qualifiedName;
@@ -890,8 +961,10 @@
};
}
-/// A container to categorize classes into the following groups: abstract
-/// classes, regular classes, typedefs, and errors.
+/**
+ * A container to categorize classes into the following groups: abstract
+ * classes, regular classes, typedefs, and errors.
+ */
class ClassGroup {
Map<String, Class> classes = {};
Map<String, Typedef> typedefs = {};
@@ -933,7 +1006,9 @@
}
}
- /// Checks if the given name is a key for any of the Class Maps.
+ /**
+ * Checks if the given name is a key for any of the Class Maps.
+ */
bool containsKey(String name) {
return classes.containsKey(name) || errors.containsKey(name);
}
@@ -976,7 +1051,9 @@
String get typeName => 'typedef';
}
-/// A class containing properties of a Dart variable.
+/**
+ * A class containing properties of a Dart variable.
+ */
class Variable extends Indexable {
bool isFinal;
@@ -1008,7 +1085,9 @@
String get typeName => 'property';
}
-/// A class containing properties of a Dart method.
+/**
+ * A class containing properties of a Dart method.
+ */
class Method extends Indexable {
/// Parameters for this method.
@@ -1037,7 +1116,9 @@
_mdnComment(this);
}
- /// Makes sure that the method with an inherited equivalent have comments.
+ /**
+ * Makes sure that the method with an inherited equivalent have comments.
+ */
void ensureCommentFor(Method inheritedMethod) {
if (comment.isNotEmpty) return;
(entityMap[inheritedMethod.owner] as Class).ensureComments();
@@ -1065,8 +1146,10 @@
isOperator ? 'operator' : 'method';
}
-/// A container to categorize methods into the following groups: setters,
-/// getters, constructors, operators, regular methods.
+/**
+ * A container to categorize methods into the following groups: setters,
+ * getters, constructors, operators, regular methods.
+ */
class MethodGroup {
Map<String, Method> setters = {};
Map<String, Method> getters = {};
@@ -1135,7 +1218,9 @@
}
}
-/// A class containing properties of a Dart method/function parameter.
+/**
+ * A class containing properties of a Dart method/function parameter.
+ */
class Parameter {
String name;
@@ -1163,7 +1248,9 @@
};
}
-/// A class containing properties of a Generic.
+/**
+ * A class containing properties of a Generic.
+ */
class Generic {
String name;
String type;
@@ -1176,34 +1263,36 @@
};
}
-/// Holds the name of a return type, and its generic type parameters.
-///
-/// Return types are of a form [outer]<[inner]>.
-/// If there is no [inner] part, [inner] will be an empty list.
-///
-/// For example:
-/// int size()
-/// "return" :
-/// - "outer" : "dart-core.int"
-/// "inner" :
-///
-/// List<String> toList()
-/// "return" :
-/// - "outer" : "dart-core.List"
-/// "inner" :
-/// - "outer" : "dart-core.String"
-/// "inner" :
-///
-/// Map<String, List<int>>
-/// "return" :
-/// - "outer" : "dart-core.Map"
-/// "inner" :
-/// - "outer" : "dart-core.String"
-/// "inner" :
-/// - "outer" : "dart-core.List"
-/// "inner" :
-/// - "outer" : "dart-core.int"
-/// "inner" :
+/**
+ * Holds the name of a return type, and its generic type parameters.
+ *
+ * Return types are of a form [outer]<[inner]>.
+ * If there is no [inner] part, [inner] will be an empty list.
+ *
+ * For example:
+ * int size()
+ * "return" :
+ * - "outer" : "dart-core.int"
+ * "inner" :
+ *
+ * List<String> toList()
+ * "return" :
+ * - "outer" : "dart-core.List"
+ * "inner" :
+ * - "outer" : "dart-core.String"
+ * "inner" :
+ *
+ * Map<String, List<int>>
+ * "return" :
+ * - "outer" : "dart-core.Map"
+ * "inner" :
+ * - "outer" : "dart-core.String"
+ * "inner" :
+ * - "outer" : "dart-core.List"
+ * "inner" :
+ * - "outer" : "dart-core.int"
+ * "inner" :
+ */
class Type {
String outer;
List<Type> inner;
@@ -1216,7 +1305,9 @@
};
}
-/// Holds the name of the annotation, and its parameters.
+/**
+ * Holds the name of the annotation, and its parameters.
+ */
class Annotation {
String qualifiedName;
List<String> parameters;
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index 254e477..a385dd5 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -1,10 +1,15 @@
name: docgen
+version: 0.9.0
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/dartdoc-viewer
description: A documentation generator for the Dart repository.
dependencies:
- args: any
- logging: any
- markdown: any
- path: any
- yaml: any
+ args: ">=0.9.0 <0.10.0"
+ logging: ">=0.9.0 <0.10.0"
+ markdown: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ yaml: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index 0b2ed15..026b85e 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -1,4 +1,5 @@
name: expect
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -7,3 +8,5 @@
Third parties are discouraged from using this, and should use
the expect() function in the unit test library instead for
test assertions.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/fixnum/pubspec.yaml b/pkg/fixnum/pubspec.yaml
index c582394..a149549 100644
--- a/pkg/fixnum/pubspec.yaml
+++ b/pkg/fixnum/pubspec.yaml
@@ -1,6 +1,9 @@
name: fixnum
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: Library for 32- and 64-bit fixed size integers.
homepage: http://www.dartlang.org
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/html_import/pubspec.yaml b/pkg/html_import/pubspec.yaml
index 9aa328d..9d2ca0e 100644
--- a/pkg/html_import/pubspec.yaml
+++ b/pkg/html_import/pubspec.yaml
@@ -1,4 +1,5 @@
name: html_import
+version: 0.9.0
author: "Web UI Team <web-ui-dev@dartlang.org>"
homepage: https://github.com/Polymer/HTMLImports/tree/master
description: >
@@ -6,3 +7,5 @@
documents. As <script> tags let authors include external code in their
pages, imports let authors load full HTML resources. In particular, imports
let authors include Custom Element definitions from external URLs.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 515206d..2e2aafa 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,8 +1,11 @@
name: http
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: A composable, Future-based API for making HTTP requests.
dependencies:
- path: any
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/http_server/pubspec.yaml b/pkg/http_server/pubspec.yaml
index 10896aa..555569b 100644
--- a/pkg/http_server/pubspec.yaml
+++ b/pkg/http_server/pubspec.yaml
@@ -1,10 +1,13 @@
name: http_server
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: Library of HTTP server classes.
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/http_server
dependencies:
- mime: any
- path: any
+ mime: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 9cccb36..97bce62 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,12 +1,14 @@
name: intl
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/intl
dependencies:
- analyzer: any
- meta: any
- path: any
+ analyzer: ">=0.10.1 <0.11.0"
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- serialization: any
- unittest: any
+ serialization: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/json/pubspec.yaml b/pkg/json/pubspec.yaml
index 1ff8b89..de9f8cc 100644
--- a/pkg/json/pubspec.yaml
+++ b/pkg/json/pubspec.yaml
@@ -1,4 +1,5 @@
name: json
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: >
A JSON library. Intended for advanced use where the built-in facilities are
@@ -6,4 +7,6 @@
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/json
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/logging/pubspec.yaml b/pkg/logging/pubspec.yaml
index c23bd3e..7893523 100644
--- a/pkg/logging/pubspec.yaml
+++ b/pkg/logging/pubspec.yaml
@@ -1,10 +1,12 @@
name: logging
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: Provides APIs for debugging and error logging. This library introduces abstractions similar to those used in other languages, such as the Closure JS Logger and java.util.logging.Logger.
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/logging
dependencies:
- meta: any
- unmodifiable_collection: any
+ unmodifiable_collection: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/mime/pubspec.yaml b/pkg/mime/pubspec.yaml
index 174820c..0ce9b2a 100644
--- a/pkg/mime/pubspec.yaml
+++ b/pkg/mime/pubspec.yaml
@@ -1,6 +1,9 @@
name: mime
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: Helper-package for working with MIME.
homepage: http://www.dartlang.org
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/mutation_observer/pubspec.yaml b/pkg/mutation_observer/pubspec.yaml
index cafca55..4d320c3 100644
--- a/pkg/mutation_observer/pubspec.yaml
+++ b/pkg/mutation_observer/pubspec.yaml
@@ -1,8 +1,11 @@
name: mutation_observer
+version: 0.9.0
author: "Web UI Team <web-ui-dev@dartlang.org>"
homepage: https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/pkg/mutation_observer/
documentation: https://api.dartlang.org/docs/releases/latest/dart_html/MutationObserver.html
description: >
Mutation Observers provide a way to react to changes in the DOM.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index f531f46..4d6fda6 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -1,4 +1,5 @@
name: oauth2
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -6,6 +7,8 @@
behalf of a user, and making authorized HTTP requests with the user's
OAuth2 credentials.
dependencies:
- http: any
+ http: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index d55ca35..5c6f23f 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,4 +1,5 @@
name: observe
+version: 0.9.0
author: Web UI Team <web-ui-dev@dartlang.org>
description: >
Observable properties and objects for use in Model-Driven-Views (MDV).
@@ -8,10 +9,12 @@
immediately assigned to the model.
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
- analyzer: any
- barback: any
- logging: any
- path: any
- source_maps: any
+ analyzer: ">=0.10.1 <0.11.0"
+ barback: ">=0.9.0 <0.10.0"
+ logging: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ source_maps: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index a366122..aa905cf 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,4 +1,5 @@
name: path
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: >
A string-based path manipulation library. All of the path operations you know
@@ -7,4 +8,6 @@
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/path
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 30f623f..a86c987 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -33,9 +33,6 @@
[ $compiler == dart2js && $checked && $runtime == ie9 ]
crypto/test/base64_test: Timeout # Issue 12486
-[ $compiler == dart2js && $checked && $runtime == d8 ]
-serialization/test/serialization_test: Pass, RuntimeError # Issue 14735
-
[ $runtime == d8 || $runtime == jsshell ]
unittest/test/unittest_nested_groups_setup_teardown_test: Pass, RuntimeError # http://dartbug.com/10109
stack_trace/test/vm_test: RuntimeError, OK # VM-specific traces
@@ -307,14 +304,6 @@
source_maps/test/parser_test: Pass, Timeout # Issue 13719: Please triage this failure.
polymer_expressions/test/bindings_test: Fail, Pass # Issue 14445.
-[ $compiler == dartanalyzer ]
-# pkg issue 13944; Missing inherited member 'Observable._mirror'
-custom_element/test/analyzer_test: fail
-
-[ $compiler == dart2analyzer ]
-# pkg issue 13944; Missing inherited members: 'ListChangeRecord.addedCount' and 'ListChangeRecord.removedCount'
-custom_element/test/analyzer_test: fail
-
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
docgen/test/single_library_test: StaticWarning
http_server/test/http_body_test: StaticWarning
@@ -334,3 +323,7 @@
intl/test/date_time_format_local_odd_test: StaticWarning
unittest/test/matchers_test: StaticWarning, OK # testing error creating abstract class
unittest/test/mock_test: StaticWarning, OK # testing unimplemented members
+
+[ $runtime == vm ]
+# Issue surfaced after removing deprecated async features.
+scheduled_test/test/scheduled_test/nested_task_test: RuntimeError # Issue 14639
diff --git a/pkg/polymer/example/component/news/web/index.html b/pkg/polymer/example/component/news/web/index.html
index 8dda8f59..b9e56c9 100644
--- a/pkg/polymer/example/component/news/web/index.html
+++ b/pkg/polymer/example/component/news/web/index.html
@@ -18,7 +18,7 @@
<li><a href="//example.com/stories/4">Awesome story</a></li>
<li class="breaking"><a href="//example.com/stories/5">Horrible story</a></li>
</ul>
- <script type="application/dart">import 'package:polymer/init.dart';</script>
+ <script type="application/dart">export 'package:polymer/init.dart';</script>
<script src='packages/browser/dart.js'></script>
</body>
</html>
diff --git a/pkg/polymer/lib/boot.js b/pkg/polymer/lib/boot.js
index 0cb6714..d4a0f8f 100644
--- a/pkg/polymer/lib/boot.js
+++ b/pkg/polymer/lib/boot.js
@@ -5,7 +5,7 @@
(function() {
console.error('"boot.js" is now deprecated. Instead, you can initialize '
+ 'your polymer application by adding the following tags: \'' +
- + '<script type="application/dart">import "package:polymer/init.dart";'
+ + '<script type="application/dart">export "package:polymer/init.dart";'
+ '</script><script src="packages/browser/dart.js"></script>\'. '
+ 'Make sure these script tags come after all HTML imports.');
})();
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 317765f..f186d31 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -544,7 +544,7 @@
const String USE_INIT_DART =
'To run a polymer applications, you need to call "initPolymer". You can '
'either include a generic script tag that does this for you:'
- '\'<script type="application/dart">import "package:polymer/init.dart";'
+ '\'<script type="application/dart">export "package:polymer/init.dart";'
'</script>\' or add your own script tag and call that function. '
'Make sure the script tag is placed after all HTML imports.';
@@ -556,7 +556,7 @@
'"boot.js" is now deprecated. Instead, you can initialize your polymer '
'application by calling "initPolymer()" in your main. If you don\'t have a '
'main, then you can include our generic main by adding the following '
- 'script tag to your page: \'<script type="application/dart">import '
+ 'script tag to your page: \'<script type="application/dart">export '
'"package:polymer/init.dart";</script>\'. Additionally you need to '
'include: \'<script src="packages/browser/dart.js"></script>\' in the page '
'too. Make sure these script tags come after all HTML imports.';
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index bfb2c56..e869a2c 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -81,10 +81,7 @@
mainScriptTag.attributes['src'] =
path.url.basename(bootstrapId.path);
- // TODO(sigmund): stop renaming the file (see dartbug.com/14554)
- var modifiedMainId = mainLibraryId.addExtension('_modified.dart');
-
- libraries.add(modifiedMainId);
+ libraries.add(mainLibraryId);
var urls = libraries.map((id) => assetUrlFor(id, bootstrapId, logger))
.where((url) => url != null).toList();
var buffer = new StringBuffer()..writeln(MAIN_HEADER);
@@ -98,17 +95,12 @@
..writeln(' configureForDeployment([')
..writeAll(urls.map((url) => " '$url',\n"))
..writeln(' ]);')
- ..writeln(' i${i - 1}.polymerMainWrapper();')
+ ..writeln(' i${i - 1}.main();')
..writeln('}');
transform.addOutput(new Asset.fromString(
bootstrapId, buffer.toString()));
transform.addOutput(new Asset.fromString(id, document.outerHtml));
-
- return transform.readInputAsString(mainLibraryId).then((contents) {
- transform.addOutput(new Asset.fromString(modifiedMainId,
- '$contents\n\npolymerMainWrapper() => main();\n'));
- });
});
});
}
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 6aa271e..853824c 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,4 +1,5 @@
name: polymer
+version: 0.9.0
author: Polymer.dart Authors <web-ui-dev@dartlang.org>
description: >
Polymer.dart is a new type of library for the web, built on top of Web
@@ -6,22 +7,23 @@
browsers.
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
- analyzer: any
- args: any
- barback: any
- browser: any
- csslib: any
- custom_element: any
- html5lib: any
- html_import: any
- logging: any
- meta: any
- observe: any
- path: any
- polymer_expressions: any
- shadow_dom: any
- source_maps: any
- template_binding: any
- yaml: any
+ analyzer: ">=0.10.1 <0.11.0"
+ args: ">=0.9.0 <0.10.0"
+ barback: ">=0.9.0 <0.10.0"
+ browser: ">=0.9.0 <0.10.0"
+ csslib: ">=0.9.0 <0.10.0"
+ custom_element: ">=0.9.0 <0.10.0"
+ html5lib: ">=0.9.0 <0.10.0"
+ html_import: ">=0.9.0 <0.10.0"
+ logging: ">=0.9.0 <0.10.0"
+ observe: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ polymer_expressions: ">=0.9.0 <0.10.0"
+ shadow_dom: ">=0.9.0 <0.10.0"
+ source_maps: ">=0.9.0 <0.10.0"
+ template_binding: ">=0.9.0 <0.10.0"
+ yaml: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 4b6b759..bb39a85 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -45,18 +45,16 @@
'a|web/test.html_bootstrap.dart':
'''$MAIN_HEADER
- import 'a.dart_modified.dart' as i0;
+ import 'a.dart' as i0;
void main() {
configureForDeployment([
- 'a.dart_modified.dart',
+ 'a.dart',
]);
- i0.polymerMainWrapper();
+ i0.main();
}
'''.replaceAll('\n ', '\n'),
'a|web/a.dart': _sampleObservableOutput('A', 'foo'),
- 'a|web/a.dart_modified.dart':
- _sampleObservableOutput('A', 'foo', includeMain: true),
});
testPhases('single inline script', phases, {
@@ -75,19 +73,17 @@
'a|web/test.html_bootstrap.dart':
'''$MAIN_HEADER
- import 'test.html.0.dart_modified.dart' as i0;
+ import 'test.html.0.dart' as i0;
void main() {
configureForDeployment([
- 'test.html.0.dart_modified.dart',
+ 'test.html.0.dart',
]);
- i0.polymerMainWrapper();
+ i0.main();
}
'''.replaceAll('\n ', '\n'),
'a|web/test.html.0.dart':
_sampleObservableOutput("B", "bar"),
- 'a|web/test.html.0.dart_modified.dart':
- _sampleObservableOutput("B", "bar", includeMain: true),
});
testPhases('several scripts', phases, {
@@ -119,18 +115,16 @@
'a|web/test.html_bootstrap.dart':
'''$MAIN_HEADER
- import 'a.dart_modified.dart' as i0;
+ import 'a.dart' as i0;
void main() {
configureForDeployment([
- 'a.dart_modified.dart',
+ 'a.dart',
]);
- i0.polymerMainWrapper();
+ i0.main();
}
'''.replaceAll('\n ', '\n'),
'a|web/a.dart': _sampleObservableOutput('A', 'foo'),
- 'a|web/a.dart_modified.dart':
- _sampleObservableOutput('A', 'foo', includeMain: true),
'a|web/test.html.0.dart': _sampleObservableOutput("B", "bar"),
'a|web/test.html.1.dart': _sampleObservableOutput("C", "car"),
});
@@ -160,19 +154,17 @@
'a|web/index.html_bootstrap.dart':
'''$MAIN_HEADER
import 'test2.html.0.dart' as i0;
- import 'b.dart_modified.dart' as i1;
+ import 'b.dart' as i1;
void main() {
configureForDeployment([
'test2.html.0.dart',
- 'b.dart_modified.dart',
+ 'b.dart',
]);
- i1.polymerMainWrapper();
+ i1.main();
}
'''.replaceAll('\n ', '\n'),
'a|web/test2.html.0.dart': _sampleObservableOutput("A", "foo"),
- 'a|web/test2.html.0.dart_modified.dart':
- _sampleObservableOutput("A", "foo", includeMain: true),
'a|web/b.dart': _sampleObservableOutput('B', 'bar'),
});
}
@@ -198,5 +190,4 @@
"__\$$field = notifyPropertyChange(#$field, __\$$field, value); "
"}\n"
" $className($field) : __\$$field = $field;\n"
- "}\n"
- "${includeMain ? '\n\npolymerMainWrapper() => main();\n' : ''}";
+ "}\n";
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 946c90d..e3ec79c 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -46,19 +46,16 @@
'a|web/test.html_bootstrap.dart':
'''$MAIN_HEADER
- import 'a.dart_modified.dart' as i0;
+ import 'a.dart' as i0;
void main() {
configureForDeployment([
- 'a.dart_modified.dart',
+ 'a.dart',
]);
- i0.polymerMainWrapper();
+ i0.main();
}
'''.replaceAll('\n ', '\n'),
'a|web/a.dart': 'library a;\nmain(){}',
- 'a|web/a.dart_modified.dart':
- 'library a;\nmain(){}'
- '\n\npolymerMainWrapper() => main();\n',
});
testPhases('several scripts', phases, {
@@ -83,16 +80,16 @@
import 'a.dart' as i0;
import 'b.dart' as i1;
import 'c.dart' as i2;
- import 'd.dart_modified.dart' as i3;
+ import 'd.dart' as i3;
void main() {
configureForDeployment([
'a.dart',
'b.dart',
'c.dart',
- 'd.dart_modified.dart',
+ 'd.dart',
]);
- i3.polymerMainWrapper();
+ i3.main();
}
'''.replaceAll('\n ', '\n'),
});
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 5686381..4a62f0f 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,10 +1,13 @@
name: polymer_expressions
+version: 0.9.0
author: Web UI Authors <html-dev@dartlang.org>
description: An expressive custom binding syntax for MDV templates
homepage: http://www.dartlang.org/polymer-dart/
dependencies:
- browser: any
- observe: any
- template_binding: any
+ browser: ">=0.9.0 <0.10.0"
+ observe: ">=0.9.0 <0.10.0"
+ template_binding: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/scheduled_test/lib/src/schedule.dart b/pkg/scheduled_test/lib/src/schedule.dart
index 7cc30fb..5c88464 100644
--- a/pkg/scheduled_test/lib/src/schedule.dart
+++ b/pkg/scheduled_test/lib/src/schedule.dart
@@ -134,26 +134,26 @@
_state = ScheduleState.RUNNING;
return tasks._run();
- }).catchError((error, stackTrace) {
- _addError(error, stackTrace);
- return onException._run().catchError((innerError, innerTrace) {
+ }).catchError((e) {
+ _addError(e);
+ return onException._run().catchError((innerError) {
// If an error occurs in a task in the onException queue, make sure it's
// registered in the error list and re-throw it. We could also re-throw
- // `error`; ultimately, all the errors will be shown to the user if any
+ // `e`; ultimately, all the errors will be shown to the user if any
// ScheduleError is thrown.
- _addError(innerError, innerTrace);
+ _addError(innerError);
throw innerError;
}).then((_) {
// If there are no errors in the onException queue, re-throw the
// original error that caused it to run.
- throw error;
+ throw e;
});
}).whenComplete(() {
- return onComplete._run().catchError((error, stackTrace) {
+ return onComplete._run().catchError((e) {
// If an error occurs in a task in the onComplete queue, make sure it's
// registered in the error list and re-throw it.
- _addError(error, stackTrace);
- throw error;
+ _addError(e);
+ throw e;
});
}).whenComplete(() {
if (_timeoutTimer != null) _timeoutTimer.cancel();
@@ -255,14 +255,13 @@
Future wrapFuture(Future future, [String description]) {
var done = wrapAsync((fn) => fn(), description);
- future = future.then((result) => done(() => result))
- .catchError((error, stackTrace) {
+ future = future.then((result) => done(() => result)).catchError((e) {
done(() {
- throw new ScheduleError.from(this, error, stackTrace: stackTrace);
+ throw e;
});
// wrapAsync will catch the first throw, so we throw [e] again so it
// propagates through the Future chain.
- throw error;
+ throw e;
});
// Don't top-level the error, since it's already been signaled to the
@@ -308,10 +307,9 @@
/// Register an error in the schedule's error list. This ensures that there
/// are no duplicate errors, and that all errors are wrapped in
/// [ScheduleError].
- void _addError(error, [StackTrace stackTrace]) {
- error = new ScheduleError.from(this, error, stackTrace: stackTrace);
- if (errors.contains(error)) return;
- _errors.add(error);
+ void _addError(error) {
+ if (error is ScheduleError && errors.contains(error)) return;
+ _errors.add(new ScheduleError.from(this, error));
}
}
@@ -426,8 +424,8 @@
}
var task = new Task(() {
- return new Future.sync(fn).catchError((e, stackTrace) {
- throw new ScheduleError.from(_schedule, e, stackTrace: stackTrace);
+ return new Future.sync(fn).catchError((e) {
+ throw new ScheduleError.from(_schedule, e);
});
}, description, this);
_contents.add(task);
@@ -548,9 +546,8 @@
} else if (_taskFuture != null) {
// Catch errors coming off the old task future, in case it completes after
// timing out.
- _taskFuture.substitute(new Future.error(error))
- .catchError((e, stackTrace) {
- _schedule._signalPostTimeoutError(e, stackTrace);
+ _taskFuture.substitute(new Future.error(error)).catchError((e) {
+ _schedule._signalPostTimeoutError(e);
});
} else {
// This branch probably won't be reached, but it's conceivable that the
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 4f4f60b..285a74c 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,4 +1,5 @@
name: scheduled_test
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -9,7 +10,9 @@
read like synchronous, linear code, despite executing asynchronously.
dependencies:
- http: ">=0.4.1 <1.0.0"
- path: ">=0.3.2 <1.0.0"
- stack_trace: ">=0.4.3 <1.0.0"
- unittest: ">=0.4.3 <1.0.0"
+ http: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ stack_trace: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/scheduled_test/test/metatest.dart
index 18309bd..d2ed92f 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/scheduled_test/test/metatest.dart
@@ -119,9 +119,7 @@
/// describing the results of that test run.
Future<Map> _runInIsolate(String description) {
var replyPort = new ReceivePort();
- // TODO(nweiz): Don't use path here once issue 8440 is fixed.
- var uri = path.toUri(path.absolute(path.fromUri(Platform.script)));
- return Isolate.spawnUri(uri, [], {
+ return Isolate.spawnUri(Platform.script, [], {
'testToRun': description,
'replyTo': replyPort.sendPort
}).then((_) {
diff --git a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
index 1356b80..ecb88d0 100644
--- a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
@@ -90,7 +90,7 @@
expectTestsPass("nested scheduled blocks whose return values are passed to "
"wrapFuture should report exceptions once", () {
- var error = 'oh no!';
+ var error = new Object();
var errors;
test('test 1', () {
currentSchedule.onException.schedule(() {
diff --git a/pkg/sequence_zip/pubspec.yaml b/pkg/sequence_zip/pubspec.yaml
index ba4d377..fa4d22c 100644
--- a/pkg/sequence_zip/pubspec.yaml
+++ b/pkg/sequence_zip/pubspec.yaml
@@ -1,4 +1,5 @@
name: sequence_zip
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -6,4 +7,6 @@
Combines multiple iterables into a single iterable of tuples of values,
and similar for Streams.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/serialization/pubspec.yaml b/pkg/serialization/pubspec.yaml
index e66e029..3a5ea8a 100644
--- a/pkg/serialization/pubspec.yaml
+++ b/pkg/serialization/pubspec.yaml
@@ -1,8 +1,11 @@
name: serialization
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/serialization
description: >
Provide a serialization facility for Dart objects.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index 2622ea3..5ed6ecf 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -1884,7 +1884,7 @@
// 1.
if (isShadowRoot(node))
- return getInsertionParent(node) || scope.getHostForShadowRoot(node);
+ return getInsertionParent(node) || node.host;
// 2.
var eventParents = scope.eventParentsTable.get(node);
@@ -1980,7 +1980,7 @@
ancestor = calculateParents(ancestor, context, ancestors); // 3.4.7.
}
if (isShadowRoot(target)) // 3.5.
- target = scope.getHostForShadowRoot(target);
+ target = target.host;
else
target = target.parentNode; // 3.6.
}
@@ -2009,10 +2009,8 @@
function enclosedBy(a, b) {
if (a === b)
return true;
- if (a instanceof wrappers.ShadowRoot) {
- var host = scope.getHostForShadowRoot(a);
- return enclosedBy(rootOfNode(host), b);
- }
+ if (a instanceof wrappers.ShadowRoot)
+ return enclosedBy(rootOfNode(a.host), b);
return false;
}
@@ -2434,7 +2432,7 @@
function getTargetToListenAt(wrapper) {
if (wrapper instanceof wrappers.ShadowRoot)
- wrapper = scope.getHostForShadowRoot(wrapper);
+ wrapper = wrapper.host;
return unwrap(wrapper);
}
@@ -2671,11 +2669,13 @@
}
var nodes = [];
- var firstChild;
- while (firstChild = node.firstChild) {
- node.removeChild(firstChild);
- nodes.push(firstChild);
- firstChild.parentNode_ = parentNode;
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ nodes.push(child);
+ }
+
+ for (var i = nodes.length - 1; i >= 0; i--) {
+ node.removeChild(nodes[i]);
+ nodes[i].parentNode_ = parentNode;
}
for (var i = 0; i < nodes.length; i++) {
@@ -2825,12 +2825,28 @@
this.previousSibling_ = undefined;
};
+ var OriginalDocumentFragment = window.DocumentFragment;
var originalAppendChild = OriginalNode.prototype.appendChild;
- var originalInsertBefore = OriginalNode.prototype.insertBefore;
- var originalReplaceChild = OriginalNode.prototype.replaceChild;
- var originalRemoveChild = OriginalNode.prototype.removeChild;
var originalCompareDocumentPosition =
OriginalNode.prototype.compareDocumentPosition;
+ var originalInsertBefore = OriginalNode.prototype.insertBefore;
+ var originalRemoveChild = OriginalNode.prototype.removeChild;
+ var originalReplaceChild = OriginalNode.prototype.replaceChild;
+
+ var isIe = /Trident/.test(navigator.userAgent);
+
+ var removeChildOriginalHelper = isIe ?
+ function(parent, child) {
+ try {
+ originalRemoveChild.call(parent, child);
+ } catch (ex) {
+ if (!(parent instanceof OriginalDocumentFragment))
+ throw ex;
+ }
+ } :
+ function(parent, child) {
+ originalRemoveChild.call(parent, child);
+ };
Node.prototype = Object.create(EventTarget.prototype);
mixin(Node.prototype, {
@@ -2906,8 +2922,20 @@
removeChild: function(childWrapper) {
assertIsNodeWrapper(childWrapper);
if (childWrapper.parentNode !== this) {
- // TODO(arv): DOMException
- throw new Error('NotFoundError');
+ // IE has invalid DOM trees at times.
+ var found = false;
+ var childNodes = this.childNodes;
+ for (var ieChild = this.firstChild; ieChild;
+ ieChild = ieChild.nextSibling) {
+ if (ieChild === childWrapper) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ // TODO(arv): DOMException
+ throw new Error('NotFoundError');
+ }
}
var childNode = unwrap(childWrapper);
@@ -2923,7 +2951,7 @@
var parentNode = childNode.parentNode;
if (parentNode)
- originalRemoveChild.call(parentNode, childNode);
+ removeChildOriginalHelper(parentNode, childNode);
if (thisFirstChild === childWrapper)
this.firstChild_ = childWrapperNextSibling;
@@ -2939,7 +2967,7 @@
childWrapper.previousSibling_ = childWrapper.nextSibling_ =
childWrapper.parentNode_ = undefined;
} else {
- originalRemoveChild.call(this.impl, childNode);
+ removeChildOriginalHelper(this.impl, childNode);
}
return childWrapper;
@@ -3726,12 +3754,13 @@
}
var node = unwrap(document.createElement('img'));
+ HTMLElement.call(this, node);
+ rewrap(node, this);
+
if (width !== undefined)
node.width = width;
if (height !== undefined)
node.height = height;
- HTMLElement.call(this, node);
- rewrap(node, this);
}
Image.prototype = HTMLImageElement.prototype;
@@ -3858,6 +3887,136 @@
(function(scope) {
'use strict';
+ var HTMLElement = scope.wrappers.HTMLElement;
+ var registerWrapper = scope.registerWrapper;
+
+ var OriginalHTMLMediaElement = window.HTMLMediaElement;
+
+ function HTMLMediaElement(node) {
+ HTMLElement.call(this, node);
+ }
+ HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
+
+ registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
+ document.createElement('audio'));
+
+ scope.wrappers.HTMLMediaElement = HTMLMediaElement;
+})(this.ShadowDOMPolyfill);
+
+// 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(scope) {
+ 'use strict';
+
+ var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
+ var registerWrapper = scope.registerWrapper;
+ var unwrap = scope.unwrap;
+ var rewrap = scope.rewrap;
+
+ var OriginalHTMLAudioElement = window.HTMLAudioElement;
+
+ function HTMLAudioElement(node) {
+ HTMLMediaElement.call(this, node);
+ }
+ HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
+
+ registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
+ document.createElement('audio'));
+
+ function Audio(src) {
+ if (!(this instanceof Audio)) {
+ throw new TypeError(
+ 'DOM object constructor cannot be called as a function.');
+ }
+
+ var node = unwrap(document.createElement('audio'));
+ HTMLMediaElement.call(this, node);
+ rewrap(node, this);
+
+ node.setAttribute('preload', 'auto');
+ if (src !== undefined)
+ node.setAttribute('src', src);
+ }
+
+ Audio.prototype = HTMLAudioElement.prototype;
+
+ scope.wrappers.HTMLAudioElement = HTMLAudioElement;
+ scope.wrappers.Audio = Audio;
+})(this.ShadowDOMPolyfill);
+
+// 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(scope) {
+ 'use strict';
+
+ var HTMLElement = scope.wrappers.HTMLElement;
+ var mixin = scope.mixin;
+ var registerWrapper = scope.registerWrapper;
+ var rewrap = scope.rewrap;
+ var unwrap = scope.unwrap;
+ var wrap = scope.wrap;
+
+ var OriginalHTMLOptionElement = window.HTMLOptionElement;
+
+ function trimText(s) {
+ return s.replace(/\s+/g, ' ').trim();
+ }
+
+ function HTMLOptionElement(node) {
+ HTMLElement.call(this, node);
+ }
+ HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
+ mixin(HTMLOptionElement.prototype, {
+ get text() {
+ return trimText(this.textContent);
+ },
+ set text(value) {
+ this.textContent = trimText(String(value));
+ },
+ get form() {
+ return wrap(unwrap(this).form);
+ }
+ });
+
+ registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,
+ document.createElement('option'));
+
+ function Option(text, value, defaultSelected, selected) {
+ if (!(this instanceof Option)) {
+ throw new TypeError(
+ 'DOM object constructor cannot be called as a function.');
+ }
+
+ var node = unwrap(document.createElement('option'));
+ HTMLElement.call(this, node);
+ rewrap(node, this);
+
+ if (text !== undefined)
+ node.text = text;
+ if (value !== undefined)
+ node.setAttribute('value', value);
+ if (defaultSelected === true)
+ node.setAttribute('selected', '');
+ node.selected = selected === true;
+ }
+
+ Option.prototype = HTMLOptionElement.prototype;
+
+ scope.wrappers.HTMLOptionElement = HTMLOptionElement;
+ scope.wrappers.Option = Option;
+})(this.ShadowDOMPolyfill);
+
+// 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(scope) {
+ 'use strict';
+
var HTMLContentElement = scope.wrappers.HTMLContentElement;
var HTMLElement = scope.wrappers.HTMLElement;
var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
@@ -4037,6 +4196,10 @@
return nextOlderShadowTreeTable.get(this) || null;
},
+ get host() {
+ return shadowHostTable.get(this) || null;
+ },
+
invalidateShadowRenderer: function() {
return shadowHostTable.get(this).invalidateShadowRenderer();
},
@@ -4051,9 +4214,6 @@
});
scope.wrappers.ShadowRoot = ShadowRoot;
- scope.getHostForShadowRoot = function(node) {
- return shadowHostTable.get(node);
- };
})(this.ShadowDOMPolyfill);
// Copyright 2013 The Polymer Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -4068,7 +4228,6 @@
var Node = scope.wrappers.Node;
var ShadowRoot = scope.wrappers.ShadowRoot;
var assert = scope.assert;
- var getHostForShadowRoot = scope.getHostForShadowRoot;
var mixin = scope.mixin;
var muteMutationEvents = scope.muteMutationEvents;
var oneOf = scope.oneOf;
@@ -4310,7 +4469,7 @@
}
function getRendererForShadowRoot(shadowRoot) {
- return getRendererForHost(getHostForShadowRoot(shadowRoot));
+ return getRendererForHost(shadowRoot.host);
}
var spliceDiff = new ArraySplice();
@@ -4739,7 +4898,7 @@
'HTMLLabelElement',
'HTMLLegendElement',
'HTMLObjectElement',
- 'HTMLOptionElement',
+ // HTMLOptionElement is handled in HTMLOptionElement.js
'HTMLOutputElement',
'HTMLSelectElement',
'HTMLTextAreaElement',
@@ -4924,13 +5083,19 @@
};
});
- var nativeConstructor = originalRegister.call(unwrap(this), tagName,
- object.extends ? {prototype: newPrototype, extends: object.extends} :
- {prototype: newPrototype});
+ var p = {prototype: newPrototype};
+ if (object.extends)
+ p.extends = object.extends;
+ var nativeConstructor = originalRegister.call(unwrap(this), tagName, p);
function GeneratedWrapper(node) {
- if (!node)
- return document.createElement(tagName);
+ if (!node) {
+ if (object.extends) {
+ return document.createElement(object.extends, tagName);
+ } else {
+ return document.createElement(tagName);
+ }
+ }
this.impl = node;
}
GeneratedWrapper.prototype = prototype;
@@ -5304,7 +5469,6 @@
'a': 'HTMLAnchorElement',
'applet': 'HTMLAppletElement',
'area': 'HTMLAreaElement',
- 'audio': 'HTMLAudioElement',
'br': 'HTMLBRElement',
'base': 'HTMLBaseElement',
'body': 'HTMLBodyElement',
@@ -5333,7 +5497,6 @@
'link': 'HTMLLinkElement',
'map': 'HTMLMapElement',
'marquee': 'HTMLMarqueeElement',
- // 'media', Covered by audio and video
'menu': 'HTMLMenuElement',
'menuitem': 'HTMLMenuItemElement',
'meta': 'HTMLMetaElement',
@@ -5477,10 +5640,10 @@
/*
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.
+
+ 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.
@@ -5489,57 +5652,57 @@
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
+ * @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
+
+ * 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
+
+ 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
+ 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.
+ 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;
}
@@ -5571,39 +5734,39 @@
becomes:
- x-foo [part=special] { ... }
-
+ x-foo [part=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
+ 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
+ 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 * /
+ / *@polyfill .content-container div * /
content::-webkit-distributed(div) {
background: red;
}
@@ -5611,9 +5774,9 @@
<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
+ 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) {
@@ -5649,7 +5812,7 @@
root.shimmedStyle = def.shimmedStyle;
}
// remove existing style elements
- for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]);
+ for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]);
i++) {
s.parentNode.removeChild(s);
}
@@ -5693,14 +5856,14 @@
/*
* 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 menu-item (comment end)
* shadow::-webkit-distributed(menu-item) {
- *
+ *
* to this:
- *
+ *
* scopeName menu-item {
*
**/
@@ -5719,14 +5882,14 @@
},
/*
* Process styles to add rules which will only apply under the polyfill
- *
+ *
* For example, we convert this rule:
- *
- * (comment start) @polyfill-rule :host menu-item {
+ *
+ * (comment start) @polyfill-rule :host menu-item {
* ... } (comment end)
- *
+ *
* to this:
- *
+ *
* scopeName menu-item {...}
*
**/
@@ -5745,15 +5908,15 @@
},
/*
* Process styles to add rules which will only apply under the polyfill
- * and do not process via CSSOM. (CSSOM is destructive to rules on rare
+ * and do not process via CSSOM. (CSSOM is destructive to rules on rare
* occasions, e.g. -webkit-calc on Safari.)
* For example, we convert this rule:
- *
- * (comment start) @polyfill-unscoped-rule menu-item {
+ *
+ * (comment start) @polyfill-unscoped-rule menu-item {
* ... } (comment end)
- *
+ *
* to this:
- *
+ *
* menu-item {...}
*
**/
@@ -5792,7 +5955,7 @@
return self.scopeHostCss(p1, name, typeExtension);
});
cssText = rulesToCss(this.findAtHostRules(cssToRules(cssText),
- new RegExp('^' + name + selectorReSuffix, 'm')));
+ this.makeScopeMatcher(name, typeExtension)));
return cssText;
},
scopeHostCss: function(cssText, name, typeExtension) {
@@ -5819,10 +5982,10 @@
return r.join(', ');
},
// consider styles that do not include component name in the selector to be
- // unscoped and in need of promotion;
+ // unscoped and in need of promotion;
// for convenience, also consider keyframe rules this way.
findAtHostRules: function(cssRules, matcher) {
- return Array.prototype.filter.call(cssRules,
+ return Array.prototype.filter.call(cssRules,
this.isHostRule.bind(this, matcher));
},
isHostRule: function(matcher, cssRule) {
@@ -5831,11 +5994,11 @@
(cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
},
/* Ensure styles are scoped. Pseudo-scoping takes a rule like:
- *
- * .foo {... }
- *
+ *
+ * .foo {... }
+ *
* and converts this to
- *
+ *
* scopeName .foo { ... }
*/
shimScoping: function(styles, name, typeExtension) {
@@ -5866,15 +6029,28 @@
* to
*
* scopeName.foo > .bar, .foo scopeName > .bar { }
- * TODO(sorvell): file bug since native impl does not do the former yet.
- * http://jsbin.com/OganOCI/2/edit
+ *
+ * and
+ *
+ * :host(.foo:host) .bar { ... }
+ *
+ * to
+ *
+ * scopeName.foo .bar { ... }
*/
convertColonHost: function(cssText) {
// p1 = :host, p2 = contents of (), p3 rest of rule
return cssText.replace(cssColonHostRe, function(m, p1, p2, p3) {
- return p2 ? polyfillHostNoCombinator + p2 + p3 + ', '
- + p2 + ' ' + p1 + p3 :
- p1 + p3;
+ p1 = polyfillHostNoCombinator;
+ if (p2) {
+ if (p2.match(polyfillHost)) {
+ return p1 + p2.replace(polyfillHost, '') + p3;
+ } else {
+ return p1 + p2 + p3 + ', ' + p2 + ' ' + p1 + p3;
+ }
+ } else {
+ return p1 + p3;
+ }
});
},
/*
@@ -5888,7 +6064,7 @@
var cssText = '';
Array.prototype.forEach.call(cssRules, function(rule) {
if (rule.selectorText && (rule.style && rule.style.cssText)) {
- cssText += this.scopeSelector(rule.selectorText, name, typeExtension,
+ cssText += this.scopeSelector(rule.selectorText, name, typeExtension,
this.strictStyling) + ' {\n\t';
cssText += this.propertiesFromRule(rule) + '\n}\n\n';
} else if (rule.media) {
@@ -5914,10 +6090,13 @@
return r.join(', ');
},
selectorNeedsScoping: function(selector, name, typeExtension) {
- var matchScope = typeExtension ? name : '\\[is=' + name + '\\]';
- var re = new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
+ var re = this.makeScopeMatcher(name, typeExtension);
return !selector.match(re);
},
+ makeScopeMatcher: function(name, typeExtension) {
+ var matchScope = typeExtension ? '\\[is=[\'"]?' + name + '[\'"]?\\]' : name;
+ return new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
+ },
// scope via name and [is=name]
applySimpleSelectorScope: function(selector, name, typeExtension) {
var scoper = typeExtension ? '[is=' + name + ']' : name;
@@ -5956,7 +6135,7 @@
// 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' +
+ properties = 'content: \'' + rule.style.content + '\';\n' +
rule.style.cssText.replace(/content:[^;]*;/g, '');
}
return properties;
@@ -6042,5 +6221,4 @@
scope.ShadowCSS = ShadowCSS;
})(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 3f339be..c9b57af 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,3 +1,3 @@
-if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)F="new",G="updated",H="reconfigured",I="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=J||b[1].type!=J?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:M(a)&&M(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:U.test(a))}function i(a,b){if(b!==V)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),L&&!K&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=W[a];if(b)return b;if(!h(a))return X;var b=new i(a,V);return W[a]=b,b}function k(b){for(var c=0;Y>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,K){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){$&&(Z.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];db[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=G&&(g.type!=F?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return ib.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case J:C(c,g.index,g.removed.slice(),g.addedCount);break;case F:case G:case I:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F="add",G="update",H="reconfigure",I="delete",J="splice",K=b(),L=c(),M=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},N="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},O="[$_a-zA-Z]",P="[$_a-zA-Z0-9]",Q=O+"+"+P+"*",R="(?:[0-9]|[1-9]+[0-9]+)",S="(?:"+Q+"|"+R+")",T="(?:"+S+")(?:\\s*\\.\\s*"+S+")*",U=new RegExp("^"+T+"$"),V={},W={};i.get=j,i.prototype=N({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n "+c+" != null";return b+=")\n",c+=a[e],b+=" return "+c+";\nelse\n return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var X=new i("",V);X.valid=!1,X.getValueFrom=X.setValueFrom=function(){};var Y=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(K?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(K&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var Z,$=!K||a.forceCollectObservers;p._allObserversCount=0,$&&(Z=[]);var _=!1,ab="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!_){if(ab)return Object.deliverAllChangeRecords(),void 0;if($){_=!0;var b=0,c={};do{b++;var d=Z;Z=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(K?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),Z.push(f))}}while(Y>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=Z.length,_=!1}}},$&&(a.Platform.clearObservers=function(){Z=[]}),r.prototype=N({__proto__:p.prototype,connect:function(){K&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=o(this.object))},check:function(a){var b,c;if(K){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){K?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=N({__proto__:r.prototype,connect:function(){K&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=this.object.slice())},check:function(a){var b;if(K){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var bb=Object.getPrototypeOf({}),cb=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==bb&&a!==cb){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=N({__proto__:p.prototype,connect:function(){K&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=N({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var db={};db[F]=!0,db[G]=!0,db[I]=!0,u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f(G,b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var eb=0,fb=1,gb=2,hb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(eb):(e.push(fb),d=g),b--,c--):f==h?(e.push(hb),b--,d=h):(e.push(gb),c--,d=i)}else e.push(hb),b--;else e.push(gb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case eb:j&&(l.push(j),j=void 0),m++,n++;break;case fb:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case gb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case hb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var ib=new z;a.Observer=p,a.Observer.hasObjectObserve=K,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return ib.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i,a.Observer.changeRecordTypes={add:F,update:G,reconfigure:H,"delete":I,splice:J}}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}();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,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){G=!1}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.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)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}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=[],j=e,l=void 0;j;){var n=null;if(i.length){if(c(j)&&(n=h(i),k(l))){var o=i[i.length-1];i.push(o)}}else i.push(j);if(m(j,d))return i[i.length-1];b(j)&&i.pop(),l=j,j=f(j,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(b,c){if(b===c)return!0;if(b instanceof O.ShadowRoot){var d=a.getHostForShadowRoot(b);return n(l(d),c)}return!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(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=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(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=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.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===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}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!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(b){return b instanceof O.ShadowRoot&&(b=a.getHostForShadowRoot(b)),M(b)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.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}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.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 _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.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=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(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){o(a instanceof k)}function c(a,b,c,d){if(!(a instanceof DocumentFragment))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,f=[];e=a.firstChild;)a.removeChild(e),f.push(e),e.parentNode_=b;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||c,f[g].nextSibling_=f[g+1]||d;return c&&(c.nextSibling_=f[0]),d&&(d.previousSibling_=f[f.length-1]),f}function d(a){if(a instanceof DocumentFragment){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}return[a]}function e(a){for(var b=0;b<a.length;b++)a[b].nodeWasAdded_()}function f(a,b){var c=a.nodeType===k.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function g(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function h(a,b){g(a,b);var c=b.length;if(1===c)return r(b[0]);for(var d=r(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(r(b[e]));return d}function i(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){o(b.parentNode===a);var c=b.nextSibling,d=r(b),e=d.parentNode;e&&y.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=r(a),g=f.firstChild;g;)c=g.nextSibling,y.call(f,g),g=c}function j(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function k(a){o(a instanceof u),l.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var l=a.wrappers.EventTarget,m=a.wrappers.NodeList,n=a.defineWrapGetter,o=a.assert,p=a.mixin,q=a.registerWrapper,r=a.unwrap,s=a.wrap,t=a.wrapIfNeeded,u=window.Node,v=u.prototype.appendChild,w=u.prototype.insertBefore,x=u.prototype.replaceChild,y=u.prototype.removeChild,z=u.prototype.compareDocumentPosition;k.prototype=Object.create(l.prototype),p(k.prototype,{appendChild:function(a){b(a);var g;if(this.invalidateShadowRenderer()||j(a)){var i=this.lastChild,k=null;g=c(a,this,i,k),this.lastChild_=g[g.length-1],i||(this.firstChild_=g[0]),v.call(this.impl,h(this,g))}else g=d(a),f(this,a),v.call(this.impl,r(a));return e(g),a},insertBefore:function(a,i){if(!i)return this.appendChild(a);b(a),b(i),o(i.parentNode===this);var k;if(this.invalidateShadowRenderer()||j(a)){var l=i.previousSibling,m=i;k=c(a,this,l,m),this.firstChild===i&&(this.firstChild_=k[0]);var n=r(i),p=n.parentNode;p?w.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),w.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");var c=r(a);if(this.invalidateShadowRenderer()){var d=this.firstChild,e=this.lastChild,f=a.nextSibling,g=a.previousSibling,h=c.parentNode;h&&y.call(h,c),d===a&&(this.firstChild_=f),e===a&&(this.lastChild_=g),g&&(g.nextSibling_=f),f&&(f.previousSibling_=g),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else y.call(this.impl,c);return a},replaceChild:function(a,g){if(b(a),b(g),g.parentNode!==this)throw new Error("NotFoundError");var i,k=r(g);if(this.invalidateShadowRenderer()||j(a)){var l=g.previousSibling,m=g.nextSibling;m===a&&(m=a.nextSibling),i=c(a,this,l,m),this.firstChild===g&&(this.firstChild_=i[0]),this.lastChild===g&&(this.lastChild_=i[i.length-1]),g.previousSibling_=g.nextSibling_=g.parentNode_=void 0,k.parentNode&&x.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),x.call(this.impl,r(a),k);return e(i),g},nodeWasAdded_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeWasAdded_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:s(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:s(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:s(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:s(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:s(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==k.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(this.invalidateShadowRenderer()){if(i(this),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}}else this.impl.textContent=a},get childNodes(){for(var a=new m,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return s(this.impl.cloneNode(a));var b=s(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=t(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return z.call(this.impl,r(a))}}),n(k,"ownerDocument"),q(u,k,document.createDocumentFragment()),delete k.prototype.querySelector,delete k.prototype.querySelectorAll,k.prototype=p(Object.create(l.prototype),k.prototype),a.wrappers.Node=k}(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.previousSibling)}};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(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a){g.call(this,a)}function d(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.ParentNodeInterface,i=a.SelectorsInterface;a.addWrapNodeListMethod;var j=a.mixin,k=a.oneOf,l=a.registerWrapper,m=a.wrappers,n=window.Element,o=k(n.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),p=n.prototype[o];c.prototype=Object.create(g.prototype),j(c.prototype,{createShadowRoot:function(){var b=new m.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,c){this.impl.setAttribute(a,c),b(this,a)},removeAttribute:function(a){this.impl.removeAttribute(a),b(this,a)},matches:function(a){return p.call(this.impl,a)}}),c.prototype[o]=function(a){return this.matches(a)},n.prototype.webkitCreateShadowRoot&&(c.prototype.webkitCreateShadowRoot=c.prototype.createShadowRoot),d(c.prototype,"id"),d(c.prototype,"className","class"),j(c.prototype,e),j(c.prototype,f),j(c.prototype,h),j(c.prototype,i),l(n,c),a.matchesName=o,a.wrappers.Element=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&";case"<":return"<";case'"':return"""}}function c(a){return a.replace(r,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+=">",s[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=p(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(q(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=/&|<|"/g,s={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},t=window.HTMLElement;g.prototype=Object.create(l.prototype),n(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),o(t,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=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(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){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));void 0!==a&&(e.width=a),void 0!==b&&(e.height=b),d.call(this,e),g(e,this)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(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.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,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";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b),a.wrappers.CanvasRenderingContext2D=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;g&&(c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}}),d(g,b),a.wrappers.WebGLRenderingContext=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(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}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 WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},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,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){return I.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++)P[a].render();P=[]}function l(){F=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(D(a))}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert;var D=a.getHostForShadowRoot;a.mixin,a.muteMutationEvents;var E=a.oneOf;a.unmuteMutationEvents;var F,G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=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("|")+")"),O=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),F)return;F=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeWasAdded_=z.prototype.nodeWasAdded_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOptionElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);return["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})}),z.call(u(this),b,c.extends?{prototype:i,"extends":c.extends}:{prototype:i}),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(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=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,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){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b),a.wrappers.Range=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",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",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",marquee:"HTMLMarqueeElement",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",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",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(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;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(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?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||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},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))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),new RegExp("^"+c+u,"m")))},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n "})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.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,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return c?y+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace("^^"," ").replace("^"," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n ",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")
-},selectorNeedsScoping:function(a,b,c){var d=c?b:"\\[is="+b+"\\]",e=new RegExp("^("+d+")"+u,"m");return!a.match(e)},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+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().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)},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}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(window.Platform)}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)F="new",G="updated",H="reconfigured",I="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=J||b[1].type!=J?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:M(a)&&M(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:U.test(a))}function i(a,b){if(b!==V)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),L&&!K&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=W[a];if(b)return b;if(!h(a))return X;var b=new i(a,V);return W[a]=b,b}function k(b){for(var c=0;Y>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,K){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){$&&(Z.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];db[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=G&&(g.type!=F?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return ib.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case J:C(c,g.index,g.removed.slice(),g.addedCount);break;case F:case G:case I:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F="add",G="update",H="reconfigure",I="delete",J="splice",K=b(),L=c(),M=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},N="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},O="[$_a-zA-Z]",P="[$_a-zA-Z0-9]",Q=O+"+"+P+"*",R="(?:[0-9]|[1-9]+[0-9]+)",S="(?:"+Q+"|"+R+")",T="(?:"+S+")(?:\\s*\\.\\s*"+S+")*",U=new RegExp("^"+T+"$"),V={},W={};i.get=j,i.prototype=N({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n "+c+" != null";return b+=")\n",c+=a[e],b+=" return "+c+";\nelse\n return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var X=new i("",V);X.valid=!1,X.getValueFrom=X.setValueFrom=function(){};var Y=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(K?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(K&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var Z,$=!K||a.forceCollectObservers;p._allObserversCount=0,$&&(Z=[]);var _=!1,ab="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!_){if(ab)return Object.deliverAllChangeRecords(),void 0;if($){_=!0;var b=0,c={};do{b++;var d=Z;Z=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(K?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),Z.push(f))}}while(Y>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=Z.length,_=!1}}},$&&(a.Platform.clearObservers=function(){Z=[]}),r.prototype=N({__proto__:p.prototype,connect:function(){K&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=o(this.object))},check:function(a){var b,c;if(K){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){K?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=N({__proto__:r.prototype,connect:function(){K&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=this.object.slice())},check:function(a){var b;if(K){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var bb=Object.getPrototypeOf({}),cb=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==bb&&a!==cb){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=N({__proto__:p.prototype,connect:function(){K&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=N({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var db={};db[F]=!0,db[G]=!0,db[I]=!0,u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f(G,b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var eb=0,fb=1,gb=2,hb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(eb):(e.push(fb),d=g),b--,c--):f==h?(e.push(hb),b--,d=h):(e.push(gb),c--,d=i)}else e.push(hb),b--;else e.push(gb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case eb:j&&(l.push(j),j=void 0),m++,n++;break;case fb:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case gb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case hb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var ib=new z;a.Observer=p,a.Observer.hasObjectObserve=K,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return ib.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i,a.Observer.changeRecordTypes={add:F,update:G,reconfigure:H,"delete":I,splice:J}}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}();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,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){G=!1}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.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)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}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(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var l=null;if(g.length){if(c(i)&&(l=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(m(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,l,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(a,b){return a===b?!0:a instanceof O.ShadowRoot?n(l(a.host),b):!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(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=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(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=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.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===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}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!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(a){return a instanceof O.ShadowRoot&&(a=a.host),M(a)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.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}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.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 _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.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=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(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){o(a instanceof k)}function c(a,b,c,d){if(!(a instanceof DocumentFragment))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=[],f=a.firstChild;f;f=f.nextSibling)e.push(f);for(var g=e.length-1;g>=0;g--)a.removeChild(e[g]),e[g].parentNode_=b;for(var g=0;g<e.length;g++)e[g].previousSibling_=e[g-1]||c,e[g].nextSibling_=e[g+1]||d;return c&&(c.nextSibling_=e[0]),d&&(d.previousSibling_=e[e.length-1]),e}function d(a){if(a instanceof DocumentFragment){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}return[a]}function e(a){for(var b=0;b<a.length;b++)a[b].nodeWasAdded_()}function f(a,b){var c=a.nodeType===k.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function g(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function h(a,b){g(a,b);var c=b.length;if(1===c)return r(b[0]);for(var d=r(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(r(b[e]));return d}function i(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){o(b.parentNode===a);var c=b.nextSibling,d=r(b),e=d.parentNode;e&&z.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=r(a),g=f.firstChild;g;)c=g.nextSibling,z.call(f,g),g=c}function j(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function k(a){o(a instanceof u),l.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var l=a.wrappers.EventTarget,m=a.wrappers.NodeList,n=a.defineWrapGetter,o=a.assert,p=a.mixin,q=a.registerWrapper,r=a.unwrap,s=a.wrap,t=a.wrapIfNeeded,u=window.Node,v=window.DocumentFragment,w=u.prototype.appendChild,x=u.prototype.compareDocumentPosition,y=u.prototype.insertBefore,z=u.prototype.removeChild,A=u.prototype.replaceChild,B=/Trident/.test(navigator.userAgent),C=B?function(a,b){try{z.call(a,b)}catch(c){if(!(a instanceof v))throw c}}:function(a,b){z.call(a,b)};k.prototype=Object.create(l.prototype),p(k.prototype,{appendChild:function(a){b(a);var g;if(this.invalidateShadowRenderer()||j(a)){var i=this.lastChild,k=null;g=c(a,this,i,k),this.lastChild_=g[g.length-1],i||(this.firstChild_=g[0]),w.call(this.impl,h(this,g))}else g=d(a),f(this,a),w.call(this.impl,r(a));return e(g),a},insertBefore:function(a,i){if(!i)return this.appendChild(a);b(a),b(i),o(i.parentNode===this);var k;if(this.invalidateShadowRenderer()||j(a)){var l=i.previousSibling,m=i;k=c(a,this,l,m),this.firstChild===i&&(this.firstChild_=k[0]);var n=r(i),p=n.parentNode;p?y.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),y.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this){var c=!1;this.childNodes;for(var d=this.firstChild;d;d=d.nextSibling)if(d===a){c=!0;break}if(!c)throw new Error("NotFoundError")}var e=r(a);if(this.invalidateShadowRenderer()){var f=this.firstChild,g=this.lastChild,h=a.nextSibling,i=a.previousSibling,j=e.parentNode;j&&C(j,e),f===a&&(this.firstChild_=h),g===a&&(this.lastChild_=i),i&&(i.nextSibling_=h),h&&(h.previousSibling_=i),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else C(this.impl,e);return a},replaceChild:function(a,g){if(b(a),b(g),g.parentNode!==this)throw new Error("NotFoundError");var i,k=r(g);if(this.invalidateShadowRenderer()||j(a)){var l=g.previousSibling,m=g.nextSibling;m===a&&(m=a.nextSibling),i=c(a,this,l,m),this.firstChild===g&&(this.firstChild_=i[0]),this.lastChild===g&&(this.lastChild_=i[i.length-1]),g.previousSibling_=g.nextSibling_=g.parentNode_=void 0,k.parentNode&&A.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),A.call(this.impl,r(a),k);return e(i),g},nodeWasAdded_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeWasAdded_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:s(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:s(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:s(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:s(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:s(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==k.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(this.invalidateShadowRenderer()){if(i(this),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}}else this.impl.textContent=a},get childNodes(){for(var a=new m,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;
+return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return s(this.impl.cloneNode(a));var b=s(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=t(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return x.call(this.impl,r(a))}}),n(k,"ownerDocument"),q(u,k,document.createDocumentFragment()),delete k.prototype.querySelector,delete k.prototype.querySelectorAll,k.prototype=p(Object.create(l.prototype),k.prototype),a.wrappers.Node=k}(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.previousSibling)}};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(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a){g.call(this,a)}function d(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.ParentNodeInterface,i=a.SelectorsInterface;a.addWrapNodeListMethod;var j=a.mixin,k=a.oneOf,l=a.registerWrapper,m=a.wrappers,n=window.Element,o=k(n.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),p=n.prototype[o];c.prototype=Object.create(g.prototype),j(c.prototype,{createShadowRoot:function(){var b=new m.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,c){this.impl.setAttribute(a,c),b(this,a)},removeAttribute:function(a){this.impl.removeAttribute(a),b(this,a)},matches:function(a){return p.call(this.impl,a)}}),c.prototype[o]=function(a){return this.matches(a)},n.prototype.webkitCreateShadowRoot&&(c.prototype.webkitCreateShadowRoot=c.prototype.createShadowRoot),d(c.prototype,"id"),d(c.prototype,"className","class"),j(c.prototype,e),j(c.prototype,f),j(c.prototype,h),j(c.prototype,i),l(n,c),a.matchesName=o,a.wrappers.Element=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&";case"<":return"<";case'"':return"""}}function c(a){return a.replace(r,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+=">",s[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=p(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(q(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=/&|<|"/g,s={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},t=window.HTMLElement;g.prototype=Object.create(l.prototype),n(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),o(t,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=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(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){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(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.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=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";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b),a.wrappers.CanvasRenderingContext2D=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;g&&(c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}}),d(g,b),a.wrappers.WebGLRenderingContext=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(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}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 WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},get host(){return j.get(this)||null},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}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=F(a),g=F(c),h=e?F(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=G(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=F(a),d=c.parentNode;if(d){var e=G(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=I.get(a);c||I.set(a,c=[]),c.push(b)}function f(a){H.set(a,[])}function g(a){return H.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!L.test(c))return!1;if(":"===c[0]&&!M.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<O.length;a++)O[a].render();O=[]}function l(){E=null,k()}function m(a){var b=K.get(a);return b||(b=new q(a),K.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){J.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert,a.mixin,a.muteMutationEvents;var D=a.oneOf;a.unmuteMutationEvents;var E,F=a.unwrap,G=a.wrap,H=new WeakMap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=/^[*.:#[a-zA-Z_|]/,M=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("|")+")"),N=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),O=[],P=new ArraySplice;P.equals=function(a,b){return F(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(F(b)),g=a||new WeakMap,i=P.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=G(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&G(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,O.push(this),E)return;E=window[N](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeWasAdded_=z.prototype.nodeWasAdded_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=I,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=J,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})});var k={prototype:i};return c.extends&&(k.extends=c.extends),z.call(u(this),b,k),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(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=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,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){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b),a.wrappers.Range=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",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",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",marquee:"HTMLMarqueeElement",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",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",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(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;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(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?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||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},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))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),this.makeScopeMatcher(c,f)))
+},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n "})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.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,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return b=y,c?c.match(x)?b+c.replace(x,"")+d:b+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace("^^"," ").replace("^"," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n ",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")},selectorNeedsScoping:function(a,b,c){var d=this.makeScopeMatcher(b,c);return!a.match(d)},makeScopeMatcher:function(a,b){var c=b?"\\[is=['\"]?"+a+"['\"]?\\]":a;return new RegExp("^("+c+")"+u,"m")},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+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().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)},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}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(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
deleted file mode 100644
index 49fde56..0000000
--- a/pkg/shadow_dom/lib/src/platform/ShadowCSS.js
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * 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] { ... }
-
- * ::part(): These rules are converted to rules that take advantage of the
- part attribute. For example, a shadowRoot like this inside an x-foo
-
- <div part="special">Special</div>
-
- with a rule like this:
-
- x-foo::part(special) { ... }
-
- becomes:
-
- x-foo [part=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 */ and /* @polyfill-rule */
- // 4. shim @host and scoping
- shimStyling: function(root, name, extendsName) {
- var typeExtension = this.isTypeExtension(extendsName);
- // 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);
- }
- // insert @polyfill and @polyfill-rule rules into style elements
- // scoping process takes care of shimming these
- this.insertPolyfillDirectives(def.rootStyles);
- this.insertPolyfillRules(def.rootStyles);
- var cssText = this.stylesToShimmedCssText(def.scopeStyles, name,
- typeExtension);
- // note: we only need to do rootStyles since these are unscoped.
- cssText += this.extractPolyfillUnscopedRules(def.rootStyles);
- // provide shimmedStyle for user extensibility
- def.shimmedStyle = cssTextToStyle(cssText);
- if (root) {
- root.shimmedStyle = def.shimmedStyle;
- }
- // remove existing style elements
- for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]);
- i++) {
- s.parentNode.removeChild(s);
- }
- // add style to document
- addCssToDocument(cssText);
- },
- registerDefinition: function(root, name, extendsName) {
- var def = this.registry[name] = {
- root: root,
- name: name,
- extendsName: extendsName
- }
- var styles = root ? 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 && (!root || root.querySelector('shadow'))) {
- def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
- }
- return def;
- },
- isTypeExtension: function(extendsName) {
- return extendsName && extendsName.indexOf('-') < 0;
- },
- 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 menu-item (comment end)
- * shadow::-webkit-distributed(menu-item) {
- *
- * to this:
- *
- * scopeName menu-item {
- *
- **/
- insertPolyfillDirectives: function(styles) {
- if (styles) {
- Array.prototype.forEach.call(styles, function(s) {
- s.textContent = this.insertPolyfillDirectivesInCssText(s.textContent);
- }, this);
- }
- },
- insertPolyfillDirectivesInCssText: function(cssText) {
- return cssText.replace(cssPolyfillCommentRe, function(match, p1) {
- // remove end comment delimiter and add block start
- return p1.slice(0, -2) + '{';
- });
- },
- /*
- * Process styles to add rules which will only apply under the polyfill
- *
- * For example, we convert this rule:
- *
- * (comment start) @polyfill-rule :host menu-item {
- * ... } (comment end)
- *
- * to this:
- *
- * scopeName menu-item {...}
- *
- **/
- insertPolyfillRules: function(styles) {
- if (styles) {
- Array.prototype.forEach.call(styles, function(s) {
- s.textContent = this.insertPolyfillRulesInCssText(s.textContent);
- }, this);
- }
- },
- insertPolyfillRulesInCssText: function(cssText) {
- return cssText.replace(cssPolyfillRuleCommentRe, function(match, p1) {
- // remove end comment delimiter
- return p1.slice(0, -1);
- });
- },
- /*
- * Process styles to add rules which will only apply under the polyfill
- * and do not process via CSSOM. (CSSOM is destructive to rules on rare
- * occasions, e.g. -webkit-calc on Safari.)
- * For example, we convert this rule:
- *
- * (comment start) @polyfill-unscoped-rule menu-item {
- * ... } (comment end)
- *
- * to this:
- *
- * menu-item {...}
- *
- **/
- extractPolyfillUnscopedRules: function(styles) {
- var cssText = '';
- if (styles) {
- Array.prototype.forEach.call(styles, function(s) {
- cssText += this.extractPolyfillUnscopedRulesFromCssText(
- s.textContent) + '\n\n';
- }, this);
- }
- return cssText;
- },
- extractPolyfillUnscopedRulesFromCssText: function(cssText) {
- var r = '', matches;
- while (matches = cssPolyfillUnscopedRuleCommentRe.exec(cssText)) {
- r += matches[1].slice(0, -1) + '\n\n';
- }
- return r;
- },
- // apply @host and scope shimming
- stylesToShimmedCssText: function(styles, name, typeExtension) {
- return this.shimAtHost(styles, name, typeExtension) +
- this.shimScoping(styles, name, typeExtension);
- },
- // form: @host { .foo { declarations } }
- // becomes: scopeName.foo { declarations }
- shimAtHost: function(styles, name, typeExtension) {
- if (styles) {
- return this.convertAtHostStyles(styles, name, typeExtension);
- }
- },
- convertAtHostStyles: function(styles, name, typeExtension) {
- var cssText = stylesToCssText(styles), self = this;
- cssText = cssText.replace(hostRuleRe, function(m, p1) {
- return self.scopeHostCss(p1, name, typeExtension);
- });
- cssText = rulesToCss(this.findAtHostRules(cssToRules(cssText),
- new RegExp('^' + name + selectorReSuffix, 'm')));
- return cssText;
- },
- scopeHostCss: function(cssText, name, typeExtension) {
- var self = this;
- return cssText.replace(selectorRe, function(m, p1, p2) {
- return self.scopeHostSelector(p1, name, typeExtension) + ' ' + p2 + '\n\t';
- });
- },
- // supports scopig by name and [is=name] syntax
- scopeHostSelector: function(selector, name, typeExtension) {
- 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, typeExtension ? is + '$1$3' :
- name + '$1$3');
- // selector: .foo -> name.foo (OR) [bar] -> name[bar]
- } else if (p.match(hostFixableRe)) {
- p = typeExtension ? is + p : name + 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, typeExtension) {
- if (styles) {
- return this.convertScopedStyles(styles, name, typeExtension);
- }
- },
- convertScopedStyles: function(styles, name, typeExtension) {
- var cssText = stylesToCssText(styles).replace(hostRuleRe, '');
- cssText = this.insertPolyfillHostInCssText(cssText);
- cssText = this.convertColonHost(cssText);
- cssText = this.convertPseudos(cssText);
- cssText = this.convertParts(cssText);
- cssText = this.convertCombinators(cssText);
- var rules = cssToRules(cssText);
- cssText = this.scopeRules(rules, name, typeExtension);
- return cssText;
- },
- convertPseudos: function(cssText) {
- return cssText.replace(cssPseudoRe, ' [pseudo=$1]');
- },
- convertParts: function(cssText) {
- return cssText.replace(cssPartRe, ' [part=$1]');
- },
- /*
- * convert a rule like :host(.foo) > .bar { }
- *
- * to
- *
- * scopeName.foo > .bar, .foo scopeName > .bar { }
- * TODO(sorvell): file bug since native impl does not do the former yet.
- * http://jsbin.com/OganOCI/2/edit
- */
- convertColonHost: function(cssText) {
- // p1 = :host, p2 = contents of (), p3 rest of rule
- return cssText.replace(cssColonHostRe, function(m, p1, p2, p3) {
- return p2 ? polyfillHostNoCombinator + p2 + p3 + ', '
- + p2 + ' ' + p1 + p3 :
- p1 + p3;
- });
- },
- /*
- * Convert ^ and ^^ combinators by replacing with space.
- */
- convertCombinators: function(cssText) {
- return cssText.replace('^^', ' ').replace('^', ' ');
- },
- // change a selector like 'div' to 'name div'
- scopeRules: function(cssRules, name, typeExtension) {
- var cssText = '';
- Array.prototype.forEach.call(cssRules, function(rule) {
- if (rule.selectorText && (rule.style && rule.style.cssText)) {
- cssText += this.scopeSelector(rule.selectorText, name, typeExtension,
- 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, typeExtension, strict) {
- var r = [], parts = selector.split(',');
- parts.forEach(function(p) {
- p = p.trim();
- if (this.selectorNeedsScoping(p, name, typeExtension)) {
- p = strict ? this.applyStrictSelectorScope(p, name) :
- this.applySimpleSelectorScope(p, name, typeExtension);
- }
- r.push(p);
- }, this);
- return r.join(', ');
- },
- selectorNeedsScoping: function(selector, name, typeExtension) {
- var matchScope = typeExtension ? name : '\\[is=' + name + '\\]';
- var re = new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
- return !selector.match(re);
- },
- // scope via name and [is=name]
- applySimpleSelectorScope: function(selector, name, typeExtension) {
- var scoper = typeExtension ? '[is=' + name + ']' : name;
- if (selector.match(polyfillHostRe)) {
- selector = selector.replace(polyfillHostNoCombinator, scoper);
- return selector.replace(polyfillHostRe, scoper + ' ');
- } else {
- return scoper + ' ' + 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) {
- // remove :host since it should be unnecessary
- var t = p.trim().replace(polyfillHostRe, '');
- if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
- p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
- }
- return p;
- }).join(sep);
- });
- return scoped;
- },
- insertPolyfillHostInCssText: function(selector) {
- return selector.replace(hostRe, polyfillHost).replace(colonHostRe,
- polyfillHost);
- },
- 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,
- cssPolyfillRuleCommentRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
- cssPolyfillUnscopedRuleCommentRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
- cssPseudoRe = /::(x-[^\s{,(]*)/gim,
- cssPartRe = /::part\(([^)]*)\)/gim,
- // note: :host pre-processed to -host.
- cssColonHostRe = /(-host)(?:\(([^)]*)\))?([^,{]*)/gim,
- selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
- hostRe = /@host/gim,
- colonHostRe = /\:host/gim,
- polyfillHost = '-host',
- /* host name without combinator */
- polyfillHostNoCombinator = '-host-no-combinator',
- polyfillHostRe = /-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 cssTextToStyle(cssText) {
- var style = document.createElement('style');
- style.textContent = cssText;
- return style;
-}
-
-function cssToRules(cssText) {
- var style = cssTextToStyle(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);
diff --git a/pkg/shadow_dom/pubspec.yaml b/pkg/shadow_dom/pubspec.yaml
index 61b7107..38516cb 100644
--- a/pkg/shadow_dom/pubspec.yaml
+++ b/pkg/shadow_dom/pubspec.yaml
@@ -1,4 +1,5 @@
name: shadow_dom
+version: 0.9.0
author: "Web UI Team <web-ui-dev@dartlang.org>"
homepage: https://github.com/dart-lang/ShadowDOM/tree/conditional_shadowdom
description: >
@@ -7,3 +8,5 @@
boundaries between DOM trees and how these trees interact with each other
within a document, thus enabling better functional encapsulation within the
DOM.
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/shadow_dom/tool/build.json b/pkg/shadow_dom/tool/build.json
index 7834f81..8c2b7be 100644
--- a/pkg/shadow_dom/tool/build.json
+++ b/pkg/shadow_dom/tool/build.json
@@ -4,6 +4,6 @@
"../../../third_party/polymer/ShadowDOM/build.json",
"../lib/src/platform/patches-shadowdom-polyfill.js",
"../lib/src/platform/platform-init.js",
- "../lib/src/platform/ShadowCSS.js",
+ "../../../third_party/polymer/platform/src/ShadowCSS.js",
"build/end-if.js"
]
diff --git a/pkg/shadow_dom/tool/build.sh b/pkg/shadow_dom/tool/build.sh
index b10ebe7..10cd859 100755
--- a/pkg/shadow_dom/tool/build.sh
+++ b/pkg/shadow_dom/tool/build.sh
@@ -16,7 +16,9 @@
POLYMER_REMOTE=https://github.com/Polymer
POLYMER_DIR=../../../third_party/polymer
-for NAME in ShadowDOM observe-js WeakMap; do
+NEWLINE=$'\n'
+REVISIONS=""
+for NAME in ShadowDOM observe-js WeakMap platform; do
GIT_REMOTE="$POLYMER_REMOTE/$NAME.git"
GIT_DIR="$POLYMER_DIR/$NAME"
echo "*** Syncing $GIT_DIR from $GIT_REMOTE"
@@ -28,6 +30,9 @@
else
git clone $GIT_REMOTE $GIT_DIR
fi
+ pushd $GIT_DIR > /dev/null
+ REVISIONS="$REVISIONS $NEWLINE $NAME is at revision `git rev-parse HEAD`"
+ popd
done
echo '*** Installing NPM prerequisites'
@@ -35,3 +40,5 @@
echo '*** Running grunt'
grunt
+
+echo "*** Revision hash to use in commit message: $REVISIONS"
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 4ae1802..83c59a3 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,6 +1,9 @@
name: source_maps
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: Library to programmatically manipulate source map files.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index b672df7..63a1bf9 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -1,11 +1,14 @@
name: stack_trace
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
A package for manipulating stack traces and printing them readably.
dependencies:
- path: any
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 62a8a94..180fe90 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,12 +1,16 @@
name: template_binding
+version: 0.9.0
author: Polymer.dart Team <web-ui-dev@dartlang.org>
description: >
Extends the capabilities of the HTML Template Element by enabling it to
create, manage, and remove instances of content bound to data defined in Dart.
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
- logging: any
- observe: any
+ logging: ">=0.9.0 <0.10.0"
+ mutation_observer: ">=0.9.0 <0.10.0"
+ observe: ">=0.9.0 <0.10.0"
dev_dependencies:
- custom_element: any
- unittest: any
+ custom_element: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index 2e5c327..7c0b71b 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -27,15 +27,25 @@
main() {
useHtmlConfiguration();
- setUp(() {
+ // Load MutationObserver polyfill in case IE needs it.
+ var script = new ScriptElement()
+ ..src = '/root_dart/pkg/mutation_observer/lib/mutation_observer.min.js';
+ var polyfillLoaded = script.onLoad.first;
+ document.head.append(script);
+
+ setUp(() => polyfillLoaded.then((_) {
document.body.append(testDiv = new DivElement());
- });
+ }));
tearDown(() {
testDiv.remove();
testDiv = null;
});
+ test('MutationObserver is supported', () {
+ expect(MutationObserver.supported, true, reason: 'polyfill was loaded.');
+ });
+
group('Template Instantiation', templateInstantiationTests);
group('Binding Delegate API', () {
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 6a2a57f..728b008 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,11 +1,14 @@
name: html5lib
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: A library for working with HTML documents.
homepage: http://pub.dartlang.org/packages/html5lib
dependencies:
- source_maps: any
- utf: any
+ source_maps: ">=0.9.0 <0.10.0"
+ utf: ">=0.9.0 <0.10.0"
dev_dependencies:
- browser: any
- path: any
- unittest: any
+ browser: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index aab71ab..ebc4d7b 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,8 +1,10 @@
name: unittest
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: A library for writing dart unit tests.
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/unittest
dependencies:
- meta: any
- stack_trace: any
+ stack_trace: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/unmodifiable_collection/pubspec.yaml b/pkg/unmodifiable_collection/pubspec.yaml
index 43cbc11..17a035f 100644
--- a/pkg/unmodifiable_collection/pubspec.yaml
+++ b/pkg/unmodifiable_collection/pubspec.yaml
@@ -1,7 +1,10 @@
name: unmodifiable_collection
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
Unmodifiable wrappers for base collection types.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/utf/pubspec.yaml b/pkg/utf/pubspec.yaml
index 707be03..e997dac 100644
--- a/pkg/utf/pubspec.yaml
+++ b/pkg/utf/pubspec.yaml
@@ -1,4 +1,5 @@
name: utf
+version: 0.9.0
author: Dart Team <misc@dartlang.org>
description: >
A Unicode library. Intended for advanced use where the built-in facilities
@@ -6,4 +7,6 @@
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/utf
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/watcher/pubspec.yaml b/pkg/watcher/pubspec.yaml
index 263832e..b95c7ef 100644
--- a/pkg/watcher/pubspec.yaml
+++ b/pkg/watcher/pubspec.yaml
@@ -1,4 +1,5 @@
name: watcher
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -6,8 +7,10 @@
of directories and notifies you when files have been added, removed, or
modified.
dependencies:
- crypto: any
- path: any
+ crypto: ">=0.9.0 <0.10.0"
+ path: ">=0.9.0 <0.10.0"
dev_dependencies:
- scheduled_test: any
- unittest: any
+ scheduled_test: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index 4b17267..1fb4c8d 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,6 +1,9 @@
name: yaml
+version: 0.9.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: A parser for YAML.
dev_dependencies:
- unittest: any
+ unittest: ">=0.9.0 <0.10.0"
+environment:
+ sdk: ">=0.8.10+6 <2.0.0"
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 7546f40..8d8145e 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -4,6 +4,13 @@
library builtin;
import 'dart:io';
+// import 'root_library'; happens here from C Code
+
+// The root library (aka the script) is imported into this library. The
+// standalone embedder uses this to lookup the main entrypoint in the
+// root library's namespace.
+Function _getMainClosure() => main;
+
// Corelib 'print' implementation.
void _print(arg) {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 657a457..1c1277b 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -10,12 +10,13 @@
#include "platform/assert.h"
#include "platform/globals.h"
-#include "bin/extensions.h"
+#include "bin/crypto.h"
#include "bin/directory.h"
+#include "bin/extensions.h"
#include "bin/file.h"
#include "bin/io_buffer.h"
-#include "bin/utils.h"
#include "bin/socket.h"
+#include "bin/utils.h"
namespace dart {
namespace bin {
@@ -243,6 +244,11 @@
}
+bool DartUtils::EntropySource(uint8_t* buffer, intptr_t length) {
+ return Crypto::GetRandomBytes(length, buffer);
+}
+
+
static Dart_Handle SingleArgDart_Invoke(Dart_Handle lib, const char* method,
Dart_Handle arg) {
const int kNumArgs = 1;
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 375a9bc..476d813 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -115,6 +115,8 @@
static void ReadFile(const uint8_t** data, intptr_t* file_len, void* stream);
static void WriteFile(const void* buffer, intptr_t num_bytes, void* stream);
static void CloseFile(void* stream);
+ static bool EntropySource(uint8_t* buffer, intptr_t length);
+
static Dart_Handle ReadStringFromFile(const char* filename);
static Dart_Handle ReadStringFromHttp(const char* filename);
static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 2da2778..e502a0b 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -499,7 +499,8 @@
DartUtils::OpenFile,
DartUtils::ReadFile,
DartUtils::WriteFile,
- DartUtils::CloseFile)) {
+ DartUtils::CloseFile,
+ DartUtils::EntropySource)) {
Log::PrintErr("VM initialization failed\n");
return 255;
}
diff --git a/runtime/bin/io_impl_sources.gypi b/runtime/bin/io_impl_sources.gypi
index 8887d10..d026609 100644
--- a/runtime/bin/io_impl_sources.gypi
+++ b/runtime/bin/io_impl_sources.gypi
@@ -7,6 +7,7 @@
{
'sources': [
'crypto.cc',
+ 'crypto.h',
'crypto_android.cc',
'crypto_linux.cc',
'crypto_macos.cc',
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index fae077d..c696a9d 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -823,7 +823,8 @@
DartUtils::OpenFile,
DartUtils::ReadFile,
DartUtils::WriteFile,
- DartUtils::CloseFile)) {
+ DartUtils::CloseFile,
+ DartUtils::EntropySource)) {
fprintf(stderr, "%s", "VM initialization failed\n");
fflush(stderr);
return kErrorExitCode;
@@ -897,6 +898,14 @@
ASSERT(bytes_written);
delete snapshot_file;
} else {
+ // Lookup the library of the root script.
+ Dart_Handle root_lib = Dart_RootLibrary();
+ // Import the root library into the builtin library so that we can easily
+ // lookup the main entry point exported from the root library.
+ Dart_Handle builtin_lib =
+ Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
+ result = Dart_LibraryImportLibrary(builtin_lib, root_lib, Dart_Null());
+
if (has_compile_all) {
result = Dart_CompileAll();
if (Dart_IsError(result)) {
@@ -911,60 +920,65 @@
}
}
- // Lookup the library of the root script.
- Dart_Handle library = Dart_RootLibrary();
- if (Dart_IsNull(library)) {
+ if (Dart_IsNull(root_lib)) {
return ErrorExit(kErrorExitCode,
"Unable to find root library for '%s'\n",
script_name);
}
- // Set debug breakpoint if specified on the command line.
- if (breakpoint_at != NULL) {
- result = SetBreakpoint(breakpoint_at, library);
- if (Dart_IsError(result)) {
- return ErrorExit(kErrorExitCode,
- "Error setting breakpoint at '%s': %s\n",
- breakpoint_at,
- Dart_GetError(result));
- }
- }
if (has_print_script) {
result = GenerateScriptSource();
if (Dart_IsError(result)) {
return DartErrorExit(result);
}
} else {
- // Lookup and invoke the top level main function.
- // The top-level function may accept up to two arguments:
- // main(List<String> args, var message).
- // However most commonly it either accepts one (the args list) or
- // none.
- // If the message is optional, main(args, [message]), it is invoked with
- // one argument only.
- Dart_Handle main_args[2];
- main_args[0] = CreateRuntimeOptions(&dart_options);
- main_args[1] = Dart_Null();
- // First try with 1 argument.
- result = Dart_Invoke(library, DartUtils::NewString("main"), 1, main_args);
- // TODO(iposva): Return a special error type for mismatched argument
- // counts from Dart_Invoke to avoid the string comparison.
- const char* expected_error = "Dart_Invoke: wrong argument count for "
- "function 'main': ";
- intptr_t length = strlen(expected_error);
- if (Dart_IsError(result) &&
- strncmp(expected_error, Dart_GetError(result), length) == 0) {
- // Try with two arguments.
- result =
- Dart_Invoke(library, DartUtils::NewString("main"), 2, main_args);
- if (Dart_IsError(result) &&
- strncmp(expected_error, Dart_GetError(result), length) == 0) {
- // Finally try with 0 arguments.
- result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
+ // The helper function _getMainClosure creates a closure for the main
+ // entry point which is either explicitly or implictly exported from the
+ // root library.
+ Dart_Handle main_closure = Dart_Invoke(
+ builtin_lib, Dart_NewStringFromCString("_getMainClosure"), 0, NULL);
+ if (Dart_IsError(main_closure)) {
+ return DartErrorExit(result);
+ }
+
+ // Set debug breakpoint if specified on the command line before calling
+ // the main function.
+ if (breakpoint_at != NULL) {
+ result = SetBreakpoint(breakpoint_at, root_lib);
+ if (Dart_IsError(result)) {
+ return ErrorExit(kErrorExitCode,
+ "Error setting breakpoint at '%s': %s\n",
+ breakpoint_at,
+ Dart_GetError(result));
}
}
+
+ // Call _startIsolate in the isolate library to enable dispatching the
+ // initial startup message.
+ Dart_Handle isolate_args[2];
+ isolate_args[0] = main_closure;
+ isolate_args[1] = Dart_True();
+
+ Dart_Handle isolate_lib = Dart_LookupLibrary(
+ Dart_NewStringFromCString("dart:isolate"));
+ result = Dart_Invoke(isolate_lib,
+ Dart_NewStringFromCString("_startIsolate"),
+ 2, isolate_args);
+
+ // Setup the arguments in the initial startup message and leave the
+ // replyTo and message fields empty.
+ Dart_Handle initial_startup_msg = Dart_NewList(3);
+ result = Dart_ListSetAt(initial_startup_msg, 1,
+ CreateRuntimeOptions(&dart_options));
if (Dart_IsError(result)) {
return DartErrorExit(result);
}
+ Dart_Port main_port = Dart_GetMainPortId();
+ bool posted = Dart_Post(main_port, initial_startup_msg);
+ if (!posted) {
+ return ErrorExit(kErrorExitCode,
+ "Failed posting startup message to main "
+ "isolate control port.");
+ }
// Keep handling messages until the last active receive port is closed.
result = Dart_RunLoop();
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 7ff4198..438a2cc 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -109,7 +109,8 @@
dart::bin::DartUtils::OpenFile,
dart::bin::DartUtils::ReadFile,
dart::bin::DartUtils::WriteFile,
- dart::bin::DartUtils::CloseFile);
+ dart::bin::DartUtils::CloseFile,
+ NULL);
ASSERT(err_msg == NULL);
// Apply the filter to all registered tests.
TestCaseBase::RunAll();
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 4dfbe50..48acaf3 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -235,13 +235,24 @@
if (Dart_IsError(err)) Dart_PropagateError(err);
OSError os_error;
intptr_t port = 0;
- ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
- char host[INET6_ADDRSTRLEN];
- if (Socket::GetRemotePeer(socket, host, &port)) {
+ SocketAddress* addr = Socket::GetRemotePeer(socket, &port);
+ if (addr != NULL) {
Dart_Handle list = Dart_NewList(2);
- Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host));
+
+ Dart_Handle entry = Dart_NewList(3);
+ Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType()));
+ Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
+
+ RawAddr raw = addr->addr();
+ intptr_t data_length = SocketAddress::GetAddrLength(&raw);
+ Dart_Handle data = Dart_NewTypedData(Dart_TypedData_kUint8, data_length);
+ Dart_ListSetAsBytes(data, 0, reinterpret_cast<uint8_t*>(&raw), data_length);
+ Dart_ListSetAt(entry, 2, data);
+
+ Dart_ListSetAt(list, 0, entry);
Dart_ListSetAt(list, 1, Dart_NewInteger(port));
Dart_SetReturnValue(args, list);
+ delete addr;
} else {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
}
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 63fc5ef..ce94c5e 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -163,7 +163,7 @@
static intptr_t CreateConnect(RawAddr addr,
const intptr_t port);
static intptr_t GetPort(intptr_t fd);
- static bool GetRemotePeer(intptr_t fd, char* host, intptr_t* port);
+ static SocketAddress* GetRemotePeer(intptr_t fd, intptr_t* port);
static void GetError(intptr_t fd, OSError* os_error);
static int GetType(intptr_t fd);
static intptr_t GetStdioHandle(intptr_t num);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 38c1c7f..02aed0b 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -136,7 +136,7 @@
}
-bool Socket::GetRemotePeer(intptr_t fd, char *host, intptr_t *port) {
+SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) {
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
@@ -148,23 +148,10 @@
char error_message[kBufferSize];
strerror_r(errno, error_message, kBufferSize);
Log::PrintErr("Error getpeername: %s\n", error_message);
- return false;
- }
- if (TEMP_FAILURE_RETRY(getnameinfo(&raw.addr,
- size,
- host,
- INET6_ADDRSTRLEN,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
- const int kBufferSize = 1024;
- char error_message[kBufferSize];
- strerror_r(errno, error_message, kBufferSize);
- Log::PrintErr("Error getnameinfo: %s\n", error_message);
- return false;
+ return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
- return true;
+ return new SocketAddress(&raw.addr);
}
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index b9431e1..c3c01cc 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -137,7 +137,7 @@
}
-bool Socket::GetRemotePeer(intptr_t fd, char *host, intptr_t *port) {
+SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) {
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
@@ -149,23 +149,10 @@
char error_buf[kBufferSize];
Log::PrintErr("Error getpeername: %s\n",
strerror_r(errno, error_buf, kBufferSize));
- return false;
- }
- if (TEMP_FAILURE_RETRY(getnameinfo(&raw.addr,
- size,
- host,
- INET6_ADDRSTRLEN,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
- const int kBufferSize = 1024;
- char error_buf[kBufferSize];
- Log::PrintErr("Error getnameinfo: %s\n",
- strerror_r(errno, error_buf, kBufferSize));
- return false;
+ return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
- return true;
+ return new SocketAddress(&raw.addr);
}
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index be7beca..4b6ead6 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -137,7 +137,7 @@
}
-bool Socket::GetRemotePeer(intptr_t fd, char *host, intptr_t *port) {
+SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) {
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
@@ -149,23 +149,10 @@
char error_message[kBufferSize];
strerror_r(errno, error_message, kBufferSize);
Log::PrintErr("Error getpeername: %s\n", error_message);
- return false;
- }
- if (TEMP_FAILURE_RETRY(getnameinfo(&raw.addr,
- size,
- host,
- INET6_ADDRSTRLEN,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
- const int kBufferSize = 1024;
- char error_message[kBufferSize];
- strerror_r(errno, error_message, kBufferSize);
- Log::PrintErr("Error getnameinfo: %s\n", error_message);
- return false;
+ return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
- return true;
+ return new SocketAddress(&raw.addr);
}
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 2c1990d..fb93b8b 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -440,8 +440,10 @@
return nativeGetRemotePeer()[1];
}
- String get remoteHost {
- return nativeGetRemotePeer()[0];
+ InternetAddress get remoteAddress {
+ var result = nativeGetRemotePeer()[0];
+ var type = new InternetAddressType._from(result[0]);
+ return new _InternetAddress(type, result[1], "", result[2]);
}
// Multiplexes socket events to the socket handlers.
@@ -814,7 +816,7 @@
List<int> read([int len]) {
if (_isMacOSTerminalInput) {
- var available = available();
+ var available = this.available();
if (available == 0) return null;
var data = _socket.read(len);
if (data == null || data.length < available) {
@@ -841,7 +843,7 @@
InternetAddress get address => _socket.address;
- String get remoteHost => _socket.remoteHost;
+ InternetAddress get remoteAddress => _socket.remoteAddress;
bool get readEventsEnabled => _readEventsEnabled;
void set readEventsEnabled(bool value) {
@@ -1112,7 +1114,7 @@
}
int get port => _raw.port;
- String get remoteHost => _raw.remoteHost;
+ InternetAddress get remoteAddress => _raw.remoteAddress;
int get remotePort => _raw.remotePort;
Future _detachRaw() {
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index a5d55a9..32b690d 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -85,7 +85,7 @@
}
-bool Socket::GetRemotePeer(intptr_t fd, char *host, intptr_t *port) {
+SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) {
ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
RawAddr raw;
@@ -94,23 +94,13 @@
&raw.addr,
&size)) {
Log::PrintErr("Error getpeername: %d\n", WSAGetLastError());
- return false;
+ return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
// Clear the port before calling WSAAddressToString as WSAAddressToString
// includes the port in the formatted string.
SocketAddress::SetAddrPort(&raw, 0);
- DWORD len = INET6_ADDRSTRLEN;
- int err = WSAAddressToStringA(&raw.addr,
- sizeof(raw),
- NULL,
- host,
- &len);
- if (err != 0) {
- Log::PrintErr("Error WSAAddressToString: %d\n", WSAGetLastError());
- return false;
- }
- return true;
+ return new SocketAddress(&raw.addr);
}
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index c2dbabd..48a9cbd 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -5,11 +5,7 @@
<link type="text/css" rel="stylesheet"
href="bootstrap_css/css/bootstrap.min.css" />
<link rel="import" href="packages/observatory/observatory_elements.html">
- <script type='application/dart'>
- import 'package:polymer/init.dart';
- // this export won't be needed after we fix issue 14542
- export 'package:polymer/init.dart';
- </script>
+ <script type='application/dart'>export 'package:polymer/init.dart';</script>
<script src="packages/browser/dart.js"></script>
</head>
<body>
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 6fe83fe..805737c 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -724,6 +724,7 @@
typedef void (*Dart_FileCloseCallback)(void* stream);
+typedef bool (*Dart_EntropySource)(uint8_t* buffer, intptr_t length);
/**
* Initializes the VM.
@@ -747,7 +748,8 @@
Dart_FileOpenCallback file_open,
Dart_FileReadCallback file_read,
Dart_FileWriteCallback file_write,
- Dart_FileCloseCallback file_close);
+ Dart_FileCloseCallback file_close,
+ Dart_EntropySource entropy_source);
/**
* Cleanup state in the VM before process termination.
@@ -2154,8 +2156,7 @@
/* TODO(turnidge): Finish documenting this section. */
typedef enum {
- Dart_kLibraryTag = 0,
- Dart_kImportTag,
+ Dart_kImportTag = 0,
Dart_kSourceTag,
Dart_kCanonicalizeUrl
} Dart_LibraryTag;
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index cdee5c4..81aa289 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -562,7 +562,7 @@
bool contains(Object object) {
int index = _hashCode(object) & (_buckets.length - 1);
- HashSetEntry entry = _buckets[index];
+ _HashSetEntry entry = _buckets[index];
while (entry != null) {
if (_equals(entry.key, object)) return true;
entry = entry.next;
@@ -572,7 +572,7 @@
E lookup(Object object) {
int index = _hashCode(object) & (_buckets.length - 1);
- HashSetEntry entry = _buckets[index];
+ _HashSetEntry entry = _buckets[index];
while (entry != null) {
var key = entry.key;
if (_equals(key, object)) return key;
@@ -586,7 +586,7 @@
bool add(E element) {
int hashCode = _hashCode(element);
int index = hashCode & (_buckets.length - 1);
- HashSetEntry entry = _buckets[index];
+ _HashSetEntry entry = _buckets[index];
while (entry != null) {
if (_equals(entry.key, element)) return false;
entry = entry.next;
@@ -641,8 +641,8 @@
void _filterWhere(bool test(E element), bool removeMatching) {
int length = _buckets.length;
for (int index = 0; index < length; index++) {
- HashSetEntry entry = _buckets[index];
- HashSetEntry previous = null;
+ _HashSetEntry entry = _buckets[index];
+ _HashSetEntry previous = null;
while (entry != null) {
int modificationCount = _modificationCount;
bool testResult = test(entry.key);
@@ -650,7 +650,7 @@
throw new ConcurrentModificationError(this);
}
if (testResult == removeMatching) {
- HashSetEntry next = entry.remove();
+ _HashSetEntry next = entry.remove();
if (previous == null) {
_buckets[index] = next;
} else {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index df716fc..f900083 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -266,6 +266,12 @@
if (port.IsError()) {
Exceptions::PropagateError(Error::Cast(port));
}
+
+ // The control port is being accessed as a regular port from Dart code. This
+ // is most likely due to the _startIsolate code in dart:isolate. Account for
+ // this by increasing the number of open control ports.
+ isolate->message_handler()->increment_control_ports();
+
return port.raw();
}
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 6022b07..99d0d69 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -110,13 +110,8 @@
class _SendPortImpl implements SendPort {
/*--- public interface ---*/
- void send(var message, [SendPort replyTo = null]) {
- this._sendNow(message, replyTo);
- }
-
- void _sendNow(var message, SendPort replyTo) {
- int replyId = (replyTo == null) ? 0 : replyTo._id;
- _sendInternal(_id, replyId, message);
+ void send(var message) {
+ _sendInternal(_id, 0, message);
}
bool operator==(var other) {
@@ -145,6 +140,7 @@
// Forward the implementation of sending messages to the VM. Only port ids
// are being handed to the VM.
+ // TODO(14731): Remove replyId argument.
static _sendInternal(int sendId, int replyId, var message)
native "SendPortImpl_sendInternal_";
@@ -178,8 +174,10 @@
keepAlivePort.close();
SendPort replyTo = message[0];
- // TODO(floitsch): don't send ok-message if we can't find the entry point.
- replyTo.send("started");
+ if (replyTo != null) {
+ // TODO(floitsch): don't send ok-message if we can't find the entry point.
+ replyTo.send("started");
+ }
if (isSpawnUri) {
assert(message.length == 3);
List<String> args = message[1];
@@ -216,7 +214,7 @@
completer.complete(new Isolate._fromControlPort(controlPort));
};
} catch(e, st) {
- // TODO(14718): we want errors to go into the returned future.
+ // TODO(floitsch): we want errors to go into the returned future.
rethrow;
};
return completer.future;
@@ -236,7 +234,7 @@
completer.complete(new Isolate._fromControlPort(controlPort));
};
} catch(e, st) {
- // TODO(14718): we want errors to go into the returned future.
+ // TODO(floitsch): we want errors to go into the returned future.
rethrow;
};
return completer.future;
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 00cacdf..b1301e9 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -113,7 +113,7 @@
void _nextState() native "Random_nextState";
int nextInt(int max) {
- // TODO(srdjan): Remove the 'limit' check once optimizing comparison of
+ // TODO(srdjan): Remove the 'limit' check once optimizing comparison of
// Smi-s with Mint constants.
final limit = 0x3FFFFFFF;
if (max <= 0 || ((max > limit) && (max > _POW2_32))) {
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 6f76866..a2ab082 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -49,9 +49,10 @@
void clear() => _throw();
}
-// These values are allowed to be passed directly over the wire.
-bool _isSimpleValue(var value) {
- return (value == null || value is num || value is String || value is bool);
+class _InternalMirrorError {
+ const _InternalMirrorError(String this._msg);
+ String toString() => _msg;
+ final String _msg;
}
Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) {
@@ -216,19 +217,6 @@
value);
return reflect(value);
}
-
- static _validateArgument(int i, Object arg)
- {
- if (arg is Mirror) {
- if (arg is! InstanceMirror) {
- throw new MirrorException(
- 'positional argument $i ($arg) was not an InstanceMirror');
- }
- } else if (!_isSimpleValue(arg)) {
- throw new MirrorException(
- 'positional argument $i ($arg) was not a simple value');
- }
- }
}
class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl
@@ -1252,7 +1240,7 @@
} else {
var parts = MirrorSystem.getName(simpleName).split('.');
if (parts.length > 2) {
- throw new MirrorException(
+ throw new _InternalMirrorError(
'Internal error in MethodMirror.constructorName: '
'malformed name <$simpleName>');
} else if (parts.length == 2) {
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index d2aaf68..2bda632 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -54,8 +54,8 @@
}
-DEFINE_NATIVE_ENTRY(Float32x4_fromUint32x4Bits, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, v, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(1));
return Float32x4::New(v.value());
}
@@ -122,7 +122,7 @@
uint32_t _y = a.y() < b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() < b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() < b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -133,7 +133,7 @@
uint32_t _y = a.y() <= b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() <= b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() <= b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -144,7 +144,7 @@
uint32_t _y = a.y() > b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() > b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() > b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -155,7 +155,7 @@
uint32_t _y = a.y() >= b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() >= b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() >= b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -166,7 +166,7 @@
uint32_t _y = a.y() == b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() == b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() == b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -177,7 +177,7 @@
uint32_t _y = a.y() != b.y() ? 0xFFFFFFFF : 0x0;
uint32_t _z = a.z() != b.z() ? 0xFFFFFFFF : 0x0;
uint32_t _w = a.w() != b.w() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
@@ -260,8 +260,8 @@
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getSignMask, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_getSignMask, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
uint32_t mx = (self.x() & 0x80000000) >> 31;
uint32_t my = (self.y() & 0x80000000) >> 31;
uint32_t mz = (self.z() & 0x80000000) >> 31;
@@ -399,311 +399,311 @@
}
-DEFINE_NATIVE_ENTRY(Uint32x4_fromInts, 5) {
+DEFINE_NATIVE_ENTRY(Int32x4_fromInts, 5) {
ASSERT(AbstractTypeArguments::CheckedHandle(
arguments->NativeArgAt(0)).IsNull());
GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(2));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(3));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, w, arguments->NativeArgAt(4));
- uint32_t _x = static_cast<uint32_t>(x.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _y = static_cast<uint32_t>(y.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _z = static_cast<uint32_t>(z.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _w = static_cast<uint32_t>(w.AsInt64Value() & 0xFFFFFFFF);
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = static_cast<int32_t>(x.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _y = static_cast<int32_t>(y.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _z = static_cast<int32_t>(z.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _w = static_cast<int32_t>(w.AsInt64Value() & 0xFFFFFFFF);
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_fromBools, 5) {
+DEFINE_NATIVE_ENTRY(Int32x4_fromBools, 5) {
ASSERT(AbstractTypeArguments::CheckedHandle(
arguments->NativeArgAt(0)).IsNull());
GET_NON_NULL_NATIVE_ARGUMENT(Bool, x, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, y, arguments->NativeArgAt(2));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, z, arguments->NativeArgAt(3));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, w, arguments->NativeArgAt(4));
- uint32_t _x = x.value() ? 0xFFFFFFFF : 0x0;
- uint32_t _y = y.value() ? 0xFFFFFFFF : 0x0;
- uint32_t _z = z.value() ? 0xFFFFFFFF : 0x0;
- uint32_t _w = w.value() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = x.value() ? 0xFFFFFFFF : 0x0;
+ int32_t _y = y.value() ? 0xFFFFFFFF : 0x0;
+ int32_t _z = z.value() ? 0xFFFFFFFF : 0x0;
+ int32_t _w = w.value() ? 0xFFFFFFFF : 0x0;
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_fromFloat32x4Bits, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_fromFloat32x4Bits, 2) {
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
- return Uint32x4::New(v.value());
+ return Int32x4::New(v.value());
}
-DEFINE_NATIVE_ENTRY(Uint32x4_or, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, other, arguments->NativeArgAt(1));
- uint32_t _x = self.x() | other.x();
- uint32_t _y = self.y() | other.y();
- uint32_t _z = self.z() | other.z();
- uint32_t _w = self.w() | other.w();
- return Uint32x4::New(_x, _y, _z, _w);
+DEFINE_NATIVE_ENTRY(Int32x4_or, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
+ int32_t _x = self.x() | other.x();
+ int32_t _y = self.y() | other.y();
+ int32_t _z = self.z() | other.z();
+ int32_t _w = self.w() | other.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_and, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, other, arguments->NativeArgAt(1));
- uint32_t _x = self.x() & other.x();
- uint32_t _y = self.y() & other.y();
- uint32_t _z = self.z() & other.z();
- uint32_t _w = self.w() & other.w();
- return Uint32x4::New(_x, _y, _z, _w);
+DEFINE_NATIVE_ENTRY(Int32x4_and, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
+ int32_t _x = self.x() & other.x();
+ int32_t _y = self.y() & other.y();
+ int32_t _z = self.z() & other.z();
+ int32_t _w = self.w() & other.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_xor, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, other, arguments->NativeArgAt(1));
- uint32_t _x = self.x() ^ other.x();
- uint32_t _y = self.y() ^ other.y();
- uint32_t _z = self.z() ^ other.z();
- uint32_t _w = self.w() ^ other.w();
- return Uint32x4::New(_x, _y, _z, _w);
+DEFINE_NATIVE_ENTRY(Int32x4_xor, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
+ int32_t _x = self.x() ^ other.x();
+ int32_t _y = self.y() ^ other.y();
+ int32_t _z = self.z() ^ other.z();
+ int32_t _w = self.w() ^ other.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_add, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, other, arguments->NativeArgAt(1));
- uint32_t _x = self.x() + other.x();
- uint32_t _y = self.y() + other.y();
- uint32_t _z = self.z() + other.z();
- uint32_t _w = self.w() + other.w();
- return Uint32x4::New(_x, _y, _z, _w);
+DEFINE_NATIVE_ENTRY(Int32x4_add, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
+ int32_t _x = self.x() + other.x();
+ int32_t _y = self.y() + other.y();
+ int32_t _z = self.z() + other.z();
+ int32_t _w = self.w() + other.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_sub, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, other, arguments->NativeArgAt(1));
- uint32_t _x = self.x() - other.x();
- uint32_t _y = self.y() - other.y();
- uint32_t _z = self.z() - other.z();
- uint32_t _w = self.w() - other.w();
- return Uint32x4::New(_x, _y, _z, _w);
+DEFINE_NATIVE_ENTRY(Int32x4_sub, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
+ int32_t _x = self.x() - other.x();
+ int32_t _y = self.y() - other.y();
+ int32_t _z = self.z() - other.z();
+ int32_t _w = self.w() - other.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getX, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.x();
+DEFINE_NATIVE_ENTRY(Int32x4_getX, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.x();
return Integer::New(value);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getY, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.y();
+DEFINE_NATIVE_ENTRY(Int32x4_getY, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.y();
return Integer::New(value);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getZ, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.z();
+DEFINE_NATIVE_ENTRY(Int32x4_getZ, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.z();
return Integer::New(value);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getW, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.w();
+DEFINE_NATIVE_ENTRY(Int32x4_getW, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.w();
return Integer::New(value);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_shuffle, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_shuffle, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
int64_t m = mask.AsInt64Value();
ThrowMaskRangeException(m);
- uint32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
- uint32_t _x = data[m & 0x3];
- uint32_t _y = data[(m >> 2) & 0x3];
- uint32_t _z = data[(m >> 4) & 0x3];
- uint32_t _w = data[(m >> 6) & 0x3];
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
+ int32_t _x = data[m & 0x3];
+ int32_t _y = data[(m >> 2) & 0x3];
+ int32_t _z = data[(m >> 4) & 0x3];
+ int32_t _w = data[(m >> 6) & 0x3];
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_shuffleMix, 3) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, zw, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Int32x4_shuffleMix, 3) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, zw, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(2));
int64_t m = mask.AsInt64Value();
ThrowMaskRangeException(m);
- uint32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
- uint32_t zw_data[4] = { zw.x(), zw.y(), zw.z(), zw.w() };
- uint32_t _x = data[m & 0x3];
- uint32_t _y = data[(m >> 2) & 0x3];
- uint32_t _z = zw_data[(m >> 4) & 0x3];
- uint32_t _w = zw_data[(m >> 6) & 0x3];
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
+ int32_t zw_data[4] = { zw.x(), zw.y(), zw.z(), zw.w() };
+ int32_t _x = data[m & 0x3];
+ int32_t _y = data[(m >> 2) & 0x3];
+ int32_t _z = zw_data[(m >> 4) & 0x3];
+ int32_t _w = zw_data[(m >> 6) & 0x3];
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setX, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setX, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
- uint32_t _x = static_cast<uint32_t>(x.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = self.w();
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = static_cast<int32_t>(x.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = self.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setY, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setY, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = static_cast<uint32_t>(y.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _z = self.z();
- uint32_t _w = self.w();
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = self.x();
+ int32_t _y = static_cast<int32_t>(y.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _z = self.z();
+ int32_t _w = self.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setZ, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setZ, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = static_cast<uint32_t>(z.AsInt64Value() & 0xFFFFFFFF);
- uint32_t _w = self.w();
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = static_cast<int32_t>(z.AsInt64Value() & 0xFFFFFFFF);
+ int32_t _w = self.w();
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setW, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setW, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, w, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = static_cast<uint32_t>(w.AsInt64Value() & 0xFFFFFFFF);
- return Uint32x4::New(_x, _y, _z, _w);
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = static_cast<int32_t>(w.AsInt64Value() & 0xFFFFFFFF);
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getFlagX, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.x();
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagX, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.x();
return Bool::Get(value != 0).raw();
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getFlagY, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.y();
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagY, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.y();
return Bool::Get(value != 0).raw();
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getFlagZ, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.z();
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagZ, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.z();
return Bool::Get(value != 0).raw();
}
-DEFINE_NATIVE_ENTRY(Uint32x4_getFlagW, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
- uint32_t value = self.w();
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagW, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
+ int32_t value = self.w();
return Bool::Get(value != 0).raw();
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setFlagX, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagX, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagX, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = self.w();
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = self.w();
_x = flagX.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setFlagY, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagY, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagY, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = self.w();
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = self.w();
_y = flagY.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setFlagZ, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagZ, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagZ, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = self.w();
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = self.w();
_z = flagZ.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
-DEFINE_NATIVE_ENTRY(Uint32x4_setFlagW, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagW, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagW, arguments->NativeArgAt(1));
- uint32_t _x = self.x();
- uint32_t _y = self.y();
- uint32_t _z = self.z();
- uint32_t _w = self.w();
+ int32_t _x = self.x();
+ int32_t _y = self.y();
+ int32_t _z = self.z();
+ int32_t _w = self.w();
_w = flagW.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
- return Uint32x4::New(_x, _y, _z, _w);
+ return Int32x4::New(_x, _y, _z, _w);
}
-// Used to convert between uint32_t and float32 without breaking strict
+// Used to convert between int32_t and float32 without breaking strict
// aliasing rules.
-union float32_uint32 {
+union float32_int32 {
float f;
- uint32_t u;
- float32_uint32(float v) {
+ int32_t u;
+ float32_int32(float v) {
f = v;
}
- float32_uint32(uint32_t v) {
+ float32_int32(int32_t v) {
u = v;
}
};
-DEFINE_NATIVE_ENTRY(Uint32x4_select, 3) {
- GET_NON_NULL_NATIVE_ARGUMENT(Uint32x4, self, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Int32x4_select, 3) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, tv, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, fv, arguments->NativeArgAt(2));
- uint32_t _maskX = self.x();
- uint32_t _maskY = self.y();
- uint32_t _maskZ = self.z();
- uint32_t _maskW = self.w();
+ int32_t _maskX = self.x();
+ int32_t _maskY = self.y();
+ int32_t _maskZ = self.z();
+ int32_t _maskW = self.w();
// Extract floats and interpret them as masks.
- float32_uint32 tvx(tv.x());
- float32_uint32 tvy(tv.y());
- float32_uint32 tvz(tv.z());
- float32_uint32 tvw(tv.w());
- float32_uint32 fvx(fv.x());
- float32_uint32 fvy(fv.y());
- float32_uint32 fvz(fv.z());
- float32_uint32 fvw(fv.w());
+ float32_int32 tvx(tv.x());
+ float32_int32 tvy(tv.y());
+ float32_int32 tvz(tv.z());
+ float32_int32 tvw(tv.w());
+ float32_int32 fvx(fv.x());
+ float32_int32 fvy(fv.y());
+ float32_int32 fvz(fv.z());
+ float32_int32 fvw(fv.w());
// Perform select.
- float32_uint32 tempX((_maskX & tvx.u) | (~_maskX & fvx.u));
- float32_uint32 tempY((_maskY & tvy.u) | (~_maskY & fvy.u));
- float32_uint32 tempZ((_maskZ & tvz.u) | (~_maskZ & fvz.u));
- float32_uint32 tempW((_maskW & tvw.u) | (~_maskW & fvw.u));
+ float32_int32 tempX((_maskX & tvx.u) | (~_maskX & fvx.u));
+ float32_int32 tempY((_maskY & tvy.u) | (~_maskY & fvy.u));
+ float32_int32 tempZ((_maskZ & tvz.u) | (~_maskZ & fvz.u));
+ float32_int32 tempW((_maskW & tvw.u) | (~_maskW & fvw.u));
return Float32x4::New(tempX.f, tempY.f, tempZ.f, tempW.f);
}
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index b671aef..703a7f9 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -296,7 +296,7 @@
TYPED_DATA_NATIVES(GetFloat32, SetFloat32, Double, value, 4)
TYPED_DATA_NATIVES(GetFloat64, SetFloat64, Double, value, 8)
TYPED_DATA_NATIVES(GetFloat32x4, SetFloat32x4, Float32x4, value, 16)
-TYPED_DATA_NATIVES(GetUint32x4, SetUint32x4, Uint32x4, value, 16)
+TYPED_DATA_NATIVES(GetInt32x4, SetInt32x4, Int32x4, value, 16)
DEFINE_NATIVE_ENTRY(ByteData_ToEndianInt16, 2) {
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 64e43d4..d97e4fe 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -244,22 +244,22 @@
}
-patch class Uint32x4List {
- /* patch */ factory Uint32x4List(int length) {
- return new _Uint32x4Array(length);
+patch class Int32x4List {
+ /* patch */ factory Int32x4List(int length) {
+ return new _Int32x4Array(length);
}
- /* patch */ factory Uint32x4List.fromList(List<Uint32x4> elements) {
- var result = new _Uint32x4Array(elements.length);
+ /* patch */ factory Int32x4List.fromList(List<Int32x4> elements) {
+ var result = new _Int32x4Array(elements.length);
for (int i = 0; i < elements.length; i++) {
result[i] = elements[i];
}
return result;
}
- /* patch */ factory Uint32x4List.view(ByteBuffer buffer,
+ /* patch */ factory Int32x4List.view(ByteBuffer buffer,
[int offsetInBytes = 0, int length]) {
- return new _Uint32x4ArrayView(buffer, offsetInBytes, length);
+ return new _Int32x4ArrayView(buffer, offsetInBytes, length);
}
}
@@ -274,21 +274,21 @@
/* patch */ factory Float32x4.zero() {
return new _Float32x4.zero();
}
- /* patch */ factory Float32x4.fromUint32x4Bits(Uint32x4 x) {
- return new _Float32x4.fromUint32x4Bits(x);
+ /* patch */ factory Float32x4.fromInt32x4Bits(Int32x4 x) {
+ return new _Float32x4.fromInt32x4Bits(x);
}
}
-patch class Uint32x4 {
- /* patch */ factory Uint32x4(int x, int y, int z, int w) {
- return new _Uint32x4(x, y, z, w);
+patch class Int32x4 {
+ /* patch */ factory Int32x4(int x, int y, int z, int w) {
+ return new _Int32x4(x, y, z, w);
}
- /* patch */ factory Uint32x4.bool(bool x, bool y, bool z, bool w) {
- return new _Uint32x4.bool(x, y, z, w);
+ /* patch */ factory Int32x4.bool(bool x, bool y, bool z, bool w) {
+ return new _Int32x4.bool(x, y, z, w);
}
- /* patch */ factory Uint32x4.fromFloat32x4Bits(Float32x4 x) {
- return new _Uint32x4.fromFloat32x4Bits(x);
+ /* patch */ factory Int32x4.fromFloat32x4Bits(Float32x4 x) {
+ return new _Int32x4.fromFloat32x4Bits(x);
}
}
@@ -611,9 +611,9 @@
void _setFloat32x4(int offsetInBytes, Float32x4 value)
native "TypedData_SetFloat32x4";
- Uint32x4 _getUint32x4(int offsetInBytes) native "TypedData_GetUint32x4";
- void _setUint32x4(int offsetInBytes, Uint32x4 value)
- native "TypedData_SetUint32x4";
+ Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4";
+ void _setInt32x4(int offsetInBytes, Int32x4 value)
+ native "TypedData_SetInt32x4";
}
@@ -1342,64 +1342,64 @@
}
-class _Uint32x4Array extends _TypedList implements Uint32x4List {
+class _Int32x4Array extends _TypedList implements Int32x4List {
// Factory constructors.
- factory _Uint32x4Array(int length) {
+ factory _Int32x4Array(int length) {
return _new(length);
}
- factory _Uint32x4Array.view(ByteBuffer buffer,
+ factory _Int32x4Array.view(ByteBuffer buffer,
[int offsetInBytes = 0, int length]) {
if (length == null) {
length = (buffer.lengthInBytes - offsetInBytes) ~/
- Uint32x4List.BYTES_PER_ELEMENT;
+ Int32x4List.BYTES_PER_ELEMENT;
}
- return new _Uint32x4ArrayView(buffer, offsetInBytes, length);
+ return new _Int32x4ArrayView(buffer, offsetInBytes, length);
}
- Uint32x4 operator[](int index) {
+ Int32x4 operator[](int index) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- return _getIndexedUint32x4(index);
+ return _getIndexedInt32x4(index);
}
- void operator[]=(int index, Uint32x4 value) {
+ void operator[]=(int index, Int32x4 value) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- _setIndexedUint32x4(index, value);
+ _setIndexedInt32x4(index, value);
}
- Iterator<Uint32x4> get iterator {
- return new _TypedListIterator<Uint32x4>(this);
+ Iterator<Int32x4> get iterator {
+ return new _TypedListIterator<Int32x4>(this);
}
// Method(s) implementing the TypedData interface.
int get elementSizeInBytes {
- return Uint32x4List.BYTES_PER_ELEMENT;
+ return Int32x4List.BYTES_PER_ELEMENT;
}
// Internal utility methods.
- _Uint32x4Array _createList(int length) {
+ _Int32x4Array _createList(int length) {
return _new(length);
}
- Uint32x4 _getIndexedUint32x4(int index) {
- return _getUint32x4(index * Uint32x4List.BYTES_PER_ELEMENT);
+ Int32x4 _getIndexedInt32x4(int index) {
+ return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
}
- void _setIndexedUint32x4(int index, Uint32x4 value) {
- _setUint32x4(index * Uint32x4List.BYTES_PER_ELEMENT, value);
+ void _setIndexedInt32x4(int index, Int32x4 value) {
+ _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
}
- static _Uint32x4Array _new(int length) native "TypedData_Uint32x4Array_new";
+ static _Int32x4Array _new(int length) native "TypedData_Int32x4Array_new";
}
@@ -2038,58 +2038,58 @@
}
-class _ExternalUint32x4Array extends _TypedList implements Uint32x4List {
+class _ExternalInt32x4Array extends _TypedList implements Int32x4List {
// Factory constructors.
- factory _ExternalUint32x4Array(int length) {
+ factory _ExternalInt32x4Array(int length) {
return _new(length);
}
// Method(s) implementing the List interface.
- Uint32x4 operator[](int index) {
+ Int32x4 operator[](int index) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- return _getIndexedUint32x4(index);
+ return _getIndexedInt32x4(index);
}
- void operator[]=(int index, Uint32x4 value) {
+ void operator[]=(int index, Int32x4 value) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- _setIndexedUint32x4(index, value);
+ _setIndexedInt32x4(index, value);
}
- Iterator<Uint32x4> get iterator {
- return new _TypedListIterator<Uint32x4>(this);
+ Iterator<Int32x4> get iterator {
+ return new _TypedListIterator<Int32x4>(this);
}
// Method(s) implementing the TypedData interface.
int get elementSizeInBytes {
- return Uint32x4List.BYTES_PER_ELEMENT;
+ return Int32x4List.BYTES_PER_ELEMENT;
}
// Internal utility methods.
- Uint32x4List _createList(int length) {
- return new Uint32x4List(length);
+ Int32x4List _createList(int length) {
+ return new Int32x4List(length);
}
- Uint32x4 _getIndexedUint32x4(int index) {
- return _getUint32x4(index * Uint32x4List.BYTES_PER_ELEMENT);
+ Int32x4 _getIndexedInt32x4(int index) {
+ return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
}
- void _setIndexedUint32x4(int index, Uint32x4 value) {
- _setUint32x4(index * Uint32x4List.BYTES_PER_ELEMENT, value);
+ void _setIndexedInt32x4(int index, Int32x4 value) {
+ _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
}
- static _ExternalUint32x4Array _new(int length) native
- "ExternalTypedData_Uint32x4Array_new";
+ static _ExternalInt32x4Array _new(int length) native
+ "ExternalTypedData_Int32x4Array_new";
}
@@ -2098,8 +2098,8 @@
native "Float32x4_fromDoubles";
factory _Float32x4.splat(double v) native "Float32x4_splat";
factory _Float32x4.zero() native "Float32x4_zero";
- factory _Float32x4.fromUint32x4Bits(Uint32x4 x)
- native "Float32x4_fromUint32x4Bits";
+ factory _Float32x4.fromInt32x4Bits(Int32x4 x)
+ native "Float32x4_fromInt32x4Bits";
Float32x4 operator +(Float32x4 other) {
return _add(other);
}
@@ -2120,31 +2120,31 @@
return _div(other);
}
Float32x4 _div(Float32x4 other) native "Float32x4_div";
- Uint32x4 lessThan(Float32x4 other) {
+ Int32x4 lessThan(Float32x4 other) {
return _cmplt(other);
}
- Uint32x4 _cmplt(Float32x4 other) native "Float32x4_cmplt";
- Uint32x4 lessThanOrEqual(Float32x4 other) {
+ Int32x4 _cmplt(Float32x4 other) native "Float32x4_cmplt";
+ Int32x4 lessThanOrEqual(Float32x4 other) {
return _cmplte(other);
}
- Uint32x4 _cmplte(Float32x4 other) native "Float32x4_cmplte";
- Uint32x4 greaterThan(Float32x4 other) {
+ Int32x4 _cmplte(Float32x4 other) native "Float32x4_cmplte";
+ Int32x4 greaterThan(Float32x4 other) {
return _cmpgt(other);
}
- Uint32x4 _cmpgt(Float32x4 other) native "Float32x4_cmpgt";
- Uint32x4 greaterThanOrEqual(Float32x4 other) {
+ Int32x4 _cmpgt(Float32x4 other) native "Float32x4_cmpgt";
+ Int32x4 greaterThanOrEqual(Float32x4 other) {
return _cmpgte(other);
}
- Uint32x4 _cmpgte(Float32x4 other) native "Float32x4_cmpgte";
- Uint32x4 equal(Float32x4 other) {
+ Int32x4 _cmpgte(Float32x4 other) native "Float32x4_cmpgte";
+ Int32x4 equal(Float32x4 other) {
return _cmpequal(other);
}
- Uint32x4 _cmpequal(Float32x4 other)
+ Int32x4 _cmpequal(Float32x4 other)
native "Float32x4_cmpequal";
- Uint32x4 notEqual(Float32x4 other) {
+ Int32x4 notEqual(Float32x4 other) {
return _cmpnequal(other);
}
- Uint32x4 _cmpnequal(Float32x4 other)
+ Int32x4 _cmpnequal(Float32x4 other)
native "Float32x4_cmpnequal";
Float32x4 scale(double s) {
return _scale(s);
@@ -2197,59 +2197,59 @@
}
-class _Uint32x4 implements Uint32x4 {
- factory _Uint32x4(int x, int y, int z, int w)
- native "Uint32x4_fromInts";
- factory _Uint32x4.bool(bool x, bool y, bool z, bool w)
- native "Uint32x4_fromBools";
- factory _Uint32x4.fromFloat32x4Bits(Float32x4 x)
- native "Uint32x4_fromFloat32x4Bits";
- Uint32x4 operator |(Uint32x4 other) {
+class _Int32x4 implements Int32x4 {
+ factory _Int32x4(int x, int y, int z, int w)
+ native "Int32x4_fromInts";
+ factory _Int32x4.bool(bool x, bool y, bool z, bool w)
+ native "Int32x4_fromBools";
+ factory _Int32x4.fromFloat32x4Bits(Float32x4 x)
+ native "Int32x4_fromFloat32x4Bits";
+ Int32x4 operator |(Int32x4 other) {
return _or(other);
}
- Uint32x4 _or(Uint32x4 other) native "Uint32x4_or";
- Uint32x4 operator &(Uint32x4 other) {
+ Int32x4 _or(Int32x4 other) native "Int32x4_or";
+ Int32x4 operator &(Int32x4 other) {
return _and(other);
}
- Uint32x4 _and(Uint32x4 other) native "Uint32x4_and";
- Uint32x4 operator ^(Uint32x4 other) {
+ Int32x4 _and(Int32x4 other) native "Int32x4_and";
+ Int32x4 operator ^(Int32x4 other) {
return _xor(other);
}
- Uint32x4 _xor(Uint32x4 other) native "Uint32x4_xor";
- Uint32x4 operator +(Uint32x4 other) {
+ Int32x4 _xor(Int32x4 other) native "Int32x4_xor";
+ Int32x4 operator +(Int32x4 other) {
return _add(other);
}
- Uint32x4 _add(Uint32x4 other) native "Uint32x4_add";
- Uint32x4 operator -(Uint32x4 other) {
+ Int32x4 _add(Int32x4 other) native "Int32x4_add";
+ Int32x4 operator -(Int32x4 other) {
return _sub(other);
}
- Uint32x4 _sub(Uint32x4 other) native "Uint32x4_sub";
- int get x native "Uint32x4_getX";
- int get y native "Uint32x4_getY";
- int get z native "Uint32x4_getZ";
- int get w native "Uint32x4_getW";
- int get signMask native "Uint32x4_getSignMask";
- Uint32x4 shuffle(int mask) native "Uint32x4_shuffle";
- Uint32x4 shuffleMix(Uint32x4 zw, int mask) native "Uint32x4_shuffleMix";
- Uint32x4 withX(int x) native "Uint32x4_setX";
- Uint32x4 withY(int y) native "Uint32x4_setY";
- Uint32x4 withZ(int z) native "Uint32x4_setZ";
- Uint32x4 withW(int w) native "Uint32x4_setW";
- bool get flagX native "Uint32x4_getFlagX";
- bool get flagY native "Uint32x4_getFlagY";
- bool get flagZ native "Uint32x4_getFlagZ";
- bool get flagW native "Uint32x4_getFlagW";
- Uint32x4 withFlagX(bool x) native "Uint32x4_setFlagX";
- Uint32x4 withFlagY(bool y) native "Uint32x4_setFlagY";
- Uint32x4 withFlagZ(bool z) native "Uint32x4_setFlagZ";
- Uint32x4 withFlagW(bool w) native "Uint32x4_setFlagW";
+ Int32x4 _sub(Int32x4 other) native "Int32x4_sub";
+ int get x native "Int32x4_getX";
+ int get y native "Int32x4_getY";
+ int get z native "Int32x4_getZ";
+ int get w native "Int32x4_getW";
+ int get signMask native "Int32x4_getSignMask";
+ Int32x4 shuffle(int mask) native "Int32x4_shuffle";
+ Int32x4 shuffleMix(Int32x4 zw, int mask) native "Int32x4_shuffleMix";
+ Int32x4 withX(int x) native "Int32x4_setX";
+ Int32x4 withY(int y) native "Int32x4_setY";
+ Int32x4 withZ(int z) native "Int32x4_setZ";
+ Int32x4 withW(int w) native "Int32x4_setW";
+ bool get flagX native "Int32x4_getFlagX";
+ bool get flagY native "Int32x4_getFlagY";
+ bool get flagZ native "Int32x4_getFlagZ";
+ bool get flagW native "Int32x4_getFlagW";
+ Int32x4 withFlagX(bool x) native "Int32x4_setFlagX";
+ Int32x4 withFlagY(bool y) native "Int32x4_setFlagY";
+ Int32x4 withFlagZ(bool z) native "Int32x4_setFlagZ";
+ Int32x4 withFlagW(bool w) native "Int32x4_setFlagW";
Float32x4 select(Float32x4 trueValue,
Float32x4 falseValue) {
return _select(trueValue, falseValue);
}
Float32x4 _select(Float32x4 trueValue,
Float32x4 falseValue)
- native "Uint32x4_select";
+ native "Int32x4_select";
}
class _TypedListIterator<E> implements Iterator<E> {
@@ -2925,54 +2925,54 @@
}
-class _Uint32x4ArrayView extends _TypedListView implements Uint32x4List {
+class _Int32x4ArrayView extends _TypedListView implements Int32x4List {
// Constructor.
- _Uint32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+ _Int32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
: super(buffer, _offsetInBytes,
_defaultIfNull(_length,
((buffer.lengthInBytes - _offsetInBytes) ~/
- Uint32x4List.BYTES_PER_ELEMENT))) {
+ Int32x4List.BYTES_PER_ELEMENT))) {
_rangeCheck(buffer.lengthInBytes,
offsetInBytes,
- length * Uint32x4List.BYTES_PER_ELEMENT);
- _offsetAlignmentCheck(_offsetInBytes, Uint32x4List.BYTES_PER_ELEMENT);
+ length * Int32x4List.BYTES_PER_ELEMENT);
+ _offsetAlignmentCheck(_offsetInBytes, Int32x4List.BYTES_PER_ELEMENT);
}
// Method(s) implementing List interface.
- Uint32x4 operator[](int index) {
+ Int32x4 operator[](int index) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- return _typedData._getUint32x4(offsetInBytes +
- (index * Uint32x4List.BYTES_PER_ELEMENT));
+ return _typedData._getInt32x4(offsetInBytes +
+ (index * Int32x4List.BYTES_PER_ELEMENT));
}
- void operator[]=(int index, Uint32x4 value) {
+ void operator[]=(int index, Int32x4 value) {
if (index < 0 || index >= length) {
_throwRangeError(index, length);
}
- _typedData._setUint32x4(offsetInBytes +
- (index * Uint32x4List.BYTES_PER_ELEMENT), value);
+ _typedData._setInt32x4(offsetInBytes +
+ (index * Int32x4List.BYTES_PER_ELEMENT), value);
}
- Iterator<Uint32x4> get iterator {
- return new _TypedListIterator<Uint32x4>(this);
+ Iterator<Int32x4> get iterator {
+ return new _TypedListIterator<Int32x4>(this);
}
// Method(s) implementing TypedData interface.
int get elementSizeInBytes {
- return Uint32x4List.BYTES_PER_ELEMENT;
+ return Int32x4List.BYTES_PER_ELEMENT;
}
// Internal utility methods.
- Uint32x4List _createList(int length) {
- return new Uint32x4List(length);
+ Int32x4List _createList(int length) {
+ return new Int32x4List(length);
}
}
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index f3dbb88..7ee14fb 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -81,7 +81,7 @@
storage[3] = v[3];
return *this;
}
- simd128_value_t& readFrom(const uint32_t* v) {
+ simd128_value_t& readFrom(const int32_t* v) {
const float* vv = reinterpret_cast<const float*>(v);
storage[0] = vv[0];
storage[1] = vv[1];
@@ -99,7 +99,7 @@
v[2] = storage[2];
v[3] = storage[3];
}
- void writeTo(uint32_t* v) {
+ void writeTo(int32_t* v) {
float* vv = reinterpret_cast<float*>(v);
vv[0] = storage[0];
vv[1] = storage[1];
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 8f6164f..6b6e659 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -83,6 +83,15 @@
};
+int32_t Assembler::jit_cookie() {
+ if (jit_cookie_ == 0) {
+ jit_cookie_ = static_cast<int32_t>(
+ Isolate::Current()->random()->NextUInt32());
+ }
+ return jit_cookie_;
+}
+
+
void Assembler::InitializeMemoryWithBreakpoints(uword data, intptr_t length) {
memset(reinterpret_cast<void*>(data), Instr::kBreakPointInstruction, length);
}
@@ -1949,9 +1958,9 @@
if (Assembler::IsSafe(object)) {
LoadObject(dst, object);
} else {
- movl(dst,
- Immediate(reinterpret_cast<int32_t>(object.raw()) ^ jit_cookie_));
- xorl(dst, Immediate(jit_cookie_));
+ int32_t cookie = jit_cookie();
+ movl(dst, Immediate(reinterpret_cast<int32_t>(object.raw()) ^ cookie));
+ xorl(dst, Immediate(cookie));
}
}
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index ae5a0cd..0afbb0f 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -311,8 +311,8 @@
: buffer_(),
object_pool_(GrowableObjectArray::Handle()),
prologue_offset_(-1),
- comments_(),
- jit_cookie_(1017109444) {
+ jit_cookie_(0),
+ comments_() {
// This mode is only needed and implemented for MIPS and ARM.
ASSERT(!use_far_branches);
}
@@ -798,10 +798,6 @@
}
private:
- AssemblerBuffer buffer_;
- GrowableObjectArray& object_pool_; // Object pool is not used on ia32.
- intptr_t prologue_offset_;
-
class CodeComment : public ZoneAllocated {
public:
CodeComment(intptr_t pc_offset, const String& comment)
@@ -817,9 +813,6 @@
DISALLOW_COPY_AND_ASSIGN(CodeComment);
};
- GrowableArray<CodeComment*> comments_;
-
- int32_t jit_cookie_;
inline void EmitUint8(uint8_t value);
inline void EmitInt32(int32_t value);
@@ -845,6 +838,14 @@
Register value,
Label* no_update);
+ int32_t jit_cookie();
+
+ AssemblerBuffer buffer_;
+ GrowableObjectArray& object_pool_; // Object pool is not used on ia32.
+ intptr_t prologue_offset_;
+ int32_t jit_cookie_;
+ GrowableArray<CodeComment*> comments_;
+
DISALLOW_ALLOCATION();
DISALLOW_COPY_AND_ASSIGN(Assembler);
};
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index 257fb95..aab3c6b 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -255,6 +255,17 @@
bool BinaryOpNode::IsPotentiallyConst() const {
switch (kind_) {
+ case Token::kOR:
+ case Token::kAND:
+ if (this->left()->IsLiteralNode() &&
+ this->left()->AsLiteralNode()->literal().IsNull()) {
+ return false;
+ }
+ if (this->right()->IsLiteralNode() &&
+ this->right()->AsLiteralNode()->literal().IsNull()) {
+ return false;
+ }
+ // Fall-through intentional.
case Token::kADD:
case Token::kSUB:
case Token::kMUL:
@@ -266,8 +277,6 @@
case Token::kBIT_AND:
case Token::kSHL:
case Token::kSHR:
- case Token::kOR:
- case Token::kAND:
return this->left()->IsPotentiallyConst() &&
this->right()->IsPotentiallyConst();
default:
@@ -355,6 +364,10 @@
bool UnaryOpNode::IsPotentiallyConst() const {
+ if (this->operand()->IsLiteralNode() &&
+ this->operand()->AsLiteralNode()->literal().IsNull()) {
+ return false;
+ }
return this->operand()->IsPotentiallyConst();
}
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 550efdd..95f39c4 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -144,7 +144,7 @@
V(TypedData_Float32Array_new, 1) \
V(TypedData_Float64Array_new, 1) \
V(TypedData_Float32x4Array_new, 1) \
- V(TypedData_Uint32x4Array_new, 1) \
+ V(TypedData_Int32x4Array_new, 1) \
V(ExternalTypedData_Int8Array_new, 1) \
V(ExternalTypedData_Uint8Array_new, 1) \
V(ExternalTypedData_Uint8ClampedArray_new, 1) \
@@ -157,7 +157,7 @@
V(ExternalTypedData_Float32Array_new, 1) \
V(ExternalTypedData_Float64Array_new, 1) \
V(ExternalTypedData_Float32x4Array_new, 1) \
- V(ExternalTypedData_Uint32x4Array_new, 1) \
+ V(ExternalTypedData_Int32x4Array_new, 1) \
V(TypedData_length, 1) \
V(TypedData_setRange, 5) \
V(TypedData_GetInt8, 2) \
@@ -182,8 +182,8 @@
V(TypedData_SetFloat64, 3) \
V(TypedData_GetFloat32x4, 2) \
V(TypedData_SetFloat32x4, 3) \
- V(TypedData_GetUint32x4, 2) \
- V(TypedData_SetUint32x4, 3) \
+ V(TypedData_GetInt32x4, 2) \
+ V(TypedData_SetInt32x4, 3) \
V(ByteData_ToEndianInt16, 2) \
V(ByteData_ToEndianUint16, 2) \
V(ByteData_ToEndianInt32, 2) \
@@ -194,7 +194,7 @@
V(ByteData_ToEndianFloat64, 2) \
V(Float32x4_fromDoubles, 5) \
V(Float32x4_splat, 2) \
- V(Float32x4_fromUint32x4Bits, 2) \
+ V(Float32x4_fromInt32x4Bits, 2) \
V(Float32x4_zero, 1) \
V(Float32x4_add, 2) \
V(Float32x4_negate, 1) \
@@ -226,34 +226,34 @@
V(Float32x4_sqrt, 1) \
V(Float32x4_reciprocal, 1) \
V(Float32x4_reciprocalSqrt, 1) \
- V(Uint32x4_fromInts, 5) \
- V(Uint32x4_fromBools, 5) \
- V(Uint32x4_fromFloat32x4Bits, 2) \
- V(Uint32x4_or, 2) \
- V(Uint32x4_and, 2) \
- V(Uint32x4_xor, 2) \
- V(Uint32x4_add, 2) \
- V(Uint32x4_sub, 2) \
- V(Uint32x4_getX, 1) \
- V(Uint32x4_getY, 1) \
- V(Uint32x4_getZ, 1) \
- V(Uint32x4_getW, 1) \
- V(Uint32x4_setX, 2) \
- V(Uint32x4_setY, 2) \
- V(Uint32x4_setZ, 2) \
- V(Uint32x4_setW, 2) \
- V(Uint32x4_getSignMask, 1) \
- V(Uint32x4_shuffle, 2) \
- V(Uint32x4_shuffleMix, 3) \
- V(Uint32x4_getFlagX, 1) \
- V(Uint32x4_getFlagY, 1) \
- V(Uint32x4_getFlagZ, 1) \
- V(Uint32x4_getFlagW, 1) \
- V(Uint32x4_setFlagX, 2) \
- V(Uint32x4_setFlagY, 2) \
- V(Uint32x4_setFlagZ, 2) \
- V(Uint32x4_setFlagW, 2) \
- V(Uint32x4_select, 3) \
+ V(Int32x4_fromInts, 5) \
+ V(Int32x4_fromBools, 5) \
+ V(Int32x4_fromFloat32x4Bits, 2) \
+ V(Int32x4_or, 2) \
+ V(Int32x4_and, 2) \
+ V(Int32x4_xor, 2) \
+ V(Int32x4_add, 2) \
+ V(Int32x4_sub, 2) \
+ V(Int32x4_getX, 1) \
+ V(Int32x4_getY, 1) \
+ V(Int32x4_getZ, 1) \
+ V(Int32x4_getW, 1) \
+ V(Int32x4_setX, 2) \
+ V(Int32x4_setY, 2) \
+ V(Int32x4_setZ, 2) \
+ V(Int32x4_setW, 2) \
+ V(Int32x4_getSignMask, 1) \
+ V(Int32x4_shuffle, 2) \
+ V(Int32x4_shuffleMix, 3) \
+ V(Int32x4_getFlagX, 1) \
+ V(Int32x4_getFlagY, 1) \
+ V(Int32x4_getFlagZ, 1) \
+ V(Int32x4_getFlagW, 1) \
+ V(Int32x4_setFlagX, 2) \
+ V(Int32x4_setFlagY, 2) \
+ V(Int32x4_setFlagZ, 2) \
+ V(Int32x4_setFlagW, 2) \
+ V(Int32x4_select, 3) \
V(Isolate_mainPort, 0) \
V(Isolate_spawnFunction, 1) \
V(Isolate_spawnUri, 1) \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 4d384a4..1113f5e 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1220,17 +1220,11 @@
field.set_value(Instance::Handle(Object::sentinel().raw()));
// Create initializer function.
- // We don't have the start position of the initializer expression
- // here, but can compute it from the field identifier position:
- // The initializer expression starts after the assignment token at +2.
- const intptr_t initializer_pos = field.token_pos() + 2;
- const Function& init_function = Function::ZoneHandle(
- Function::NewStaticInitializer(
- String::Handle(field.name()),
- type,
- cls,
- initializer_pos));
- cls.AddFunction(init_function);
+ if (!field.is_const()) {
+ const Function& init_function = Function::ZoneHandle(
+ Function::NewStaticInitializer(field));
+ cls.AddFunction(init_function);
+ }
}
}
}
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index ae577df..5de912a 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -545,6 +545,9 @@
const SubtypeTestCache& cache =
SubtypeTestCache::CheckedHandle(arguments.ArgAt(4));
ASSERT(type.IsFinalized());
+ ASSERT(!type.IsDynamicType()); // No need to check assignment.
+ ASSERT(!type.IsMalformed()); // Already checked in code generator.
+ ASSERT(!type.IsMalbounded()); // Already checked in code generator.
Error& bound_error = Error::Handle();
const Bool& result =
Bool::Get(instance.IsInstanceOf(type,
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e81438f..92bba64 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -81,12 +81,14 @@
Dart_FileOpenCallback file_open,
Dart_FileReadCallback file_read,
Dart_FileWriteCallback file_write,
- Dart_FileCloseCallback file_close) {
+ Dart_FileCloseCallback file_close,
+ Dart_EntropySource entropy_source) {
// TODO(iposva): Fix race condition here.
if (vm_isolate_ != NULL || !Flags::Initialized()) {
return "VM already initialized.";
}
Isolate::SetFileCallbacks(file_open, file_read, file_write, file_close);
+ Isolate::SetEntropySourceCallback(entropy_source);
OS::InitOnce();
VirtualMemory::InitOnce();
Isolate::InitOnce();
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index edb18ad..135c6b0 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -27,7 +27,8 @@
Dart_FileOpenCallback file_open,
Dart_FileReadCallback file_read,
Dart_FileWriteCallback file_write,
- Dart_FileCloseCallback file_close);
+ Dart_FileCloseCallback file_close,
+ Dart_EntropySource entropy_source);
static const char* Cleanup();
static Isolate* CreateIsolate(const char* name_prefix);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 5faea45..f22df2c 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -733,10 +733,11 @@
Dart_FileOpenCallback file_open,
Dart_FileReadCallback file_read,
Dart_FileWriteCallback file_write,
- Dart_FileCloseCallback file_close) {
+ Dart_FileCloseCallback file_close,
+ Dart_EntropySource entropy_source) {
const char* err_msg = Dart::InitOnce(create, interrupt, unhandled, shutdown,
file_open, file_read, file_write,
- file_close);
+ file_close, entropy_source);
if (err_msg != NULL) {
OS::PrintErr("Dart_Initialize: %s\n", err_msg);
return false;
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 0208c40..f8d7794 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -291,11 +291,12 @@
if (type != Dart_TypedData_kInvalid) {
object->type =
static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kView);
- ReadObjectImpl(); // Skip type arguments.
+ Dart_CObject_Internal* cls =
+ reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
+ ASSERT(cls == object->cls);
object->internal.as_view.buffer = ReadObjectImpl();
object->internal.as_view.offset_in_bytes = ReadSmiValue();
object->internal.as_view.length = ReadSmiValue();
- ReadObjectImpl(); // Skip last field.
// The buffer is fully read now as typed data objects are
// serialized in-line.
@@ -317,7 +318,9 @@
}
} else if (strcmp("dart:isolate", library_uri) == 0 &&
strncmp("_SendPortImpl@", class_name, 14) == 0) {
- ReadObjectImpl(); // Skip type arguments.
+ Dart_CObject_Internal* cls =
+ reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
+ ASSERT(cls == object->cls);
// Read the port id.
Dart_CObject* port = ReadObjectImpl();
if (port->type == Dart_CObject_kInt32) {
@@ -327,7 +330,6 @@
object->type = Dart_CObject_kSendPort;
object->value.as_send_port = port->value.as_int64;
}
- ReadObjectImpl(); // Skip last field.
} else {
// TODO(sgjesse): Handle other instances. Currently this will
// skew the reading as the fields of the instance is not read.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 5e023b4..884706e 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1484,6 +1484,11 @@
void Debugger::OneTimeBreakAtEntry(const Function& target_function) {
InstrumentForStepping(target_function);
+ if (target_function.HasImplicitClosureFunction()) {
+ const Function& closure_func =
+ Function::Handle(target_function.ImplicitClosureFunction());
+ InstrumentForStepping(closure_func);
+ }
}
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 76f5be7..5a6412d 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -54,17 +54,17 @@
}
-void DeferredUint32x4::Materialize() {
- RawUint32x4** uint32x4_slot = reinterpret_cast<RawUint32x4**>(slot());
- RawUint32x4* raw_uint32x4 = Uint32x4::New(value());
- *uint32x4_slot = raw_uint32x4;
+void DeferredInt32x4::Materialize() {
+ RawInt32x4** int32x4_slot = reinterpret_cast<RawInt32x4**>(slot());
+ RawInt32x4* raw_int32x4 = Int32x4::New(value());
+ *int32x4_slot = raw_int32x4;
if (FLAG_trace_deoptimization_verbose) {
- uint32_t x = raw_uint32x4->x();
- uint32_t y = raw_uint32x4->y();
- uint32_t z = raw_uint32x4->z();
- uint32_t w = raw_uint32x4->w();
- OS::PrintErr("materializing Uint32x4 at %" Px ": %x,%x,%x,%x\n",
+ uint32_t x = raw_int32x4->x();
+ uint32_t y = raw_int32x4->y();
+ uint32_t z = raw_int32x4->z();
+ uint32_t w = raw_int32x4->w();
+ OS::PrintErr("materializing Int32x4 at %" Px ": %x,%x,%x,%x\n",
reinterpret_cast<uword>(slot()), x, y, z, w);
}
}
diff --git a/runtime/vm/deferred_objects.h b/runtime/vm/deferred_objects.h
index 7e2c3c9..ae2e29f 100644
--- a/runtime/vm/deferred_objects.h
+++ b/runtime/vm/deferred_objects.h
@@ -86,9 +86,9 @@
};
-class DeferredUint32x4 : public DeferredSlot {
+class DeferredInt32x4 : public DeferredSlot {
public:
- DeferredUint32x4(simd128_value_t value, RawInstance** slot,
+ DeferredInt32x4(simd128_value_t value, RawInstance** slot,
DeferredSlot* next)
: DeferredSlot(slot, next), value_(value) { }
@@ -99,7 +99,7 @@
private:
const simd128_value_t value_;
- DISALLOW_COPY_AND_ASSIGN(DeferredUint32x4);
+ DISALLOW_COPY_AND_ASSIGN(DeferredInt32x4);
};
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index c5266d1..ea2e147 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -190,7 +190,7 @@
case DeoptInstr::kDoubleStackSlot:
case DeoptInstr::kInt64StackSlot:
case DeoptInstr::kFloat32x4StackSlot:
- case DeoptInstr::kUint32x4StackSlot:
+ case DeoptInstr::kInt32x4StackSlot:
case DeoptInstr::kPp:
case DeoptInstr::kCallerPp:
case DeoptInstr::kMaterializedObjectRef:
@@ -200,7 +200,7 @@
case DeoptInstr::kFpuRegister:
case DeoptInstr::kInt64FpuRegister:
case DeoptInstr::kFloat32x4FpuRegister:
- case DeoptInstr::kUint32x4FpuRegister:
+ case DeoptInstr::kInt32x4FpuRegister:
// TODO(turnidge): Sometimes we encounter a deopt instruction
// with a register source while deoptimizing frames during
// debugging but we haven't saved our register set. This
@@ -506,15 +506,15 @@
};
-class DeoptUint32x4StackSlotInstr : public DeoptInstr {
+class DeoptInt32x4StackSlotInstr : public DeoptInstr {
public:
- explicit DeoptUint32x4StackSlotInstr(intptr_t source_index)
+ explicit DeoptInt32x4StackSlotInstr(intptr_t source_index)
: stack_slot_index_(source_index) {
ASSERT(stack_slot_index_ >= 0);
}
virtual intptr_t source_index() const { return stack_slot_index_; }
- virtual DeoptInstr::Kind kind() const { return kUint32x4StackSlot; }
+ virtual DeoptInstr::Kind kind() const { return kInt32x4StackSlot; }
virtual const char* ToCString() const {
return Isolate::Current()->current_zone()->PrintToString(
@@ -527,14 +527,14 @@
simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
deopt_context->GetSourceFrameAddressAt(source_index));
*reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
- deopt_context->DeferUint32x4Materialization(
- *source_addr, reinterpret_cast<RawUint32x4**>(dest_addr));
+ deopt_context->DeferInt32x4Materialization(
+ *source_addr, reinterpret_cast<RawInt32x4**>(dest_addr));
}
private:
const intptr_t stack_slot_index_; // First argument is 0, always >= 0.
- DISALLOW_COPY_AND_ASSIGN(DeoptUint32x4StackSlotInstr);
+ DISALLOW_COPY_AND_ASSIGN(DeoptInt32x4StackSlotInstr);
};
@@ -744,13 +744,13 @@
// Deoptimization instruction moving an XMM register.
-class DeoptUint32x4FpuRegisterInstr: public DeoptInstr {
+class DeoptInt32x4FpuRegisterInstr: public DeoptInstr {
public:
- explicit DeoptUint32x4FpuRegisterInstr(intptr_t reg_as_int)
+ explicit DeoptInt32x4FpuRegisterInstr(intptr_t reg_as_int)
: reg_(static_cast<FpuRegister>(reg_as_int)) {}
virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
- virtual DeoptInstr::Kind kind() const { return kUint32x4FpuRegister; }
+ virtual DeoptInstr::Kind kind() const { return kInt32x4FpuRegister; }
virtual const char* ToCString() const {
return Isolate::Current()->current_zone()->PrintToString(
@@ -760,14 +760,14 @@
void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
*reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
- deopt_context->DeferUint32x4Materialization(
- value, reinterpret_cast<RawUint32x4**>(dest_addr));
+ deopt_context->DeferInt32x4Materialization(
+ value, reinterpret_cast<RawInt32x4**>(dest_addr));
}
private:
const FpuRegister reg_;
- DISALLOW_COPY_AND_ASSIGN(DeoptUint32x4FpuRegisterInstr);
+ DISALLOW_COPY_AND_ASSIGN(DeoptInt32x4FpuRegisterInstr);
};
@@ -1069,8 +1069,8 @@
case kInt64StackSlot: return new DeoptInt64StackSlotInstr(source_index);
case kFloat32x4StackSlot:
return new DeoptFloat32x4StackSlotInstr(source_index);
- case kUint32x4StackSlot:
- return new DeoptUint32x4StackSlotInstr(source_index);
+ case kInt32x4StackSlot:
+ return new DeoptInt32x4StackSlotInstr(source_index);
case kRetAddress: return new DeoptRetAddressInstr(source_index);
case kConstant: return new DeoptConstantInstr(source_index);
case kRegister: return new DeoptRegisterInstr(source_index);
@@ -1078,8 +1078,8 @@
case kInt64FpuRegister: return new DeoptInt64FpuRegisterInstr(source_index);
case kFloat32x4FpuRegister:
return new DeoptFloat32x4FpuRegisterInstr(source_index);
- case kUint32x4FpuRegister:
- return new DeoptUint32x4FpuRegisterInstr(source_index);
+ case kInt32x4FpuRegister:
+ return new DeoptInt32x4FpuRegisterInstr(source_index);
case kPcMarker: return new DeoptPcMarkerInstr(source_index);
case kPp: return new DeoptPpInstr(source_index);
case kCallerFp: return new DeoptCallerFpInstr();
@@ -1214,8 +1214,8 @@
} else if (value->definition()->representation() == kUnboxedFloat32x4) {
deopt_instr = new DeoptFloat32x4FpuRegisterInstr(source_loc.fpu_reg());
} else {
- ASSERT(value->definition()->representation() == kUnboxedUint32x4);
- deopt_instr = new DeoptUint32x4FpuRegisterInstr(source_loc.fpu_reg());
+ ASSERT(value->definition()->representation() == kUnboxedInt32x4);
+ deopt_instr = new DeoptInt32x4FpuRegisterInstr(source_loc.fpu_reg());
}
} else if (source_loc.IsStackSlot()) {
ASSERT(value->definition()->representation() == kTagged);
@@ -1234,8 +1234,8 @@
if (value->definition()->representation() == kUnboxedFloat32x4) {
deopt_instr = new DeoptFloat32x4StackSlotInstr(source_index);
} else {
- ASSERT(value->definition()->representation() == kUnboxedUint32x4);
- deopt_instr = new DeoptUint32x4StackSlotInstr(source_index);
+ ASSERT(value->definition()->representation() == kUnboxedInt32x4);
+ deopt_instr = new DeoptInt32x4StackSlotInstr(source_index);
}
} else if (source_loc.IsInvalid() &&
value->definition()->IsMaterializeObject()) {
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 36b1b7f..f55c120 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -134,9 +134,9 @@
deferred_boxes_);
}
- void DeferUint32x4Materialization(simd128_value_t value,
- RawUint32x4** slot) {
- deferred_boxes_ = new DeferredUint32x4(
+ void DeferInt32x4Materialization(simd128_value_t value,
+ RawInt32x4** slot) {
+ deferred_boxes_ = new DeferredInt32x4(
value,
reinterpret_cast<RawInstance**>(slot),
deferred_boxes_);
@@ -210,12 +210,12 @@
kFpuRegister,
kInt64FpuRegister,
kFloat32x4FpuRegister,
- kUint32x4FpuRegister,
+ kInt32x4FpuRegister,
kStackSlot,
kDoubleStackSlot,
kInt64StackSlot,
kFloat32x4StackSlot,
- kUint32x4StackSlot,
+ kInt32x4StackSlot,
kPcMarker,
kPp,
kCallerFp,
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index ab2d296..f40c175 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -605,7 +605,7 @@
if ((instr->representation() == kUnboxedDouble) ||
(instr->representation() == kUnboxedMint) ||
(instr->representation() == kUnboxedFloat32x4) ||
- (instr->representation() == kUnboxedUint32x4)) {
+ (instr->representation() == kUnboxedInt32x4)) {
return Location::kFpuRegister;
} else {
return Location::kRegister;
@@ -1601,7 +1601,7 @@
// parallel move resolution.
const bool need_quad = (register_kind_ == Location::kFpuRegister) &&
((range->representation() == kUnboxedFloat32x4) ||
- (range->representation() == kUnboxedUint32x4));
+ (range->representation() == kUnboxedInt32x4));
// Search for a free spill slot among allocated: the value in it should be
// dead and its type should match (e.g. it should not be a part of the quad if
@@ -1650,7 +1650,7 @@
Location location;
if ((range->representation() == kUnboxedFloat32x4) ||
- (range->representation() == kUnboxedUint32x4)) {
+ (range->representation() == kUnboxedInt32x4)) {
ASSERT(need_quad);
location = Location::QuadStackSlot(slot_idx);
} else {
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index fb82608..b231788 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2241,7 +2241,7 @@
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
case kTypedDataFloat32x4ArrayCid:
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
return function_class.id();
default:
return kDynamicCid; // Unknown.
@@ -3574,12 +3574,11 @@
owner()->AddCatchEntry(catch_entry);
ASSERT(!for_catch.is_open());
AppendFragment(catch_entry, for_catch);
- if (node->end_catch_label() != NULL) {
- JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
- if (join != NULL) {
- if (is_open()) Goto(join);
- exit_ = join;
- }
+
+ JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
+ if (join != NULL) {
+ if (is_open()) Goto(join);
+ exit_ = join;
}
if (finally_block != NULL) {
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 199b4f3..a7affc9 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -84,8 +84,8 @@
Isolate::Current()->object_store()->double_class())),
float32x4_class_(Class::ZoneHandle(
Isolate::Current()->object_store()->float32x4_class())),
- uint32x4_class_(Class::ZoneHandle(
- Isolate::Current()->object_store()->uint32x4_class())),
+ int32x4_class_(Class::ZoneHandle(
+ Isolate::Current()->object_store()->int32x4_class())),
list_class_(Class::ZoneHandle(
Library::Handle(Library::CoreLibrary()).
LookupClass(Symbols::List()))),
@@ -505,7 +505,7 @@
it.SetCurrentLocation(Location::DoubleStackSlot(index));
break;
case kUnboxedFloat32x4:
- case kUnboxedUint32x4:
+ case kUnboxedInt32x4:
it.SetCurrentLocation(Location::QuadStackSlot(index));
break;
default:
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 18c9028..debf138 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -429,7 +429,7 @@
const Class& double_class() const { return double_class_; }
const Class& float32x4_class() const { return float32x4_class_; }
- const Class& uint32x4_class() const { return uint32x4_class_; }
+ const Class& int32x4_class() const { return int32x4_class_; }
void SaveLiveRegisters(LocationSummary* locs);
void RestoreLiveRegisters(LocationSummary* locs);
@@ -598,7 +598,7 @@
const Class& double_class_;
const Class& float32x4_class_;
- const Class& uint32x4_class_;
+ const Class& int32x4_class_;
const Class& list_class_;
ParallelMoveResolver parallel_move_resolver_;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index cda4032..378d474 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -393,13 +393,13 @@
converted = new UnboxFloat32x4Instr(use->CopyWithType(), deopt_id);
} else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
converted = new BoxFloat32x4Instr(use->CopyWithType());
- } else if ((from == kTagged) && (to == kUnboxedUint32x4)) {
- ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kUint32x4Cid));
+ } else if ((from == kTagged) && (to == kUnboxedInt32x4)) {
+ ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kInt32x4Cid));
const intptr_t deopt_id = (deopt_target != NULL) ?
deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
- converted = new UnboxUint32x4Instr(use->CopyWithType(), deopt_id);
- } else if ((from == kUnboxedUint32x4) && (to == kTagged)) {
- converted = new BoxUint32x4Instr(use->CopyWithType());
+ converted = new UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
+ } else if ((from == kUnboxedInt32x4) && (to == kTagged)) {
+ converted = new BoxInt32x4Instr(use->CopyWithType());
} else {
// We have failed to find a suitable conversion instruction.
// Insert two "dummy" conversion instructions with the correct
@@ -412,8 +412,8 @@
Definition* boxed = NULL;
if (from == kUnboxedDouble) {
boxed = new BoxDoubleInstr(use->CopyWithType());
- } else if (from == kUnboxedUint32x4) {
- boxed = new BoxUint32x4Instr(use->CopyWithType());
+ } else if (from == kUnboxedInt32x4) {
+ boxed = new BoxInt32x4Instr(use->CopyWithType());
} else if (from == kUnboxedFloat32x4) {
boxed = new BoxFloat32x4Instr(use->CopyWithType());
} else if (from == kUnboxedMint) {
@@ -426,8 +426,8 @@
Value* to_value = new Value(boxed);
if (to == kUnboxedDouble) {
converted = new UnboxDoubleInstr(to_value, deopt_id);
- } else if (to == kUnboxedUint32x4) {
- converted = new UnboxUint32x4Instr(to_value, deopt_id);
+ } else if (to == kUnboxedInt32x4) {
+ converted = new UnboxInt32x4Instr(to_value, deopt_id);
} else if (to == kUnboxedFloat32x4) {
converted = new UnboxFloat32x4Instr(to_value, deopt_id);
} else if (to == kUnboxedMint) {
@@ -492,9 +492,9 @@
unboxed = kUnboxedFloat32x4;
}
break;
- case kUint32x4Cid:
+ case kInt32x4Cid:
if (ShouldInlineSimd()) {
- unboxed = kUnboxedUint32x4;
+ unboxed = kUnboxedInt32x4;
}
break;
}
@@ -510,7 +510,7 @@
void FlowGraphOptimizer::SelectRepresentations() {
// Convervatively unbox all phis that were proven to be of Double,
- // Float32x4, or Uint32x4 type.
+ // Float32x4, or Int32x4 type.
for (intptr_t i = 0; i < block_order_.length(); ++i) {
JoinEntryInstr* join_entry = block_order_[i]->AsJoinEntry();
if (join_entry != NULL) {
@@ -812,9 +812,9 @@
case MethodRecognizer::kFloat32x4ArraySetIndexed:
return kTypedDataFloat32x4ArrayCid;
- case MethodRecognizer::kUint32x4ArrayGetIndexed:
- case MethodRecognizer::kUint32x4ArraySetIndexed:
- return kTypedDataUint32x4ArrayCid;
+ case MethodRecognizer::kInt32x4ArrayGetIndexed:
+ case MethodRecognizer::kInt32x4ArraySetIndexed:
+ return kTypedDataInt32x4ArrayCid;
default:
break;
@@ -976,7 +976,7 @@
: kEmitStoreBarrier;
if (!value_check.IsNull()) {
// No store barrier needed because checked value is a smi, an unboxed mint,
- // an unboxed double, an unboxed Float32x4, or unboxed Uint32x4.
+ // an unboxed double, an unboxed Float32x4, or unboxed Int32x4.
needs_store_barrier = kNoStoreBarrier;
Instruction* check =
GetCheckClass(stored_value, value_check, call->deopt_id());
@@ -1122,10 +1122,10 @@
return InlineByteArrayViewLoad(call, receiver, receiver_cid,
kTypedDataFloat32x4ArrayCid,
ic_data, entry, last);
- case MethodRecognizer::kByteArrayBaseGetUint32x4:
+ case MethodRecognizer::kByteArrayBaseGetInt32x4:
if (!ShouldInlineSimd()) return false;
return InlineByteArrayViewLoad(call, receiver, receiver_cid,
- kTypedDataUint32x4ArrayCid,
+ kTypedDataInt32x4ArrayCid,
ic_data, entry, last);
default:
return false;
@@ -1370,8 +1370,8 @@
operands_type = kDoubleCid;
} else if (HasOnlyTwoOf(ic_data, kFloat32x4Cid)) {
operands_type = kFloat32x4Cid;
- } else if (HasOnlyTwoOf(ic_data, kUint32x4Cid)) {
- operands_type = kUint32x4Cid;
+ } else if (HasOnlyTwoOf(ic_data, kInt32x4Cid)) {
+ operands_type = kInt32x4Cid;
} else {
return false;
}
@@ -1415,8 +1415,8 @@
operands_type = kSmiCid;
} else if (HasTwoMintOrSmi(ic_data)) {
operands_type = kMintCid;
- } else if (HasOnlyTwoOf(ic_data, kUint32x4Cid)) {
- operands_type = kUint32x4Cid;
+ } else if (HasOnlyTwoOf(ic_data, kInt32x4Cid)) {
+ operands_type = kInt32x4Cid;
} else {
return false;
}
@@ -1490,8 +1490,8 @@
}
} else if (operands_type == kFloat32x4Cid) {
return InlineFloat32x4BinaryOp(call, op_kind);
- } else if (operands_type == kUint32x4Cid) {
- return InlineUint32x4BinaryOp(call, op_kind);
+ } else if (operands_type == kInt32x4Cid) {
+ return InlineInt32x4BinaryOp(call, op_kind);
} else if (op_kind == Token::kMOD) {
// TODO(vegorov): implement fast path code for modulo.
ASSERT(operands_type == kSmiCid);
@@ -1755,7 +1755,7 @@
}
-bool FlowGraphOptimizer::InlineUint32x4Getter(InstanceCallInstr* call,
+bool FlowGraphOptimizer::InlineInt32x4Getter(InstanceCallInstr* call,
MethodRecognizer::Kind getter) {
if (!ShouldInlineSimd()) {
return false;
@@ -1767,15 +1767,15 @@
call->env(),
call);
intptr_t mask = 0;
- if ((getter == MethodRecognizer::kUint32x4Shuffle) ||
- (getter == MethodRecognizer::kUint32x4ShuffleMix)) {
+ if ((getter == MethodRecognizer::kInt32x4Shuffle) ||
+ (getter == MethodRecognizer::kInt32x4ShuffleMix)) {
// Extract shuffle mask.
Definition* mask_definition = NULL;
- if (getter == MethodRecognizer::kUint32x4Shuffle) {
+ if (getter == MethodRecognizer::kInt32x4Shuffle) {
ASSERT(call->ArgumentCount() == 2);
mask_definition = call->ArgumentAt(1);
} else {
- ASSERT(getter == MethodRecognizer::kUint32x4ShuffleMix);
+ ASSERT(getter == MethodRecognizer::kInt32x4ShuffleMix);
ASSERT(call->ArgumentCount() == 3);
mask_definition = call->ArgumentAt(2);
}
@@ -1795,14 +1795,14 @@
return false;
}
}
- if (getter == MethodRecognizer::kUint32x4GetSignMask) {
+ if (getter == MethodRecognizer::kInt32x4GetSignMask) {
Simd32x4GetSignMaskInstr* instr = new Simd32x4GetSignMaskInstr(
getter,
new Value(call->ArgumentAt(0)),
call->deopt_id());
ReplaceCall(call, instr);
return true;
- } else if (getter == MethodRecognizer::kUint32x4ShuffleMix) {
+ } else if (getter == MethodRecognizer::kInt32x4ShuffleMix) {
Simd32x4ShuffleMixInstr* instr = new Simd32x4ShuffleMixInstr(
getter,
new Value(call->ArgumentAt(0)),
@@ -1811,7 +1811,7 @@
call->deopt_id());
ReplaceCall(call, instr);
return true;
- } else if (getter == MethodRecognizer::kUint32x4Shuffle) {
+ } else if (getter == MethodRecognizer::kInt32x4Shuffle) {
Simd32x4ShuffleInstr* instr = new Simd32x4ShuffleInstr(
getter,
new Value(call->ArgumentAt(0)),
@@ -1820,7 +1820,7 @@
ReplaceCall(call, instr);
return true;
} else {
- Uint32x4GetFlagInstr* instr = new Uint32x4GetFlagInstr(
+ Int32x4GetFlagInstr* instr = new Int32x4GetFlagInstr(
getter,
new Value(call->ArgumentAt(0)),
call->deopt_id());
@@ -1862,7 +1862,7 @@
}
-bool FlowGraphOptimizer::InlineUint32x4BinaryOp(InstanceCallInstr* call,
+bool FlowGraphOptimizer::InlineInt32x4BinaryOp(InstanceCallInstr* call,
Token::Kind op_kind) {
if (!ShouldInlineSimd()) {
return false;
@@ -1885,10 +1885,10 @@
call->env(),
call);
// Replace call.
- BinaryUint32x4OpInstr* uint32x4_bin_op =
- new BinaryUint32x4OpInstr(op_kind, new Value(left), new Value(right),
+ BinaryInt32x4OpInstr* int32x4_bin_op =
+ new BinaryInt32x4OpInstr(op_kind, new Value(left), new Value(right),
call->deopt_id());
- ReplaceCall(call, uint32x4_bin_op);
+ ReplaceCall(call, int32x4_bin_op);
return true;
}
@@ -1987,7 +1987,7 @@
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
case kTypedDataFloat32x4ArrayCid:
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
return true;
default:
return false;
@@ -2161,8 +2161,8 @@
return BuildByteArrayViewLoad(call, kTypedDataFloat64ArrayCid);
case MethodRecognizer::kByteArrayBaseGetFloat32x4:
return BuildByteArrayViewLoad(call, kTypedDataFloat32x4ArrayCid);
- case MethodRecognizer::kByteArrayBaseGetUint32x4:
- return BuildByteArrayViewLoad(call, kTypedDataUint32x4ArrayCid);
+ case MethodRecognizer::kByteArrayBaseGetInt32x4:
+ return BuildByteArrayViewLoad(call, kTypedDataInt32x4ArrayCid);
// ByteArray setters.
case MethodRecognizer::kByteArrayBaseSetInt8:
@@ -2183,8 +2183,8 @@
return BuildByteArrayViewStore(call, kTypedDataFloat64ArrayCid);
case MethodRecognizer::kByteArrayBaseSetFloat32x4:
return BuildByteArrayViewStore(call, kTypedDataFloat32x4ArrayCid);
- case MethodRecognizer::kByteArrayBaseSetUint32x4:
- return BuildByteArrayViewStore(call, kTypedDataUint32x4ArrayCid);
+ case MethodRecognizer::kByteArrayBaseSetInt32x4:
+ return BuildByteArrayViewStore(call, kTypedDataInt32x4ArrayCid);
default:
// Unsupported method.
return false;
@@ -2195,8 +2195,8 @@
return TryInlineFloat32x4Method(call, recognized_kind);
}
- if ((class_ids[0] == kUint32x4Cid) && (ic_data.NumberOfChecks() == 1)) {
- return TryInlineUint32x4Method(call, recognized_kind);
+ if ((class_ids[0] == kInt32x4Cid) && (ic_data.NumberOfChecks() == 1)) {
+ return TryInlineInt32x4Method(call, recognized_kind);
}
if (recognized_kind == MethodRecognizer::kIntegerLeftShiftWithMask32) {
@@ -2288,9 +2288,9 @@
call->deopt_id());
ReplaceCall(call, con);
return true;
- } else if (recognized_kind == MethodRecognizer::kFloat32x4FromUint32x4Bits) {
- Uint32x4ToFloat32x4Instr* cast =
- new Uint32x4ToFloat32x4Instr(new Value(call->ArgumentAt(1)),
+ } else if (recognized_kind == MethodRecognizer::kFloat32x4FromInt32x4Bits) {
+ Int32x4ToFloat32x4Instr* cast =
+ new Int32x4ToFloat32x4Instr(new Value(call->ArgumentAt(1)),
call->deopt_id());
ReplaceCall(call, cast);
return true;
@@ -2299,14 +2299,14 @@
}
-bool FlowGraphOptimizer::TryInlineUint32x4Constructor(
+bool FlowGraphOptimizer::TryInlineInt32x4Constructor(
StaticCallInstr* call,
MethodRecognizer::Kind recognized_kind) {
if (!ShouldInlineSimd()) {
return false;
}
- if (recognized_kind == MethodRecognizer::kUint32x4BoolConstructor) {
- Uint32x4BoolConstructorInstr* con = new Uint32x4BoolConstructorInstr(
+ if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
+ Int32x4BoolConstructorInstr* con = new Int32x4BoolConstructorInstr(
new Value(call->ArgumentAt(1)),
new Value(call->ArgumentAt(2)),
new Value(call->ArgumentAt(3)),
@@ -2314,9 +2314,9 @@
call->deopt_id());
ReplaceCall(call, con);
return true;
- } else if (recognized_kind == MethodRecognizer::kUint32x4FromFloat32x4Bits) {
- Float32x4ToUint32x4Instr* cast =
- new Float32x4ToUint32x4Instr(new Value(call->ArgumentAt(1)),
+ } else if (recognized_kind == MethodRecognizer::kInt32x4FromFloat32x4Bits) {
+ Float32x4ToInt32x4Instr* cast =
+ new Float32x4ToInt32x4Instr(new Value(call->ArgumentAt(1)),
call->deopt_id());
ReplaceCall(call, cast);
return true;
@@ -2480,7 +2480,7 @@
}
-bool FlowGraphOptimizer::TryInlineUint32x4Method(
+bool FlowGraphOptimizer::TryInlineInt32x4Method(
InstanceCallInstr* call,
MethodRecognizer::Kind recognized_kind) {
if (!ShouldInlineSimd()) {
@@ -2488,18 +2488,18 @@
}
ASSERT(call->HasICData());
switch (recognized_kind) {
- case MethodRecognizer::kUint32x4ShuffleMix:
- case MethodRecognizer::kUint32x4Shuffle:
- case MethodRecognizer::kUint32x4GetFlagX:
- case MethodRecognizer::kUint32x4GetFlagY:
- case MethodRecognizer::kUint32x4GetFlagZ:
- case MethodRecognizer::kUint32x4GetFlagW:
- case MethodRecognizer::kUint32x4GetSignMask:
- ASSERT(call->ic_data()->HasReceiverClassId(kUint32x4Cid));
+ case MethodRecognizer::kInt32x4ShuffleMix:
+ case MethodRecognizer::kInt32x4Shuffle:
+ case MethodRecognizer::kInt32x4GetFlagX:
+ case MethodRecognizer::kInt32x4GetFlagY:
+ case MethodRecognizer::kInt32x4GetFlagZ:
+ case MethodRecognizer::kInt32x4GetFlagW:
+ case MethodRecognizer::kInt32x4GetSignMask:
+ ASSERT(call->ic_data()->HasReceiverClassId(kInt32x4Cid));
ASSERT(call->ic_data()->HasOneTarget());
- return InlineUint32x4Getter(call, recognized_kind);
+ return InlineInt32x4Getter(call, recognized_kind);
- case MethodRecognizer::kUint32x4Select: {
+ case MethodRecognizer::kInt32x4Select: {
Definition* mask = call->ArgumentAt(0);
Definition* trueValue = call->ArgumentAt(1);
Definition* falseValue = call->ArgumentAt(2);
@@ -2510,7 +2510,7 @@
call->deopt_id(),
call->env(),
call);
- Uint32x4SelectInstr* select = new Uint32x4SelectInstr(
+ Int32x4SelectInstr* select = new Int32x4SelectInstr(
new Value(mask),
new Value(trueValue),
new Value(falseValue),
@@ -2518,10 +2518,10 @@
ReplaceCall(call, select);
return true;
}
- case MethodRecognizer::kUint32x4WithFlagX:
- case MethodRecognizer::kUint32x4WithFlagY:
- case MethodRecognizer::kUint32x4WithFlagZ:
- case MethodRecognizer::kUint32x4WithFlagW: {
+ case MethodRecognizer::kInt32x4WithFlagX:
+ case MethodRecognizer::kInt32x4WithFlagY:
+ case MethodRecognizer::kInt32x4WithFlagZ:
+ case MethodRecognizer::kInt32x4WithFlagW: {
Definition* left = call->ArgumentAt(0);
Definition* flag = call->ArgumentAt(1);
// Type check left.
@@ -2531,7 +2531,7 @@
call->deopt_id(),
call->env(),
call);
- Uint32x4SetFlagInstr* setFlag = new Uint32x4SetFlagInstr(
+ Int32x4SetFlagInstr* setFlag = new Int32x4SetFlagInstr(
recognized_kind,
new Value(left),
new Value(flag),
@@ -2675,7 +2675,7 @@
bool FlowGraphOptimizer::BuildByteArrayViewLoad(InstanceCallInstr* call,
intptr_t view_cid) {
bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
- (view_cid == kTypedDataUint32x4ArrayCid);
+ (view_cid == kTypedDataInt32x4ArrayCid);
if (simd_view && !ShouldInlineSimd()) {
return false;
}
@@ -2725,7 +2725,7 @@
bool FlowGraphOptimizer::BuildByteArrayViewStore(InstanceCallInstr* call,
intptr_t view_cid) {
bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
- (view_cid == kTypedDataUint32x4ArrayCid);
+ (view_cid == kTypedDataInt32x4ArrayCid);
if (simd_view && !ShouldInlineSimd()) {
return false;
}
@@ -2780,14 +2780,14 @@
value_check.AddReceiverCheck(kDoubleCid, target);
break;
}
- case kTypedDataUint32x4ArrayCid: {
- // Check that value is always Uint32x4.
+ case kTypedDataInt32x4ArrayCid: {
+ // Check that value is always Int32x4.
value_check = ICData::New(flow_graph_->parsed_function().function(),
call->function_name(),
Object::empty_array(), // Dummy args. descr.
Isolate::kNoDeoptId,
1);
- value_check.AddReceiverCheck(kUint32x4Cid, target);
+ value_check.AddReceiverCheck(kInt32x4Cid, target);
break;
}
case kTypedDataFloat32x4ArrayCid: {
@@ -3136,8 +3136,8 @@
(recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
(recognized_kind == MethodRecognizer::kFloat32x4Constructor)) {
TryInlineFloat32x4Constructor(call, recognized_kind);
- } else if (recognized_kind == MethodRecognizer::kUint32x4BoolConstructor) {
- TryInlineUint32x4Constructor(call, recognized_kind);
+ } else if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
+ TryInlineInt32x4Constructor(call, recognized_kind);
} else if (recognized_kind == MethodRecognizer::kObjectConstructor) {
// Remove the original push arguments.
for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
@@ -6992,40 +6992,40 @@
}
-void ConstantPropagator::VisitFloat32x4ToUint32x4(
- Float32x4ToUint32x4Instr* instr) {
+void ConstantPropagator::VisitFloat32x4ToInt32x4(
+ Float32x4ToInt32x4Instr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitUint32x4BoolConstructor(
- Uint32x4BoolConstructorInstr* instr) {
+void ConstantPropagator::VisitInt32x4BoolConstructor(
+ Int32x4BoolConstructorInstr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitUint32x4GetFlag(Uint32x4GetFlagInstr* instr) {
+void ConstantPropagator::VisitInt32x4GetFlag(Int32x4GetFlagInstr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitUint32x4SetFlag(Uint32x4SetFlagInstr* instr) {
+void ConstantPropagator::VisitInt32x4SetFlag(Int32x4SetFlagInstr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitUint32x4Select(Uint32x4SelectInstr* instr) {
+void ConstantPropagator::VisitInt32x4Select(Int32x4SelectInstr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitUint32x4ToFloat32x4(
- Uint32x4ToFloat32x4Instr* instr) {
+void ConstantPropagator::VisitInt32x4ToFloat32x4(
+ Int32x4ToFloat32x4Instr* instr) {
SetValue(instr, non_constant_);
}
-void ConstantPropagator::VisitBinaryUint32x4Op(BinaryUint32x4OpInstr* instr) {
+void ConstantPropagator::VisitBinaryInt32x4Op(BinaryInt32x4OpInstr* instr) {
SetValue(instr, non_constant_);
}
@@ -7097,7 +7097,7 @@
}
-void ConstantPropagator::VisitUnboxUint32x4(UnboxUint32x4Instr* instr) {
+void ConstantPropagator::VisitUnboxInt32x4(UnboxInt32x4Instr* instr) {
const Object& value = instr->value()->definition()->constant_value();
if (IsNonConstant(value)) {
SetValue(instr, non_constant_);
@@ -7108,7 +7108,7 @@
}
-void ConstantPropagator::VisitBoxUint32x4(BoxUint32x4Instr* instr) {
+void ConstantPropagator::VisitBoxInt32x4(BoxInt32x4Instr* instr) {
const Object& value = instr->value()->definition()->constant_value();
if (IsNonConstant(value)) {
SetValue(instr, non_constant_);
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 2940c6b..bd26fdd 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -110,11 +110,11 @@
bool TryInlineInstanceMethod(InstanceCallInstr* call);
bool TryInlineFloat32x4Constructor(StaticCallInstr* call,
MethodRecognizer::Kind recognized_kind);
- bool TryInlineUint32x4Constructor(StaticCallInstr* call,
+ bool TryInlineInt32x4Constructor(StaticCallInstr* call,
MethodRecognizer::Kind recognized_kind);
bool TryInlineFloat32x4Method(InstanceCallInstr* call,
MethodRecognizer::Kind recognized_kind);
- bool TryInlineUint32x4Method(InstanceCallInstr* call,
+ bool TryInlineInt32x4Method(InstanceCallInstr* call,
MethodRecognizer::Kind recognized_kind);
void ReplaceWithInstanceOf(InstanceCallInstr* instr);
void ReplaceWithTypeCast(InstanceCallInstr* instr);
@@ -187,11 +187,11 @@
bool InlineFloat32x4Getter(InstanceCallInstr* call,
MethodRecognizer::Kind getter);
- bool InlineUint32x4Getter(InstanceCallInstr* call,
+ bool InlineInt32x4Getter(InstanceCallInstr* call,
MethodRecognizer::Kind getter);
bool InlineFloat32x4BinaryOp(InstanceCallInstr* call,
Token::Kind op_kind);
- bool InlineUint32x4BinaryOp(InstanceCallInstr* call,
+ bool InlineInt32x4BinaryOp(InstanceCallInstr* call,
Token::Kind op_kind);
void InlineImplicitInstanceGetter(InstanceCallInstr* call);
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 6dc3a61..d259022 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -415,18 +415,16 @@
cid_ = kDynamicCid;
}
- Error& malformed_error = Error::Handle();
- if (ToAbstractType()->IsMoreSpecificThan(*other->ToAbstractType(),
- &malformed_error)) {
- type_ = other->ToAbstractType();
- } else if (other->ToAbstractType()->IsMoreSpecificThan(*ToAbstractType(),
- &malformed_error)) {
- // Nothing to do.
+ const AbstractType* compile_type = ToAbstractType();
+ const AbstractType* other_compile_type = other->ToAbstractType();
+ if (compile_type->IsMoreSpecificThan(*other_compile_type, NULL)) {
+ type_ = other_compile_type;
+ } else if (other_compile_type->IsMoreSpecificThan(*compile_type, NULL)) {
+ // Nothing to do.
} else {
- // Can't unify.
- type_ = &Type::ZoneHandle(Type::DynamicType());
+ // Can't unify.
+ type_ = &Type::ZoneHandle(Type::DynamicType());
}
- ASSERT(malformed_error.IsNull());
}
@@ -615,14 +613,13 @@
return false;
}
- Error& malformed_error = Error::Handle();
- *is_instance = compile_type.IsMoreSpecificThan(type, &malformed_error);
- return malformed_error.IsNull() && *is_instance;
+ *is_instance = compile_type.IsMoreSpecificThan(type, NULL);
+ return *is_instance;
}
bool CompileType::IsMoreSpecificThan(const AbstractType& other) {
- if (IsNone() || other.IsMalformed()) {
+ if (IsNone()) {
return false;
}
@@ -631,10 +628,7 @@
return IsNull();
}
- Error& malformed_error = Error::Handle();
- const bool is_more_specific =
- ToAbstractType()->IsMoreSpecificThan(other, &malformed_error);
- return malformed_error.IsNull() && is_more_specific;
+ return ToAbstractType()->IsMoreSpecificThan(other, NULL);
}
@@ -1056,8 +1050,8 @@
(op_kind() == MethodRecognizer::kFloat32x4ShuffleW)) {
return CompileType::FromCid(kDoubleCid);
}
- if ((op_kind() == MethodRecognizer::kUint32x4Shuffle)) {
- return CompileType::FromCid(kUint32x4Cid);
+ if ((op_kind() == MethodRecognizer::kInt32x4Shuffle)) {
+ return CompileType::FromCid(kInt32x4Cid);
}
ASSERT((op_kind() == MethodRecognizer::kFloat32x4Shuffle));
return CompileType::FromCid(kFloat32x4Cid);
@@ -1065,8 +1059,8 @@
CompileType Simd32x4ShuffleMixInstr::ComputeType() const {
- if (op_kind() == MethodRecognizer::kUint32x4ShuffleMix) {
- return CompileType::FromCid(kUint32x4Cid);
+ if (op_kind() == MethodRecognizer::kInt32x4ShuffleMix) {
+ return CompileType::FromCid(kInt32x4Cid);
}
ASSERT((op_kind() == MethodRecognizer::kFloat32x4ShuffleMix));
return CompileType::FromCid(kFloat32x4Cid);
@@ -1094,7 +1088,7 @@
CompileType Float32x4ComparisonInstr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+ return CompileType::FromCid(kInt32x4Cid);
}
@@ -1128,38 +1122,38 @@
}
-CompileType Float32x4ToUint32x4Instr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType Float32x4ToInt32x4Instr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
-CompileType Uint32x4BoolConstructorInstr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType Int32x4BoolConstructorInstr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
-CompileType Uint32x4GetFlagInstr::ComputeType() const {
+CompileType Int32x4GetFlagInstr::ComputeType() const {
return CompileType::FromCid(kBoolCid);
}
-CompileType Uint32x4SelectInstr::ComputeType() const {
+CompileType Int32x4SelectInstr::ComputeType() const {
return CompileType::FromCid(kFloat32x4Cid);
}
-CompileType Uint32x4SetFlagInstr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType Int32x4SetFlagInstr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
-CompileType Uint32x4ToFloat32x4Instr::ComputeType() const {
+CompileType Int32x4ToFloat32x4Instr::ComputeType() const {
return CompileType::FromCid(kFloat32x4Cid);
}
-CompileType BinaryUint32x4OpInstr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType BinaryInt32x4OpInstr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
@@ -1193,13 +1187,13 @@
}
-CompileType UnboxUint32x4Instr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType UnboxInt32x4Instr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
-CompileType BoxUint32x4Instr::ComputeType() const {
- return CompileType::FromCid(kUint32x4Cid);
+CompileType BoxInt32x4Instr::ComputeType() const {
+ return CompileType::FromCid(kInt32x4Cid);
}
diff --git a/runtime/vm/freelist.h b/runtime/vm/freelist.h
index 072348a..8ec1ac4 100644
--- a/runtime/vm/freelist.h
+++ b/runtime/vm/freelist.h
@@ -43,6 +43,7 @@
FakeInstance() { }
static cpp_vtable vtable() { return 0; }
static intptr_t InstanceSize() { return 0; }
+ static intptr_t NextFieldOffset() { return -kWordSize; }
static const ClassId kClassId = kFreeListElement;
static bool IsInstance() { return true; }
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index cfeca9b..202bb3c 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -625,8 +625,8 @@
if (op_kind() == MethodRecognizer::kFloat32x4GetSignMask) {
f->Print("Float32x4.getSignMask ");
} else {
- ASSERT(op_kind() == MethodRecognizer::kUint32x4GetSignMask);
- f->Print("Uint32x4.getSignMask ");
+ ASSERT(op_kind() == MethodRecognizer::kInt32x4GetSignMask);
+ f->Print("Int32x4.getSignMask ");
}
value()->PrintTo(f);
}
@@ -707,8 +707,8 @@
}
-void Float32x4ToUint32x4Instr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Float32x4.toUint32x4 ");
+void Float32x4ToInt32x4Instr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Float32x4.toInt32x4 ");
left()->PrintTo(f);
}
@@ -716,8 +716,8 @@
-void Uint32x4BoolConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Uint32x4.bool(");
+void Int32x4BoolConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Int32x4.bool(");
value0()->PrintTo(f);
f->Print(", ");
value1()->PrintTo(f);
@@ -729,22 +729,22 @@
}
-void Uint32x4GetFlagInstr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Uint32x4.%s ", MethodRecognizer::KindToCString(op_kind()));
+void Int32x4GetFlagInstr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Int32x4.%s ", MethodRecognizer::KindToCString(op_kind()));
value()->PrintTo(f);
}
-void Uint32x4SetFlagInstr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Uint32x4.%s ", MethodRecognizer::KindToCString(op_kind()));
+void Int32x4SetFlagInstr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Int32x4.%s ", MethodRecognizer::KindToCString(op_kind()));
value()->PrintTo(f);
f->Print(", ");
flagValue()->PrintTo(f);
}
-void Uint32x4SelectInstr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Uint32x4.select ");
+void Int32x4SelectInstr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Int32x4.select ");
mask()->PrintTo(f);
f->Print(", ");
trueValue()->PrintTo(f);
@@ -753,13 +753,13 @@
}
-void Uint32x4ToFloat32x4Instr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("Uint32x4.toFloat32x4 ");
+void Int32x4ToFloat32x4Instr::PrintOperandsTo(BufferFormatter* f) const {
+ f->Print("Int32x4.toFloat32x4 ");
left()->PrintTo(f);
}
-void BinaryUint32x4OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+void BinaryInt32x4OpInstr::PrintOperandsTo(BufferFormatter* f) const {
f->Print("%s, ", Token::Str(op_kind()));
left()->PrintTo(f);
f->Print(", ");
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 50e3caf..1877a5c 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -1517,15 +1517,15 @@
}
-Definition* BoxUint32x4Instr::Canonicalize(FlowGraph* flow_graph) {
+Definition* BoxInt32x4Instr::Canonicalize(FlowGraph* flow_graph) {
if (input_use_list() == NULL) {
// Environments can accomodate any representation. No need to box.
return value()->definition();
}
- // Fold away BoxUint32x4(UnboxUint32x4(v)).
- UnboxUint32x4Instr* defn = value()->definition()->AsUnboxUint32x4();
- if ((defn != NULL) && (defn->value()->Type()->ToCid() == kUint32x4Cid)) {
+ // Fold away BoxInt32x4(UnboxInt32x4(v)).
+ UnboxInt32x4Instr* defn = value()->definition()->AsUnboxInt32x4();
+ if ((defn != NULL) && (defn->value()->Type()->ToCid() == kInt32x4Cid)) {
return defn->value()->definition();
}
@@ -1533,9 +1533,9 @@
}
-Definition* UnboxUint32x4Instr::Canonicalize(FlowGraph* flow_graph) {
- // Fold away UnboxUint32x4(BoxUint32x4(v)).
- BoxUint32x4Instr* defn = value()->definition()->AsBoxUint32x4();
+Definition* UnboxInt32x4Instr::Canonicalize(FlowGraph* flow_graph) {
+ // Fold away UnboxInt32x4(BoxInt32x4(v)).
+ BoxInt32x4Instr* defn = value()->definition()->AsBoxInt32x4();
return (defn != NULL) ? defn->value()->definition() : this;
}
@@ -1666,6 +1666,9 @@
}
RemoveEnvironment();
flow_graph->CopyDeoptTarget(this, comp);
+ // Unlink environment from the comparison since it is copied to the
+ // branch instruction.
+ comp->RemoveEnvironment();
comp->RemoveFromGraph();
SetComparison(comp);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index b4e6878..ea91a10 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -53,7 +53,7 @@
V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470) \
V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173) \
V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356) \
- V(_TypedList, _getUint32x4, ByteArrayBaseGetUint32x4, 1499091330) \
+ V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162) \
V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1443265945) \
V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 1864204733) \
V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1807419109) \
@@ -63,7 +63,7 @@
V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1457395244) \
V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 49127618) \
V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1261559935) \
- V(_TypedList, _setUint32x4, ByteArrayBaseSetUint32x4, 691480480) \
+ V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1871750680) \
V(_GrowableList, get:length, GrowableArrayLength, 1654225242) \
V(_GrowableList, get:_capacity, GrowableArrayCapacity, 817090003) \
V(_GrowableList, _setData, GrowableArraySetData, 1375509957) \
@@ -92,8 +92,8 @@
V(Float32x4, Float32x4., Float32x4Constructor, 786169160) \
V(Float32x4, Float32x4.zero, Float32x4Zero, 1589383280) \
V(Float32x4, Float32x4.splat, Float32x4Splat, 62513275) \
- V(Float32x4, Float32x4.fromUint32x4Bits, Float32x4FromUint32x4Bits, \
- 770033146) \
+ V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits, \
+ 1933861675) \
V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105) \
V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119) \
V(_Float32x4, get:x, Float32x4ShuffleX, 1351717838) \
@@ -101,12 +101,12 @@
V(_Float32x4, get:z, Float32x4ShuffleZ, 2144923721) \
V(_Float32x4, get:w, Float32x4ShuffleW, 1447699119) \
V(_Float32x4, get:signMask, Float32x4GetSignMask, 1198849347) \
- V(_Float32x4, _cmpequal, Float32x4Equal, 2141256163) \
- V(_Float32x4, _cmpgt, Float32x4GreaterThan, 696292270) \
- V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 1199333164) \
- V(_Float32x4, _cmplt, Float32x4LessThan, 943396590) \
- V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 57211241) \
- V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1234888884) \
+ V(_Float32x4, _cmpequal, Float32x4Equal, 1944929844) \
+ V(_Float32x4, _cmpgt, Float32x4GreaterThan, 499965951) \
+ V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 1003006845) \
+ V(_Float32x4, _cmplt, Float32x4LessThan, 747070271) \
+ V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 2008368570) \
+ V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1038562565) \
V(_Float32x4, _min, Float32x4Min, 1166664658) \
V(_Float32x4, _max, Float32x4Max, 343968921) \
V(_Float32x4, _scale, Float32x4Scale, 803505531) \
@@ -120,21 +120,21 @@
V(_Float32x4, withY, Float32x4WithY, 1806065938) \
V(_Float32x4, withZ, Float32x4WithZ, 320659034) \
V(_Float32x4, withW, Float32x4WithW, 1108437255) \
- V(Uint32x4, Uint32x4.bool, Uint32x4BoolConstructor, 517444095) \
- V(Uint32x4, Uint32x4.fromFloat32x4Bits, Uint32x4FromFloat32x4Bits, \
- 1080034855) \
- V(_Uint32x4, get:flagX, Uint32x4GetFlagX, 1674696792) \
- V(_Uint32x4, get:flagY, Uint32x4GetFlagY, 2013200152) \
- V(_Uint32x4, get:flagZ, Uint32x4GetFlagZ, 944733935) \
- V(_Uint32x4, get:flagW, Uint32x4GetFlagW, 22746169) \
- V(_Uint32x4, get:signMask, Uint32x4GetSignMask, 1858144083) \
- V(_Uint32x4, shuffle, Uint32x4Shuffle, 146209630) \
- V(_Uint32x4, shuffleMix, Uint32x4ShuffleMix, 1251494596) \
- V(_Uint32x4, select, Uint32x4Select, 72244182) \
- V(_Uint32x4, withFlagX, Uint32x4WithFlagX, 1475542073) \
- V(_Uint32x4, withFlagY, Uint32x4WithFlagY, 830610988) \
- V(_Uint32x4, withFlagZ, Uint32x4WithFlagZ, 1714792414) \
- V(_Uint32x4, withFlagW, Uint32x4WithFlagW, 1516924162) \
+ V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 1477593884) \
+ V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits, \
+ 1955567428) \
+ V(_Int32x4, get:flagX, Int32x4GetFlagX, 729235803) \
+ V(_Int32x4, get:flagY, Int32x4GetFlagY, 430840849) \
+ V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 1981076496) \
+ V(_Int32x4, get:flagW, Int32x4GetFlagW, 629356099) \
+ V(_Int32x4, get:signMask, Int32x4GetSignMask, 1598787746) \
+ V(_Int32x4, shuffle, Int32x4Shuffle, 599391160) \
+ V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 1491641197) \
+ V(_Int32x4, select, Int32x4Select, 598942806) \
+ V(_Int32x4, withFlagX, Int32x4WithFlagX, 63248661) \
+ V(_Int32x4, withFlagY, Int32x4WithFlagY, 1498755850) \
+ V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 457856832) \
+ V(_Int32x4, withFlagW, Int32x4WithFlagW, 690638779) \
V(_List, [], ObjectArrayGetIndexed, 1079829188) \
V(_List, []=, ObjectArraySetIndexed, 748954698) \
V(_ImmutableList, [], ImmutableArrayGetIndexed, 25983597) \
@@ -166,8 +166,8 @@
V(_Uint32Array, []=, Uint32ArraySetIndexed, 1980947178) \
V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1901126825) \
V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 1419416331) \
- V(_Uint32x4Array, [], Uint32x4ArrayGetIndexed, 1340743913) \
- V(_Uint32x4Array, []=, Uint32x4ArraySetIndexed, 1326924628) \
+ V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1675579883) \
+ V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 809970636) \
// A list of core function that should always be inlined.
@@ -192,7 +192,7 @@
V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470) \
V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173) \
V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356) \
- V(_TypedList, _getUint32x4, ByteArrayBaseGetUint32x4, 1499091330) \
+ V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162) \
// Class that recognizes the name and owner of a function and returns the
// corresponding enum. See RECOGNIZED_LIST above for list of recognizable
@@ -660,8 +660,8 @@
M(BoxDouble) \
M(BoxFloat32x4) \
M(UnboxFloat32x4) \
- M(BoxUint32x4) \
- M(UnboxUint32x4) \
+ M(BoxInt32x4) \
+ M(UnboxInt32x4) \
M(UnboxInteger) \
M(BoxInteger) \
M(BinaryMintOp) \
@@ -688,14 +688,14 @@
M(Float32x4ZeroArg) \
M(Float32x4Clamp) \
M(Float32x4With) \
- M(Float32x4ToUint32x4) \
+ M(Float32x4ToInt32x4) \
M(MaterializeObject) \
- M(Uint32x4BoolConstructor) \
- M(Uint32x4GetFlag) \
- M(Uint32x4Select) \
- M(Uint32x4SetFlag) \
- M(Uint32x4ToFloat32x4) \
- M(BinaryUint32x4Op) \
+ M(Int32x4BoolConstructor) \
+ M(Int32x4GetFlag) \
+ M(Int32x4Select) \
+ M(Int32x4SetFlag) \
+ M(Int32x4ToFloat32x4) \
+ M(BinaryInt32x4Op) \
#define FORWARD_DECLARATION(type) class type##Instr;
@@ -960,7 +960,7 @@
friend class UnboxIntegerInstr;
friend class UnboxDoubleInstr;
friend class UnboxFloat32x4Instr;
- friend class UnboxUint32x4Instr;
+ friend class UnboxInt32x4Instr;
friend class BinaryDoubleOpInstr;
friend class BinaryFloat32x4OpInstr;
friend class Float32x4ZeroInstr;
@@ -976,13 +976,13 @@
friend class Float32x4ZeroArgInstr;
friend class Float32x4ClampInstr;
friend class Float32x4WithInstr;
- friend class Float32x4ToUint32x4Instr;
- friend class Uint32x4BoolConstructorInstr;
- friend class Uint32x4GetFlagInstr;
- friend class Uint32x4SetFlagInstr;
- friend class Uint32x4SelectInstr;
- friend class Uint32x4ToFloat32x4Instr;
- friend class BinaryUint32x4OpInstr;
+ friend class Float32x4ToInt32x4Instr;
+ friend class Int32x4BoolConstructorInstr;
+ friend class Int32x4GetFlagInstr;
+ friend class Int32x4SetFlagInstr;
+ friend class Int32x4SelectInstr;
+ friend class Int32x4ToFloat32x4Instr;
+ friend class BinaryInt32x4OpInstr;
friend class BinaryMintOpInstr;
friend class BinarySmiOpInstr;
friend class UnarySmiOpInstr;
@@ -4571,9 +4571,9 @@
};
-class BoxUint32x4Instr : public TemplateDefinition<1> {
+class BoxInt32x4Instr : public TemplateDefinition<1> {
public:
- explicit BoxUint32x4Instr(Value* value) {
+ explicit BoxInt32x4Instr(Value* value) {
SetInputAt(0, value);
}
@@ -4583,10 +4583,10 @@
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT(idx == 0);
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
- DECLARE_INSTRUCTION(BoxUint32x4)
+ DECLARE_INSTRUCTION(BoxInt32x4)
virtual CompileType ComputeType() const;
virtual bool AllowsCSE() const { return true; }
@@ -4599,7 +4599,7 @@
Definition* Canonicalize(FlowGraph* flow_graph);
private:
- DISALLOW_COPY_AND_ASSIGN(BoxUint32x4Instr);
+ DISALLOW_COPY_AND_ASSIGN(BoxInt32x4Instr);
};
@@ -4702,9 +4702,9 @@
};
-class UnboxUint32x4Instr : public TemplateDefinition<1> {
+class UnboxInt32x4Instr : public TemplateDefinition<1> {
public:
- UnboxUint32x4Instr(Value* value, intptr_t deopt_id) {
+ UnboxInt32x4Instr(Value* value, intptr_t deopt_id) {
SetInputAt(0, value);
deopt_id_ = deopt_id;
}
@@ -4712,11 +4712,11 @@
Value* value() const { return inputs_[0]; }
virtual bool CanDeoptimize() const {
- return (value()->Type()->ToCid() != kUint32x4Cid);
+ return (value()->Type()->ToCid() != kInt32x4Cid);
}
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual bool AllowsCSE() const { return true; }
@@ -4724,7 +4724,7 @@
virtual EffectSet Dependencies() const { return EffectSet::None(); }
virtual bool AttributesEqual(Instruction* other) const { return true; }
- DECLARE_INSTRUCTION(UnboxUint32x4)
+ DECLARE_INSTRUCTION(UnboxInt32x4)
virtual CompileType ComputeType() const;
virtual bool MayThrow() const { return false; }
@@ -4732,7 +4732,7 @@
Definition* Canonicalize(FlowGraph* flow_graph);
private:
- DISALLOW_COPY_AND_ASSIGN(UnboxUint32x4Instr);
+ DISALLOW_COPY_AND_ASSIGN(UnboxInt32x4Instr);
};
@@ -5021,8 +5021,8 @@
(op_kind_ == MethodRecognizer::kFloat32x4ShuffleW)) {
return kUnboxedDouble;
}
- if ((op_kind_ == MethodRecognizer::kUint32x4Shuffle)) {
- return kUnboxedUint32x4;
+ if ((op_kind_ == MethodRecognizer::kInt32x4Shuffle)) {
+ return kUnboxedInt32x4;
}
ASSERT((op_kind_ == MethodRecognizer::kFloat32x4Shuffle));
return kUnboxedFloat32x4;
@@ -5037,8 +5037,8 @@
(op_kind_ == MethodRecognizer::kFloat32x4Shuffle)) {
return kUnboxedFloat32x4;
}
- ASSERT((op_kind_ == MethodRecognizer::kUint32x4Shuffle));
- return kUnboxedUint32x4;
+ ASSERT((op_kind_ == MethodRecognizer::kInt32x4Shuffle));
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -5090,8 +5090,8 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- if (op_kind() == MethodRecognizer::kUint32x4ShuffleMix) {
- return kUnboxedUint32x4;
+ if (op_kind() == MethodRecognizer::kInt32x4ShuffleMix) {
+ return kUnboxedInt32x4;
}
ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix);
return kUnboxedFloat32x4;
@@ -5099,8 +5099,8 @@
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT((idx == 0) || (idx == 1));
- if (op_kind() == MethodRecognizer::kUint32x4ShuffleMix) {
- return kUnboxedUint32x4;
+ if (op_kind() == MethodRecognizer::kInt32x4ShuffleMix) {
+ return kUnboxedInt32x4;
}
ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix);
return kUnboxedFloat32x4;
@@ -5288,7 +5288,7 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
@@ -5634,9 +5634,9 @@
};
-class Float32x4ToUint32x4Instr : public TemplateDefinition<1> {
+class Float32x4ToInt32x4Instr : public TemplateDefinition<1> {
public:
- Float32x4ToUint32x4Instr(Value* left, intptr_t deopt_id) {
+ Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id) {
SetInputAt(0, left);
deopt_id_ = deopt_id;
}
@@ -5648,7 +5648,7 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
@@ -5662,7 +5662,7 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Float32x4ToUint32x4)
+ DECLARE_INSTRUCTION(Float32x4ToInt32x4)
virtual CompileType ComputeType() const;
virtual bool AllowsCSE() const { return true; }
@@ -5673,13 +5673,13 @@
virtual bool MayThrow() const { return false; }
private:
- DISALLOW_COPY_AND_ASSIGN(Float32x4ToUint32x4Instr);
+ DISALLOW_COPY_AND_ASSIGN(Float32x4ToInt32x4Instr);
};
-class Uint32x4BoolConstructorInstr : public TemplateDefinition<4> {
+class Int32x4BoolConstructorInstr : public TemplateDefinition<4> {
public:
- Uint32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
+ Int32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
Value* value3, intptr_t deopt_id) {
SetInputAt(0, value0);
SetInputAt(1, value1);
@@ -5698,7 +5698,7 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
@@ -5712,7 +5712,7 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Uint32x4BoolConstructor)
+ DECLARE_INSTRUCTION(Int32x4BoolConstructor)
virtual CompileType ComputeType() const;
virtual bool AllowsCSE() const { return true; }
@@ -5723,13 +5723,13 @@
virtual bool MayThrow() const { return false; }
private:
- DISALLOW_COPY_AND_ASSIGN(Uint32x4BoolConstructorInstr);
+ DISALLOW_COPY_AND_ASSIGN(Int32x4BoolConstructorInstr);
};
-class Uint32x4GetFlagInstr : public TemplateDefinition<1> {
+class Int32x4GetFlagInstr : public TemplateDefinition<1> {
public:
- Uint32x4GetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
+ Int32x4GetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
intptr_t deopt_id)
: op_kind_(op_kind) {
SetInputAt(0, value);
@@ -5750,7 +5750,7 @@
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT(idx == 0);
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -5759,14 +5759,14 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Uint32x4GetFlag)
+ DECLARE_INSTRUCTION(Int32x4GetFlag)
virtual CompileType ComputeType() const;
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 op_kind() == other->AsUint32x4GetFlag()->op_kind();
+ return op_kind() == other->AsInt32x4GetFlag()->op_kind();
}
virtual bool MayThrow() const { return false; }
@@ -5774,7 +5774,7 @@
private:
const MethodRecognizer::Kind op_kind_;
- DISALLOW_COPY_AND_ASSIGN(Uint32x4GetFlagInstr);
+ DISALLOW_COPY_AND_ASSIGN(Int32x4GetFlagInstr);
};
@@ -5803,8 +5803,8 @@
if (op_kind_ == MethodRecognizer::kFloat32x4GetSignMask) {
return kUnboxedFloat32x4;
}
- ASSERT(op_kind_ == MethodRecognizer::kUint32x4GetSignMask);
- return kUnboxedUint32x4;
+ ASSERT(op_kind_ == MethodRecognizer::kInt32x4GetSignMask);
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -5832,9 +5832,9 @@
};
-class Uint32x4SelectInstr : public TemplateDefinition<3> {
+class Int32x4SelectInstr : public TemplateDefinition<3> {
public:
- Uint32x4SelectInstr(Value* mask, Value* trueValue, Value* falseValue,
+ Int32x4SelectInstr(Value* mask, Value* trueValue, Value* falseValue,
intptr_t deopt_id) {
SetInputAt(0, mask);
SetInputAt(1, trueValue);
@@ -5857,7 +5857,7 @@
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT((idx == 0) || (idx == 1) || (idx == 2));
if (idx == 0) {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
return kUnboxedFloat32x4;
}
@@ -5868,7 +5868,7 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Uint32x4Select)
+ DECLARE_INSTRUCTION(Int32x4Select)
virtual CompileType ComputeType() const;
virtual bool AllowsCSE() const { return true; }
@@ -5879,13 +5879,13 @@
virtual bool MayThrow() const { return false; }
private:
- DISALLOW_COPY_AND_ASSIGN(Uint32x4SelectInstr);
+ DISALLOW_COPY_AND_ASSIGN(Int32x4SelectInstr);
};
-class Uint32x4SetFlagInstr : public TemplateDefinition<2> {
+class Int32x4SetFlagInstr : public TemplateDefinition<2> {
public:
- Uint32x4SetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
+ Int32x4SetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
Value* flagValue, intptr_t deopt_id)
: op_kind_(op_kind) {
SetInputAt(0, value);
@@ -5903,7 +5903,7 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
@@ -5911,7 +5911,7 @@
if (idx == 1) {
return kTagged;
}
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -5920,14 +5920,14 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Uint32x4SetFlag)
+ DECLARE_INSTRUCTION(Int32x4SetFlag)
virtual CompileType ComputeType() const;
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 op_kind() == other->AsUint32x4SetFlag()->op_kind();
+ return op_kind() == other->AsInt32x4SetFlag()->op_kind();
}
virtual bool MayThrow() const { return false; }
@@ -5935,13 +5935,13 @@
private:
const MethodRecognizer::Kind op_kind_;
- DISALLOW_COPY_AND_ASSIGN(Uint32x4SetFlagInstr);
+ DISALLOW_COPY_AND_ASSIGN(Int32x4SetFlagInstr);
};
-class Uint32x4ToFloat32x4Instr : public TemplateDefinition<1> {
+class Int32x4ToFloat32x4Instr : public TemplateDefinition<1> {
public:
- Uint32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id) {
+ Int32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id) {
SetInputAt(0, left);
deopt_id_ = deopt_id;
}
@@ -5958,7 +5958,7 @@
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT(idx == 0);
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -5967,7 +5967,7 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(Uint32x4ToFloat32x4)
+ DECLARE_INSTRUCTION(Int32x4ToFloat32x4)
virtual CompileType ComputeType() const;
virtual bool AllowsCSE() const { return true; }
@@ -5978,13 +5978,13 @@
virtual bool MayThrow() const { return false; }
private:
- DISALLOW_COPY_AND_ASSIGN(Uint32x4ToFloat32x4Instr);
+ DISALLOW_COPY_AND_ASSIGN(Int32x4ToFloat32x4Instr);
};
-class BinaryUint32x4OpInstr : public TemplateDefinition<2> {
+class BinaryInt32x4OpInstr : public TemplateDefinition<2> {
public:
- BinaryUint32x4OpInstr(Token::Kind op_kind,
+ BinaryInt32x4OpInstr(Token::Kind op_kind,
Value* left,
Value* right,
intptr_t deopt_id)
@@ -6004,12 +6004,12 @@
virtual bool CanDeoptimize() const { return false; }
virtual Representation representation() const {
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual Representation RequiredInputRepresentation(intptr_t idx) const {
ASSERT((idx == 0) || (idx == 1));
- return kUnboxedUint32x4;
+ return kUnboxedInt32x4;
}
virtual intptr_t DeoptimizationTarget() const {
@@ -6018,14 +6018,14 @@
return deopt_id_;
}
- DECLARE_INSTRUCTION(BinaryUint32x4Op)
+ DECLARE_INSTRUCTION(BinaryInt32x4Op)
virtual CompileType ComputeType() const;
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 op_kind() == other->AsBinaryUint32x4Op()->op_kind();
+ return op_kind() == other->AsBinaryInt32x4Op()->op_kind();
}
virtual bool MayThrow() const { return false; }
@@ -6033,7 +6033,7 @@
private:
const Token::Kind op_kind_;
- DISALLOW_COPY_AND_ASSIGN(BinaryUint32x4OpInstr);
+ DISALLOW_COPY_AND_ASSIGN(BinaryInt32x4OpInstr);
};
class BinaryMintOpInstr : public TemplateDefinition<2> {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 3c613e8..43ab8a1 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -979,8 +979,8 @@
return CompileType::FromCid(kDoubleCid);
case kTypedDataFloat32x4ArrayCid:
return CompileType::FromCid(kFloat32x4Cid);
- case kTypedDataUint32x4ArrayCid:
- return CompileType::FromCid(kUint32x4Cid);
+ case kTypedDataInt32x4ArrayCid:
+ return CompileType::FromCid(kInt32x4Cid);
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
@@ -1030,8 +1030,8 @@
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
return kUnboxedDouble;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
default:
@@ -1053,7 +1053,7 @@
locs->set_in(1, Location::WritableRegister());
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
locs->set_out(Location::RequiresFpuRegister());
} else {
locs->set_out(Location::RequiresRegister());
@@ -1106,7 +1106,7 @@
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedMint) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
QRegister result = locs()->out().fpu_reg();
DRegister dresult0 = EvenDRegisterOf(result);
DRegister dresult1 = OddDRegisterOf(result);
@@ -1131,7 +1131,7 @@
element_address = Address(index.reg(), 0);
__ vldrd(dresult0, element_address);
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
__ add(index.reg(), index.reg(), ShifterOperand(array));
__ LoadDFromOffset(dresult0, index.reg(), 0);
@@ -1217,8 +1217,8 @@
return kUnboxedDouble;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
default:
UNREACHABLE();
return kTagged;
@@ -1256,7 +1256,7 @@
break;
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid: // TODO(srdjan): Support Float64 constants.
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
locs->set_in(2, Location::RequiresFpuRegister());
break;
@@ -1397,7 +1397,7 @@
__ StoreDToOffset(in2, index.reg(), 0);
break;
}
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid: {
QRegister in = locs()->in(2).fpu_reg();
DRegister din0 = EvenDRegisterOf(in);
@@ -1523,7 +1523,7 @@
__ CompareImmediate(value_cid_reg, kNullCid);
__ b(&no_fixed_length, EQ);
// Check for typed data array.
- __ CompareImmediate(value_cid_reg, kTypedDataUint32x4ArrayCid);
+ __ CompareImmediate(value_cid_reg, kTypedDataInt32x4ArrayCid);
__ b(&no_fixed_length, GT);
__ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid);
// Could still be a regular array.
@@ -1603,7 +1603,7 @@
__ CompareImmediate(value_cid_reg, kNullCid);
__ b(&no_fixed_length, EQ);
// Check for typed data array.
- __ CompareImmediate(value_cid_reg, kTypedDataUint32x4ArrayCid);
+ __ CompareImmediate(value_cid_reg, kTypedDataInt32x4ArrayCid);
__ b(&no_fixed_length, GT);
__ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid);
// Could still be a regular array.
@@ -2886,7 +2886,7 @@
}
-LocationSummary* BoxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -2899,18 +2899,18 @@
}
-class BoxUint32x4SlowPath : public SlowPathCode {
+class BoxInt32x4SlowPath : public SlowPathCode {
public:
- explicit BoxUint32x4SlowPath(BoxUint32x4Instr* instruction)
+ explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction)
: instruction_(instruction) { }
virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
- __ Comment("BoxUint32x4SlowPath");
+ __ Comment("BoxInt32x4SlowPath");
__ Bind(entry_label());
- const Class& uint32x4_class = compiler->uint32x4_class();
+ const Class& int32x4_class = compiler->int32x4_class();
const Code& stub =
- Code::Handle(StubCode::GetAllocationStubForClass(uint32x4_class));
- const ExternalLabel label(uint32x4_class.ToCString(), stub.EntryPoint());
+ Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+ const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
LocationSummary* locs = instruction_->locs();
locs->live_registers()->Remove(locs->out());
@@ -2927,12 +2927,12 @@
}
private:
- BoxUint32x4Instr* instruction_;
+ BoxInt32x4Instr* instruction_;
};
-void BoxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
- BoxUint32x4SlowPath* slow_path = new BoxUint32x4SlowPath(this);
+void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ BoxInt32x4SlowPath* slow_path = new BoxInt32x4SlowPath(this);
compiler->AddSlowPathCode(slow_path);
Register out_reg = locs()->out().reg();
@@ -2940,21 +2940,21 @@
DRegister value_even = EvenDRegisterOf(value);
DRegister value_odd = OddDRegisterOf(value);
- __ TryAllocate(compiler->uint32x4_class(),
+ __ TryAllocate(compiler->int32x4_class(),
slow_path->entry_label(),
out_reg);
__ Bind(slow_path->exit_label());
__ StoreDToOffset(value_even, out_reg,
- Uint32x4::value_offset() - kHeapObjectTag);
+ Int32x4::value_offset() - kHeapObjectTag);
__ StoreDToOffset(value_odd, out_reg,
- Uint32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
+ Int32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
}
-LocationSummary* UnboxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const {
const intptr_t value_cid = value()->Type()->ToCid();
const intptr_t kNumInputs = 1;
- const intptr_t kNumTemps = value_cid == kUint32x4Cid ? 0 : 1;
+ const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1;
LocationSummary* summary =
new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
summary->set_in(0, Location::RequiresRegister());
@@ -2967,26 +2967,26 @@
}
-void UnboxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
const intptr_t value_cid = value()->Type()->ToCid();
const Register value = locs()->in(0).reg();
const QRegister result = locs()->out().fpu_reg();
- if (value_cid != kUint32x4Cid) {
+ if (value_cid != kInt32x4Cid) {
const Register temp = locs()->temp(0).reg();
Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
__ tst(value, ShifterOperand(kSmiTagMask));
__ b(deopt, EQ);
- __ CompareClassId(value, kUint32x4Cid, temp);
+ __ CompareClassId(value, kInt32x4Cid, temp);
__ b(deopt, NE);
}
const DRegister result_even = EvenDRegisterOf(result);
const DRegister result_odd = OddDRegisterOf(result);
__ LoadDFromOffset(result_even, value,
- Uint32x4::value_offset() - kHeapObjectTag);
+ Int32x4::value_offset() - kHeapObjectTag);
__ LoadDFromOffset(result_odd, value,
- Uint32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
+ Int32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
}
@@ -3091,7 +3091,7 @@
__ vdup(kWord, result, dvalue1, 1);
__ vcvtds(dresult0, sresult0);
break;
- case MethodRecognizer::kUint32x4Shuffle:
+ case MethodRecognizer::kInt32x4Shuffle:
case MethodRecognizer::kFloat32x4Shuffle:
if (mask_ == 0x00) {
__ vdup(kWord, result, dvalue0, 0);
@@ -3155,7 +3155,7 @@
switch (op_kind()) {
case MethodRecognizer::kFloat32x4ShuffleMix:
- case MethodRecognizer::kUint32x4ShuffleMix:
+ case MethodRecognizer::kInt32x4ShuffleMix:
// TODO(zra): Investigate better instruction sequences for shuffle masks.
SRegister left_svalues[4];
SRegister right_svalues[4];
@@ -3524,7 +3524,7 @@
}
-LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3535,7 +3535,7 @@
}
-void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister value = locs()->in(0).fpu_reg();
QRegister result = locs()->out().fpu_reg();
@@ -3545,7 +3545,7 @@
}
-LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 4;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3561,7 +3561,7 @@
}
-void Uint32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
Register v0 = locs()->in(0).reg();
Register v1 = locs()->in(1).reg();
Register v2 = locs()->in(2).reg();
@@ -3592,7 +3592,7 @@
}
-LocationSummary* Uint32x4GetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3604,7 +3604,7 @@
}
-void Uint32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister value = locs()->in(0).fpu_reg();
Register result = locs()->out().reg();
@@ -3616,16 +3616,16 @@
SRegister svalue3 = OddSRegisterOf(dvalue1);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4GetFlagX:
+ case MethodRecognizer::kInt32x4GetFlagX:
__ vmovrs(result, svalue0);
break;
- case MethodRecognizer::kUint32x4GetFlagY:
+ case MethodRecognizer::kInt32x4GetFlagY:
__ vmovrs(result, svalue1);
break;
- case MethodRecognizer::kUint32x4GetFlagZ:
+ case MethodRecognizer::kInt32x4GetFlagZ:
__ vmovrs(result, svalue2);
break;
- case MethodRecognizer::kUint32x4GetFlagW:
+ case MethodRecognizer::kInt32x4GetFlagW:
__ vmovrs(result, svalue3);
break;
default: UNREACHABLE();
@@ -3637,7 +3637,7 @@
}
-LocationSummary* Uint32x4SelectInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3651,7 +3651,7 @@
}
-void Uint32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister mask = locs()->in(0).fpu_reg();
QRegister trueValue = locs()->in(1).fpu_reg();
QRegister falseValue = locs()->in(2).fpu_reg();
@@ -3672,7 +3672,7 @@
}
-LocationSummary* Uint32x4SetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3685,7 +3685,7 @@
}
-void Uint32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister mask = locs()->in(0).fpu_reg();
Register flag = locs()->in(1).reg();
QRegister result = locs()->out().fpu_reg();
@@ -3705,16 +3705,16 @@
__ LoadImmediate(TMP, 0xffffffff, EQ);
__ LoadImmediate(TMP, 0, NE);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4WithFlagX:
+ case MethodRecognizer::kInt32x4WithFlagX:
__ vmovsr(sresult0, TMP);
break;
- case MethodRecognizer::kUint32x4WithFlagY:
+ case MethodRecognizer::kInt32x4WithFlagY:
__ vmovsr(sresult1, TMP);
break;
- case MethodRecognizer::kUint32x4WithFlagZ:
+ case MethodRecognizer::kInt32x4WithFlagZ:
__ vmovsr(sresult2, TMP);
break;
- case MethodRecognizer::kUint32x4WithFlagW:
+ case MethodRecognizer::kInt32x4WithFlagW:
__ vmovsr(sresult3, TMP);
break;
default: UNREACHABLE();
@@ -3722,7 +3722,7 @@
}
-LocationSummary* Uint32x4ToFloat32x4Instr::MakeLocationSummary() const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3733,7 +3733,7 @@
}
-void Uint32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister value = locs()->in(0).fpu_reg();
QRegister result = locs()->out().fpu_reg();
@@ -3743,7 +3743,7 @@
}
-LocationSummary* BinaryUint32x4OpInstr::MakeLocationSummary() const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3755,7 +3755,7 @@
}
-void BinaryUint32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
QRegister left = locs()->in(0).fpu_reg();
QRegister right = locs()->in(1).fpu_reg();
QRegister result = locs()->out().fpu_reg();
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index ba97036..160fe52 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1050,8 +1050,8 @@
return CompileType::FromCid(kDoubleCid);
case kTypedDataFloat32x4ArrayCid:
return CompileType::FromCid(kFloat32x4Cid);
- case kTypedDataUint32x4ArrayCid:
- return CompileType::FromCid(kUint32x4Cid);
+ case kTypedDataInt32x4ArrayCid:
+ return CompileType::FromCid(kInt32x4Cid);
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
@@ -1103,8 +1103,8 @@
return kUnboxedDouble;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
default:
UNIMPLEMENTED();
return kTagged;
@@ -1130,7 +1130,7 @@
}
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
locs->set_out(Location::RequiresFpuRegister());
} else {
locs->set_out(Location::RequiresRegister());
@@ -1163,7 +1163,7 @@
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedMint) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
XmmRegister result = locs()->out().fpu_reg();
if ((index_scale() == 1) && index.IsRegister()) {
__ SmiUntag(index.reg());
@@ -1185,7 +1185,7 @@
case kTypedDataFloat64ArrayCid:
__ movsd(result, element_address);
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
__ movups(result, element_address);
break;
@@ -1272,8 +1272,8 @@
return kUnboxedDouble;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
default:
UNIMPLEMENTED();
return kTagged;
@@ -1334,7 +1334,7 @@
// TODO(srdjan): Support Float64 constants.
locs->set_in(2, Location::RequiresFpuRegister());
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
locs->set_in(2, Location::RequiresFpuRegister());
break;
@@ -1455,7 +1455,7 @@
case kTypedDataFloat64ArrayCid:
__ movsd(element_address, locs()->in(2).fpu_reg());
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
__ movups(element_address, locs()->in(2).fpu_reg());
break;
@@ -1585,7 +1585,7 @@
__ cmpl(value_cid_reg, Immediate(kNullCid));
__ j(EQUAL, &no_fixed_length, Assembler::kNearJump);
// Check for typed data array.
- __ cmpl(value_cid_reg, Immediate(kTypedDataUint32x4ArrayCid));
+ __ cmpl(value_cid_reg, Immediate(kTypedDataInt32x4ArrayCid));
// Not a typed array or a regular array.
__ j(GREATER, &no_fixed_length, Assembler::kNearJump);
__ cmpl(value_cid_reg, Immediate(kTypedDataInt8ArrayCid));
@@ -1672,7 +1672,7 @@
__ cmpl(value_cid_reg, Immediate(kNullCid));
__ j(EQUAL, &no_fixed_length, Assembler::kNearJump);
// Check for typed data array.
- __ cmpl(value_cid_reg, Immediate(kTypedDataUint32x4ArrayCid));
+ __ cmpl(value_cid_reg, Immediate(kTypedDataInt32x4ArrayCid));
// Not a typed array or a regular array.
__ j(GREATER, &no_fixed_length, Assembler::kNearJump);
__ cmpl(value_cid_reg, Immediate(kTypedDataInt8ArrayCid));
@@ -2984,7 +2984,7 @@
}
-LocationSummary* BoxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -2997,18 +2997,18 @@
}
-class BoxUint32x4SlowPath : public SlowPathCode {
+class BoxInt32x4SlowPath : public SlowPathCode {
public:
- explicit BoxUint32x4SlowPath(BoxUint32x4Instr* instruction)
+ explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction)
: instruction_(instruction) { }
virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
- __ Comment("BoxUint32x4SlowPath");
+ __ Comment("BoxInt32x4SlowPath");
__ Bind(entry_label());
- const Class& uint32x4_class = compiler->uint32x4_class();
+ const Class& int32x4_class = compiler->int32x4_class();
const Code& stub =
- Code::Handle(StubCode::GetAllocationStubForClass(uint32x4_class));
- const ExternalLabel label(uint32x4_class.ToCString(), stub.EntryPoint());
+ Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+ const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
LocationSummary* locs = instruction_->locs();
locs->live_registers()->Remove(locs->out());
@@ -3025,30 +3025,30 @@
}
private:
- BoxUint32x4Instr* instruction_;
+ BoxInt32x4Instr* instruction_;
};
-void BoxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
- BoxUint32x4SlowPath* slow_path = new BoxUint32x4SlowPath(this);
+void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ BoxInt32x4SlowPath* slow_path = new BoxInt32x4SlowPath(this);
compiler->AddSlowPathCode(slow_path);
Register out_reg = locs()->out().reg();
XmmRegister value = locs()->in(0).fpu_reg();
- __ TryAllocate(compiler->uint32x4_class(),
+ __ TryAllocate(compiler->int32x4_class(),
slow_path->entry_label(),
Assembler::kFarJump,
out_reg);
__ Bind(slow_path->exit_label());
- __ movups(FieldAddress(out_reg, Uint32x4::value_offset()), value);
+ __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value);
}
-LocationSummary* UnboxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const {
const intptr_t value_cid = value()->Type()->ToCid();
const intptr_t kNumInputs = 1;
- const intptr_t kNumTemps = value_cid == kUint32x4Cid ? 0 : 1;
+ const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1;
LocationSummary* summary =
new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
summary->set_in(0, Location::RequiresRegister());
@@ -3061,20 +3061,20 @@
}
-void UnboxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
const intptr_t value_cid = value()->Type()->ToCid();
const Register value = locs()->in(0).reg();
const XmmRegister result = locs()->out().fpu_reg();
- if (value_cid != kUint32x4Cid) {
+ if (value_cid != kInt32x4Cid) {
const Register temp = locs()->temp(0).reg();
Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
__ testl(value, Immediate(kSmiTagMask));
__ j(ZERO, deopt);
- __ CompareClassId(value, kUint32x4Cid, temp);
+ __ CompareClassId(value, kInt32x4Cid, temp);
__ j(NOT_EQUAL, deopt);
}
- __ movups(result, FieldAddress(value, Uint32x4::value_offset()));
+ __ movups(result, FieldAddress(value, Int32x4::value_offset()));
}
@@ -3169,7 +3169,7 @@
__ cvtss2sd(value, value);
break;
case MethodRecognizer::kFloat32x4Shuffle:
- case MethodRecognizer::kUint32x4Shuffle:
+ case MethodRecognizer::kInt32x4Shuffle:
__ shufps(value, value, Immediate(mask_));
break;
default: UNREACHABLE();
@@ -3196,7 +3196,7 @@
ASSERT(locs()->out().fpu_reg() == left);
switch (op_kind()) {
case MethodRecognizer::kFloat32x4ShuffleMix:
- case MethodRecognizer::kUint32x4ShuffleMix:
+ case MethodRecognizer::kInt32x4ShuffleMix:
__ shufps(left, right, Immediate(mask_));
break;
default: UNREACHABLE();
@@ -3549,7 +3549,7 @@
}
-LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3560,12 +3560,12 @@
}
-void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
// NOP.
}
-LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 4;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3579,7 +3579,7 @@
}
-void Uint32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
Register v0 = locs()->in(0).reg();
Register v1 = locs()->in(1).reg();
Register v2 = locs()->in(2).reg();
@@ -3627,7 +3627,7 @@
}
-LocationSummary* Uint32x4GetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3638,7 +3638,7 @@
}
-void Uint32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister value = locs()->in(0).fpu_reg();
Register result = locs()->out().reg();
Label done;
@@ -3647,16 +3647,16 @@
// Move value to stack.
__ movups(Address(ESP, 0), value);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4GetFlagX:
+ case MethodRecognizer::kInt32x4GetFlagX:
__ movl(result, Address(ESP, 0));
break;
- case MethodRecognizer::kUint32x4GetFlagY:
+ case MethodRecognizer::kInt32x4GetFlagY:
__ movl(result, Address(ESP, 4));
break;
- case MethodRecognizer::kUint32x4GetFlagZ:
+ case MethodRecognizer::kInt32x4GetFlagZ:
__ movl(result, Address(ESP, 8));
break;
- case MethodRecognizer::kUint32x4GetFlagW:
+ case MethodRecognizer::kInt32x4GetFlagW:
__ movl(result, Address(ESP, 12));
break;
default: UNREACHABLE();
@@ -3672,7 +3672,7 @@
}
-LocationSummary* Uint32x4SelectInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3686,7 +3686,7 @@
}
-void Uint32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister mask = locs()->in(0).fpu_reg();
XmmRegister trueValue = locs()->in(1).fpu_reg();
XmmRegister falseValue = locs()->in(2).fpu_reg();
@@ -3706,7 +3706,7 @@
}
-LocationSummary* Uint32x4SetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3718,7 +3718,7 @@
}
-void Uint32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister mask = locs()->in(0).fpu_reg();
Register flag = locs()->in(1).reg();
ASSERT(mask == locs()->out().fpu_reg());
@@ -3729,25 +3729,25 @@
__ CompareObject(flag, Bool::True());
__ j(NOT_EQUAL, &falsePath);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4WithFlagX:
+ case MethodRecognizer::kInt32x4WithFlagX:
__ movl(Address(ESP, 0), Immediate(0xFFFFFFFF));
__ jmp(&exitPath);
__ Bind(&falsePath);
__ movl(Address(ESP, 0), Immediate(0x0));
break;
- case MethodRecognizer::kUint32x4WithFlagY:
+ case MethodRecognizer::kInt32x4WithFlagY:
__ movl(Address(ESP, 4), Immediate(0xFFFFFFFF));
__ jmp(&exitPath);
__ Bind(&falsePath);
__ movl(Address(ESP, 4), Immediate(0x0));
break;
- case MethodRecognizer::kUint32x4WithFlagZ:
+ case MethodRecognizer::kInt32x4WithFlagZ:
__ movl(Address(ESP, 8), Immediate(0xFFFFFFFF));
__ jmp(&exitPath);
__ Bind(&falsePath);
__ movl(Address(ESP, 8), Immediate(0x0));
break;
- case MethodRecognizer::kUint32x4WithFlagW:
+ case MethodRecognizer::kInt32x4WithFlagW:
__ movl(Address(ESP, 12), Immediate(0xFFFFFFFF));
__ jmp(&exitPath);
__ Bind(&falsePath);
@@ -3762,7 +3762,7 @@
}
-LocationSummary* Uint32x4ToFloat32x4Instr::MakeLocationSummary() const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3773,12 +3773,12 @@
}
-void Uint32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
// NOP.
}
-LocationSummary* BinaryUint32x4OpInstr::MakeLocationSummary() const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3790,7 +3790,7 @@
}
-void BinaryUint32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister left = locs()->in(0).fpu_reg();
XmmRegister right = locs()->in(1).fpu_reg();
ASSERT(left == locs()->out().fpu_reg());
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index ae873ee..77e0ffc 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1039,8 +1039,8 @@
return CompileType::FromCid(kDoubleCid);
case kTypedDataFloat32x4ArrayCid:
return CompileType::FromCid(kFloat32x4Cid);
- case kTypedDataUint32x4ArrayCid:
- return CompileType::FromCid(kUint32x4Cid);
+ case kTypedDataInt32x4ArrayCid:
+ return CompileType::FromCid(kInt32x4Cid);
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
@@ -1090,8 +1090,8 @@
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
return kUnboxedDouble;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
default:
@@ -1113,7 +1113,7 @@
locs->set_in(1, Location::WritableRegister());
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
locs->set_out(Location::RequiresFpuRegister());
} else {
locs->set_out(Location::RequiresRegister());
@@ -1173,7 +1173,7 @@
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedMint) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
DRegister result = locs()->out().fpu_reg();
switch (class_id()) {
case kTypedDataInt32ArrayCid:
@@ -1191,7 +1191,7 @@
__ LoadDFromOffset(result, index.reg(),
FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
UNIMPLEMENTED();
break;
@@ -1275,8 +1275,8 @@
return kUnboxedDouble;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
default:
UNIMPLEMENTED();
return kTagged;
@@ -1318,7 +1318,7 @@
locs->AddTemp(Location::RequiresFpuRegister());
// Fall through.
case kTypedDataFloat64ArrayCid: // TODO(srdjan): Support Float64 constants.
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
locs->set_in(2, Location::RequiresFpuRegister());
break;
@@ -1458,7 +1458,7 @@
__ StoreDToOffset(locs()->in(2).fpu_reg(), index.reg(),
FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
UNIMPLEMENTED();
break;
@@ -1586,7 +1586,7 @@
__ BranchSignedLess(CMPRES1, 0, &skip_length_check);
__ BranchEqual(value_cid_reg, kNullCid, &no_fixed_length);
// Check for typed data array.
- __ BranchSignedGreater(value_cid_reg, kTypedDataUint32x4ArrayCid,
+ __ BranchSignedGreater(value_cid_reg, kTypedDataInt32x4ArrayCid,
&no_fixed_length);
__ BranchSignedLess(value_cid_reg, kTypedDataInt8ArrayCid,
&check_array);
@@ -1662,7 +1662,7 @@
Label check_array, length_set, no_fixed_length;
__ BranchEqual(value_cid_reg, kNullCid, &no_fixed_length);
// Check for typed data array.
- __ BranchSignedGreater(value_cid_reg, kTypedDataUint32x4ArrayCid,
+ __ BranchSignedGreater(value_cid_reg, kTypedDataInt32x4ArrayCid,
&no_fixed_length);
__ BranchSignedLess(value_cid_reg, kTypedDataInt8ArrayCid,
&check_array);
@@ -2910,24 +2910,24 @@
}
-LocationSummary* BoxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void BoxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* UnboxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void UnboxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
@@ -3102,35 +3102,35 @@
}
-LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Uint32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* Uint32x4GetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Uint32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
@@ -3146,46 +3146,46 @@
}
-LocationSummary* Uint32x4SelectInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Uint32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* Uint32x4SetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Uint32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* Uint32x4ToFloat32x4Instr::MakeLocationSummary() const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void Uint32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
-LocationSummary* BinaryUint32x4OpInstr::MakeLocationSummary() const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary() const {
UNIMPLEMENTED();
return NULL;
}
-void BinaryUint32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
UNIMPLEMENTED();
}
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index fcf2db7..e2dfa5d 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1035,8 +1035,8 @@
return CompileType::FromCid(kDoubleCid);
case kTypedDataFloat32x4ArrayCid:
return CompileType::FromCid(kFloat32x4Cid);
- case kTypedDataUint32x4ArrayCid:
- return CompileType::FromCid(kUint32x4Cid);
+ case kTypedDataInt32x4ArrayCid:
+ return CompileType::FromCid(kInt32x4Cid);
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
@@ -1077,8 +1077,8 @@
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
return kUnboxedDouble;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
default:
@@ -1109,7 +1109,7 @@
}
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
locs->set_out(Location::RequiresFpuRegister());
} else {
locs->set_out(Location::RequiresRegister());
@@ -1144,7 +1144,7 @@
if ((representation() == kUnboxedDouble) ||
(representation() == kUnboxedFloat32x4) ||
- (representation() == kUnboxedUint32x4)) {
+ (representation() == kUnboxedInt32x4)) {
if ((index_scale() == 1) && index.IsRegister()) {
__ SmiUntag(index.reg());
}
@@ -1158,7 +1158,7 @@
} else if (class_id() == kTypedDataFloat64ArrayCid) {
__ movsd(result, element_address);
} else {
- ASSERT((class_id() == kTypedDataUint32x4ArrayCid) ||
+ ASSERT((class_id() == kTypedDataInt32x4ArrayCid) ||
(class_id() == kTypedDataFloat32x4ArrayCid));
__ movups(result, element_address);
}
@@ -1230,8 +1230,8 @@
return kUnboxedDouble;
case kTypedDataFloat32x4ArrayCid:
return kUnboxedFloat32x4;
- case kTypedDataUint32x4ArrayCid:
- return kUnboxedUint32x4;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
default:
UNIMPLEMENTED();
return kTagged;
@@ -1289,7 +1289,7 @@
// TODO(srdjan): Support Float64 constants.
locs->set_in(2, Location::RequiresFpuRegister());
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
locs->set_in(2, Location::RequiresFpuRegister());
break;
@@ -1407,7 +1407,7 @@
case kTypedDataFloat64ArrayCid:
__ movsd(element_address, locs()->in(2).fpu_reg());
break;
- case kTypedDataUint32x4ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
__ movups(element_address, locs()->in(2).fpu_reg());
break;
@@ -1542,7 +1542,7 @@
__ j(EQUAL, &no_fixed_length, Assembler::kNearJump);
// Check for typed data array.
__ CompareImmediate(
- value_cid_reg, Immediate(kTypedDataUint32x4ArrayCid), PP);
+ value_cid_reg, Immediate(kTypedDataInt32x4ArrayCid), PP);
// Not a typed array or a regular array.
__ j(GREATER, &no_fixed_length, Assembler::kNearJump);
__ CompareImmediate(
@@ -1622,7 +1622,7 @@
__ j(EQUAL, &no_fixed_length, Assembler::kNearJump);
// Check for typed data array.
__ CompareImmediate(value_cid_reg,
- Immediate(kTypedDataUint32x4ArrayCid), PP);
+ Immediate(kTypedDataInt32x4ArrayCid), PP);
// Not a typed array or a regular array.
__ j(GREATER, &no_fixed_length);
__ CompareImmediate(
@@ -3006,7 +3006,7 @@
}
-LocationSummary* BoxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3019,18 +3019,18 @@
}
-class BoxUint32x4SlowPath : public SlowPathCode {
+class BoxInt32x4SlowPath : public SlowPathCode {
public:
- explicit BoxUint32x4SlowPath(BoxUint32x4Instr* instruction)
+ explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction)
: instruction_(instruction) { }
virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
- __ Comment("BoxUint32x4SlowPath");
+ __ Comment("BoxInt32x4SlowPath");
__ Bind(entry_label());
- const Class& uint32x4_class = compiler->uint32x4_class();
+ const Class& int32x4_class = compiler->int32x4_class();
const Code& stub =
- Code::Handle(StubCode::GetAllocationStubForClass(uint32x4_class));
- const ExternalLabel label(uint32x4_class.ToCString(), stub.EntryPoint());
+ Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+ const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
LocationSummary* locs = instruction_->locs();
locs->live_registers()->Remove(locs->out());
@@ -3047,28 +3047,28 @@
}
private:
- BoxUint32x4Instr* instruction_;
+ BoxInt32x4Instr* instruction_;
};
-void BoxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
- BoxUint32x4SlowPath* slow_path = new BoxUint32x4SlowPath(this);
+void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ BoxInt32x4SlowPath* slow_path = new BoxInt32x4SlowPath(this);
compiler->AddSlowPathCode(slow_path);
Register out_reg = locs()->out().reg();
XmmRegister value = locs()->in(0).fpu_reg();
- __ TryAllocate(compiler->uint32x4_class(),
+ __ TryAllocate(compiler->int32x4_class(),
slow_path->entry_label(),
Assembler::kFarJump,
out_reg,
PP);
__ Bind(slow_path->exit_label());
- __ movups(FieldAddress(out_reg, Uint32x4::value_offset()), value);
+ __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value);
}
-LocationSummary* UnboxUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3079,19 +3079,19 @@
}
-void UnboxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
const intptr_t value_cid = value()->Type()->ToCid();
const Register value = locs()->in(0).reg();
const XmmRegister result = locs()->out().fpu_reg();
- if (value_cid != kUint32x4Cid) {
+ if (value_cid != kInt32x4Cid) {
Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
__ testq(value, Immediate(kSmiTagMask));
__ j(ZERO, deopt);
- __ CompareClassId(value, kUint32x4Cid);
+ __ CompareClassId(value, kInt32x4Cid);
__ j(NOT_EQUAL, deopt);
}
- __ movups(result, FieldAddress(value, Uint32x4::value_offset()));
+ __ movups(result, FieldAddress(value, Int32x4::value_offset()));
}
@@ -3185,7 +3185,7 @@
__ cvtss2sd(value, value);
break;
case MethodRecognizer::kFloat32x4Shuffle:
- case MethodRecognizer::kUint32x4Shuffle:
+ case MethodRecognizer::kInt32x4Shuffle:
__ shufps(value, value, Immediate(mask_));
break;
default: UNREACHABLE();
@@ -3212,7 +3212,7 @@
ASSERT(locs()->out().fpu_reg() == left);
switch (op_kind()) {
case MethodRecognizer::kFloat32x4ShuffleMix:
- case MethodRecognizer::kUint32x4ShuffleMix:
+ case MethodRecognizer::kInt32x4ShuffleMix:
__ shufps(left, right, Immediate(mask_));
break;
default: UNREACHABLE();
@@ -3565,7 +3565,7 @@
}
-LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3576,12 +3576,12 @@
}
-void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
// NOP.
}
-LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 4;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3596,7 +3596,7 @@
}
-void Uint32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
Register v0 = locs()->in(0).reg();
Register v1 = locs()->in(1).reg();
Register v2 = locs()->in(2).reg();
@@ -3650,7 +3650,7 @@
}
-LocationSummary* Uint32x4GetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3661,7 +3661,7 @@
}
-void Uint32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister value = locs()->in(0).fpu_reg();
Register result = locs()->out().reg();
Label done;
@@ -3670,16 +3670,16 @@
// Move value to stack.
__ movups(Address(RSP, 0), value);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4GetFlagX:
+ case MethodRecognizer::kInt32x4GetFlagX:
__ movl(result, Address(RSP, 0));
break;
- case MethodRecognizer::kUint32x4GetFlagY:
+ case MethodRecognizer::kInt32x4GetFlagY:
__ movl(result, Address(RSP, 4));
break;
- case MethodRecognizer::kUint32x4GetFlagZ:
+ case MethodRecognizer::kInt32x4GetFlagZ:
__ movl(result, Address(RSP, 8));
break;
- case MethodRecognizer::kUint32x4GetFlagW:
+ case MethodRecognizer::kInt32x4GetFlagW:
__ movl(result, Address(RSP, 12));
break;
default: UNREACHABLE();
@@ -3695,7 +3695,7 @@
}
-LocationSummary* Uint32x4SelectInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3709,7 +3709,7 @@
}
-void Uint32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister mask = locs()->in(0).fpu_reg();
XmmRegister trueValue = locs()->in(1).fpu_reg();
XmmRegister falseValue = locs()->in(2).fpu_reg();
@@ -3729,7 +3729,7 @@
}
-LocationSummary* Uint32x4SetFlagInstr::MakeLocationSummary() const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -3742,7 +3742,7 @@
}
-void Uint32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister mask = locs()->in(0).fpu_reg();
Register flag = locs()->in(1).reg();
Register temp = locs()->temp(0).reg();
@@ -3754,7 +3754,7 @@
__ CompareObject(flag, Bool::True(), PP);
__ j(NOT_EQUAL, &falsePath);
switch (op_kind()) {
- case MethodRecognizer::kUint32x4WithFlagX:
+ case MethodRecognizer::kInt32x4WithFlagX:
__ LoadImmediate(temp, Immediate(0xFFFFFFFF), PP);
__ movl(Address(RSP, 0), temp);
__ jmp(&exitPath);
@@ -3762,7 +3762,7 @@
__ LoadImmediate(temp, Immediate(0x0), PP);
__ movl(Address(RSP, 0), temp);
break;
- case MethodRecognizer::kUint32x4WithFlagY:
+ case MethodRecognizer::kInt32x4WithFlagY:
__ LoadImmediate(temp, Immediate(0xFFFFFFFF), PP);
__ movl(Address(RSP, 4), temp);
__ jmp(&exitPath);
@@ -3770,7 +3770,7 @@
__ LoadImmediate(temp, Immediate(0x0), PP);
__ movl(Address(RSP, 4), temp);
break;
- case MethodRecognizer::kUint32x4WithFlagZ:
+ case MethodRecognizer::kInt32x4WithFlagZ:
__ LoadImmediate(temp, Immediate(0xFFFFFFFF), PP);
__ movl(Address(RSP, 8), temp);
__ jmp(&exitPath);
@@ -3778,7 +3778,7 @@
__ LoadImmediate(temp, Immediate(0x0), PP);
__ movl(Address(RSP, 8), temp);
break;
- case MethodRecognizer::kUint32x4WithFlagW:
+ case MethodRecognizer::kInt32x4WithFlagW:
__ LoadImmediate(temp, Immediate(0xFFFFFFFF), PP);
__ movl(Address(RSP, 12), temp);
__ jmp(&exitPath);
@@ -3795,7 +3795,7 @@
}
-LocationSummary* Uint32x4ToFloat32x4Instr::MakeLocationSummary() const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3806,12 +3806,12 @@
}
-void Uint32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
// NOP.
}
-LocationSummary* BinaryUint32x4OpInstr::MakeLocationSummary() const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3823,7 +3823,7 @@
}
-void BinaryUint32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
XmmRegister left = locs()->in(0).fpu_reg();
XmmRegister right = locs()->in(1).fpu_reg();
ASSERT(left == locs()->out().fpu_reg());
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index cc80d32..bfba629 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -119,7 +119,7 @@
V(_Float32Array, _new, TypedData_Float32Array_new, 1931183334) \
V(_Float64Array, _new, TypedData_Float64Array_new, 2119419798) \
V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 435301615) \
- V(_Uint32x4Array, _new, TypedData_Uint32x4Array_new, 71945244) \
+ V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 1734048395) \
V(_Int8Array, ., TypedData_Int8Array_factory, 810750844) \
V(_Uint8Array, ., TypedData_Uint8Array_factory, 1246070930) \
V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 1882603960) \
@@ -132,7 +132,7 @@
V(_Float32Array, ., TypedData_Float32Array_factory, 1986018007) \
V(_Float64Array, ., TypedData_Float64Array_factory, 1863852388) \
V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1144749257) \
- V(_Uint32x4Array, ., TypedData_Uint32x4Array_factory, 966782236) \
+ V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 1189356537) \
// TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 49eb208..b89db64 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -290,6 +290,7 @@
stub_code_(NULL),
debugger_(NULL),
single_step_(false),
+ random_(),
simulator_(NULL),
long_jump_base_(NULL),
timer_list_(),
@@ -535,10 +536,6 @@
args.SetAt(0, Instance::Handle(func.ImplicitStaticClosure()));
args.SetAt(1, is_spawn_uri ? Bool::True() : Bool::False());
- // Dispatching through _startIsolate will open a control port as a live
- // port. Account for this by increasing the number of open control ports.
- isolate->message_handler()->increment_control_ports();
-
const Library& lib = Library::Handle(Library::IsolateLibrary());
const String& entry_name = String::Handle(String::New("_startIsolate"));
const Function& entry_point =
@@ -730,6 +727,7 @@
Dart_FileReadCallback Isolate::file_read_callback_ = NULL;
Dart_FileWriteCallback Isolate::file_write_callback_ = NULL;
Dart_FileCloseCallback Isolate::file_close_callback_ = NULL;
+Dart_EntropySource Isolate::entropy_source_callback_ = NULL;
Dart_IsolateInterruptCallback Isolate::vmstats_callback_ = NULL;
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index bd3d0be..a01638d 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -13,6 +13,7 @@
#include "vm/gc_callbacks.h"
#include "vm/handles.h"
#include "vm/megamorphic_cache_table.h"
+#include "vm/random.h"
#include "vm/store_buffer.h"
#include "vm/timer.h"
@@ -48,7 +49,7 @@
class RawInteger;
class RawError;
class RawFloat32x4;
-class RawUint32x4;
+class RawInt32x4;
class Simulator;
class StackResource;
class StackZone;
@@ -273,6 +274,8 @@
return OFFSET_OF(Isolate, single_step_);
}
+ Random* random() { return &random_; }
+
Simulator* simulator() const { return simulator_; }
void set_simulator(Simulator* value) { simulator_ = value; }
@@ -343,6 +346,13 @@
return file_close_callback_;
}
+ static void SetEntropySourceCallback(Dart_EntropySource entropy_source) {
+ entropy_source_callback_ = entropy_source;
+ }
+ static Dart_EntropySource entropy_source_callback() {
+ return entropy_source_callback_;
+ }
+
void set_object_id_ring(ObjectIdRing* ring) {
object_id_ring_ = ring;
}
@@ -388,6 +398,7 @@
template<class T> T* AllocateReusableHandle();
static ThreadLocalKey isolate_key;
+
StoreBuffer store_buffer_;
ClassTable class_table_;
MegamorphicCacheTable megamorphic_cache_table_;
@@ -406,6 +417,7 @@
StubCode* stub_code_;
Debugger* debugger_;
bool single_step_;
+ Random random_;
Simulator* simulator_;
LongJump* long_jump_base_;
TimerList timer_list_;
@@ -445,6 +457,7 @@
static Dart_FileReadCallback file_read_callback_;
static Dart_FileWriteCallback file_write_callback_;
static Dart_FileCloseCallback file_close_callback_;
+ static Dart_EntropySource entropy_source_callback_;
static Dart_IsolateInterruptCallback vmstats_callback_;
friend class ReusableHandleScope;
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 8e34046..6d93f71 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -22,7 +22,7 @@
kUnboxedDouble,
kUnboxedMint,
kUnboxedFloat32x4,
- kUnboxedUint32x4,
+ kUnboxedInt32x4,
kNumRepresentations
};
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0d4c8530..8ba182a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -480,7 +480,7 @@
cls.raw_ = class_class_;
cls.set_handle_vtable(fake.vtable());
cls.set_instance_size(Class::InstanceSize());
- cls.set_next_field_offset(Class::InstanceSize());
+ cls.set_next_field_offset(Class::NextFieldOffset());
cls.set_id(Class::kClassId);
cls.set_state_bits(0);
cls.set_is_finalized();
@@ -1148,13 +1148,13 @@
CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
#undef REGISTER_EXT_TYPED_DATA_CLASS
- // Register Float32x4 and Uint32x4 in the object store.
+ // Register Float32x4 and Int32x4 in the object store.
cls = Class::New<Float32x4>();
object_store->set_float32x4_class(cls);
RegisterPrivateClass(cls, Symbols::_Float32x4(), lib);
- cls = Class::New<Uint32x4>();
- object_store->set_uint32x4_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint32x4(), lib);
+ cls = Class::New<Int32x4>();
+ object_store->set_int32x4_class(cls);
+ RegisterPrivateClass(cls, Symbols::_Int32x4(), lib);
cls = Class::New<Instance>(kIllegalCid);
RegisterClass(cls, Symbols::Float32x4(), lib);
@@ -1166,13 +1166,13 @@
object_store->set_float32x4_type(type);
cls = Class::New<Instance>(kIllegalCid);
- RegisterClass(cls, Symbols::Uint32x4(), lib);
+ RegisterClass(cls, Symbols::Int32x4(), lib);
cls.set_num_type_arguments(0);
cls.set_num_own_type_arguments(0);
cls.set_is_prefinalized();
pending_classes.Add(cls);
type = Type::NewNonParameterizedType(cls);
- object_store->set_uint32x4_type(type);
+ object_store->set_int32x4_type(type);
object_store->set_typed_data_classes(typed_data_classes);
@@ -1308,8 +1308,8 @@
cls = Class::New<Float32x4>();
object_store->set_float32x4_class(cls);
- cls = Class::New<Uint32x4>();
- object_store->set_uint32x4_class(cls);
+ cls = Class::New<Int32x4>();
+ object_store->set_int32x4_class(cls);
#define REGISTER_TYPED_DATA_CLASS(clazz) \
cls = Class::NewTypedDataClass(kTypedData##clazz##Cid);
@@ -1534,8 +1534,8 @@
return Symbols::List().raw();
case kFloat32x4Cid:
return Symbols::Float32x4().raw();
- case kUint32x4Cid:
- return Symbols::Uint32x4().raw();
+ case kInt32x4Cid:
+ return Symbols::Int32x4().raw();
case kTypedDataInt8ArrayCid:
case kExternalTypedDataInt8ArrayCid:
return Symbols::Int8List().raw();
@@ -1662,7 +1662,7 @@
FakeObject fake;
result.set_handle_vtable(fake.vtable());
result.set_instance_size(FakeObject::InstanceSize());
- result.set_next_field_offset(FakeObject::InstanceSize());
+ result.set_next_field_offset(FakeObject::NextFieldOffset());
ASSERT((FakeObject::kClassId != kInstanceCid));
result.set_id(FakeObject::kClassId);
result.set_state_bits(0);
@@ -2032,7 +2032,8 @@
intptr_t offset = 0;
intptr_t type_args_field_offset = kNoTypeArguments;
if (super.IsNull()) {
- offset = sizeof(RawObject);
+ offset = Instance::NextFieldOffset();
+ ASSERT(offset > 0);
} else {
ASSERT(super.is_finalized() || super.is_prefinalized());
type_args_field_offset = super.type_arguments_field_offset();
@@ -2056,7 +2057,7 @@
}
}
set_type_arguments_field_offset(type_args_field_offset);
- ASSERT(offset != 0);
+ ASSERT(offset > 0);
Field& field = Field::Handle();
intptr_t len = flds.Length();
for (intptr_t i = 0; i < len; i++) {
@@ -2394,7 +2395,7 @@
ASSERT(fake.IsInstance());
result.set_handle_vtable(fake.vtable());
result.set_instance_size(FakeInstance::InstanceSize());
- result.set_next_field_offset(FakeInstance::InstanceSize());
+ result.set_next_field_offset(FakeInstance::NextFieldOffset());
result.set_id(index);
result.set_state_bits(0);
result.set_type_arguments_field_offset_in_words(kNoTypeArguments);
@@ -2426,7 +2427,7 @@
const Class& result = Class::Handle(New(name, script, token_pos));
// Instances of a signature class can only be closures.
result.set_instance_size(Closure::InstanceSize());
- result.set_next_field_offset(Closure::InstanceSize());
+ result.set_next_field_offset(Closure::NextFieldOffset());
// Signature classes extend the _FunctionImpl class.
result.set_super_type(Type::Handle(
Isolate::Current()->object_store()->function_impl_type()));
@@ -2498,7 +2499,7 @@
cls.set_super_type(Type::Handle(Type::ObjectType()));
// Compute instance size. First word contains a pointer to a properly
// sized typed array once the first native field has been set.
- intptr_t instance_size = sizeof(RawObject) + kWordSize;
+ intptr_t instance_size = sizeof(RawInstance) + kWordSize;
cls.set_instance_size(RoundedAllocationSize(instance_size));
cls.set_next_field_offset(instance_size);
cls.set_num_native_fields(field_count);
@@ -2526,7 +2527,7 @@
}
Class& result = Class::Handle(New<String>(class_id));
result.set_instance_size(instance_size);
- result.set_next_field_offset(instance_size);
+ result.set_next_field_offset(String::NextFieldOffset());
result.set_is_prefinalized();
return result.raw();
}
@@ -2537,7 +2538,7 @@
intptr_t instance_size = TypedData::InstanceSize();
Class& result = Class::Handle(New<TypedData>(class_id));
result.set_instance_size(instance_size);
- result.set_next_field_offset(instance_size);
+ result.set_next_field_offset(TypedData::NextFieldOffset());
result.set_is_prefinalized();
return result.raw();
}
@@ -2547,7 +2548,7 @@
ASSERT(RawObject::IsTypedDataViewClassId(class_id));
Class& result = Class::Handle(New<Instance>(class_id));
result.set_instance_size(0);
- result.set_next_field_offset(0);
+ result.set_next_field_offset(-kWordSize);
return result.raw();
}
@@ -2557,7 +2558,7 @@
intptr_t instance_size = ExternalTypedData::InstanceSize();
Class& result = Class::Handle(New<ExternalTypedData>(class_id));
result.set_instance_size(instance_size);
- result.set_next_field_offset(instance_size);
+ result.set_next_field_offset(ExternalTypedData::NextFieldOffset());
result.set_is_prefinalized();
return result.raw();
}
@@ -2736,157 +2737,179 @@
// type T by class 'other' parameterized with 'other_type_arguments'.
// This class and class 'other' do not need to be finalized, however, they must
// be resolved as well as their interfaces.
-bool Class::TypeTest(
- TypeTestKind test_kind,
+bool Class::TypeTestNonRecursive(
+ const Class& cls,
+ Class::TypeTestKind test_kind,
const AbstractTypeArguments& type_arguments,
const Class& other,
const AbstractTypeArguments& other_type_arguments,
- Error* bound_error) const {
- ASSERT(!IsVoidClass());
- // Check for DynamicType.
- // Each occurrence of DynamicType in type T is interpreted as the dynamic
- // type, a supertype of all types.
- if (other.IsDynamicClass()) {
- return true;
- }
- // In the case of a subtype test, each occurrence of DynamicType in type S is
- // interpreted as the bottom type, a subtype of all types.
- // However, DynamicType is not more specific than any type.
- if (IsDynamicClass()) {
- return test_kind == kIsSubtypeOf;
- }
- // Check for NullType, which is only a subtype of ObjectType, of DynamicType,
- // or of itself, and which is more specific than any type.
- if (IsNullClass()) {
- // We already checked for other.IsDynamicClass() above.
- return (test_kind == kIsMoreSpecificThan) ||
- other.IsObjectClass() || other.IsNullClass();
- }
- // Check for ObjectType. Any type that is not NullType or DynamicType (already
- // checked above), is more specific than ObjectType.
- if (other.IsObjectClass()) {
- return true;
- }
- // Check for reflexivity.
- if (raw() == other.raw()) {
- const intptr_t len = NumTypeArguments();
- if (len == 0) {
+ Error* bound_error) {
+ // Use the thsi object as if it was the receiver of this method, but instead
+ // of recursing reset it to the super class and loop.
+ Class& thsi = Class::Handle(cls.raw());
+ while (true) {
+ ASSERT(!thsi.IsVoidClass());
+ // Check for DynamicType.
+ // Each occurrence of DynamicType in type T is interpreted as the dynamic
+ // type, a supertype of all types.
+ if (other.IsDynamicClass()) {
return true;
}
- // Since we do not truncate the type argument vector of a subclass (see
- // below), we only check a prefix of the proper length.
- // Check for covariance.
- if (other_type_arguments.IsNull() || other_type_arguments.IsRaw(len)) {
+ // In the case of a subtype test, each occurrence of DynamicType in type S
+ // is interpreted as the bottom type, a subtype of all types.
+ // However, DynamicType is not more specific than any type.
+ if (thsi.IsDynamicClass()) {
+ return test_kind == Class::kIsSubtypeOf;
+ }
+ // Check for NullType, which is only a subtype of ObjectType, of
+ // DynamicType, or of itself, and which is more specific than any type.
+ if (thsi.IsNullClass()) {
+ // We already checked for other.IsDynamicClass() above.
+ return (test_kind == Class::kIsMoreSpecificThan) ||
+ other.IsObjectClass() || other.IsNullClass();
+ }
+ // Check for ObjectType. Any type that is not NullType or DynamicType
+ // (already checked above), is more specific than ObjectType.
+ if (other.IsObjectClass()) {
return true;
}
- if (type_arguments.IsNull() || type_arguments.IsRaw(len)) {
- // Other type can't be more specific than this one because for that
- // it would have to have all dynamic type arguments which is checked
- // above.
- return test_kind == kIsSubtypeOf;
- }
- return type_arguments.TypeTest(test_kind,
- other_type_arguments,
- len,
- bound_error);
- }
- const bool other_is_function_class = other.IsFunctionClass();
- if (other.IsSignatureClass() || other_is_function_class) {
- const Function& other_fun = Function::Handle(other.signature_function());
- if (IsSignatureClass()) {
- if (other_is_function_class) {
+ // Check for reflexivity.
+ if (thsi.raw() == other.raw()) {
+ const intptr_t len = thsi.NumTypeArguments();
+ if (len == 0) {
return true;
}
- // Check for two function types.
- const Function& fun = Function::Handle(signature_function());
- return fun.TypeTest(test_kind,
- type_arguments,
- other_fun,
- other_type_arguments,
- bound_error);
- }
- // Check if type S has a call() method of function type T.
- Function& function =
- Function::Handle(LookupDynamicFunction(Symbols::Call()));
- if (function.IsNull()) {
- // Walk up the super_class chain.
- Class& cls = Class::Handle(SuperClass());
- while (!cls.IsNull() && function.IsNull()) {
- function = cls.LookupDynamicFunction(Symbols::Call());
- cls = cls.SuperClass();
+ // Since we do not truncate the type argument vector of a subclass (see
+ // below), we only check a prefix of the proper length.
+ // Check for covariance.
+ if (other_type_arguments.IsNull() || other_type_arguments.IsRaw(len)) {
+ return true;
}
+ if (type_arguments.IsNull() || type_arguments.IsRaw(len)) {
+ // Other type can't be more specific than this one because for that
+ // it would have to have all dynamic type arguments which is checked
+ // above.
+ return test_kind == Class::kIsSubtypeOf;
+ }
+ return type_arguments.TypeTest(test_kind,
+ other_type_arguments,
+ len,
+ bound_error);
}
- if (!function.IsNull()) {
- if (other_is_function_class ||
- function.TypeTest(test_kind,
+ const bool other_is_function_class = other.IsFunctionClass();
+ if (other.IsSignatureClass() || other_is_function_class) {
+ const Function& other_fun = Function::Handle(other.signature_function());
+ if (thsi.IsSignatureClass()) {
+ if (other_is_function_class) {
+ return true;
+ }
+ // Check for two function types.
+ const Function& fun = Function::Handle(thsi.signature_function());
+ return fun.TypeTest(test_kind,
type_arguments,
other_fun,
other_type_arguments,
- bound_error)) {
- return true;
+ bound_error);
+ }
+ // Check if type S has a call() method of function type T.
+ Function& function =
+ Function::Handle(thsi.LookupDynamicFunction(Symbols::Call()));
+ if (function.IsNull()) {
+ // Walk up the super_class chain.
+ Class& cls = Class::Handle(thsi.SuperClass());
+ while (!cls.IsNull() && function.IsNull()) {
+ function = cls.LookupDynamicFunction(Symbols::Call());
+ cls = cls.SuperClass();
+ }
+ }
+ if (!function.IsNull()) {
+ if (other_is_function_class ||
+ function.TypeTest(test_kind,
+ type_arguments,
+ other_fun,
+ other_type_arguments,
+ bound_error)) {
+ return true;
+ }
}
}
- }
- // Check for 'direct super type' specified in the implements clause
- // and check for transitivity at the same time.
- Array& interfaces = Array::Handle(this->interfaces());
- AbstractType& interface = AbstractType::Handle();
- Class& interface_class = Class::Handle();
- AbstractTypeArguments& interface_args = AbstractTypeArguments::Handle();
- Error& error = Error::Handle();
- for (intptr_t i = 0; i < interfaces.Length(); i++) {
- interface ^= interfaces.At(i);
- if (!interface.IsFinalized()) {
- // We may be checking bounds at finalization time. Skipping this
- // unfinalized interface will postpone bound checking to run time.
- continue;
- }
- error = Error::null();
- if (interface.IsMalboundedWithError(&error)) {
- // Return the first bound error to the caller if it requests it.
- if ((bound_error != NULL) && bound_error->IsNull()) {
- ASSERT(!error.IsNull());
- *bound_error = error.raw();
+ // Check for 'direct super type' specified in the implements clause
+ // and check for transitivity at the same time.
+ Array& interfaces = Array::Handle(thsi.interfaces());
+ AbstractType& interface = AbstractType::Handle();
+ Class& interface_class = Class::Handle();
+ AbstractTypeArguments& interface_args = AbstractTypeArguments::Handle();
+ Error& error = Error::Handle();
+ for (intptr_t i = 0; i < interfaces.Length(); i++) {
+ interface ^= interfaces.At(i);
+ if (!interface.IsFinalized()) {
+ // We may be checking bounds at finalization time. Skipping this
+ // unfinalized interface will postpone bound checking to run time.
+ continue;
}
- continue; // Another interface may work better.
- }
- interface_class = interface.type_class();
- interface_args = interface.arguments();
- if (!interface_args.IsNull() && !interface_args.IsInstantiated()) {
- // This type class implements an interface that is parameterized with
- // generic type(s), e.g. it implements List<T>.
- // The uninstantiated type T must be instantiated using the type
- // parameters of this type before performing the type test.
- // The type arguments of this type that are referred to by the type
- // parameters of the interface are at the end of the type vector,
- // after the type arguments of the super type of this type.
- // The index of the type parameters is adjusted upon finalization.
error = Error::null();
- interface_args = interface_args.InstantiateFrom(type_arguments, &error);
- if (!error.IsNull()) {
+ if (interface.IsMalboundedWithError(&error)) {
// Return the first bound error to the caller if it requests it.
if ((bound_error != NULL) && bound_error->IsNull()) {
+ ASSERT(!error.IsNull());
*bound_error = error.raw();
}
continue; // Another interface may work better.
}
+ interface_class = interface.type_class();
+ interface_args = interface.arguments();
+ if (!interface_args.IsNull() && !interface_args.IsInstantiated()) {
+ // This type class implements an interface that is parameterized with
+ // generic type(s), e.g. it implements List<T>.
+ // The uninstantiated type T must be instantiated using the type
+ // parameters of this type before performing the type test.
+ // The type arguments of this type that are referred to by the type
+ // parameters of the interface are at the end of the type vector,
+ // after the type arguments of the super type of this type.
+ // The index of the type parameters is adjusted upon finalization.
+ error = Error::null();
+ interface_args = interface_args.InstantiateFrom(type_arguments, &error);
+ if (!error.IsNull()) {
+ // Return the first bound error to the caller if it requests it.
+ if ((bound_error != NULL) && bound_error->IsNull()) {
+ *bound_error = error.raw();
+ }
+ continue; // Another interface may work better.
+ }
+ }
+ if (interface_class.TypeTest(test_kind,
+ interface_args,
+ other,
+ other_type_arguments,
+ bound_error)) {
+ return true;
+ }
}
- if (interface_class.TypeTest(test_kind,
- interface_args,
- other,
- other_type_arguments,
- bound_error)) {
- return true;
+ // "Recurse" up the class hierarchy until we have reached the top.
+ thsi = thsi.SuperClass();
+ if (thsi.IsNull()) {
+ return false;
}
}
- const Class& super_class = Class::Handle(SuperClass());
- if (super_class.IsNull()) {
- return false;
- }
- // Instead of truncating the type argument vector to the length of the super
- // type argument vector, we make sure that the code works with a vector that
- // is longer than necessary.
- return super_class.TypeTest(test_kind,
+ UNREACHABLE();
+ return false;
+}
+
+
+// If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T.
+// If test_kind == kIsMoreSpecificThan, checks if S is more specific than T.
+// Type S is specified by this class parameterized with 'type_arguments', and
+// type T by class 'other' parameterized with 'other_type_arguments'.
+// This class and class 'other' do not need to be finalized, however, they must
+// be resolved as well as their interfaces.
+bool Class::TypeTest(
+ TypeTestKind test_kind,
+ const AbstractTypeArguments& type_arguments,
+ const Class& other,
+ const AbstractTypeArguments& other_type_arguments,
+ Error* bound_error) const {
+ return TypeTestNonRecursive(*this,
+ test_kind,
type_arguments,
other,
other_type_arguments,
@@ -4227,6 +4250,21 @@
}
+RawField* Function::saved_static_field() const {
+ ASSERT(kind() == RawFunction::kStaticInitializer);
+ const Object& obj = Object::Handle(raw_ptr()->data_);
+ ASSERT(obj.IsField());
+ return Field::Cast(obj).raw();
+}
+
+
+void Function::set_saved_static_field(const Field& value) const {
+ ASSERT(kind() == RawFunction::kStaticInitializer);
+ ASSERT(raw_ptr()->data_ == Object::null());
+ set_data(value);
+}
+
+
RawFunction* Function::parent_function() const {
if (IsClosureFunction()) {
const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -5454,10 +5492,9 @@
}
-RawFunction* Function::NewStaticInitializer(const String& field_name,
- const AbstractType& result_type,
- const Class& cls,
- intptr_t initializer_pos) {
+RawFunction* Function::NewStaticInitializer(const Field& field) {
+ ASSERT(field.is_static());
+ const String& field_name = String::Handle(field.name());
const String& init_name =
String::Handle(Symbols::New(String::Handle(
String::Concat(Symbols::InitPrefix(), field_name))));
@@ -5468,9 +5505,9 @@
false, // !const
false, // !abstract
false, // !external
- cls,
- initializer_pos));
- init_function.set_result_type(result_type);
+ Class::Handle(field.owner()),
+ field.token_pos()));
+ init_function.set_result_type(AbstractType::Handle(field.type()));
// Static initializer functions are generated by the VM and are therfore
// hidden from the user. Since they are only executed once, we avoid
// optimizing and inlining them. After the field is initialized, the
@@ -5479,6 +5516,7 @@
init_function.set_is_visible(false);
init_function.set_is_optimizable(false);
init_function.set_is_inlinable(false);
+ init_function.set_saved_static_field(field);
return init_function.raw();
}
@@ -10814,7 +10852,7 @@
ASSERT(instance_size != 0);
uword this_addr = reinterpret_cast<uword>(this->raw_ptr());
uword other_addr = reinterpret_cast<uword>(other.raw_ptr());
- for (intptr_t offset = sizeof(RawObject);
+ for (intptr_t offset = Instance::NextFieldOffset();
offset < instance_size;
offset += kWordSize) {
if ((*reinterpret_cast<RawObject**>(this_addr + offset)) !=
@@ -11394,9 +11432,9 @@
}
-bool AbstractType::IsUint32x4Type() const {
+bool AbstractType::IsInt32x4Type() const {
return HasResolvedTypeClass() &&
- (type_class() == Type::Handle(Type::Uint32x4()).type_class());
+ (type_class() == Type::Handle(Type::Int32x4()).type_class());
}
@@ -11423,8 +11461,13 @@
Error* bound_error) const {
ASSERT(IsResolved());
ASSERT(other.IsResolved());
- ASSERT(!IsMalformed());
- ASSERT(!other.IsMalformed());
+ if (IsMalformed() || other.IsMalformed()) {
+ // Malformed types involved in subtype tests should be handled specially
+ // by the caller. Malformed types should only be encountered here in a
+ // more specific than test.
+ ASSERT(test_kind == kIsMoreSpecificThan);
+ return false;
+ }
// In case the type checked in a type test is malbounded, the code generator
// may compile a throw instead of a run time call performing the type check.
// However, in checked mode, a function type may include malbounded result
@@ -11559,8 +11602,8 @@
}
-RawType* Type::Uint32x4() {
- return Isolate::Current()->object_store()->uint32x4_type();
+RawType* Type::Int32x4() {
+ return Isolate::Current()->object_store()->int32x4_type();
}
@@ -15037,14 +15080,14 @@
}
-RawUint32x4* Uint32x4::New(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3,
- Heap::Space space) {
- ASSERT(Isolate::Current()->object_store()->uint32x4_class() !=
+RawInt32x4* Int32x4::New(int32_t v0, int32_t v1, int32_t v2, int32_t v3,
+ Heap::Space space) {
+ ASSERT(Isolate::Current()->object_store()->int32x4_class() !=
Class::null());
- Uint32x4& result = Uint32x4::Handle();
+ Int32x4& result = Int32x4::Handle();
{
- RawObject* raw = Object::Allocate(Uint32x4::kClassId,
- Uint32x4::InstanceSize(),
+ RawObject* raw = Object::Allocate(Int32x4::kClassId,
+ Int32x4::InstanceSize(),
space);
NoGCScope no_gc;
result ^= raw;
@@ -15057,13 +15100,13 @@
}
-RawUint32x4* Uint32x4::New(simd128_value_t value, Heap::Space space) {
- ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
+RawInt32x4* Int32x4::New(simd128_value_t value, Heap::Space space) {
+ ASSERT(Isolate::Current()->object_store()->int32x4_class() !=
Class::null());
- Uint32x4& result = Uint32x4::Handle();
+ Int32x4& result = Int32x4::Handle();
{
- RawObject* raw = Object::Allocate(Uint32x4::kClassId,
- Uint32x4::InstanceSize(),
+ RawObject* raw = Object::Allocate(Int32x4::kClassId,
+ Int32x4::InstanceSize(),
space);
NoGCScope no_gc;
result ^= raw;
@@ -15073,62 +15116,62 @@
}
-void Uint32x4::set_x(uint32_t value) const {
+void Int32x4::set_x(int32_t value) const {
raw_ptr()->value_[0] = value;
}
-void Uint32x4::set_y(uint32_t value) const {
+void Int32x4::set_y(int32_t value) const {
raw_ptr()->value_[1] = value;
}
-void Uint32x4::set_z(uint32_t value) const {
+void Int32x4::set_z(int32_t value) const {
raw_ptr()->value_[2] = value;
}
-void Uint32x4::set_w(uint32_t value) const {
+void Int32x4::set_w(int32_t value) const {
raw_ptr()->value_[3] = value;
}
-uint32_t Uint32x4::x() const {
+int32_t Int32x4::x() const {
return raw_ptr()->value_[0];
}
-uint32_t Uint32x4::y() const {
+int32_t Int32x4::y() const {
return raw_ptr()->value_[1];
}
-uint32_t Uint32x4::z() const {
+int32_t Int32x4::z() const {
return raw_ptr()->value_[2];
}
-uint32_t Uint32x4::w() const {
+int32_t Int32x4::w() const {
return raw_ptr()->value_[3];
}
-simd128_value_t Uint32x4::value() const {
+simd128_value_t Int32x4::value() const {
return simd128_value_t().readFrom(&raw_ptr()->value_[0]);
}
-void Uint32x4::set_value(simd128_value_t value) const {
+void Int32x4::set_value(simd128_value_t value) const {
value.writeTo(&raw_ptr()->value_[0]);
}
-const char* Uint32x4::ToCString() const {
+const char* Int32x4::ToCString() const {
const char* kFormat = "[%08x, %08x, %08x, %08x]";
- uint32_t _x = x();
- uint32_t _y = y();
- uint32_t _z = z();
- uint32_t _w = w();
+ int32_t _x = x();
+ int32_t _y = y();
+ int32_t _z = z();
+ int32_t _w = w();
// Calculate the size of the string.
intptr_t len = OS::SNPrint(NULL, 0, kFormat, _x, _y, _z, _w) + 1;
char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
@@ -15137,7 +15180,7 @@
}
-void Uint32x4::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Int32x4::PrintToJSONStream(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
}
@@ -15155,7 +15198,7 @@
4, // kTypedDataFloat32ArrayCid.
8, // kTypedDataFloat64ArrayCid.
16, // kTypedDataFloat32x4ArrayCid.
- 16, // kTypedDataUint32x4ArrayCid.
+ 16, // kTypedDataInt32x4ArrayCid.
};
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 75ba0b8..2b48af2 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -201,6 +201,9 @@
ASSERT(raw() != null()); \
return raw()->ptr(); \
} \
+ static intptr_t NextFieldOffset() { \
+ return -kWordSize; \
+ } \
SNAPSHOT_READER_SUPPORT(object) \
friend class Isolate; \
friend class StackFrame; \
@@ -528,6 +531,11 @@
RawObject* raw_; // The raw object reference.
private:
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
+
static void InitializeObject(uword address, intptr_t id, intptr_t size);
static void RegisterClass(const Class& cls,
@@ -655,7 +663,8 @@
set_next_field_offset_in_words(value_in_bytes / kWordSize);
}
void set_next_field_offset_in_words(intptr_t value) const {
- ASSERT((Utils::IsAligned((value * kWordSize), kObjectAlignment) &&
+ ASSERT((value == -1) ||
+ (Utils::IsAligned((value * kWordSize), kObjectAlignment) &&
(value == raw_ptr()->instance_size_in_words_)) ||
(!Utils::IsAligned((value * kWordSize), kObjectAlignment) &&
((value + 1) == raw_ptr()->instance_size_in_words_)));
@@ -1083,6 +1092,7 @@
RawFunction* CreateInvocationDispatcher(const String& target_name,
const Array& args_desc,
RawFunction::Kind kind) const;
+
void CalculateFieldOffsets() const;
// Initial value for the cached number of type arguments.
@@ -1121,6 +1131,14 @@
const AbstractTypeArguments& other_type_arguments,
Error* bound_error) const;
+ static bool TypeTestNonRecursive(
+ const Class& cls,
+ TypeTestKind test_kind,
+ const AbstractTypeArguments& type_arguments,
+ const Class& other,
+ const AbstractTypeArguments& other_type_arguments,
+ Error* bound_error);
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
friend class AbstractType;
friend class Instance;
@@ -1144,6 +1162,7 @@
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(RawUnresolvedClass));
}
+
static RawUnresolvedClass* New(const LibraryPrefix& library_prefix,
const String& ident,
intptr_t token_pos);
@@ -1384,6 +1403,7 @@
const AbstractTypeArguments& value) const;
void set_instantiator_type_arguments(
const AbstractTypeArguments& value) const;
+
static RawInstantiatedTypeArguments* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments,
@@ -1408,6 +1428,7 @@
private:
void set_patched_class(const Class& value) const;
void set_source_class(const Class& value) const;
+
static RawPatchClass* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object);
@@ -1527,6 +1548,9 @@
void set_saved_args_desc(const Array& array) const;
RawArray* saved_args_desc() const;
+ void set_saved_static_field(const Field& array) const;
+ RawField* saved_static_field() const;
+
bool IsMethodExtractor() const {
return kind() == RawFunction::kMethodExtractor;
}
@@ -1856,7 +1880,6 @@
return kind() == RawFunction::kSignatureFunction;
}
-
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(RawFunction));
}
@@ -1880,10 +1903,7 @@
// Creates a new static initializer function which is invoked in the implicit
// static getter function.
- static RawFunction* NewStaticInitializer(const String& field_name,
- const AbstractType& result_type,
- const Class& cls,
- intptr_t token_pos);
+ static RawFunction* NewStaticInitializer(const Field& field);
// Allocate new function object, clone values from this function. The
// owner of the clone is new_owner.
@@ -1946,6 +1966,7 @@
void set_num_optional_parameters(intptr_t value) const; // Encoded value.
void set_kind_tag(intptr_t value) const;
void set_data(const Object& value) const;
+
static RawFunction* New();
void BuildSignatureParameters(bool instantiate,
@@ -2212,6 +2233,7 @@
void set_kind_bits(intptr_t value) const {
raw_ptr()->kind_bits_ = static_cast<uint8_t>(value);
}
+
static RawField* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(Field, Object);
@@ -2378,6 +2400,7 @@
void set_source(const String& value) const;
void set_kind(RawScript::Kind value) const;
void set_tokens(const TokenStream& value) const;
+
static RawScript* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(Script, Object);
@@ -2592,6 +2615,7 @@
private:
static const int kInitialImportsCapacity = 4;
static const int kImportsCapacityIncrement = 8;
+
static RawLibrary* New();
void set_num_imports(intptr_t value) const {
@@ -2654,6 +2678,7 @@
void set_name(const String& value) const;
void set_imports(const Array& value) const;
void set_num_imports(intptr_t value) const;
+
static RawLibraryPrefix* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Object);
@@ -2679,6 +2704,7 @@
static RawNamespace* New(const Library& library,
const Array& show_names,
const Array& hide_names);
+
private:
static RawNamespace* New();
@@ -2988,6 +3014,7 @@
static const intptr_t kMaxHandlers = 1024 * 1024;
void set_handled_types_data(const Array& value) const;
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers, Object);
friend class Class;
};
@@ -3745,6 +3772,7 @@
private:
void set_message(const String& message) const;
+
static RawApiError* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(ApiError, Error);
@@ -3770,6 +3798,7 @@
private:
void set_message(const String& message) const;
+
static RawLanguageError* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(LanguageError, Error);
@@ -3913,10 +3942,16 @@
}
bool IsValidFieldOffset(int offset) const;
+ static intptr_t NextFieldOffset() {
+ return sizeof(RawInstance);
+ }
+
// TODO(iposva): Determine if this gets in the way of Smi.
HEAP_OBJECT_IMPLEMENTATION(Instance, Object);
friend class Class;
friend class Closure;
+ friend class SnapshotWriter;
+ friend class StubCode;
friend class TypedDataView;
};
@@ -4007,8 +4042,8 @@
// Check if this type represents the 'Float32x4' type.
bool IsFloat32x4Type() const;
- // Check if this type represents the 'Uint32x4' type.
- bool IsUint32x4Type() const;
+ // Check if this type represents the 'Int32x4' type.
+ bool IsInt32x4Type() const;
// Check if this type represents the 'num' type.
bool IsNumberType() const;
@@ -4129,8 +4164,8 @@
// The 'Float32x4' type.
static RawType* Float32x4();
- // The 'Uint32x4' type.
- static RawType* Uint32x4();
+ // The 'Int32x4' type.
+ static RawType* Int32x4();
// The 'num' type.
static RawType* Number();
@@ -4225,6 +4260,7 @@
void set_name(const String& value) const;
void set_token_pos(intptr_t token_pos) const;
void set_type_state(int8_t state) const;
+
static RawTypeParameter* New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType);
@@ -4478,11 +4514,17 @@
}
private:
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
+
static intptr_t ValueFromRaw(uword raw_value) {
intptr_t value = raw_value;
ASSERT((value & kSmiTagMask) == kSmiTag);
return (value >> kSmiTagShift);
}
+
static cpp_vtable handle_vtable_;
Smi() : Integer() {}
@@ -5201,6 +5243,11 @@
intptr_t tags,
Snapshot::Kind kind);
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
+
friend class Class;
friend class String;
friend class SnapshotReader;
@@ -5267,6 +5314,11 @@
intptr_t tags,
Snapshot::Kind kind);
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
+
friend class Class;
friend class String;
friend class SnapshotReader;
@@ -5436,6 +5488,11 @@
}
private:
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
+
static RawImmutableArray* raw(const Array& array) {
return reinterpret_cast<RawImmutableArray*>(array.raw());
}
@@ -5594,36 +5651,36 @@
};
-class Uint32x4 : public Instance {
+class Int32x4 : public Instance {
public:
- static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2,
- uint32_t value3, Heap::Space space = Heap::kNew);
- static RawUint32x4* New(simd128_value_t value,
+ static RawInt32x4* New(int32_t value0, int32_t value1, int32_t value2,
+ int32_t value3, Heap::Space space = Heap::kNew);
+ static RawInt32x4* New(simd128_value_t value,
Heap::Space space = Heap::kNew);
- uint32_t x() const;
- uint32_t y() const;
- uint32_t z() const;
- uint32_t w() const;
+ int32_t x() const;
+ int32_t y() const;
+ int32_t z() const;
+ int32_t w() const;
- void set_x(uint32_t x) const;
- void set_y(uint32_t y) const;
- void set_z(uint32_t z) const;
- void set_w(uint32_t w) const;
+ void set_x(int32_t x) const;
+ void set_y(int32_t y) const;
+ void set_z(int32_t z) const;
+ void set_w(int32_t w) const;
simd128_value_t value() const;
void set_value(simd128_value_t value) const;
static intptr_t InstanceSize() {
- return RoundedAllocationSize(sizeof(RawUint32x4));
+ return RoundedAllocationSize(sizeof(RawInt32x4));
}
static intptr_t value_offset() {
- return OFFSET_OF(RawUint32x4, value_);
+ return OFFSET_OF(RawInt32x4, value_);
}
private:
- FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint32x4, Instance);
+ FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance);
friend class Class;
};
@@ -5675,7 +5732,7 @@
TYPED_GETTER_SETTER(Float32, float)
TYPED_GETTER_SETTER(Float64, double)
TYPED_GETTER_SETTER(Float32x4, simd128_value_t)
- TYPED_GETTER_SETTER(Uint32x4, simd128_value_t)
+ TYPED_GETTER_SETTER(Int32x4, simd128_value_t)
#undef TYPED_GETTER_SETTER
@@ -5809,7 +5866,7 @@
TYPED_GETTER_SETTER(Float32, float)
TYPED_GETTER_SETTER(Float64, double)
TYPED_GETTER_SETTER(Float32x4, simd128_value_t)
- TYPED_GETTER_SETTER(Uint32x4, simd128_value_t);
+ TYPED_GETTER_SETTER(Int32x4, simd128_value_t);
#undef TYPED_GETTER_SETTER
@@ -5907,7 +5964,7 @@
}
static intptr_t NumberOfFields() {
- return (kLengthOffset - kTypeArguments);
+ return kLengthOffset;
}
static intptr_t data_offset() {
@@ -5931,10 +5988,9 @@
private:
enum {
- kTypeArguments = 1,
- kDataOffset = 2,
- kOffsetInBytesOffset = 3,
- kLengthOffset = 4,
+ kDataOffset = 1,
+ kOffsetInBytesOffset = 2,
+ kLengthOffset = 3,
};
};
@@ -6007,6 +6063,10 @@
const Context& value) {
closure.StorePointer(ContextAddr(closure), value.raw());
}
+ static intptr_t NextFieldOffset() {
+ // Indicates this class cannot be extended by dart code.
+ return -kWordSize;
+ }
friend class Class;
};
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index a5dddc1..4ec3410 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -41,7 +41,7 @@
immutable_array_class_(Class::null()),
growable_object_array_class_(Class::null()),
float32x4_class_(Class::null()),
- uint32x4_class_(Class::null()),
+ int32x4_class_(Class::null()),
typed_data_classes_(Array::null()),
error_class_(Class::null()),
stacktrace_class_(Class::null()),
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 2bc8cc5..1f51483 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -195,15 +195,15 @@
RawType* float32x4_type() const { return float32x4_type_; }
void set_float32x4_type(const Type& value) { float32x4_type_ = value.raw(); }
- RawClass* uint32x4_class() const {
- return uint32x4_class_;
+ RawClass* int32x4_class() const {
+ return int32x4_class_;
}
- void set_uint32x4_class(const Class& value) {
- uint32x4_class_ = value.raw();
+ void set_int32x4_class(const Class& value) {
+ int32x4_class_ = value.raw();
}
- RawType* uint32x4_type() const { return uint32x4_type_; }
- void set_uint32x4_type(const Type& value) { uint32x4_type_ = value.raw(); }
+ RawType* int32x4_type() const { return int32x4_type_; }
+ void set_int32x4_type(const Type& value) { int32x4_type_ = value.raw(); }
RawArray* typed_data_classes() const {
return typed_data_classes_;
@@ -441,7 +441,7 @@
RawClass* double_class_;
RawType* double_type_;
RawType* float32x4_type_;
- RawType* uint32x4_type_;
+ RawType* int32x4_type_;
RawType* string_type_;
RawClass* one_byte_string_class_;
RawClass* two_byte_string_class_;
@@ -454,7 +454,7 @@
RawClass* immutable_array_class_;
RawClass* growable_object_array_class_;
RawClass* float32x4_class_;
- RawClass* uint32x4_class_;
+ RawClass* int32x4_class_;
RawArray* typed_data_classes_;
RawClass* error_class_;
RawClass* stacktrace_class_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index b34b06c..0fff78e 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1015,23 +1015,17 @@
ident_pos,
field,
new LiteralNode(ident_pos, Object::transition_sentinel())));
- // TODO(hausner): If evaluation of the field value throws an exception,
- // we leave the field value as 'transition_sentinel', which is wrong.
- // A second reference to the field later throws a circular dependency
- // exception. The field should instead be set to null after an exception.
- const String& init_name =
- String::Handle(Symbols::New(String::Handle(
- String::Concat(Symbols::InitPrefix(), String::Handle(field.name())))));
+ const String& init_name = String::Handle(
+ Symbols::New(String::Handle(String::Concat(
+ Symbols::InitPrefix(), String::Handle(field.name())))));
const Function& init_function = Function::ZoneHandle(
field_class.LookupStaticFunction(init_name));
ASSERT(!init_function.IsNull());
ArgumentListNode* arguments = new ArgumentListNode(expr_pos);
StaticCallNode* init_call =
new StaticCallNode(expr_pos, init_function, arguments);
+ initialize_field->Add(init_call);
- initialize_field->Add(new StoreStaticFieldNode(ident_pos,
- field,
- init_call));
AstNode* uninitialized_check =
new IfNode(ident_pos, compare_uninitialized, initialize_field, NULL);
current_block_->statements->Add(uninitialized_check);
@@ -1057,10 +1051,96 @@
OpenFunctionBlock(func);
AddFormalParamsToScope(¶ms, current_block_->scope);
- intptr_t expr_pos = func.token_pos();
+ // Move forward to the start of the initializer expression.
+ ExpectIdentifier("identifier expected");
+ ExpectToken(Token::kASSIGN);
+ intptr_t token_pos = TokenPos();
+
+ // Synthesize a try-catch block to wrap the initializer expression.
+ LocalVariable* context_var =
+ current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
+ if (context_var == NULL) {
+ context_var = new LocalVariable(token_pos,
+ Symbols::SavedTryContextVar(),
+ Type::ZoneHandle(Type::DynamicType()));
+ current_block_->scope->AddVariable(context_var);
+ }
+ LocalVariable* catch_excp_var =
+ current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
+ if (catch_excp_var == NULL) {
+ catch_excp_var = new LocalVariable(token_pos,
+ Symbols::ExceptionVar(),
+ Type::ZoneHandle(Type::DynamicType()));
+ current_block_->scope->AddVariable(catch_excp_var);
+ }
+ LocalVariable* catch_trace_var =
+ current_block_->scope->LocalLookupVariable(Symbols::StacktraceVar());
+ if (catch_trace_var == NULL) {
+ catch_trace_var = new LocalVariable(token_pos,
+ Symbols::StacktraceVar(),
+ Type::ZoneHandle(Type::DynamicType()));
+ current_block_->scope->AddVariable(catch_trace_var);
+ }
+
+ OpenBlock(); // Start try block.
AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
- ReturnNode* return_node = new ReturnNode(expr_pos, expr);
- current_block_->statements->Add(return_node);
+ const Field& field = Field::ZoneHandle(func.saved_static_field());
+ ASSERT(!field.is_const());
+ StoreStaticFieldNode* store = new StoreStaticFieldNode(field.token_pos(),
+ field,
+ expr);
+ current_block_->statements->Add(store);
+ SequenceNode* try_block = CloseBlock(); // End try block.
+
+ OpenBlock(); // Start catch handler list.
+ SourceLabel* end_catch_label =
+ SourceLabel::New(token_pos, NULL, SourceLabel::kCatch);
+ current_block_->scope->AddLabel(end_catch_label);
+
+ OpenBlock(); // Start catch clause.
+ AstNode* compare_transition_sentinel = new ComparisonNode(
+ token_pos,
+ Token::kEQ_STRICT,
+ new LoadStaticFieldNode(token_pos, field),
+ new LiteralNode(field.token_pos(), Object::transition_sentinel()));
+
+ SequenceNode* store_null = new SequenceNode(token_pos, NULL);
+ store_null->Add(new StoreStaticFieldNode(
+ field.token_pos(),
+ field,
+ new LiteralNode(token_pos, Instance::ZoneHandle())));
+ AstNode* transition_sentinel_check =
+ new IfNode(token_pos, compare_transition_sentinel, store_null, NULL);
+ current_block_->statements->Add(transition_sentinel_check);
+
+ current_block_->statements->Add(
+ new ThrowNode(token_pos,
+ new LoadLocalNode(token_pos, catch_excp_var),
+ new LoadLocalNode(token_pos, catch_trace_var)));
+ current_block_->statements->Add(
+ new JumpNode(token_pos, Token::kCONTINUE, end_catch_label));
+ SequenceNode* catch_clause = CloseBlock(); // End catch clause.
+
+ current_block_->statements->Add(catch_clause);
+ SequenceNode* catch_handler_list = CloseBlock(); // End catch handler list.
+ CatchClauseNode* catch_block =
+ new CatchClauseNode(token_pos,
+ catch_handler_list,
+ Array::ZoneHandle(Object::empty_array().raw()),
+ context_var,
+ catch_excp_var,
+ catch_trace_var,
+ CatchClauseNode::kInvalidTryIndex,
+ false); // No stack trace needed.
+
+ AstNode* try_catch_node = new TryCatchNode(token_pos,
+ try_block,
+ end_catch_label,
+ context_var,
+ catch_block,
+ NULL, // No finally block.
+ AllocateTryIndex());
+ current_block_->statements->Add(try_catch_node);
return CloseBlock();
}
@@ -3307,7 +3387,6 @@
Function& setter = Function::Handle();
Field& class_field = Field::ZoneHandle();
Instance& init_value = Instance::Handle();
- intptr_t expr_pos = -1;
while (true) {
bool has_initializer = CurrentToken() == Token::kASSIGN;
bool has_simple_literal = false;
@@ -3332,7 +3411,6 @@
(LookaheadToken(1) == Token::kSEMICOLON)) {
has_simple_literal = IsSimpleLiteral(*field->type, &init_value);
}
- expr_pos = TokenPos();
SkipExpr();
} else {
// Static const and static final fields must have an initializer.
@@ -3377,13 +3455,12 @@
getter.set_result_type(*field->type);
members->AddFunction(getter);
- // Create initializer function.
- const Function& init_function = Function::ZoneHandle(
- Function::NewStaticInitializer(*field->name,
- *field->type,
- current_class(),
- expr_pos));
- members->AddFunction(init_function);
+ // Create initializer function for non-const fields.
+ if (!class_field.is_const()) {
+ const Function& init_function = Function::ZoneHandle(
+ Function::NewStaticInitializer(class_field));
+ members->AddFunction(init_function);
+ }
}
}
@@ -4493,7 +4570,6 @@
if ((is_const || is_final) && (LookaheadToken(1) == Token::kSEMICOLON)) {
has_simple_literal = IsSimpleLiteral(type, &field_value);
}
- const intptr_t expr_pos = TokenPos();
SkipExpr();
field.set_value(field_value);
if (!has_simple_literal) {
@@ -4511,12 +4587,11 @@
top_level->functions.Add(getter);
// Create initializer function.
- const Function& init_function = Function::ZoneHandle(
- Function::NewStaticInitializer(var_name,
- type,
- current_class(),
- expr_pos));
- top_level->functions.Add(init_function);
+ if (!field.is_const()) {
+ const Function& init_function = Function::ZoneHandle(
+ Function::NewStaticInitializer(field));
+ top_level->functions.Add(init_function);
+ }
}
} else if (is_final) {
ErrorMsg(name_pos, "missing initializer for final or const variable");
@@ -4764,8 +4839,8 @@
RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
- intptr_t token_pos,
- const String& url) {
+ intptr_t token_pos,
+ const String& url) {
Dart_LibraryTagHandler handler = isolate()->library_tag_handler();
if (handler == NULL) {
if (url.StartsWith(Symbols::DartScheme())) {
@@ -5335,19 +5410,6 @@
const intptr_t ident_pos = TokenPos();
const String& ident = *CurrentLiteral();
LocalVariable* variable = new LocalVariable(ident_pos, ident, type);
- ASSERT(current_block_ != NULL);
- ASSERT(current_block_->scope != NULL);
- const intptr_t previous_pos =
- current_block_->scope->PreviousReferencePos(ident);
- if (previous_pos >= 0) {
- ASSERT(!script_.IsNull());
- intptr_t line_number;
- script_.GetTokenLocation(previous_pos, &line_number, NULL);
- ErrorMsg(ident_pos,
- "identifier '%s' previously used in line %" Pd "",
- ident.ToCString(),
- line_number);
- }
ConsumeToken(); // Variable identifier.
AstNode* initialization = NULL;
if (CurrentToken() == Token::kASSIGN) {
@@ -5368,6 +5430,27 @@
AstNode* null_expr = new LiteralNode(ident_pos, Instance::ZoneHandle());
initialization = new StoreLocalNode(ident_pos, variable, null_expr);
}
+
+ ASSERT(current_block_ != NULL);
+ const intptr_t previous_pos =
+ current_block_->scope->PreviousReferencePos(ident);
+ if (previous_pos >= 0) {
+ ASSERT(!script_.IsNull());
+ if (previous_pos > ident_pos) {
+ ErrorMsg(ident_pos,
+ "initializer of '%s' may not refer to itself",
+ ident.ToCString());
+
+ } else {
+ intptr_t line_number;
+ script_.GetTokenLocation(previous_pos, &line_number, NULL);
+ ErrorMsg(ident_pos,
+ "identifier '%s' previously used in line %" Pd "",
+ ident.ToCString(),
+ line_number);
+ }
+ }
+
// Add variable to scope after parsing the initalizer expression.
// The expression must not be able to refer to the variable.
if (!current_block_->scope->AddVariable(variable)) {
@@ -5482,8 +5565,24 @@
(LookaheadToken(1) != Token::kLPAREN)) {
result_type = ParseType(ClassFinalizer::kCanonicalize);
}
+ const intptr_t name_pos = TokenPos();
variable_name = ExpectIdentifier("function name expected");
function_name = variable_name;
+
+ // Check that the function name has not been referenced
+ // before this declaration.
+ ASSERT(current_block_ != NULL);
+ const intptr_t previous_pos =
+ current_block_->scope->PreviousReferencePos(*function_name);
+ if (previous_pos >= 0) {
+ ASSERT(!script_.IsNull());
+ intptr_t line_number;
+ script_.GetTokenLocation(previous_pos, &line_number, NULL);
+ ErrorMsg(name_pos,
+ "identifier '%s' previously used in line %" Pd "",
+ function_name->ToCString(),
+ line_number);
+ }
}
if (CurrentToken() != Token::kLPAREN) {
@@ -6753,7 +6852,6 @@
// operator.
bool catch_seen = false;
bool generic_catch_seen = false;
- SequenceNode* catch_handler_list = NULL;
const intptr_t handler_pos = TokenPos();
OpenBlock(); // Start the catch block sequence.
current_block_->scope->AddLabel(end_catch_label);
@@ -6834,9 +6932,12 @@
SequenceNode* catch_handler = CloseBlock();
ExpectToken(Token::kRBRACE);
- if (!exception_param.type->IsDynamicType()) { // Has a type specification.
- // Now form an 'if type check' as an exception type exists in
- // the catch specifier.
+ const bool is_bad_type = exception_param.type->IsMalformed() ||
+ exception_param.type->IsMalbounded();
+ if (!is_bad_type && !exception_param.type->IsDynamicType()) {
+ // Has a type specification that is not malformed or malbounded.
+ // Now form an 'if type check' as an exception type exists in the
+ // catch specifier.
if (!exception_param.type->IsInstantiated() &&
(current_block_->scope->function_level() > 0)) {
// Make sure that the instantiator is captured.
@@ -6863,6 +6964,11 @@
handler_types.Add(*exception_param.type);
}
} else {
+ if (is_bad_type) {
+ current_block_->statements->Add(ThrowTypeError(catch_pos,
+ *exception_param.type));
+ // We still add the dead code below to satisfy the code generator.
+ }
// No exception type exists in the catch specifier so execute the
// catch handler code unconditionally.
current_block_->statements->Add(catch_handler);
@@ -6877,7 +6983,7 @@
// Add this individual catch handler to the catch handlers list.
current_block_->statements->Add(catch_clause);
}
- catch_handler_list = CloseBlock();
+ SequenceNode* catch_handler_list = CloseBlock();
TryBlocks* inner_try_block = PopTryBlock();
const intptr_t try_index = inner_try_block->try_index();
TryBlocks* outer_try_block = try_blocks_list_;
@@ -8545,36 +8651,24 @@
// referenced by a static member.
if (ParsingStaticMember()) {
ASSERT(scope_class.raw() == current_class().raw());
- if ((finalization == ClassFinalizer::kCanonicalizeWellFormed) ||
- FLAG_error_on_bad_type) {
- *type = ClassFinalizer::NewFinalizedMalformedType(
- Error::Handle(), // No previous error.
- script_,
- type->token_pos(),
- "type parameter '%s' cannot be referenced "
- "from static member",
- String::Handle(type_parameter.name()).ToCString());
- } else {
- // Map the malformed type to dynamic and ignore type arguments.
- *type = Type::DynamicType();
- }
+ *type = ClassFinalizer::NewFinalizedMalformedType(
+ Error::Handle(), // No previous error.
+ script_,
+ type->token_pos(),
+ "type parameter '%s' cannot be referenced "
+ "from static member",
+ String::Handle(type_parameter.name()).ToCString());
return;
}
// A type parameter cannot be parameterized, so make the type
// malformed if type arguments have previously been parsed.
if (!AbstractTypeArguments::Handle(type->arguments()).IsNull()) {
- if ((finalization == ClassFinalizer::kCanonicalizeWellFormed) ||
- FLAG_error_on_bad_type) {
- *type = ClassFinalizer::NewFinalizedMalformedType(
- Error::Handle(), // No previous error.
- script_,
- type_parameter.token_pos(),
- "type parameter '%s' cannot be parameterized",
- String::Handle(type_parameter.name()).ToCString());
- } else {
- // Map the malformed type to dynamic and ignore type arguments.
- *type = Type::DynamicType();
- }
+ *type = ClassFinalizer::NewFinalizedMalformedType(
+ Error::Handle(), // No previous error.
+ script_,
+ type_parameter.token_pos(),
+ "type parameter '%s' cannot be parameterized",
+ String::Handle(type_parameter.name()).ToCString());
return;
}
*type = type_parameter.raw();
@@ -8601,18 +8695,12 @@
// Replace unresolved class with resolved type class.
parameterized_type.set_type_class(resolved_type_class);
} else if (finalization >= ClassFinalizer::kCanonicalize) {
- if ((finalization == ClassFinalizer::kCanonicalizeWellFormed) ||
- FLAG_error_on_bad_type) {
- ClassFinalizer::FinalizeMalformedType(
- Error::Handle(), // No previous error.
- script_,
- parameterized_type,
- "type '%s' is not loaded",
- String::Handle(parameterized_type.UserVisibleName()).ToCString());
- } else {
- // Map the malformed type to dynamic and ignore type arguments.
- *type = Type::DynamicType();
- }
+ ClassFinalizer::FinalizeMalformedType(
+ Error::Handle(), // No previous error.
+ script_,
+ parameterized_type,
+ "type '%s' is not loaded",
+ String::Handle(parameterized_type.UserVisibleName()).ToCString());
return;
}
}
@@ -9216,15 +9304,12 @@
ResolveIdentInLocalScope(type_name.ident_pos, *type_name.ident, NULL)) {
// The type is malformed. Skip over its type arguments.
ParseTypeArguments(ClassFinalizer::kIgnore);
- if (finalization == ClassFinalizer::kCanonicalizeWellFormed) {
- return ClassFinalizer::NewFinalizedMalformedType(
- Error::Handle(), // No previous error.
- script_,
- type_name.ident_pos,
- "using '%s' in this context is invalid",
- type_name.ident->ToCString());
- }
- return Type::DynamicType();
+ return ClassFinalizer::NewFinalizedMalformedType(
+ Error::Handle(), // No previous error.
+ script_,
+ type_name.ident_pos,
+ "using '%s' in this context is invalid",
+ type_name.ident->ToCString());
}
}
Object& type_class = Object::Handle(isolate());
diff --git a/runtime/vm/random.cc b/runtime/vm/random.cc
new file mode 100644
index 0000000..18703d0
--- /dev/null
+++ b/runtime/vm/random.cc
@@ -0,0 +1,59 @@
+// 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.
+
+#include "vm/random.h"
+#include "vm/flags.h"
+#include "vm/isolate.h"
+
+namespace dart {
+
+DEFINE_FLAG(int, random_seed, 0, "Override the random seed for debugging.");
+
+Random::Random() {
+ uint64_t seed = FLAG_random_seed;
+ if (seed == 0) {
+ Dart_EntropySource callback = Isolate::entropy_source_callback();
+ if (callback != NULL) {
+ if (!callback(reinterpret_cast<uint8_t*>(&seed), sizeof(seed))) {
+ // Callback failed. Reset the seed to 0.
+ seed = 0;
+ }
+ }
+ }
+ if (seed == 0) {
+ // We did not get a seed so far. As a fallback we do use the current time.
+ seed = OS::GetCurrentTimeMicros();
+ }
+ // Crank the next state a couple of times.
+ _state = seed;
+ NextState();
+ NextState();
+ NextState();
+ NextState();
+}
+
+Random::~Random() {
+ // Nothing to be done here.
+}
+
+// The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
+// http://en.wikipedia.org/wiki/Multiply-with-carry
+// The constant A is selected from "Numerical Recipes 3rd Edition" p.348 B1.
+void Random::NextState() {
+ const uint64_t MASK_32 = 0xffffffff;
+ const uint64_t A = 0xffffda61;
+
+ uint64_t state_lo = _state & MASK_32;
+ uint64_t state_hi = (_state >> 32) & MASK_32;
+ _state = (A * state_lo) + state_hi;
+}
+
+
+uint32_t Random::NextUInt32() {
+ const uint64_t MASK_32 = 0xffffffff;
+ NextState();
+ return static_cast<uint32_t>(_state & MASK_32);
+}
+
+} // namespace dart
diff --git a/runtime/vm/random.h b/runtime/vm/random.h
new file mode 100644
index 0000000..c1c69d6
--- /dev/null
+++ b/runtime/vm/random.h
@@ -0,0 +1,31 @@
+// 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.
+
+#ifndef VM_RANDOM_H_
+#define VM_RANDOM_H_
+
+#include "vm/globals.h"
+#include "vm/allocation.h"
+
+namespace dart {
+
+class Random : public ValueObject {
+ public:
+ Random();
+ ~Random();
+
+ uint32_t NextUInt32();
+
+ private:
+ void NextState();
+
+ uint64_t _state;
+
+ DISALLOW_ALLOCATION();
+ DISALLOW_COPY_AND_ASSIGN(Random);
+};
+
+} // namespace dart
+
+#endif // VM_RANDOM_H_
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 95ce178..361006f 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -742,11 +742,11 @@
}
-intptr_t RawUint32x4::VisitUint32x4Pointers(
- RawUint32x4* raw_obj,
+intptr_t RawInt32x4::VisitInt32x4Pointers(
+ RawInt32x4* raw_obj,
ObjectPointerVisitor* visitor) {
ASSERT(raw_obj->IsHeapObject());
- return Uint32x4::InstanceSize();
+ return Int32x4::InstanceSize();
}
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 0eb68b8..0d17902 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -68,7 +68,7 @@
V(WeakProperty) \
V(MirrorReference) \
V(Float32x4) \
- V(Uint32x4) \
+ V(Int32x4) \
#define CLASS_LIST_ARRAYS(V) \
V(Array) \
@@ -94,7 +94,7 @@
V(Float32Array) \
V(Float64Array) \
V(Float32x4Array) \
- V(Uint32x4Array) \
+ V(Int32x4Array) \
#define CLASS_LIST_FOR_HANDLES(V) \
CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V) \
@@ -1412,17 +1412,17 @@
};
-class RawUint32x4 : public RawInstance {
- RAW_HEAP_OBJECT_IMPLEMENTATION(Uint32x4);
+class RawInt32x4 : public RawInstance {
+ RAW_HEAP_OBJECT_IMPLEMENTATION(Int32x4);
- uint32_t value_[4];
+ int32_t value_[4];
friend class SnapshotReader;
public:
- uint32_t x() const { return value_[0]; }
- uint32_t y() const { return value_[1]; }
- uint32_t z() const { return value_[2]; }
- uint32_t w() const { return value_[3]; }
+ int32_t x() const { return value_[0]; }
+ int32_t y() const { return value_[1]; }
+ int32_t z() const { return value_[2]; }
+ int32_t w() const { return value_[3]; }
};
@@ -1650,10 +1650,10 @@
kTypedDataFloat32ArrayCid == kTypedDataInt8ArrayCid + 9 &&
kTypedDataFloat64ArrayCid == kTypedDataInt8ArrayCid + 10 &&
kTypedDataFloat32x4ArrayCid == kTypedDataInt8ArrayCid + 11 &&
- kTypedDataUint32x4ArrayCid == kTypedDataInt8ArrayCid + 12 &&
+ kTypedDataInt32x4ArrayCid == kTypedDataInt8ArrayCid + 12 &&
kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 13);
return (index >= kTypedDataInt8ArrayCid &&
- index <= kTypedDataUint32x4ArrayCid);
+ index <= kTypedDataInt32x4ArrayCid);
}
@@ -1670,7 +1670,7 @@
kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 &&
kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 &&
kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 &&
- kTypedDataUint32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 &&
+ kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 &&
kByteDataViewCid == kTypedDataInt8ArrayViewCid + 13 &&
kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 14);
return (index >= kTypedDataInt8ArrayViewCid &&
@@ -1702,11 +1702,11 @@
kExternalTypedDataInt8ArrayCid + 10) &&
(kExternalTypedDataFloat32x4ArrayCid ==
kExternalTypedDataInt8ArrayCid + 11) &&
- (kExternalTypedDataUint32x4ArrayCid ==
+ (kExternalTypedDataInt32x4ArrayCid ==
kExternalTypedDataInt8ArrayCid + 12) &&
(kNullCid == kExternalTypedDataInt8ArrayCid + 13));
return (index >= kExternalTypedDataInt8ArrayCid &&
- index <= kExternalTypedDataUint32x4ArrayCid);
+ index <= kExternalTypedDataInt32x4ArrayCid);
}
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 27ad524..db525ec 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -2227,7 +2227,7 @@
}
-RawUint32x4* Uint32x4::ReadFrom(SnapshotReader* reader,
+RawInt32x4* Int32x4::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
Snapshot::Kind kind) {
@@ -2239,12 +2239,12 @@
uint32_t value3 = reader->Read<uint32_t>();
// Create a Float32x4 object.
- Uint32x4& simd = Uint32x4::ZoneHandle(reader->isolate(), Uint32x4::null());
+ Int32x4& simd = Int32x4::ZoneHandle(reader->isolate(), Int32x4::null());
if (kind == Snapshot::kFull) {
- simd = reader->NewUint32x4(value0, value1, value2, value3);
+ simd = reader->NewInt32x4(value0, value1, value2, value3);
} else {
- simd = Uint32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
+ simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
}
reader->AddBackRef(object_id, &simd, kIsDeserialized);
// Set the object tags.
@@ -2253,7 +2253,7 @@
}
-void RawUint32x4::WriteTo(SnapshotWriter* writer,
+void RawInt32x4::WriteTo(SnapshotWriter* writer,
intptr_t object_id,
Snapshot::Kind kind) {
ASSERT(writer != NULL);
@@ -2262,7 +2262,7 @@
writer->WriteInlinedObjectHeader(object_id);
// Write out the class and tags information.
- writer->WriteIndexedObject(kUint32x4Cid);
+ writer->WriteIndexedObject(kInt32x4Cid);
writer->WriteIntptrValue(writer->GetObjectTags(this));
// Write out the mask values.
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5584104..c05a8fa 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -32,7 +32,7 @@
static bool IsObjectStoreClassId(intptr_t class_id) {
// Check if this is a class which is stored in the object store.
return (class_id == kObjectCid ||
- (class_id >= kInstanceCid && class_id <= kUint32x4Cid) ||
+ (class_id >= kInstanceCid && class_id <= kInt32x4Cid) ||
class_id == kArrayCid ||
class_id == kImmutableArrayCid ||
RawObject::IsStringClassId(class_id) ||
@@ -622,13 +622,13 @@
}
-RawUint32x4* SnapshotReader::NewUint32x4(uint32_t v0, uint32_t v1, uint32_t v2,
+RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2,
uint32_t v3) {
ASSERT(kind_ == Snapshot::kFull);
ASSERT(isolate()->no_gc_scope_depth() != 0);
- cls_ = object_store()->uint32x4_class();
- RawUint32x4* obj = reinterpret_cast<RawUint32x4*>(
- AllocateUninitialized(cls_, Uint32x4::InstanceSize()));
+ cls_ = object_store()->int32x4_class();
+ RawInt32x4* obj = reinterpret_cast<RawInt32x4*>(
+ AllocateUninitialized(cls_, Int32x4::InstanceSize()));
obj->ptr()->value_[0] = v0;
obj->ptr()->value_[1] = v1;
obj->ptr()->value_[2] = v2;
@@ -790,30 +790,39 @@
ASSERT(!cls_.IsNull());
instance_size = cls_.instance_size();
}
- intptr_t offset = Object::InstanceSize();
+ intptr_t next_field_offset = cls_.next_field_offset();
+ intptr_t type_argument_field_offset = cls_.type_arguments_field_offset();
+ ASSERT(next_field_offset > 0);
+ // Instance::NextFieldOffset() returns the offset of the first field in
+ // a Dart object.
+ intptr_t offset = Instance::NextFieldOffset();
intptr_t result_cid = result->GetClassId();
- while (offset < instance_size) {
+ while (offset < next_field_offset) {
obj_ = ReadObjectRef();
result->SetFieldAtOffset(offset, obj_);
- if (kind_ == Snapshot::kMessage) {
+ if ((offset != type_argument_field_offset) &&
+ (kind_ == Snapshot::kMessage)) {
// TODO(fschneider): Consider hoisting these lookups out of the loop.
// This would involve creating a handle, since cls_ can't be reused
// across the call to ReadObjectRef.
cls_ = isolate()->class_table()->At(result_cid);
array_ = cls_.OffsetToFieldMap();
field_ ^= array_.At(offset >> kWordSizeLog2);
- // Entries can be null because offset can be outside of instance fields
- // due to rounded allocation size.
- if (!field_.IsNull()) {
- ASSERT(field_.Offset() == offset);
- field_.UpdateGuardedCidAndLength(obj_);
- }
+ ASSERT(!field_.IsNull());
+ ASSERT(field_.Offset() == offset);
+ field_.UpdateGuardedCidAndLength(obj_);
}
// TODO(fschneider): Verify the guarded cid and length for other kinds of
// snapshot (kFull, kScript) with asserts.
offset += kWordSize;
}
if (kind_ == Snapshot::kFull) {
+ // We create an uninitialized object in the case of full snapshots, so
+ // we need to initialize any remaining padding area with the Null object.
+ while (offset < instance_size) {
+ result->SetFieldAtOffset(offset, Object::null_object());
+ offset += kWordSize;
+ }
result->SetCreatedFromSnapshot();
} else if (result->IsCanonical()) {
*result = result->CheckAndCanonicalize(NULL);
@@ -1387,9 +1396,9 @@
CheckIfSerializable(cls);
// Object is regular dart instance.
- intptr_t instance_size =
- cls->ptr()->instance_size_in_words_ << kWordSizeLog2;
- ASSERT(instance_size != 0);
+ intptr_t next_field_offset =
+ cls->ptr()->next_field_offset_in_words_ << kWordSizeLog2;
+ ASSERT(next_field_offset > 0);
// Write out the serialization header value for this object.
WriteInlinedObjectHeader(object_id);
@@ -1404,8 +1413,10 @@
WriteObjectImpl(cls);
// Write out all the fields for the object.
- intptr_t offset = Object::InstanceSize();
- while (offset < instance_size) {
+ // Instance::NextFieldOffset() returns the offset of the first field in
+ // a Dart object.
+ intptr_t offset = Instance::NextFieldOffset();
+ while (offset < next_field_offset) {
WriteObjectRef(*reinterpret_cast<RawObject**>(
reinterpret_cast<uword>(raw->ptr()) + offset));
offset += kWordSize;
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index ff65e52..4288f1d 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -45,7 +45,7 @@
class RawFunction;
class RawGrowableObjectArray;
class RawFloat32x4;
-class RawUint32x4;
+class RawInt32x4;
class RawImmutableArray;
class RawLanguageError;
class RawLibrary;
@@ -271,7 +271,7 @@
RawLiteralToken* NewLiteralToken();
RawGrowableObjectArray* NewGrowableObjectArray();
RawFloat32x4* NewFloat32x4(float v0, float v1, float v2, float v3);
- RawUint32x4* NewUint32x4(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3);
+ RawInt32x4* NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3);
RawApiError* NewApiError();
RawLanguageError* NewLanguageError();
RawObject* NewInteger(int64_t value);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 768ca07..46dfb04 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -1165,13 +1165,13 @@
if (instance_size < (kInlineInstanceSize * kWordSize)) {
// Check if the object contains any non-header fields.
// Small objects are initialized using a consecutive set of writes.
- for (intptr_t current_offset = sizeof(RawObject);
+ for (intptr_t current_offset = Instance::NextFieldOffset();
current_offset < instance_size;
current_offset += kWordSize) {
__ StoreToOffset(kWord, R0, R2, current_offset);
}
} else {
- __ add(R4, R2, ShifterOperand(sizeof(RawObject)));
+ __ add(R4, R2, ShifterOperand(Instance::NextFieldOffset()));
// Loop until the whole object is initialized.
// R0: raw null.
// R2: new object.
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 5e83dd6..a0cd794 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1195,13 +1195,13 @@
if (instance_size < (kInlineInstanceSize * kWordSize)) {
// Check if the object contains any non-header fields.
// Small objects are initialized using a consecutive set of writes.
- for (intptr_t current_offset = sizeof(RawObject);
+ for (intptr_t current_offset = Instance::NextFieldOffset();
current_offset < instance_size;
current_offset += kWordSize) {
__ movl(Address(EAX, current_offset), raw_null);
}
} else {
- __ leal(ECX, Address(EAX, sizeof(RawObject)));
+ __ leal(ECX, Address(EAX, Instance::NextFieldOffset()));
// Loop until the whole object is initialized.
// EAX: new object.
// EBX: next object start.
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 4ddc9b0..f4eb818 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -1344,13 +1344,13 @@
if (instance_size < (kInlineInstanceSize * kWordSize)) {
// Check if the object contains any non-header fields.
// Small objects are initialized using a consecutive set of writes.
- for (intptr_t current_offset = sizeof(RawObject);
+ for (intptr_t current_offset = Instance::NextFieldOffset();
current_offset < instance_size;
current_offset += kWordSize) {
__ sw(T7, Address(T2, current_offset));
}
} else {
- __ addiu(T4, T2, Immediate(sizeof(RawObject)));
+ __ addiu(T4, T2, Immediate(Instance::NextFieldOffset()));
// Loop until the whole object is initialized.
// T2: new object.
// T3: next object start.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 31abeec..84c562e 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -453,6 +453,7 @@
// require allocation.
__ EnterStubFrame();
if (preserve_result) {
+ __ pushq(Immediate(0)); // Workaround for dropped stack slot during GC.
__ pushq(RBX); // Preserve result, it will be GC-d here.
}
__ pushq(Immediate(Smi::RawValue(0))); // Space for the result.
@@ -463,6 +464,7 @@
__ SmiUntag(RBX);
if (preserve_result) {
__ popq(RAX); // Restore result.
+ __ Drop(1); // Workaround for dropped stack slot during GC.
}
__ LeaveFrame();
@@ -1187,13 +1189,13 @@
if (instance_size < (kInlineInstanceSize * kWordSize)) {
// Check if the object contains any non-header fields.
// Small objects are initialized using a consecutive set of writes.
- for (intptr_t current_offset = sizeof(RawObject);
+ for (intptr_t current_offset = Instance::NextFieldOffset();
current_offset < instance_size;
current_offset += kWordSize) {
__ movq(Address(RAX, current_offset), R12);
}
} else {
- __ leaq(RCX, Address(RAX, sizeof(RawObject)));
+ __ leaq(RCX, Address(RAX, Instance::NextFieldOffset()));
// Loop until the whole object is initialized.
// RAX: new object.
// RBX: next object start.
@@ -1820,7 +1822,7 @@
// RBX, R10: May contain arguments to runtime stub.
// TOS(0): return address (Dart code).
void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
- __ EnterStubFrame();
+ __ EnterStubFrameWithPP();
// Preserve runtime args.
__ pushq(RBX);
__ pushq(R10);
@@ -1832,7 +1834,7 @@
__ popq(RAX); // Address of original.
__ popq(R10); // Restore arguments.
__ popq(RBX);
- __ LeaveFrame();
+ __ LeaveFrameWithPP();
__ jmp(RAX); // Jump to original stub.
}
@@ -1861,11 +1863,11 @@
// TOS(0): return address (Dart code).
void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
- __ EnterStubFrame();
+ __ EnterStubFrameWithPP();
__ pushq(RAX);
__ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
__ popq(RAX);
- __ LeaveFrame();
+ __ LeaveFrameWithPP();
__ popq(R11); // discard return address of call to this stub.
__ LeaveFrameWithPP();
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index a9a3095..fbafada 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -133,9 +133,9 @@
V(Int, "int") \
V(Double, "double") \
V(_Float32x4, "_Float32x4") \
- V(_Uint32x4, "_Uint32x4") \
+ V(_Int32x4, "_Int32x4") \
V(Float32x4, "Float32x4") \
- V(Uint32x4, "Uint32x4") \
+ V(Int32x4, "Int32x4") \
V(Int8List, "Int8List") \
V(Int8ListFactory, "Int8List.") \
V(Uint8List, "Uint8List") \
@@ -156,8 +156,8 @@
V(Uint64ListFactory, "Uint64List.") \
V(Float32x4List, "Float32x4List") \
V(Float32x4ListFactory, "Float32x4List.") \
- V(Uint32x4List, "Uint32x4List") \
- V(Uint32x4ListFactory, "Uint32x4List.") \
+ V(Int32x4List, "Int32x4List") \
+ V(Int32x4ListFactory, "Int32x4List.") \
V(Float32List, "Float32List") \
V(Float32ListFactory, "Float32List.") \
V(Float64List, "Float64List") \
@@ -182,8 +182,8 @@
V(_Uint64ArrayFactory, "_Uint64Array.") \
V(_Float32x4Array, "_Float32x4Array") \
V(_Float32x4ArrayFactory, "_Float32x4Array.") \
- V(_Uint32x4Array, "_Uint32x4Array") \
- V(_Uint32x4ArrayFactory, "_Uint32x4Array.") \
+ V(_Int32x4Array, "_Int32x4Array") \
+ V(_Int32x4ArrayFactory, "_Int32x4Array.") \
V(_Float32Array, "_Float32Array") \
V(_Float32ArrayFactory, "_Float32Array.") \
V(_Float64Array, "_Float64Array") \
@@ -200,7 +200,7 @@
V(_Float32ArrayView, "_Float32ArrayView") \
V(_Float64ArrayView, "_Float64ArrayView") \
V(_Float32x4ArrayView, "_Float32x4ArrayView") \
- V(_Uint32x4ArrayView, "_Uint32x4ArrayView") \
+ V(_Int32x4ArrayView, "_Int32x4ArrayView") \
V(_ExternalInt8Array, "_ExternalInt8Array") \
V(_ExternalUint8Array, "_ExternalUint8Array") \
V(_ExternalUint8ClampedArray, "_ExternalUint8ClampedArray") \
@@ -211,7 +211,7 @@
V(_ExternalInt64Array, "_ExternalInt64Array") \
V(_ExternalUint64Array, "_ExternalUint64Array") \
V(_ExternalFloat32x4Array, "_ExternalFloat32x4Array") \
- V(_ExternalUint32x4Array, "_ExternalUint32x4Array") \
+ V(_ExternalInt32x4Array, "_ExternalInt32x4Array") \
V(_ExternalFloat32Array, "_ExternalFloat32Array") \
V(_ExternalFloat64Array, "_ExternalFloat64Array") \
V(ByteData, "ByteData") \
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index e1fa84f..1c3a8bb 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -269,6 +269,8 @@
'port.cc',
'port.h',
'port_test.cc',
+ 'random.cc',
+ 'random.h',
'raw_object.cc',
'raw_object.h',
'raw_object_snapshot.cc',
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index e324121..8951a02 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -54,8 +54,8 @@
setlocal
for %%i in (%1) do set result=%%~fi
set current=
-for /f "tokens=2 delims=[]" %%i in ('dir /a:l ^"%~dp1^" 2^>nul ^
- ^| find "> %~n1 ["') do (
+for /f "usebackq tokens=2 delims=[]" %%i in (`dir /a:l "%~dp1" 2^>nul ^
+ ^| find "> %~n1 ["`) do (
set current=%%i
)
if not "%current%"=="" call :follow_links "%current%", result
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index e7d3b79..121193a 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -114,21 +114,33 @@
Node right = assignment.arguments.head;
value =
compileNodeWithDefinitions(right, definitions, isConst: isConst);
- if (compiler.enableTypeAssertions
- && value != null
- && element.isField()) {
+ if (compiler.enableTypeAssertions &&
+ value != null &&
+ element.isField()) {
DartType elementType = element.computeType(compiler);
- DartType constantType = value.computeType(compiler);
- if (!constantSystem.isSubtype(compiler, constantType, elementType)) {
+ if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) {
if (isConst) {
+ ErroneousElement element = elementType.element;
compiler.reportFatalError(
- node, MessageKind.NOT_ASSIGNABLE.error,
- {'fromType': constantType, 'toType': elementType});
+ node, element.messageKind, element.messageArguments);
} else {
- // If the field cannot be lazily initialized, we will throw
- // the exception at runtime.
+ // We need to throw an exception at runtime.
value = null;
}
+ } else {
+ DartType constantType = value.computeType(compiler);
+ if (!constantSystem.isSubtype(compiler,
+ constantType, elementType)) {
+ if (isConst) {
+ compiler.reportFatalError(
+ node, MessageKind.NOT_ASSIGNABLE.error,
+ {'fromType': constantType, 'toType': elementType});
+ } else {
+ // If the field cannot be lazily initialized, we will throw
+ // the exception at runtime.
+ value = null;
+ }
+ }
}
}
}
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 067ee88..e0de9ff 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -416,7 +416,9 @@
LibraryElement jsHelperLibrary;
LibraryElement interceptorsLibrary;
LibraryElement foreignLibrary;
+
LibraryElement mainApp;
+ FunctionElement mainFunction;
/// Initialized when dart:mirrors is loaded.
LibraryElement mirrorsLibrary;
@@ -1025,7 +1027,7 @@
void compileLoadedLibraries() {
Element main = null;
if (mainApp != null) {
- main = mainApp.find(MAIN);
+ main = mainApp.findExported(MAIN);
if (main == null) {
if (!analyzeOnly) {
// Allow analyze only of libraries with no main.
@@ -1042,14 +1044,19 @@
"Use '--analyze-all' to analyze all code in the library."});
}
} else {
- if (!main.isFunction()) {
+ if (main.isErroneous()) {
+ reportFatalError(
+ main,
+ MessageKind.GENERIC,
+ {'text': "Error: Cannot determine which '$MAIN' to use."});
+ } else if (!main.isFunction()) {
reportFatalError(
main,
MessageKind.GENERIC,
{'text': "Error: '$MAIN' is not a function."});
}
- FunctionElement mainMethod = main;
- FunctionSignature parameters = mainMethod.computeSignature(this);
+ mainFunction = main;
+ FunctionSignature parameters = mainFunction.computeSignature(this);
if (parameters.parameterCount > 2) {
int index = 0;
parameters.forEachParameter((Element parameter) {
@@ -1110,7 +1117,7 @@
if (hasIsolateSupport()) {
enqueuer.codegen.addToWorkList(
isolateHelperLibrary.find(Compiler.START_ROOT_ISOLATE));
- enqueuer.codegen.registerGetOfStaticFunction(mainApp.find(MAIN));
+ enqueuer.codegen.registerGetOfStaticFunction(main);
}
if (enabledNoSuchMethod) {
backend.enableNoSuchMethod(enqueuer.codegen);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 1deab48..be1ffda 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -163,7 +163,7 @@
TreeElements treeElements;
LibraryElement get coreLibrary => compiler.coreLibrary;
- FunctionElement get entryFunction => compiler.mainApp.find(Compiler.MAIN);
+ FunctionElement get entryFunction => compiler.mainFunction;
DartBackend get backend => compiler.backend;
get currentFunctionScope => functionScopes.putIfAbsent(
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 8af9dfc..d530651 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -599,6 +599,7 @@
abstract class ErroneousElement extends Element implements FunctionElement {
MessageKind get messageKind;
Map get messageArguments;
+ String get message;
}
/// An [Element] whose usage should cause a warning.
@@ -694,6 +695,7 @@
Element find(String elementName);
Element findLocal(String elementName);
+ Element findExported(String elementName);
void forEachExport(f(Element element));
bool hasLibraryName();
@@ -930,7 +932,8 @@
abstract class MixinApplicationElement extends ClassElement {
ClassElement get mixin;
- void set mixin(ClassElement value);
+ InterfaceType get mixinType;
+ void set mixinType(InterfaceType value);
void addConstructor(FunctionElement constructor);
}
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 56a35e9..0b6c4c2 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -345,9 +345,9 @@
computeTargetType(Compiler compiler, InterfaceType newType) => unsupported();
- String toString() {
- return '<$name: ${messageKind.message(messageArguments)}>';
- }
+ String get message => '${messageKind.message(messageArguments)}';
+
+ String toString() => '<$name: $message>';
}
/// A message attached to a [WarnOnUseElementX].
@@ -902,6 +902,14 @@
return result;
}
+ Element findExported(String elementName) {
+ for (Link link = exports; !link.isEmpty; link = link.tail) {
+ Element element = link.head;
+ if (element.name == elementName) return element;
+ }
+ return null;
+ }
+
void forEachExport(f(Element element)) {
exports.forEach((Element e) => f(e));
}
@@ -2164,12 +2172,14 @@
Link<FunctionElement> constructors = new Link<FunctionElement>();
- ClassElement mixin;
+ InterfaceType mixinType;
MixinApplicationElementX(String name, Element enclosing, int id,
this.node, this.modifiers)
: super(name, enclosing, id, STATE_NOT_STARTED);
+ ClassElement get mixin => mixinType != null ? mixinType.element : null;
+
bool get isMixinApplication => true;
bool get isUnnamedMixinApplication => node is! NamedMixinApplication;
bool get hasConstructor => !constructors.isEmpty;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/container_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/container_tracer.dart
index a134ac6..5663714 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/container_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/container_tracer.dart
@@ -200,7 +200,13 @@
visitPhiElementTypeInformation(PhiElementTypeInformation info) {}
visitElementInContainerTypeInformation(
ElementInContainerTypeInformation info) {}
- visitContainerTypeInformation(ContainerTypeInformation info) {}
+
+ visitContainerTypeInformation(ContainerTypeInformation info) {
+ if (container != info) {
+ bailout('Stored in a container');
+ }
+ }
+
visitConcreteTypeInformation(ConcreteTypeInformation info) {}
visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index cdceeec..59274b7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -35,6 +35,17 @@
}
}
+class MalformedCheckedModeHelper extends CheckedModeHelper {
+ const MalformedCheckedModeHelper(String name) : super(name);
+
+ void generateAdditionalArguments(SsaCodeGenerator codegen,
+ HTypeConversion node,
+ List<jsAst.Expression> arguments) {
+ ErroneousElement element = node.typeExpression.element;
+ arguments.add(js.string(element.message));
+ }
+}
+
class PropertyCheckedModeHelper extends CheckedModeHelper {
const PropertyCheckedModeHelper(String name) : super(name);
@@ -338,6 +349,7 @@
/// All the checked mode helpers.
static const checkedModeHelpers = const [
+ const MalformedCheckedModeHelper('checkMalformedType'),
const CheckedModeHelper('voidTypeCheck'),
const CheckedModeHelper('stringTypeCast'),
const CheckedModeHelper('stringTypeCheck'),
@@ -988,6 +1000,9 @@
}
}
bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE;
+ if (type.kind == TypeKind.MALFORMED_TYPE) {
+ enqueueInResolution(getThrowTypeError(), elements);
+ }
if (!type.treatAsRaw || type.containsTypeVariables) {
enqueueInResolution(getSetRuntimeTypeInfo(), elements);
enqueueInResolution(getGetRuntimeTypeInfo(), elements);
@@ -1109,7 +1124,6 @@
analyzeTypeArgument(type, argument);
});
}
- // TODO(ngeoffray): Also handle T a (in checked mode).
}
void registerClassUsingVariableExpression(ClassElement cls) {
@@ -1324,6 +1338,11 @@
{bool typeCast,
bool nativeCheckOnly}) {
assert(type.kind != TypeKind.TYPEDEF);
+ if (type.kind == TypeKind.MALFORMED_TYPE) {
+ // The same error is thrown for type test and type cast of a malformed
+ // type so we only need one check method.
+ return 'checkMalformedType';
+ }
Element element = type.element;
bool nativeCheck = nativeCheckOnly ||
emitter.nativeEmitter.requiresNativeIsCheck(element);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 6205fed..dd2d293 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -959,7 +959,7 @@
emitMain(CodeBuffer buffer) {
if (compiler.isMockCompilation) return;
- Element main = compiler.mainApp.find(Compiler.MAIN);
+ Element main = compiler.mainFunction;
String mainCall = null;
if (compiler.hasIsolateSupport()) {
Element isolateMain =
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 987b996..86ef658 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -293,6 +293,8 @@
String get simpleName => _element.name;
+ bool get isNameSynthetic => false;
+
/**
* Computes the first token for this declaration using the begin token of the
* element node or element position as indicator.
@@ -537,13 +539,7 @@
*/
String get simpleName {
if (_library.libraryTag != null) {
- // TODO(ahe): Remove StringNode check when old syntax is removed.
- StringNode name = _library.libraryTag.name.asStringNode();
- if (name != null) {
- return name.dartString.slowToString();
- } else {
- return _library.libraryTag.name.toString();
- }
+ return _library.libraryTag.name.toString();
} else {
// Use the file name as script name.
String path = _library.canonicalUri.path;
@@ -847,6 +843,23 @@
return null;
}
+ ClassMirror get mixin {
+ if (_class.isMixinApplication) {
+ MixinApplicationElement mixinApplication = _class;
+ return new Dart2JsInterfaceTypeMirror(mirrors,
+ mixinApplication.mixinType);
+ }
+ return this;
+ }
+
+ bool get isNameSynthetic {
+ if (_class.isMixinApplication) {
+ MixinApplicationElement mixinApplication = _class;
+ return mixinApplication.isUnnamedMixinApplication;
+ }
+ return false;
+ }
+
List<ClassMirror> get superinterfaces {
var list = <ClassMirror>[];
Link<DartType> link = _class.interfaces;
@@ -958,6 +971,10 @@
List<ClassMirror> get superinterfaces => const <ClassMirror>[];
+ // TODO(johnniwinther): Refactor [TypedefMirror] to not extend [ClassMirror]
+ // and remove this.
+ ClassMirror get mixin => this;
+
bool get isClass => false;
bool get isOriginalDeclaration => true;
@@ -1077,6 +1094,8 @@
InterfaceType get _interfaceType => _type;
+ bool get isNameSynthetic => originalDeclaration.isNameSynthetic;
+
String get qualifiedName => originalDeclaration.qualifiedName;
// TODO(johnniwinther): Substitute type arguments for type variables.
@@ -1096,6 +1115,14 @@
// TODO(johnniwinther): Substitute type arguments for type variables.
List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
+ // TODO(johnniwinther): Substitute type arguments for type variables.
+ ClassMirror get mixin {
+ if (originalDeclaration.mixin == originalDeclaration) {
+ return this;
+ }
+ return originalDeclaration.mixin;
+ }
+
bool get isClass => originalDeclaration.isClass;
bool get isAbstract => originalDeclaration.isAbstract;
@@ -1170,7 +1197,7 @@
List<ParameterMirror> _parameters;
Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system,
- FunctionType functionType, this._functionSignature)
+ FunctionType functionType, this._functionSignature)
: super(system, functionType) {
assert (_functionSignature != null);
}
@@ -1209,6 +1236,8 @@
// TODO(johnniwinther): Substitute type arguments for type variables.
List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
+ ClassMirror get mixin => this;
+
bool get isClass => originalDeclaration.isClass;
bool get isPrivate => originalDeclaration.isPrivate;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
index 7347573..8e83643 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
@@ -64,6 +64,10 @@
*/
String get simpleName;
+ /// Returns `true` if the name of this declaration is generated by the
+ /// provider of the mirror system.
+ bool get isNameSynthetic;
+
/**
* Returns the name of this entity qualified by is enclosing context. For
* instance, the qualified name of a method 'method' in class 'Class' in
@@ -107,7 +111,7 @@
/**
* Looks up [name] in the scope of this declaration.
*
- * [name] may be either a single identifier, like 'foo', or of the
+ * [name] may be either a single identifier, like 'foo', or of the
* a prefixed identifier, like 'foo.bar', where 'foo' must be a prefix.
* For methods and constructors, the scope includes the parameters. For
* classes and typedefs, the scope includes the type variables.
@@ -368,6 +372,13 @@
List<ClassMirror> get superinterfaces;
/**
+ * The mixin of this class. If this class is the result of a mixin application
+ * of the form S with M, returns a class mirror on M. Otherwise return the
+ * class mirror itself.
+ */
+ ClassMirror get mixin;
+
+ /**
* Is [:true:] iff this type is a class.
*/
bool get isClass;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 81fcc90..4336d05 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -172,6 +172,83 @@
}
}
+bool isMixinApplication(Mirror mirror) {
+ return mirror is ClassMirror && mirror.mixin != mirror;
+}
+
+/**
+ * Returns the superclass of [cls] skipping unnamed mixin applications.
+ *
+ * For instance, for all of the following definitions this method returns [:B:].
+ *
+ * class A extends B {}
+ * class A extends B with C1, C2 {}
+ * class A extends B implements D1, D2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * class A = B with C1, C2;
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+ClassMirror getSuperclass(ClassMirror cls) {
+ ClassMirror superclass = cls.superclass;
+ while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+ superclass = superclass.superclass;
+ }
+ return superclass;
+}
+
+/**
+ * Returns the mixins directly applied to [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:C1, C2:].
+ *
+ * class A extends B with C1, C2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * class A = B with C1, C2;
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getAppliedMixins(ClassMirror cls) {
+ List<ClassMirror> mixins = <ClassMirror>[];
+ ClassMirror superclass = cls.superclass;
+ while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+ mixins.add(superclass.mixin);
+ superclass = superclass.superclass;
+ }
+ if (mixins.length > 1) {
+ mixins = new List<ClassMirror>.from(mixins.reversed);
+ }
+ if (isMixinApplication(cls)) {
+ mixins.add(cls.mixin);
+ }
+ return mixins;
+}
+
+/**
+ * Returns the superinterfaces directly and explicitly implemented by [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:D1, D2:].
+ *
+ * class A extends B implements D1, D2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getExplicitInterfaces(ClassMirror cls) {
+ if (isMixinApplication(cls)) {
+ bool first = true;
+ ClassMirror mixin = cls.mixin;
+ bool filter(ClassMirror superinterface) {
+ if (first && superinterface == mixin) {
+ first = false;
+ return false;
+ }
+ return true;
+ }
+ return cls.superinterfaces.where(filter);
+ }
+ return cls.superinterfaces;
+}
+
final RegExp _singleLineCommentStart = new RegExp(r'^///? ?(.*)');
final RegExp _multiLineCommentStartEnd =
new RegExp(r'^/\*\*? ?([\s\S]*)\*/$', multiLine: true);
@@ -220,12 +297,12 @@
* Looks up [name] in the scope [declaration].
*
* If [name] is of the form 'a.b.c', 'a' is looked up in the scope of
- * [declaration] and if unresolved 'a.b' is looked in the scope of
+ * [declaration] and if unresolved 'a.b' is looked in the scope of
* [declaration]. Each identifier of the remaining suffix, 'c' or 'b.c', is
* then looked up in the local scope of the previous result.
- *
+ *
* For instance, assumming that [:Iterable:] is imported into the scope of
- * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
+ * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
* variable of [:Iterable:] and 'col.Iterable.contains.element' finds the
* [:element:] parameter of the [:contains:] method on [:Iterable:].
*/
@@ -233,7 +310,7 @@
String name) {
// TODO(11653): Support lookup of constructors using the [:new Foo:]
// syntax.
- int offset = 1;
+ int offset = 1;
List<String> parts = name.split('.');
DeclarationMirror result = declaration.lookupInScope(parts[0]);
if (result == null && parts.length > 1) {
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 40703cf..699f026 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -3949,10 +3949,8 @@
return;
}
- assert(mixinApplication.mixin == null);
- Element mixin = resolveMixinFor(mixinApplication, mixinType);
-
- mixinApplication.mixin = mixin;
+ assert(mixinApplication.mixinType == null);
+ mixinApplication.mixinType = resolveMixinFor(mixinApplication, mixinType);
// Create forwarding constructors for constructor defined in the superclass
// because they are now hidden by the mixin application.
@@ -3966,8 +3964,8 @@
calculateAllSupertypes(mixinApplication);
}
- ClassElement resolveMixinFor(MixinApplicationElement mixinApplication,
- DartType mixinType) {
+ InterfaceType resolveMixinFor(MixinApplicationElement mixinApplication,
+ DartType mixinType) {
ClassElement mixin = mixinType.element;
mixin.ensureResolved(compiler);
@@ -3989,7 +3987,7 @@
current = currentMixinApplication.mixin;
}
compiler.world.registerMixinUse(mixinApplication, mixin);
- return mixin;
+ return mixinType;
}
DartType resolveType(TypeAnnotation node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 2519c4f..6bd3a04 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -2024,6 +2024,8 @@
push(attachPosition(instruction, node));
}
+ HInstruction peek() => stack.last;
+
HInstruction pop() {
return stack.removeLast();
}
@@ -2910,13 +2912,16 @@
} else if ("as" == op.source) {
visit(node.receiver);
HInstruction expression = pop();
- Node argument = node.arguments.head;
- TypeAnnotation typeAnnotation = argument.asTypeAnnotation();
- DartType type = elements.getType(typeAnnotation);
- HInstruction converted = buildTypeConversion(
- expression, type, HTypeConversion.CAST_TYPE_CHECK);
- if (converted != expression) add(converted);
- stack.add(converted);
+ DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+ if (type.kind == TypeKind.MALFORMED_TYPE) {
+ ErroneousElement element = type.element;
+ generateTypeError(node, element.message);
+ } else {
+ HInstruction converted = buildTypeConversion(
+ expression, type, HTypeConversion.CAST_TYPE_CHECK);
+ if (converted != expression) add(converted);
+ stack.add(converted);
+ }
} else {
visit(node.receiver);
visit(node.argumentsNode);
@@ -3021,6 +3026,11 @@
pushInvokeStatic(node, helper, inputs, backend.boolType);
HInstruction call = pop();
return new HIs.compound(type, expression, call, backend.boolType);
+ } else if (type.kind == TypeKind.MALFORMED_TYPE) {
+ ErroneousElement element = type.element;
+ generateTypeError(node, element.message);
+ HInstruction call = pop();
+ return new HIs.compound(type, expression, call, backend.boolType);
} else {
if (backend.hasDirectCheckFor(type)) {
return new HIs.direct(type, expression, backend.boolType);
@@ -4169,7 +4179,10 @@
// TODO(5346): Try to avoid the need for calling [declaration] before
// creating an [HStatic].
List<HInstruction> inputs = <HInstruction>[];
- if (backend.isInterceptedSelector(selector)) {
+ if (backend.isInterceptedSelector(selector) &&
+ // Fields don't need an interceptor; consider generating HFieldGet/Set
+ // instead.
+ element.kind != ElementKind.FIELD) {
inputs.add(invokeInterceptor(receiver));
}
inputs.add(receiver);
@@ -4519,6 +4532,17 @@
}
}
+ void setRtiIfNeeded(HInstruction object, Node node) {
+ InterfaceType type = elements.getType(node);
+ if (!backend.classNeedsRti(type.element) || type.treatAsRaw) return;
+ List<HInstruction> arguments = <HInstruction>[];
+ for (DartType argument in type.typeArguments) {
+ arguments.add(analyzeTypeArgument(argument));
+ }
+ callSetRuntimeTypeInfo(type.element, arguments, object);
+ compiler.enqueuer.codegen.registerInstantiatedType(type, elements);
+ }
+
visitLiteralList(LiteralList node) {
HInstruction instruction;
@@ -4534,6 +4558,7 @@
}
instruction = buildLiteralList(inputs);
add(instruction);
+ setRtiIfNeeded(instruction, node);
}
TypeMask type =
@@ -4736,6 +4761,7 @@
add(keyValuePairs);
TypeMask mapType = new TypeMask.nonNullSubtype(backend.mapLiteralClass);
pushInvokeStatic(node, backend.getMapMaker(), [keyValuePairs], mapType);
+ setRtiIfNeeded(peek(), node);
}
visitLiteralMapEntry(LiteralMapEntry node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index ffd4236..d77bd2b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1617,9 +1617,11 @@
world.registerStaticUse(superMethod);
ClassElement superClass = superMethod.getEnclosingClass();
if (superMethod.kind == ElementKind.FIELD) {
- String fieldName = node.caller.isShadowedByField(superMethod)
- ? backend.namer.shadowedFieldName(superMethod)
- : backend.namer.instanceFieldName(superMethod);
+ String fieldName = superMethod.hasFixedBackendName()
+ ? superMethod.fixedBackendName()
+ : node.caller.isShadowedByField(superMethod)
+ ? backend.namer.shadowedFieldName(superMethod)
+ : backend.namer.instanceFieldName(superMethod);
use(node.inputs[0]);
js.PropertyAccess access =
new js.PropertyAccess.field(pop(), fieldName);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index cdc75a2..426d329 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1204,7 +1204,7 @@
// available.
assert(type.kind != TypeKind.TYPE_VARIABLE);
assert(type.treatAsRaw || type.kind == TypeKind.FUNCTION);
- if (type.treatAsDynamic) return this;
+ if (type.isDynamic) return this;
// The type element is either a class or the void element.
Element element = type.element;
if (identical(element, compiler.objectClass)) return this;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 6b83cda..1a16f4c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -594,6 +594,11 @@
HInstruction value = node.inputs[0];
DartType type = node.typeExpression;
if (type != null) {
+ if (type.kind == TypeKind.MALFORMED_TYPE) {
+ // Malformed types are treated as dynamic statically, but should
+ // throw a type error at runtime.
+ return node;
+ }
if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) {
return node;
}
@@ -1508,14 +1513,14 @@
HInstruction input = instruction.expression;
for (HIf ifUser in ifUsers) {
changeUsesDominatedBy(ifUser.thenBlock, input, convertedType);
- // TODO(ngeoffray): Also change uses for the else block on a HType
- // that knows it is not of a specific Type.
+ // TODO(ngeoffray): Also change uses for the else block on a type
+ // that knows it is not of a specific type.
}
for (HIf ifUser in notIfUsers) {
changeUsesDominatedBy(ifUser.elseBlock, input, convertedType);
- // TODO(ngeoffray): Also change uses for the then block on a HType
- // that knows it is not of a specific Type.
+ // TODO(ngeoffray): Also change uses for the then block on a type
+ // that knows it is not of a specific type.
}
}
}
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 3b4fe10..b0536bd 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -426,7 +426,10 @@
String packageRoot) {
_packageRoot = packageRoot;
_exports = new ExportMap.parse(libraryList, packageRoot);
- var librariesToAnalyze = _exports.allExportedFiles.toList();
+ var librariesToAnalyze =
+ _exports.allExportedFiles
+ .map((file) => new Uri.file(file).toString())
+ .toList();
librariesToAnalyze.addAll(libraryList.map((uri) => uri.toString()));
// dart2js takes a String, but it expects that to be a Uri, not a file
@@ -1183,12 +1186,13 @@
subtypes.sort((x, y) => x.simpleName.compareTo(y.simpleName));
// Show the chain of superclasses.
- if (!type.superclass.isObject) {
+ var superclass = getSuperclass(type);
+ if (!superclass.isObject) {
final supertypes = [];
- var thisType = type.superclass;
+ var thisType = superclass;
do {
supertypes.add(thisType);
- thisType = thisType.superclass;
+ thisType = getSuperclass(thisType);
} while (!thisType.isObject);
writeln('<h3>Extends</h3>');
@@ -1204,7 +1208,8 @@
}
listTypes(subtypes, 'Subclasses');
- listTypes(type.superinterfaces, 'Implements');
+ listTypes(getAppliedMixins(type), 'Mixins');
+ listTypes(getExplicitInterfaces(type), 'Implements');
}
/**
@@ -1569,9 +1574,7 @@
writeln('</h4>');
if (inherited) {
- write('<div class="inherited-from">inherited from ');
- annotateType(host, member.owner);
- write('</div>');
+ docInherited(host, member.owner);
}
writeln('<div class="doc">');
@@ -1586,6 +1589,21 @@
_currentMember = null;
}
+ /**
+ * Annotate a member as inherited or mixed in from [owner].
+ */
+ void docInherited(ContainerMirror host, ClassMirror owner) {
+ if (isMixinApplication(owner)) {
+ write('<div class="inherited-from">mixed in from ');
+ annotateType(host, owner.mixin);
+ write('</div>');
+ } else {
+ write('<div class="inherited-from">inherited from ');
+ annotateType(host, owner);
+ write('</div>');
+ }
+ }
+
void docField(ContainerMirror host, VariableMirror field,
{bool asGetter: false, bool asSetter: false}) {
if (asGetter) {
@@ -1651,9 +1669,7 @@
''');
if (inherited) {
- write('<div class="inherited-from">inherited from ');
- annotateType(host, getter.owner);
- write('</div>');
+ docInherited(host, getter.owner);
}
DocComment comment = getMemberComment(getter);
@@ -1776,6 +1792,9 @@
}
}
if (comment == null) return null;
+ if (isMixinApplication(inheritedFrom)) {
+ inheritedFrom = inheritedFrom.mixin;
+ }
return new DocComment(comment, inheritedFrom, dartdocSyntaxes,
dartdocResolver);
}
diff --git a/sdk/lib/_internal/lib/async_patch.dart b/sdk/lib/_internal/lib/async_patch.dart
index 07b1cd2..8d6bb26 100644
--- a/sdk/lib/_internal/lib/async_patch.dart
+++ b/sdk/lib/_internal/lib/async_patch.dart
@@ -35,7 +35,7 @@
}
// TODO(ahe): This should not only apply to this isolate.
-final _loadedLibraries = <String, Completer<bool>>{};
+final Map<String, Future<bool>> _loadedLibraries = <String, Future<bool>>{};
Future<bool> _load(String libraryName, String uri) {
// TODO(ahe): Validate libraryName. Kasper points out that you want
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index bf3caa2..d13871b 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -729,7 +729,7 @@
const _NativeJsSendPort(this._receivePort, int isolateId) : super(isolateId);
- void send(var message, [SendPort replyTo]) {
+ void send(var message) {
_waitForPendingPorts(message, () {
// Check that the isolate still runs and the port is still open
final isolate = _globalState.isolates[_isolateId];
@@ -775,7 +775,7 @@
const _WorkerSendPort(this._workerId, int isolateId, this._receivePortId)
: super(isolateId);
- void send(var message, [SendPort replyTo]) {
+ void send(var message) {
_waitForPendingPorts(message, () {
final workerMessage = _serializeMessage({
'command': 'message',
@@ -846,9 +846,9 @@
_idCount++;
}
- void send(var message, [SendPort replyTo]) {
+ void send(var message) {
if (_port != null) {
- _port.send(message, replyTo);
+ _port.send(message);
} else {
pending.add(message);
}
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 98f9798..b4d4b4a 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -530,25 +530,7 @@
// Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
// We extract this name using a regexp.
var d = lazyAsJsDate(receiver);
- String result = JS('String', r'/\((.*)\)/.exec(#.toString())[1]', d);
- if (result == null) {
- // Internet Explorer doesn't put the zone name into parenthesis:
- // For example: Thu Oct 31 14:07:44 PDT 2013
- result = JS('String',
- // Thu followed by a space.
- r'/^[A-Z,a-z]{3}\s'
- // Oct 31 followed by space.
- r'[A-Z,a-z]{3}\s\d+\s'
- // Time followed by a space.
- r'\d{2}:\d{2}:\d{2}\s'
- // The time zone name followed by a space.
- r'([A-Z]{3,5})\s'
- // The year.
- r'\d{4}$/'
- '.exec(#.toString())[1]',
- d);
- }
- return result;
+ return JS('String', r'/\((.*)\)/.exec(#.toString())[1]', d);
}
static int getTimeZoneOffsetInMinutes(receiver) {
@@ -1939,6 +1921,11 @@
throw new TypeErrorImplementation(value, 'void');
}
+checkMalformedType(value, message) {
+ if (value == null) return value;
+ throw new TypeErrorImplementation.fromMessage(message);
+}
+
/**
* Special interface recognized by the compiler and implemented by DOM
* objects that support integer indexing. This interface is not
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 802563e..79bbdb6 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -204,6 +204,8 @@
String get _prettyName => 'TypeVariableMirror';
+ bool get isTopLevel => false;
+
TypeMirror get upperBound {
if (_cachedUpperBound != null) return _cachedUpperBound;
return _cachedUpperBound = typeMirrorFromRuntimeTypeRepresentation(
@@ -555,6 +557,16 @@
return result;
}
+Map<Symbol, MethodMirror> filterConstructors(methods) {
+ var result = new Map();
+ for (JsMethodMirror method in methods) {
+ if (method.isConstructor) {
+ result[method.simpleName] = method;
+ }
+ }
+ return result;
+}
+
Map<Symbol, MethodMirror> filterGetters(List<MethodMirror> methods,
Map<Symbol, VariableMirror> fields) {
var result = new Map();
@@ -571,7 +583,7 @@
}
Map<Symbol, MethodMirror> filterSetters(List<MethodMirror> methods,
- Map<Symbol, VariableMirror> fields) {
+ Map<Symbol, VariableMirror> fields) {
var result = new Map();
for (JsMethodMirror method in methods) {
if (method.isSetter) {
@@ -587,6 +599,24 @@
return result;
}
+Map<Symbol, Mirror> filterMembers(List<MethodMirror> methods,
+ Map<Symbol, VariableMirror> variables) {
+ Map<Symbol, Mirror> result = new Map.from(variables);
+ for (JsMethodMirror method in methods) {
+ if (method.isSetter) {
+ String name = n(method.simpleName);
+ name = name.substring(0, name.length - 1);
+ // 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);
+ }
+ return result;
+}
+
int counter = 0;
ClassMirror reflectMixinApplication(mixinNames, String mangledName) {
@@ -861,6 +891,9 @@
String _typeArguments;
UnmodifiableListView<TypeMirror> _cachedTypeArguments;
+ UnmodifiableMapView<Symbol, DeclarationMirror> _cachedDeclarations;
+ UnmodifiableMapView<Symbol, DeclarationMirror> _cachedMembers;
+ UnmodifiableMapView<Symbol, MethodMirror> _cachedConstructors;
Map<Symbol, VariableMirror> _cachedVariables;
Map<Symbol, MethodMirror> _cachedGetters;
Map<Symbol, MethodMirror> _cachedSetters;
@@ -927,8 +960,6 @@
return _cachedTypeArguments = new UnmodifiableListView(result);
}
- Map<Symbol, MethodMirror> get constructors => _class.constructors;
-
List<JsMethodMirror> get _methods {
if (_cachedMethods != null) return _cachedMethods;
return _cachedMethods =_class._getMethodsWithOwner(this);
@@ -940,6 +971,13 @@
filterMethods(_methods));
}
+ Map<Symbol, MethodMirror> get constructors {
+ if (_cachedConstructors != null) return _cachedConstructors;
+ return _cachedConstructors =
+ new UnmodifiableMapView<Symbol, MethodMirror>(
+ filterConstructors(_methods));
+ }
+
Map<Symbol, MethodMirror> get getters {
if (_cachedGetters != null) return _cachedGetters;
return _cachedGetters = new UnmodifiableMapView<Symbol, MethodMirror>(
@@ -962,7 +1000,22 @@
new UnmodifiableMapView<Symbol, VariableMirror>(result);
}
- Map<Symbol, Mirror> get members => _class.members;
+ Map<Symbol, DeclarationMirror> get members {
+ if (_cachedMembers != null) return _cachedMembers;
+ return _cachedMembers = new UnmodifiableMapView<Symbol, DeclarationMirror>(
+ filterMembers(_methods, variables));
+ }
+
+ Map<Symbol, DeclarationMirror> get declarations {
+ if (_cachedDeclarations != null) return _cachedDeclarations;
+ Map<Symbol, DeclarationMirror> result =
+ new Map<Symbol, DeclarationMirror>();
+ result.addAll(members);
+ result.addAll(constructors);
+ typeVariables.forEach((tv) => result[tv.simpleName] = tv);
+ return _cachedDeclarations =
+ new UnmodifiableMapView<Symbol, DeclarationMirror>(result);
+ }
InstanceMirror setField(Symbol fieldName, Object arg) {
return _class.setField(fieldName, arg);
@@ -1068,14 +1121,9 @@
Map<Symbol, MethodMirror> get constructors {
if (_cachedConstructors != null) return _cachedConstructors;
- var result = new Map();
- for (JsMethodMirror method in _methods) {
- if (method.isConstructor) {
- result[method.simpleName] = method;
- }
- }
return _cachedConstructors =
- new UnmodifiableMapView<Symbol, MethodMirror>(result);
+ new UnmodifiableMapView<Symbol, MethodMirror>(
+ filterConstructors(_methods));
}
List<JsMethodMirror> _getMethodsWithOwner(DeclarationMirror methodOwner) {
@@ -1189,20 +1237,8 @@
Map<Symbol, Mirror> get members {
if (_cachedMembers != null) return _cachedMembers;
- Map<Symbol, Mirror> result = new Map.from(variables);
- for (JsMethodMirror method in _methods) {
- if (method.isSetter) {
- String name = n(method.simpleName);
- name = name.substring(0, name.length - 1);
- // 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);
- }
- return _cachedMembers = new UnmodifiableMapView<Symbol, Mirror>(result);
+ return _cachedMembers = new UnmodifiableMapView<Symbol, Mirror>(
+ filterMembers(_methods, variables));
}
Map<Symbol, DeclarationMirror> get declarations {
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index a6c6720..8e480f8 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -5,10 +5,10 @@
part of dart.convert;
/** The Unicode Replacement character `U+FFFD` (�). */
-const UNICODE_REPLACEMENT_CHARACTER_RUNE = 0xFFFD;
+const int UNICODE_REPLACEMENT_CHARACTER_RUNE = 0xFFFD;
/** The Unicode Byte Order Marker (BOM) character `U+FEFF`. */
-const UNICODE_BOM_CHARACTER_RUNE = 0xFEFF;
+const int UNICODE_BOM_CHARACTER_RUNE = 0xFEFF;
/**
* An instance of the default implementation of the [Utf8Codec].
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index c2a2227..5735697 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1332,6 +1332,15 @@
// To suppress missing implicit constructor warnings.
factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
+ /**
+ * The current default path of this canvas context, if there is one.
+ *
+ * ## Other resources
+ *
+ * * [Current default path]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#current-default-path)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.currentPath')
@DocsEditable()
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
@@ -1356,6 +1365,16 @@
@DocsEditable()
String globalCompositeOperation;
+ /**
+ * Whether images and patterns on this canvas will be smoothed when this
+ * canvas is scaled.
+ *
+ * ## Other resources
+ *
+ * * [Image smoothing]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-smoothing)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
@DocsEditable()
@Experimental() // untriaged
@@ -1408,6 +1427,15 @@
String textBaseline;
@JSName('webkitBackingStorePixelRatio')
+ /**
+ * The ratio between this canvas' backing store dimensions and the canvas'
+ * logical dimensions.
+ *
+ * ## Other resources
+ *
+ * * [High DPI Canvas tutorial]
+ * (http://www.html5rocks.com/en/tutorials/canvas/hidpi/) from HTML5Rocks.
+ */
@DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -7313,6 +7341,7 @@
* save typing a few characters.
*
* [selectors] should be a string using CSS selector syntax.
+ *
* var element1 = document.querySelector('.className');
* var element2 = document.querySelector('#id');
*
@@ -7671,6 +7700,7 @@
* save typing a few characters.
*
* [selectors] should be a string using CSS selector syntax.
+ *
* var items = document.querySelectorAll('.itemClassName');
*
* For details about CSS selector syntax, see the
@@ -7752,6 +7782,17 @@
children.addAll(copy);
}
+ /**
+ * Finds all descendant elements of this document fragment that match the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
ElementList querySelectorAll(String selectors) =>
new _FrozenElementList._wrap(_querySelectorAll(selectors));
@@ -7816,6 +7857,18 @@
// To suppress missing implicit constructor warnings.
factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
+ /**
+ * Finds the first descendant element of this document fragment that matches
+ * the specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = fragment.querySelector('.className');
+ * var element2 = fragment.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
@DomName('DocumentFragment.querySelector')
@DocsEditable()
Element querySelector(String selectors) native;
@@ -9456,6 +9509,9 @@
* [selectors] should be a string using CSS selector syntax.
*
* var items = element.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
*/
@DomName('Element.querySelectorAll')
ElementList querySelectorAll(String selectors) =>
@@ -9664,6 +9720,11 @@
@DomName('Element.namespaceUri')
String get namespaceUri => _namespaceUri;
+ /**
+ * The string representation of this element.
+ *
+ * This is equivalent to reading the [localName] property.
+ */
String toString() => localName;
/**
@@ -10988,8 +11049,8 @@
String getAttributeNS(String namespaceURI, String localName) native;
/**
- * The smallest bounding rectangle that encompasses this element's padding,
- * scrollbar, and border.
+ * Returns the smallest bounding rectangle that encompasses this element's
+ * padding, scrollbar, and border.
*
* ## Other resources
*
@@ -10997,14 +11058,16 @@
* (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
* from MDN.
* * [The getBoundingClientRect() method]
- * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
*/
@DomName('Element.getBoundingClientRect')
@DocsEditable()
Rectangle getBoundingClientRect() native;
/**
- * A list of bounding rectangles for each box associated with this element.
+ * Returns a list of bounding rectangles for each box associated with this
+ * element.
*
* ## Other resources
*
@@ -11012,7 +11075,8 @@
* (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
* from MDN.
* * [The getClientRects() method]
- * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
*/
@DomName('Element.getClientRects')
@DocsEditable()
@@ -11020,6 +11084,16 @@
@Creates('_ClientRectList')
List<Rectangle> getClientRects() native;
+ /**
+ * Returns a list of shadow DOM insertion points to which this element is
+ * distributed.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM specification]
+ * (https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)
+ * from W3C.
+ */
@DomName('Element.getDestinationInsertionPoints')
@DocsEditable()
@Experimental() // untriaged
@@ -11027,6 +11101,17 @@
@Creates('NodeList')
List<Node> getDestinationInsertionPoints() native;
+ /**
+ * Returns a list of nodes with the given class name inside this element.
+ *
+ * ## Other resources
+ *
+ * * [getElementsByClassName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)
+ * from MDN.
+ * * [DOM specification]
+ * (http://www.w3.org/TR/domcore/) from W3C.
+ */
@DomName('Element.getElementsByClassName')
@DocsEditable()
@Returns('NodeList')
@@ -11063,9 +11148,8 @@
* // Gets the first descendant [ImageElement]
* var img = element.querySelector('img');
*
- * See also:
- *
- * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
*/
@DomName('Element.querySelector')
@DocsEditable()
@@ -11088,10 +11172,26 @@
@DocsEditable()
void _removeAttributeNS(String namespaceURI, String localName) native;
+ /**
+ * Scrolls the element by a number of lines.
+ *
+ * ## Other resources
+ *
+ * * [scrollByLines]
+ * (http://docs.webplatform.org/wiki/dom/methods/scrollByLines) from WebPlatform.org.
+ */
@DomName('Element.scrollByLines')
@DocsEditable()
void scrollByLines(int lines) native;
+ /**
+ * Scrolls the element by a number of pages.
+ *
+ * ## Other resources
+ *
+ * * [scrollByPages]
+ * (http://docs.webplatform.org/wiki/dom/methods/scrollByPages) from WebPlatform.org.
+ */
@DomName('Element.scrollByPages')
@DocsEditable()
void scrollByPages(int pages) native;
@@ -11117,6 +11217,17 @@
void setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
@JSName('webkitGetRegionFlowRanges')
+ /**
+ * Returns an array of ranges of fragments in the flow.
+ *
+ * ## Other resources
+ *
+ * * [CSS regions and exclusions tutorial]
+ * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+ * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+ * * [CSS regions specification]
+ * (http://www.w3.org/TR/css3-regions/) from W3C.
+ */
@DomName('Element.webkitGetRegionFlowRanges')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -11128,6 +11239,17 @@
List<Range> getRegionFlowRanges() native;
@JSName('webkitRequestFullscreen')
+ /**
+ * Displays this element fullscreen.
+ *
+ * ## Other resources
+ *
+ * * [Using the full-screen API]
+ * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
+ * tutorial from WebPlatform.org.
+ * * [Fullscreen specification]
+ * (http://www.w3.org/TR/fullscreen/) from W3C.
+ */
@DomName('Element.webkitRequestFullscreen')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -11137,6 +11259,18 @@
void requestFullscreen() native;
@JSName('webkitRequestPointerLock')
+ /**
+ * Locks the mouse pointer to this element.
+ *
+ * ## Other resources
+ *
+ * * [Pointer lock and first person shooter controls]
+ * (http://www.html5rocks.com/en/tutorials/pointerlock/intro/) tutorial from
+ * HTML5Rocks.
+ *
+ * * [Pointer lock specification]
+ * (http://www.w3.org/TR/pointerlock/) from W3C.
+ */
@DomName('Element.webkitRequestPointerLock')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -14369,6 +14503,22 @@
@DocsEditable()
final String statusText;
+ /**
+ * Length of time before a request is automatically terminated.
+ *
+ * When the time has passed, a [TimeoutEvent] is dispatched.
+ *
+ * If [timeout] is set to 0, then the request will not time out.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.timeout]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+ * from MDN.
+ * * [The timeout attribute]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+ * from W3C.
+ */
@DomName('XMLHttpRequest.timeout')
@DocsEditable()
@Experimental() // untriaged
@@ -14471,15 +14621,34 @@
* `send` method is intended only for more complext HTTP requests where
* finer-grained control is needed.
*
- * See also:
+ * ## Other resources
*
- * * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
* from MDN.
*/
@DomName('XMLHttpRequest.send')
@DocsEditable()
void send([data]) native;
+ /**
+ * Sets the value of an HTTP requst header.
+ *
+ * This method should be called after the request is opened, but before
+ * the request is sent.
+ *
+ * Multiple calls with the same header will combine all their values into a
+ * single header.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.setRequestHeader]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ * * [The setRequestHeader() method]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+ * W3C.
+ */
@DomName('XMLHttpRequest.setRequestHeader')
@DocsEditable()
void setRequestHeader(String header, String value) native;
@@ -19213,6 +19382,9 @@
// Custom element created callback.
Node._created() : super._created();
+ /**
+ * A modifiable list of this node's children.
+ */
List<Node> get nodes {
return new _ChildNodeListLazy(this);
}
@@ -19339,16 +19511,43 @@
@DocsEditable()
final String _baseUri;
+ /**
+ * A list of this node's children.
+ *
+ * ## Other resources
+ *
+ * * [Node.childNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
+ * from MDN.
+ */
@DomName('Node.childNodes')
@DocsEditable()
@Returns('NodeList')
@Creates('NodeList')
final List<Node> childNodes;
+ /**
+ * The first child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.firstChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
+ * from MDN.
+ */
@DomName('Node.firstChild')
@DocsEditable()
final Node firstChild;
+ /**
+ * The last child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.lastChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
+ * from MDN.
+ */
@DomName('Node.lastChild')
@DocsEditable()
final Node lastChild;
@@ -19364,41 +19563,147 @@
final String _namespaceUri;
@JSName('nextSibling')
+ /**
+ * The next sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nextSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
+ * from MDN.
+ */
@DomName('Node.nextSibling')
@DocsEditable()
final Node nextNode;
+ /**
+ * The name of this node.
+ *
+ * This varies by this node's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)
+ * from MDN. This page contains a table of [nodeName] values for each
+ * [nodeType].
+ */
@DomName('Node.nodeName')
@DocsEditable()
final String nodeName;
+ /**
+ * The type of node.
+ *
+ * This value is one of:
+ *
+ * * [ATTRIBUTE_NODE] if this node is an attribute.
+ * * [CDATA_SECTION_NODE] if this node is a [CDataSection].
+ * * [COMMENT_NODE] if this node is a [Comment].
+ * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].
+ * * [DOCUMENT_NODE] if this node is a [Document].
+ * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.
+ * * [ELEMENT_NODE] if this node is an [Element].
+ * * [ENTITY_NODE] if this node is an entity.
+ * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.
+ * * [NOTATION_NODE] if this node is a notation.
+ * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].
+ * * [TEXT_NODE] if this node is a [Text] node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeType]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.
+ */
@DomName('Node.nodeType')
@DocsEditable()
final int nodeType;
+ /**
+ * The value of this node.
+ *
+ * This varies by this type's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeValue]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)
+ * from MDN. This page contains a table of [nodeValue] values for each
+ * [nodeType].
+ */
@DomName('Node.nodeValue')
@DocsEditable()
final String nodeValue;
+ /**
+ * The document this node belongs to.
+ *
+ * Returns `null` if this node does not belong to any document.
+ *
+ * ## Other resources
+ *
+ * * [Node.ownerDocument]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from
+ * MDN.
+ */
@DomName('Node.ownerDocument')
@DocsEditable()
final Document ownerDocument;
@JSName('parentElement')
+ /**
+ * The parent element of this node.
+ *
+ * Returns `null` if this node either does not have a parent or its parent is
+ * not an element.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentElement]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from
+ * W3C.
+ */
@DomName('Node.parentElement')
@DocsEditable()
final Element parent;
+ /**
+ * The parent node of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from
+ * MDN.
+ */
@DomName('Node.parentNode')
@DocsEditable()
final Node parentNode;
@JSName('previousSibling')
+ /**
+ * The previous sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.previousSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
+ * from MDN.
+ */
@DomName('Node.previousSibling')
@DocsEditable()
final Node previousNode;
@JSName('textContent')
+ /**
+ * All text within this node and its decendents.
+ *
+ * ## Other resources
+ *
+ * * [Node.textContent]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+ * MDN.
+ */
@DomName('Node.textContent')
@DocsEditable()
String text;
@@ -19418,18 +19723,56 @@
Node append(Node newChild) native;
@JSName('cloneNode')
+ /**
+ * Returns a copy of this node.
+ *
+ * If [deep] is `true`, then all of this node's children and decendents are
+ * copied as well. If [deep] is `false`, then only this node is copied.
+ *
+ * ## Other resources
+ *
+ * * [Node.cloneNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+ * MDN.
+ */
@DomName('Node.cloneNode')
@DocsEditable()
Node clone(bool deep) native;
+ /**
+ * Returns true if this node contains the specified node.
+ *
+ * ## Other resources
+ *
+ * * [Node.contains]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+ */
@DomName('Node.contains')
@DocsEditable()
bool contains(Node other) native;
+ /**
+ * Returns true if this node has any children.
+ *
+ * ## Other resources
+ *
+ * * [Node.hasChildNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+ * MDN.
+ */
@DomName('Node.hasChildNodes')
@DocsEditable()
bool hasChildNodes() native;
+ /**
+ * Inserts all of the nodes into this node directly before refChild.
+ *
+ * ## Other resources
+ *
+ * * [Node.insertBefore]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+ * MDN.
+ */
@DomName('Node.insertBefore')
@DocsEditable()
Node insertBefore(Node newChild, Node refChild) native;
@@ -26236,12 +26579,14 @@
* Top-level container for the current browser tab or window.
*
* In a web browser, each window has a [Window] object, but within the context
- * of a script, a [Window] object represents only the current window. In
- * addition to the open window, each window, tab, and iframe has its own
- * [Window] object. A [Window] contains a [Document] object, which contains this
- * web page's content.
+ * of a script, this object represents only the current window.
+ * Each other window, tab, and iframe has its own [Window] object.
*
- * Use `window` to access properties of the current window. For example:
+ * Each window contains a [Document] object, which contains all of the window's
+ * content.
+ *
+ * Use the top-level `window` object to access the current window.
+ * For example:
*
* // Draw a scene when the window repaints.
* drawScene(num delta) {...}
@@ -26251,8 +26596,12 @@
* window.console.log('Jinkies!');
* window.console.error('Jeepers!');
*
- * **Note:** This class represents the current window, whereas [WindowBase] is
- * a representation of any window, including other tabs, windows, and frames.
+ * **Note:** This class represents only the current window, while [WindowBase]
+ * is a representation of any window, including other tabs, windows, and frames.
+ *
+ * ## See also
+ *
+ * * [WindowBase]
*
* ## Other resources
*
@@ -29678,32 +30027,40 @@
/**
- * An object that can be drawn to a [CanvasRenderingContext2D] object with
- * [CanvasRenderingContext2D.drawImage],
- * [CanvasRenderingContext2D.drawImageToRect],
- * [CanvasRenderingContext2D.drawImageScaled], or
- * [CanvasRenderingContext2D.drawImageScaledFromSource].
+ * An object that can be drawn to a 2D canvas rendering context.
*
- * If the CanvasImageSource is an [ImageElement] then the element's image is
- * used. If the [ImageElement] is an animated image, then the poster frame is
- * used. If there is no poster frame, then the first frame of animation is used.
+ * The image drawn to the canvas depends on the type of this object:
*
- * If the CanvasImageSource is a [VideoElement] then the frame at the current
- * playback position is used as the image.
+ * * If this object is an [ImageElement], then this element's image is
+ * drawn to the canvas. If this element is an animated image, then this
+ * element's poster frame is drawn. If this element has no poster frame, then
+ * the first frame of animation is drawn.
*
- * If the CanvasImageSource is a [CanvasElement] then the element's bitmap is
- * used.
+ * * If this object is a [VideoElement], then the frame at this element's current
+ * playback position is drawn to the canvas.
*
- * ** Note: ** Currently, all versions of Internet Explorer do not support
- * drawing a VideoElement to a canvas. Also, you may experience problems drawing
+ * * If this object is a [CanvasElement], then this element's bitmap is drawn to
+ * the canvas.
+ *
+ * **Note:** Currently all versions of Internet Explorer do not support
+ * drawing a video element to a canvas. You may also encounter problems drawing
* a video to a canvas in Firefox if the source of the video is a data URL.
*
- * See also:
+ * ## See also
*
- * * [CanvasImageSource](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
- * from the WHATWG.
- * * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
- * from the WHATWG.
+ * * [CanvasRenderingContext2D.drawImage]
+ * * [CanvasRenderingContext2D.drawImageToRect]
+ * * [CanvasRenderingContext2D.drawImageScaled]
+ * * [CanvasRenderingContext2D.drawImageScaledFromSource]
+ *
+ * ## Other resources
+ *
+ * * [Image sources for 2D rendering contexts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
+ * from WHATWG.
+ * * [Drawing images]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
+ * from WHATWG.
*/
abstract class CanvasImageSource {}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -29714,13 +30071,17 @@
/**
* Top-level container for a browser tab or window.
*
- * In a web browser, a [WindowBase] object represents any browser window. This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
*
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
* used to access the properties and content of the current window or tab.
*
+ * ## See also
+ *
+ * * [Window]
+ *
* ## Other resources
*
* * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
@@ -33837,8 +34198,42 @@
@Experimental()
ElementList queryAll(String relativeSelectors) => document.queryAll(relativeSelectors);
-Element querySelector(String selector) => document.querySelector(selector);
-ElementList querySelectorAll(String selector) => document.querySelectorAll(selector);
+/**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+Element querySelector(String selectors) => document.querySelector(selectors);
+
+/**
+ * Finds all descendant elements of this document that match the specified
+ * group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelectorAll]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ElementList querySelectorAll(String selectors) => document.querySelectorAll(selectors);
// 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.
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 85ca975..c71a035 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -1519,12 +1519,30 @@
// To suppress missing implicit constructor warnings.
factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
+ /**
+ * The current default path of this canvas context, if there is one.
+ *
+ * ## Other resources
+ *
+ * * [Current default path]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#current-default-path)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.currentPath')
@DocsEditable()
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
@Experimental()
Path get currentPath native "CanvasRenderingContext2D_currentPath_Getter";
+ /**
+ * The current default path of this canvas context, if there is one.
+ *
+ * ## Other resources
+ *
+ * * [Current default path]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#current-default-path)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.currentPath')
@DocsEditable()
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
@@ -1563,11 +1581,31 @@
@DocsEditable()
void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+ /**
+ * Whether images and patterns on this canvas will be smoothed when this
+ * canvas is scaled.
+ *
+ * ## Other resources
+ *
+ * * [Image smoothing]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-smoothing)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
@DocsEditable()
@Experimental() // untriaged
bool get imageSmoothingEnabled native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+ /**
+ * Whether images and patterns on this canvas will be smoothed when this
+ * canvas is scaled.
+ *
+ * ## Other resources
+ *
+ * * [Image smoothing]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-smoothing)
+ * from WHATWG.
+ */
@DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
@DocsEditable()
@Experimental() // untriaged
@@ -1669,6 +1707,15 @@
@DocsEditable()
void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";
+ /**
+ * The ratio between this canvas' backing store dimensions and the canvas'
+ * logical dimensions.
+ *
+ * ## Other resources
+ *
+ * * [High DPI Canvas tutorial]
+ * (http://www.html5rocks.com/en/tutorials/canvas/hidpi/) from HTML5Rocks.
+ */
@DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -7688,6 +7735,7 @@
* save typing a few characters.
*
* [selectors] should be a string using CSS selector syntax.
+ *
* var element1 = document.querySelector('.className');
* var element2 = document.querySelector('#id');
*
@@ -8034,6 +8082,7 @@
* save typing a few characters.
*
* [selectors] should be a string using CSS selector syntax.
+ *
* var items = document.querySelectorAll('.itemClassName');
*
* For details about CSS selector syntax, see the
@@ -8117,6 +8166,17 @@
children.addAll(copy);
}
+ /**
+ * Finds all descendant elements of this document fragment that match the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
ElementList querySelectorAll(String selectors) =>
new _FrozenElementList._wrap(_querySelectorAll(selectors));
@@ -8181,6 +8241,18 @@
// To suppress missing implicit constructor warnings.
factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
+ /**
+ * Finds the first descendant element of this document fragment that matches
+ * the specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = fragment.querySelector('.className');
+ * var element2 = fragment.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
@DomName('DocumentFragment.querySelector')
@DocsEditable()
Element querySelector(String selectors) native "DocumentFragment_querySelector_Callback";
@@ -9847,6 +9919,9 @@
* [selectors] should be a string using CSS selector syntax.
*
* var items = element.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
*/
@DomName('Element.querySelectorAll')
ElementList querySelectorAll(String selectors) =>
@@ -10054,6 +10129,11 @@
@DomName('Element.namespaceUri')
String get namespaceUri => _namespaceUri;
+ /**
+ * The string representation of this element.
+ *
+ * This is equivalent to reading the [localName] property.
+ */
String toString() => localName;
/**
@@ -11150,8 +11230,8 @@
String getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
/**
- * The smallest bounding rectangle that encompasses this element's padding,
- * scrollbar, and border.
+ * Returns the smallest bounding rectangle that encompasses this element's
+ * padding, scrollbar, and border.
*
* ## Other resources
*
@@ -11159,14 +11239,16 @@
* (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
* from MDN.
* * [The getBoundingClientRect() method]
- * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
*/
@DomName('Element.getBoundingClientRect')
@DocsEditable()
Rectangle getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
/**
- * A list of bounding rectangles for each box associated with this element.
+ * Returns a list of bounding rectangles for each box associated with this
+ * element.
*
* ## Other resources
*
@@ -11174,17 +11256,39 @@
* (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
* from MDN.
* * [The getClientRects() method]
- * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
*/
@DomName('Element.getClientRects')
@DocsEditable()
List<Rectangle> getClientRects() native "Element_getClientRects_Callback";
+ /**
+ * Returns a list of shadow DOM insertion points to which this element is
+ * distributed.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM specification]
+ * (https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)
+ * from W3C.
+ */
@DomName('Element.getDestinationInsertionPoints')
@DocsEditable()
@Experimental() // untriaged
List<Node> getDestinationInsertionPoints() native "Element_getDestinationInsertionPoints_Callback";
+ /**
+ * Returns a list of nodes with the given class name inside this element.
+ *
+ * ## Other resources
+ *
+ * * [getElementsByClassName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)
+ * from MDN.
+ * * [DOM specification]
+ * (http://www.w3.org/TR/domcore/) from W3C.
+ */
@DomName('Element.getElementsByClassName')
@DocsEditable()
List<Node> getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";
@@ -11214,9 +11318,8 @@
* // Gets the first descendant [ImageElement]
* var img = element.querySelector('img');
*
- * See also:
- *
- * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
*/
@DomName('Element.querySelector')
@DocsEditable()
@@ -11234,10 +11337,26 @@
@DocsEditable()
void _removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";
+ /**
+ * Scrolls the element by a number of lines.
+ *
+ * ## Other resources
+ *
+ * * [scrollByLines]
+ * (http://docs.webplatform.org/wiki/dom/methods/scrollByLines) from WebPlatform.org.
+ */
@DomName('Element.scrollByLines')
@DocsEditable()
void scrollByLines(int lines) native "Element_scrollByLines_Callback";
+ /**
+ * Scrolls the element by a number of pages.
+ *
+ * ## Other resources
+ *
+ * * [scrollByPages]
+ * (http://docs.webplatform.org/wiki/dom/methods/scrollByPages) from WebPlatform.org.
+ */
@DomName('Element.scrollByPages')
@DocsEditable()
void scrollByPages(int pages) native "Element_scrollByPages_Callback";
@@ -11276,6 +11395,17 @@
@DocsEditable()
void setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
+ /**
+ * Returns an array of ranges of fragments in the flow.
+ *
+ * ## Other resources
+ *
+ * * [CSS regions and exclusions tutorial]
+ * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+ * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+ * * [CSS regions specification]
+ * (http://www.w3.org/TR/css3-regions/) from W3C.
+ */
@DomName('Element.webkitGetRegionFlowRanges')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -11290,6 +11420,17 @@
// http://dev.w3.org/2006/webapi/selectors-api2/#matches
bool matches(String selectors) native "Element_webkitMatchesSelector_Callback";
+ /**
+ * Displays this element fullscreen.
+ *
+ * ## Other resources
+ *
+ * * [Using the full-screen API]
+ * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
+ * tutorial from WebPlatform.org.
+ * * [Fullscreen specification]
+ * (http://www.w3.org/TR/fullscreen/) from W3C.
+ */
@DomName('Element.webkitRequestFullscreen')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -11298,6 +11439,18 @@
// https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
void requestFullscreen() native "Element_webkitRequestFullscreen_Callback";
+ /**
+ * Locks the mouse pointer to this element.
+ *
+ * ## Other resources
+ *
+ * * [Pointer lock and first person shooter controls]
+ * (http://www.html5rocks.com/en/tutorials/pointerlock/intro/) tutorial from
+ * HTML5Rocks.
+ *
+ * * [Pointer lock specification]
+ * (http://www.w3.org/TR/pointerlock/) from W3C.
+ */
@DomName('Element.webkitRequestPointerLock')
@DocsEditable()
@SupportedBrowser(SupportedBrowser.CHROME)
@@ -14798,11 +14951,43 @@
@DocsEditable()
String get statusText native "XMLHttpRequest_statusText_Getter";
+ /**
+ * Length of time before a request is automatically terminated.
+ *
+ * When the time has passed, a [TimeoutEvent] is dispatched.
+ *
+ * If [timeout] is set to 0, then the request will not time out.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.timeout]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+ * from MDN.
+ * * [The timeout attribute]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+ * from W3C.
+ */
@DomName('XMLHttpRequest.timeout')
@DocsEditable()
@Experimental() // untriaged
int get timeout native "XMLHttpRequest_timeout_Getter";
+ /**
+ * Length of time before a request is automatically terminated.
+ *
+ * When the time has passed, a [TimeoutEvent] is dispatched.
+ *
+ * If [timeout] is set to 0, then the request will not time out.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.timeout]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+ * from MDN.
+ * * [The timeout attribute]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+ * from W3C.
+ */
@DomName('XMLHttpRequest.timeout')
@DocsEditable()
@Experimental() // untriaged
@@ -14915,15 +15100,34 @@
* `send` method is intended only for more complext HTTP requests where
* finer-grained control is needed.
*
- * See also:
+ * ## Other resources
*
- * * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
* from MDN.
*/
@DomName('XMLHttpRequest.send')
@DocsEditable()
void send([data]) native "XMLHttpRequest_send_Callback";
+ /**
+ * Sets the value of an HTTP requst header.
+ *
+ * This method should be called after the request is opened, but before
+ * the request is sent.
+ *
+ * Multiple calls with the same header will combine all their values into a
+ * single header.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.setRequestHeader]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ * * [The setRequestHeader() method]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+ * W3C.
+ */
@DomName('XMLHttpRequest.setRequestHeader')
@DocsEditable()
void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
@@ -20342,6 +20546,9 @@
// Custom element created callback.
Node._created() : super._created();
+ /**
+ * A modifiable list of this node's children.
+ */
List<Node> get nodes {
return new _ChildNodeListLazy(this);
}
@@ -20467,14 +20674,41 @@
@DocsEditable()
String get _baseUri native "Node_baseURI_Getter";
+ /**
+ * A list of this node's children.
+ *
+ * ## Other resources
+ *
+ * * [Node.childNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
+ * from MDN.
+ */
@DomName('Node.childNodes')
@DocsEditable()
List<Node> get childNodes native "Node_childNodes_Getter";
+ /**
+ * The first child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.firstChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
+ * from MDN.
+ */
@DomName('Node.firstChild')
@DocsEditable()
Node get firstChild native "Node_firstChild_Getter";
+ /**
+ * The last child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.lastChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
+ * from MDN.
+ */
@DomName('Node.lastChild')
@DocsEditable()
Node get lastChild native "Node_lastChild_Getter";
@@ -20487,42 +20721,157 @@
@DocsEditable()
String get _namespaceUri native "Node_namespaceURI_Getter";
+ /**
+ * The next sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nextSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
+ * from MDN.
+ */
@DomName('Node.nextSibling')
@DocsEditable()
Node get nextNode native "Node_nextSibling_Getter";
+ /**
+ * The name of this node.
+ *
+ * This varies by this node's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)
+ * from MDN. This page contains a table of [nodeName] values for each
+ * [nodeType].
+ */
@DomName('Node.nodeName')
@DocsEditable()
String get nodeName native "Node_nodeName_Getter";
+ /**
+ * The type of node.
+ *
+ * This value is one of:
+ *
+ * * [ATTRIBUTE_NODE] if this node is an attribute.
+ * * [CDATA_SECTION_NODE] if this node is a [CDataSection].
+ * * [COMMENT_NODE] if this node is a [Comment].
+ * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].
+ * * [DOCUMENT_NODE] if this node is a [Document].
+ * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.
+ * * [ELEMENT_NODE] if this node is an [Element].
+ * * [ENTITY_NODE] if this node is an entity.
+ * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.
+ * * [NOTATION_NODE] if this node is a notation.
+ * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].
+ * * [TEXT_NODE] if this node is a [Text] node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeType]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.
+ */
@DomName('Node.nodeType')
@DocsEditable()
int get nodeType native "Node_nodeType_Getter";
+ /**
+ * The value of this node.
+ *
+ * This varies by this type's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeValue]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)
+ * from MDN. This page contains a table of [nodeValue] values for each
+ * [nodeType].
+ */
@DomName('Node.nodeValue')
@DocsEditable()
String get nodeValue native "Node_nodeValue_Getter";
+ /**
+ * The document this node belongs to.
+ *
+ * Returns `null` if this node does not belong to any document.
+ *
+ * ## Other resources
+ *
+ * * [Node.ownerDocument]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from
+ * MDN.
+ */
@DomName('Node.ownerDocument')
@DocsEditable()
Document get ownerDocument native "Node_ownerDocument_Getter";
+ /**
+ * The parent element of this node.
+ *
+ * Returns `null` if this node either does not have a parent or its parent is
+ * not an element.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentElement]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from
+ * W3C.
+ */
@DomName('Node.parentElement')
@DocsEditable()
Element get parent native "Node_parentElement_Getter";
+ /**
+ * The parent node of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from
+ * MDN.
+ */
@DomName('Node.parentNode')
@DocsEditable()
Node get parentNode native "Node_parentNode_Getter";
+ /**
+ * The previous sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.previousSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
+ * from MDN.
+ */
@DomName('Node.previousSibling')
@DocsEditable()
Node get previousNode native "Node_previousSibling_Getter";
+ /**
+ * All text within this node and its decendents.
+ *
+ * ## Other resources
+ *
+ * * [Node.textContent]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+ * MDN.
+ */
@DomName('Node.textContent')
@DocsEditable()
String get text native "Node_textContent_Getter";
+ /**
+ * All text within this node and its decendents.
+ *
+ * ## Other resources
+ *
+ * * [Node.textContent]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+ * MDN.
+ */
@DomName('Node.textContent')
@DocsEditable()
void set text(String value) native "Node_textContent_Setter";
@@ -20540,18 +20889,56 @@
@DocsEditable()
Node append(Node newChild) native "Node_appendChild_Callback";
+ /**
+ * Returns a copy of this node.
+ *
+ * If [deep] is `true`, then all of this node's children and decendents are
+ * copied as well. If [deep] is `false`, then only this node is copied.
+ *
+ * ## Other resources
+ *
+ * * [Node.cloneNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+ * MDN.
+ */
@DomName('Node.cloneNode')
@DocsEditable()
Node clone(bool deep) native "Node_cloneNode_Callback";
+ /**
+ * Returns true if this node contains the specified node.
+ *
+ * ## Other resources
+ *
+ * * [Node.contains]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+ */
@DomName('Node.contains')
@DocsEditable()
bool contains(Node other) native "Node_contains_Callback";
+ /**
+ * Returns true if this node has any children.
+ *
+ * ## Other resources
+ *
+ * * [Node.hasChildNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+ * MDN.
+ */
@DomName('Node.hasChildNodes')
@DocsEditable()
bool hasChildNodes() native "Node_hasChildNodes_Callback";
+ /**
+ * Inserts all of the nodes into this node directly before refChild.
+ *
+ * ## Other resources
+ *
+ * * [Node.insertBefore]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+ * MDN.
+ */
@DomName('Node.insertBefore')
@DocsEditable()
Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";
@@ -28017,12 +28404,14 @@
* Top-level container for the current browser tab or window.
*
* In a web browser, each window has a [Window] object, but within the context
- * of a script, a [Window] object represents only the current window. In
- * addition to the open window, each window, tab, and iframe has its own
- * [Window] object. A [Window] contains a [Document] object, which contains this
- * web page's content.
+ * of a script, this object represents only the current window.
+ * Each other window, tab, and iframe has its own [Window] object.
*
- * Use `window` to access properties of the current window. For example:
+ * Each window contains a [Document] object, which contains all of the window's
+ * content.
+ *
+ * Use the top-level `window` object to access the current window.
+ * For example:
*
* // Draw a scene when the window repaints.
* drawScene(num delta) {...}
@@ -28032,8 +28421,12 @@
* window.console.log('Jinkies!');
* window.console.error('Jeepers!');
*
- * **Note:** This class represents the current window, whereas [WindowBase] is
- * a representation of any window, including other tabs, windows, and frames.
+ * **Note:** This class represents only the current window, while [WindowBase]
+ * is a representation of any window, including other tabs, windows, and frames.
+ *
+ * ## See also
+ *
+ * * [WindowBase]
*
* ## Other resources
*
@@ -31575,32 +31968,40 @@
/**
- * An object that can be drawn to a [CanvasRenderingContext2D] object with
- * [CanvasRenderingContext2D.drawImage],
- * [CanvasRenderingContext2D.drawImageToRect],
- * [CanvasRenderingContext2D.drawImageScaled], or
- * [CanvasRenderingContext2D.drawImageScaledFromSource].
+ * An object that can be drawn to a 2D canvas rendering context.
*
- * If the CanvasImageSource is an [ImageElement] then the element's image is
- * used. If the [ImageElement] is an animated image, then the poster frame is
- * used. If there is no poster frame, then the first frame of animation is used.
+ * The image drawn to the canvas depends on the type of this object:
*
- * If the CanvasImageSource is a [VideoElement] then the frame at the current
- * playback position is used as the image.
+ * * If this object is an [ImageElement], then this element's image is
+ * drawn to the canvas. If this element is an animated image, then this
+ * element's poster frame is drawn. If this element has no poster frame, then
+ * the first frame of animation is drawn.
*
- * If the CanvasImageSource is a [CanvasElement] then the element's bitmap is
- * used.
+ * * If this object is a [VideoElement], then the frame at this element's current
+ * playback position is drawn to the canvas.
*
- * ** Note: ** Currently, all versions of Internet Explorer do not support
- * drawing a VideoElement to a canvas. Also, you may experience problems drawing
+ * * If this object is a [CanvasElement], then this element's bitmap is drawn to
+ * the canvas.
+ *
+ * **Note:** Currently all versions of Internet Explorer do not support
+ * drawing a video element to a canvas. You may also encounter problems drawing
* a video to a canvas in Firefox if the source of the video is a data URL.
*
- * See also:
+ * ## See also
*
- * * [CanvasImageSource](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
- * from the WHATWG.
- * * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
- * from the WHATWG.
+ * * [CanvasRenderingContext2D.drawImage]
+ * * [CanvasRenderingContext2D.drawImageToRect]
+ * * [CanvasRenderingContext2D.drawImageScaled]
+ * * [CanvasRenderingContext2D.drawImageScaledFromSource]
+ *
+ * ## Other resources
+ *
+ * * [Image sources for 2D rendering contexts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
+ * from WHATWG.
+ * * [Drawing images]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
+ * from WHATWG.
*/
abstract class CanvasImageSource {}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -31611,13 +32012,17 @@
/**
* Top-level container for a browser tab or window.
*
- * In a web browser, a [WindowBase] object represents any browser window. This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
*
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
* used to access the properties and content of the current window or tab.
*
+ * ## See also
+ *
+ * * [Window]
+ *
* ## Other resources
*
* * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
@@ -35449,8 +35854,42 @@
@Experimental()
ElementList queryAll(String relativeSelectors) => document.queryAll(relativeSelectors);
-Element querySelector(String selector) => document.querySelector(selector);
-ElementList querySelectorAll(String selector) => document.querySelectorAll(selector);
+/**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+Element querySelector(String selectors) => document.querySelector(selectors);
+
+/**
+ * Finds all descendant elements of this document that match the specified
+ * group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelectorAll]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ElementList querySelectorAll(String selectors) => document.querySelectorAll(selectors);
// 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/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index fb3fbe4..79df03c 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -8,7 +8,7 @@
/**
* An instance of the default implementation of the [ZLibCodec].
*/
-const ZLIB = const ZLibCodec();
+const ZLibCodec ZLIB = const ZLibCodec();
/**
@@ -45,7 +45,7 @@
/**
* An instance of the default implementation of the [GZipCodec].
*/
-const GZIP = const GZipCodec();
+const GZipCodec GZIP = const GZipCodec();
/**
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 2d31161..aa000ff 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -1537,7 +1537,7 @@
* [HttpClientResponse] connection.
*/
abstract class HttpConnectionInfo {
- String get remoteHost;
+ InternetAddress get remoteAddress;
int get remotePort;
int get localPort;
}
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 2fd3659..07ef4fe 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -2201,7 +2201,7 @@
if (socket == null) return null;
try {
_HttpConnectionInfo info = new _HttpConnectionInfo();
- info.remoteHost = socket.remoteHost;
+ info.remoteAddress = socket.remoteAddress;
info.remotePort = socket.remotePort;
info.localPort = socket.port;
return info;
@@ -2209,7 +2209,7 @@
return null;
}
- String remoteHost;
+ InternetAddress remoteAddress;
int remotePort;
int localPort;
}
@@ -2268,7 +2268,7 @@
InternetAddress get address => _socket.address;
- String get remoteHost => _socket.remoteHost;
+ InternetAddress get remoteAddress => _socket.remoteAddress;
int get remotePort => _socket.remotePort;
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 16d0a1e..48bf58b 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -80,12 +80,20 @@
static String get executable => _Platform.executable;
/**
- * Returns the URI of the script being run in this
- * isolate. If the URI is relative it is relative to the file URI of
- * the working directory of the VM when it was started.
+ * Returns the absolute URI of the script being run in this
+ * isolate.
+ *
+ * If the script argument on the command line is relative,
+ * it is resolved to an absolute URI before fetching the script, and
+ * this absolute URI is returned.
+ *
+ * URI resolution only does string manipulation on the script path, and this
+ * may be different from the file system's path resolution behavior. For
+ * example, a symbolic link immediately followed by '..' will not be
+ * looked up.
*
* If the executable environment does not support [script] an empty
- * URI is returned.
+ * [Uri] is returned.
*/
static Uri get script => _Platform.script;
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index 3e018a0..40fe2f0 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -27,7 +27,7 @@
s.startsWith('file:')) {
return Uri.parse(s);
} else {
- return new Uri.file(s);
+ return Uri.base.resolveUri(new Uri.file(s));
}
}
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 8ad69d3..7d8c685 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -603,7 +603,7 @@
int get port => _socket.port;
- String get remoteHost => _socket.remoteHost;
+ InternetAddress get remoteAddress => _socket.remoteAddress;
int get remotePort => _socket.remotePort;
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index ce8ace5..f821d8b 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -381,9 +381,9 @@
InternetAddress get address;
/**
- * Returns the remote host connected to by this socket.
+ * Returns the remote [InternetAddress] connected to by this socket.
*/
- String get remoteHost;
+ InternetAddress get remoteAddress;
/**
* Closes the socket. Returns a Future that completes with [this] when the
@@ -427,9 +427,9 @@
}
/**
- * A high-level class for communicating over a TCP socket.
+ * A high-level class for communicating over a TCP socket.
*
- * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it
+ * 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 {
@@ -478,9 +478,9 @@
InternetAddress get address;
/**
- * Returns the remote host connected to by this socket.
+ * Returns the remote [InternetAddress] connected to by this socket.
*/
- String get remoteHost;
+ InternetAddress get remoteAddress;
}
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index dafd2bd..091f0d6 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -4,7 +4,7 @@
part of dart.io;
-const SYSTEM_ENCODING = const SystemEncoding();
+const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
/**
* The system encoding is the current code page on Windows and UTF-8 on
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index f7d1aed..6440bc4 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -98,10 +98,8 @@
* is also possible to send object instances (which would be copied in the
* process). This is currently only supported by the dartvm. For now, the
* dart2js compiler only supports the restricted messages described above.
- *
- * The second argument [replyTo] is deprecated and its value is ignored.
*/
- void send(var message, [SendPort replyTo]);
+ void send(var message);
/**
* Tests whether [other] is a [SendPort] pointing to the same
diff --git a/sdk/lib/math/point.dart b/sdk/lib/math/point.dart
index 37411b7..6c731c1 100644
--- a/sdk/lib/math/point.dart
+++ b/sdk/lib/math/point.dart
@@ -10,7 +10,7 @@
final T x;
final T y;
- const Point([T x = 0, T y = 0]): this.x = x, this.y = y;
+ const Point(T x, T y): this.x = x, this.y = y;
String toString() => 'Point($x, $y)';
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index e354001..b52d22b 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -30,6 +30,11 @@
}
+/**
+ * A sequence of bytes underlying a typed data object.
+ * Used to process large quantities of binary or numerical data
+ * more efficiently using a typed view.
+ */
class ByteBuffer native "ArrayBuffer" {
@JSName('byteLength')
final int lengthInBytes;
@@ -47,17 +52,33 @@
: function(x) { return x.length; };
''');
+/**
+ * A typed view of a sequence of bytes.
+ */
class TypedData native "ArrayBufferView" {
+ /**
+ * Returns the byte buffer associated with this object.
+ */
@Creates('ByteBuffer')
@Returns('ByteBuffer|Null')
final ByteBuffer buffer;
+ /**
+ * Returns the length of this view, in bytes.
+ */
@JSName('byteLength')
final int lengthInBytes;
+ /**
+ * Returns the offset in bytes into the underlying byte buffer of this view.
+ */
@JSName('byteOffset')
final int offsetInBytes;
+ /**
+ * Returns the number of bytes in the representation of each element in this
+ * list.
+ */
@JSName('BYTES_PER_ELEMENT')
final int elementSizeInBytes;
@@ -102,15 +123,58 @@
}
+/**
+ * A fixed-length, random-access sequence of bytes that also provides random
+ * and unaligned access to the fixed-width integers and floating point
+ * numbers represented by those bytes.
+ * ByteData may be used to pack and unpack data from external sources
+ * (such as networks or files systems), and to process large quantities
+ * of numerical data more efficiently than would be possible
+ * with ordinary [List] implementations. ByteData can save space, by
+ * eliminating the need for object headers, and time, by eliminating the
+ * need for data copies. Finally, ByteData may be used to intentionally
+ * reinterpret the bytes representing one arithmetic type as another.
+ * For example this code fragment determine what 32-bit signed integer
+ * is represented by the bytes of a 32-bit floating point number:
+ *
+ * var buffer = new Uint8List(8).buffer;
+ * var bdata = new ByteData.view(buffer);
+ * bdata.setFloat32(0, 3.04);
+ * int huh = bdata.getInt32(0);
+ */
class ByteData extends TypedData native "DataView" {
+ /**
+ * Creates a [ByteData] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory ByteData(int length) => _create1(length);
+ /**
+ * Creates an [ByteData] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [ByteData] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ */
factory ByteData.view(ByteBuffer buffer,
[int byteOffset = 0, int byteLength]) =>
byteLength == null
? _create2(buffer, byteOffset)
: _create3(buffer, byteOffset, byteLength);
+ /**
+ * Returns the floating point number represented by the four bytes at
+ * the specified [byteOffset] in this object, in IEEE 754
+ * single-precision binary floating-point format (binary32).
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 4` is greater than the length of this object.
+ */
num getFloat32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getFloat32(byteOffset, endian._littleEndian);
@@ -118,6 +182,14 @@
@Returns('num')
num _getFloat32(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the floating point number represented by the eight bytes at
+ * the specified [byteOffset] in this object, in IEEE 754
+ * double-precision binary floating-point format (binary64).
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
num getFloat64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getFloat64(byteOffset, endian._littleEndian);
@@ -125,6 +197,16 @@
@Returns('num')
num _getFloat64(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the (possibly negative) integer represented by the two bytes at
+ * the specified [byteOffset] in this object, in two's complement binary
+ * form.
+ * The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
+ * inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 2` is greater than the length of this object.
+ */
int getInt16(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getInt16(byteOffset, endian._littleEndian);
@@ -132,6 +214,16 @@
@Returns('int')
int _getInt16(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the (possibly negative) integer represented by the four bytes at
+ * the specified [byteOffset] in this object, in two's complement binary
+ * form.
+ * The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
+ * inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 4` is greater than the length of this object.
+ */
int getInt32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getInt32(byteOffset, endian._littleEndian);
@@ -139,12 +231,39 @@
@Returns('int')
int _getInt32(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the (possibly negative) integer represented by the eight bytes at
+ * the specified [byteOffset] in this object, in two's complement binary
+ * form.
+ * The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
+ * inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
int getInt64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
throw new UnsupportedError("Int64 accessor not supported by dart2js.");
}
+ /**
+ * Returns the (possibly negative) integer represented by the byte at the
+ * specified [byteOffset] in this object, in two's complement binary
+ * representation. The return value will be between -128 and 127, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * greater than or equal to the length of this object.
+ */
int getInt8(int byteOffset) native;
+ /**
+ * Returns the positive integer represented by the two bytes starting
+ * at the specified [byteOffset] in this object, in unsigned binary
+ * form.
+ * The return value will be between 0 and 2<sup>16</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 2` is greater than the length of this object.
+ */
int getUint16(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getUint16(byteOffset, endian._littleEndian);
@@ -152,6 +271,13 @@
@Returns('int')
int _getUint16(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the positive integer represented by the four bytes starting
+ * at the specified [byteOffset] in this object, in unsigned binary
+ * form.
+ * The return value will be between 0 and 2<sup>32</sup> - 1, inclusive.
+ *
+ */
int getUint32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_getUint32(byteOffset, endian._littleEndian);
@@ -159,58 +285,172 @@
@Returns('int')
int _getUint32(int byteOffset, [bool littleEndian]) native;
+ /**
+ * Returns the positive integer represented by the eight bytes starting
+ * at the specified [byteOffset] in this object, in unsigned binary
+ * form.
+ * The return value will be between 0 and 2<sup>64</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
int getUint64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
}
+ /**
+ * Returns the positive integer represented by the byte at the specified
+ * [byteOffset] in this object, in unsigned binary form. The
+ * return value will be between 0 and 255, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * greater than or equal to the length of this object.
+ */
int getUint8(int byteOffset) native;
+ /**
+ * Sets the four bytes starting at the specified [byteOffset] in this
+ * object to the IEEE 754 single-precision binary floating-point
+ * (binary32) representation of the specified [value].
+ *
+ * **Note that this method can lose precision.** The input [value] is
+ * a 64-bit floating point value, which will be converted to 32-bit
+ * floating point value by IEEE 754 rounding rules before it is stored.
+ * If [value] cannot be represented exactly as a binary32, it will be
+ * converted to the nearest binary32 value. If two binary32 values are
+ * equally close, the one whose least significant bit is zero will be used.
+ * Note that finite (but large) values can be converted to infinity, and
+ * small non-zero values can be converted to zero.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 4` is greater than the length of this object.
+ */
void setFloat32(int byteOffset, num value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setFloat32(byteOffset, value, endian._littleEndian);
@JSName('setFloat32')
void _setFloat32(int byteOffset, num value, [bool littleEndian]) native;
+ /**
+ * Sets the eight bytes starting at the specified [byteOffset] in this
+ * object to the IEEE 754 double-precision binary floating-point
+ * (binary64) representation of the specified [value].
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
void setFloat64(int byteOffset, num value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setFloat64(byteOffset, value, endian._littleEndian);
@JSName('setFloat64')
void _setFloat64(int byteOffset, num value, [bool littleEndian]) native;
+ /**
+ * Sets the two bytes starting at the specified [byteOffset] in this
+ * object to the two's complement binary representation of the specified
+ * [value], which must fit in two bytes. In other words, [value] must lie
+ * between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 2` is greater than the length of this object.
+ */
void setInt16(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setInt16(byteOffset, value, endian._littleEndian);
@JSName('setInt16')
void _setInt16(int byteOffset, int value, [bool littleEndian]) native;
+ /**
+ * Sets the four bytes starting at the specified [byteOffset] in this
+ * object to the two's complement binary representation of the specified
+ * [value], which must fit in four bytes. In other words, [value] must lie
+ * between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 4` is greater than the length of this object.
+ */
void setInt32(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setInt32(byteOffset, value, endian._littleEndian);
@JSName('setInt32')
void _setInt32(int byteOffset, int value, [bool littleEndian]) native;
+ /**
+ * Sets the eight bytes starting at the specified [byteOffset] in this
+ * object to the two's complement binary representation of the specified
+ * [value], which must fit in eight bytes. In other words, [value] must lie
+ * between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
void setInt64(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) {
throw new UnsupportedError("Int64 accessor not supported by dart2js.");
}
+ /**
+ * Sets the byte at the specified [byteOffset] in this object to the
+ * two's complement binary representation of the specified [value], which
+ * must fit in a single byte. In other words, [value] must be between
+ * -128 and 127, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * greater than or equal to the length of this object.
+ */
void setInt8(int byteOffset, int value) native;
+ /**
+ * Sets the two bytes starting at the specified [byteOffset] in this object
+ * to the unsigned binary representation of the specified [value],
+ * which must fit in two bytes. in other words, [value] must be between
+ * 0 and 2<sup>16</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 2` is greater than the length of this object.
+ */
void setUint16(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setUint16(byteOffset, value, endian._littleEndian);
@JSName('setUint16')
void _setUint16(int byteOffset, int value, [bool littleEndian]) native;
+ /**
+ * Sets the four bytes starting at the specified [byteOffset] in this object
+ * to the unsigned binary representation of the specified [value],
+ * which must fit in four bytes. in other words, [value] must be between
+ * 0 and 2<sup>32</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 4` is greater than the length of this object.
+ */
void setUint32(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) =>
_setUint32(byteOffset, value, endian._littleEndian);
@JSName('setUint32')
void _setUint32(int byteOffset, int value, [bool littleEndian]) native;
+ /**
+ * Sets the eight bytes starting at the specified [byteOffset] in this object
+ * to the unsigned binary representation of the specified [value],
+ * which must fit in eight bytes. in other words, [value] must be between
+ * 0 and 2<sup>64</sup> - 1, inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative, or
+ * `byteOffset + 8` is greater than the length of this object.
+ */
void setUint64(int byteOffset, int value, [Endianness endian=Endianness.BIG_ENDIAN]) {
throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
}
+ /**
+ * Sets the byte at the specified [byteOffset] in this object to the
+ * unsigned binary representation of the specified [value], which must fit
+ * in a single byte. in other words, [value] must be between 0 and 255,
+ * inclusive.
+ *
+ * Throws [RangeError] if [byteOffset] is negative,
+ * or greater than or equal to the length of this object.
+ */
void setUint8(int byteOffset, int value) native;
static ByteData _create1(arg) =>
@@ -224,16 +464,44 @@
.._setCachedLength();
}
-
+/**
+ * A fixed-length list of IEEE 754 single-precision binary floating-point
+ * numbers that is viewable as a [TypedData]. For long lists, this
+ * implementation can be considerably more space- and time-efficient than
+ * the default [List] implementation.
+ */
class Float32List
extends TypedData with ListMixin<double>, FixedLengthListMixin<double>
implements JavaScriptIndexingBehavior, List<double>
native "Float32Array" {
+ /**
+ * Creates a [Float32List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Float32List(int length) => _create1(length);
+ /**
+ * Creates a [Float32List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Float32List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Float32List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Float32List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Float32List.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -274,15 +542,44 @@
}
+/**
+ * A fixed-length list of IEEE 754 double-precision binary floating-point
+ * numbers that is viewable as a [TypedData]. For long lists, this
+ * implementation can be considerably more space- and time-efficient than
+ * the default [List] implementation.
+ */
class Float64List
extends TypedData with ListMixin<double>, FixedLengthListMixin<double>
implements JavaScriptIndexingBehavior, List<double>
native "Float64Array" {
+ /**
+ * Creates a [Float64List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Float64List(int length) => _create1(length);
+ /**
+ * Creates a [Float64List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Float64List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Float64List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Float64List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Float64List.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -326,15 +623,43 @@
}
+/**
+ * A fixed-length list of 16-bit signed integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Int16List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
native "Int16Array" {
+ /**
+ * Creates an [Int16List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Int16List(int length) => _create1(length);
+ /**
+ * Creates a [Int16List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Int16List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates an [Int16List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int16List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Int16List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
length == null
? _create2(buffer, byteOffset)
@@ -373,15 +698,43 @@
}
+/**
+ * A fixed-length list of 32-bit signed integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Int32List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
native "Int32Array" {
+ /**
+ * Creates an [Int32List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Int32List(int length) => _create1(length);
+ /**
+ * Creates a [Int32List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Int32List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates an [Int32List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int32List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Int32List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
length == null
? _create2(buffer, byteOffset)
@@ -420,15 +773,40 @@
}
+/**
+ * A fixed-length list of 8-bit signed integers.
+ * For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Int8List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
native "Int8Array" {
+ /**
+ * Creates an [Int8List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Int8List(int length) => _create1(length);
+ /**
+ * Creates a [Int8List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Int8List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates an [Int8List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int8List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ */
factory Int8List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
length == null
? _create2(buffer, byteOffset)
@@ -467,15 +845,43 @@
}
+/**
+ * A fixed-length list of 16-bit unsigned integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Uint16List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
native "Uint16Array" {
+ /**
+ * Creates a [Uint16List] of the specified length (in elements), all
+ * of whose elements are initially zero.
+ */
factory Uint16List(int length) => _create1(length);
+ /**
+ * Creates a [Uint16List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Uint16List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Uint16List] _view_ of the specified region in
+ * the specified byte buffer. Changes in the [Uint16List] will be
+ * visible in the byte buffer and vice versa. If the [offsetInBytes] index
+ * of the region is not specified, it defaults to zero (the first byte in
+ * the byte buffer). If the length is not specified, it defaults to null,
+ * which indicates that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Uint16List.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -515,15 +921,43 @@
}
+/**
+ * A fixed-length list of 32-bit unsigned integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Uint32List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
native "Uint32Array" {
+ /**
+ * Creates a [Uint32List] of the specified length (in elements), all
+ * of whose elements are initially zero.
+ */
factory Uint32List(int length) => _create1(length);
+ /**
+ * Creates a [Uint32List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Uint32List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Uint32List] _view_ of the specified region in
+ * the specified byte buffer. Changes in the [Uint32] will be
+ * visible in the byte buffer and vice versa. If the [offsetInBytes] index
+ * of the region is not specified, it defaults to zero (the first byte in
+ * the byte buffer). If the length is not specified, it defaults to null,
+ * which indicates that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Uint32List.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -563,14 +997,40 @@
}
+/**
+ * A fixed-length list of 8-bit unsigned integers.
+ * For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ * Indexed store clamps the value to range 0..0xFF.
+ */
class Uint8ClampedList extends TypedData with ListMixin<int>,
FixedLengthListMixin<int> implements JavaScriptIndexingBehavior, List<int>
native "Uint8ClampedArray,CanvasPixelArray" {
+ /**
+ * Creates a [Uint8ClampedList] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Uint8ClampedList(int length) => _create1(length);
+ /**
+ * Creates a [Uint8ClampedList] of the same size as the [elements]
+ * list and copies over the values clamping when needed.
+ */
factory Uint8ClampedList.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Uint8ClampedList] _view_ of the specified region in the
+ * specified byte [buffer]. Changes in the [Uint8List] will be visible in the
+ * byte buffer and vice versa. If the [offsetInBytes] index of the region is
+ * not specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates that
+ * the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ */
factory Uint8ClampedList.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -612,6 +1072,11 @@
}
+/**
+ * A fixed-length list of 8-bit unsigned integers.
+ * For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Uint8List
extends TypedData with ListMixin<int>, FixedLengthListMixin<int>
implements JavaScriptIndexingBehavior, List<int>
@@ -620,11 +1085,31 @@
// the potential for Uint8ClampedArray to 'accidentally' pick up the
// dispatch record for Uint8List.
native "Uint8Array,!nonleaf" {
+ /**
+ * Creates a [Uint8List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Uint8List(int length) => _create1(length);
+ /**
+ * Creates a [Uint8List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Uint8List.fromList(List<num> list) =>
_create1(_ensureNativeList(list));
+ /**
+ * Creates a [Uint8List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Uint8List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ */
factory Uint8List.view(ByteBuffer buffer,
[int byteOffset = 0, int length]) =>
length == null
@@ -664,15 +1149,43 @@
}
+/**
+ * A fixed-length list of 64-bit signed integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Int64List extends TypedData implements JavaScriptIndexingBehavior, List<int> {
+ /**
+ * Creates an [Int64List] of the specified length (in elements), all of
+ * whose elements are initially zero.
+ */
factory Int64List(int length) {
throw new UnsupportedError("Int64List not supported by dart2js.");
}
+ /**
+ * Creates a [Int64List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Int64List.fromList(List<int> list) {
throw new UnsupportedError("Int64List not supported by dart2js.");
}
+ /**
+ * Creates an [Int64List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int64List] will be visible in the byte buffer
+ * and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates that
+ * the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Int64List.view(ByteBuffer buffer, [int byteOffset, int length]) {
throw new UnsupportedError("Int64List not supported by dart2js.");
}
@@ -681,15 +1194,44 @@
}
+/**
+ * A fixed-length list of 64-bit unsigned integers that is viewable as a
+ * [TypedData]. For long lists, this implementation can be considerably
+ * more space- and time-efficient than the default [List] implementation.
+ */
class Uint64List extends TypedData implements JavaScriptIndexingBehavior, List<int> {
+ /**
+ * Creates a [Uint64List] of the specified length (in elements), all
+ * of whose elements are initially zero.
+ */
factory Uint64List(int length) {
throw new UnsupportedError("Uint64List not supported by dart2js.");
}
+ /**
+ * Creates a [Uint64List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Uint64List.fromList(List<int> list) {
throw new UnsupportedError("Uint64List not supported by dart2js.");
}
+ /**
+ * Creates an [Uint64List] _view_ of the specified region in
+ * the specified byte buffer. Changes in the [Uint64List] will be
+ * visible in the byte buffer and vice versa. If the [offsetInBytes]
+ * index of the region is not specified, it defaults to zero (the first
+ * byte in the byte buffer). If the length is not specified, it defaults
+ * to null, which indicates that the view extends to the end of the byte
+ * buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
factory Uint64List.view(ByteBuffer buffer, [int byteOffset, int length]) {
throw new UnsupportedError("Uint64List not supported by dart2js.");
}
@@ -698,6 +1240,11 @@
}
+/**
+ * A fixed-length list of Float32x4 numbers that is viewable as a
+ * [TypedData]. For long lists, this implementation will be considerably more
+ * space- and time-efficient than the default [List] implementation.
+ */
class Float32x4List
extends Object with ListMixin<Float32x4>, FixedLengthListMixin<Float32x4>
implements List<Float32x4>, TypedData {
@@ -738,6 +1285,10 @@
return end;
}
+ /**
+ * Creates a [Float32x4List] of the specified length (in elements),
+ * all of whose elements are initially zero.
+ */
Float32x4List(int length) : _storage = new Float32List(length*4);
Float32x4List._externalStorage(Float32List storage) : _storage = storage;
@@ -753,6 +1304,10 @@
}
}
+ /**
+ * Creates a [Float32x4List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
factory Float32x4List.fromList(List<Float32x4> list) {
if (list is Float32x4List) {
Float32x4List nativeList = list as Float32x4List;
@@ -763,6 +1318,21 @@
}
}
+ /**
+ * Creates a [Float32x4List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Float32x4List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
Float32x4List.view(ByteBuffer buffer,
[int byteOffset = 0, int length])
: _storage = new Float32List.view(buffer, byteOffset, length);
@@ -795,9 +1365,14 @@
}
-class Uint32x4List
- extends Object with ListMixin<Uint32x4>, FixedLengthListMixin<Uint32x4>
- implements List<Uint32x4>, TypedData {
+/**
+ * A fixed-length list of Int32x4 numbers that is viewable as a
+ * [TypedData]. For long lists, this implementation will be considerably more
+ * space- and time-efficient than the default [List] implementation.
+ */
+class Int32x4List
+ extends Object with ListMixin<Int32x4>, FixedLengthListMixin<Int32x4>
+ implements List<Int32x4>, TypedData {
final Uint32List _storage;
@@ -835,11 +1410,15 @@
return end;
}
- Uint32x4List(int length) : _storage = new Uint32List(length*4);
+ /**
+ * Creates a [Int32x4List] of the specified length (in elements),
+ * all of whose elements are initially zero.
+ */
+ Int32x4List(int length) : _storage = new Uint32List(length*4);
- Uint32x4List._externalStorage(Uint32List storage) : _storage = storage;
+ Int32x4List._externalStorage(Uint32List storage) : _storage = storage;
- Uint32x4List._slowFromList(List<Uint32x4> list)
+ Int32x4List._slowFromList(List<Int32x4> list)
: _storage = new Uint32List(list.length * 4) {
for (int i = 0; i < list.length; i++) {
var e = list[i];
@@ -850,17 +1429,36 @@
}
}
- factory Uint32x4List.fromList(List<Uint32x4> list) {
- if (list is Uint32x4List) {
- Uint32x4List nativeList = list as Uint32x4List;
- return new Uint32x4List._externalStorage(
+ /**
+ * Creates a [Int32x4List] with the same size as the [elements] list
+ * and copies over the elements.
+ */
+ factory Int32x4List.fromList(List<Int32x4> list) {
+ if (list is Int32x4List) {
+ Int32x4List nativeList = list as Int32x4List;
+ return new Int32x4List._externalStorage(
new Uint32List.fromList(nativeList._storage));
} else {
- return new Uint32x4List._slowFromList(list);
+ return new Int32x4List._slowFromList(list);
}
}
- Uint32x4List.view(ByteBuffer buffer,
+ /**
+ * Creates a [Int32x4List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int32x4List] will be visible in the byte
+ * buffer and vice versa. If the [offsetInBytes] index of the region is not
+ * specified, it defaults to zero (the first byte in the byte buffer).
+ * If the length is not specified, it defaults to null, which indicates
+ * that the view extends to the end of the byte buffer.
+ *
+ * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+ * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+ * the length of [buffer].
+ *
+ * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
+ * BYTES_PER_ELEMENT.
+ */
+ Int32x4List.view(ByteBuffer buffer,
[int byteOffset = 0, int length])
: _storage = new Uint32List.view(buffer, byteOffset, length);
@@ -868,16 +1466,16 @@
int get length => _storage.length ~/ 4;
- Uint32x4 operator[](int index) {
+ Int32x4 operator[](int index) {
_checkIndex(index, length);
int _x = _storage[(index*4)+0];
int _y = _storage[(index*4)+1];
int _z = _storage[(index*4)+2];
int _w = _storage[(index*4)+3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- void operator[]=(int index, Uint32x4 value) {
+ void operator[]=(int index, Int32x4 value) {
_checkIndex(index, length);
_storage[(index*4)+0] = value._storage[0];
_storage[(index*4)+1] = value._storage[1];
@@ -885,13 +1483,18 @@
_storage[(index*4)+3] = value._storage[3];
}
- List<Uint32x4> sublist(int start, [int end]) {
+ List<Int32x4> sublist(int start, [int end]) {
end = _checkSublistArguments(start, end, length);
- return new Uint32x4List._externalStorage(_storage.sublist(start*4, end*4));
+ return new Int32x4List._externalStorage(_storage.sublist(start*4, end*4));
}
}
+/**
+ * Interface of Dart Float32x4 immutable value type and operations.
+ * Float32x4 stores 4 32-bit floating point values in "lanes".
+ * The lanes are "x", "y", "z", and "w" respectively.
+ */
class Float32x4 {
final _storage = new Float32List(4);
@@ -909,7 +1512,7 @@
}
Float32x4.zero();
/// Returns a bit-wise copy of [x] as a Float32x4.
- Float32x4.fromUint32x4Bits(Uint32x4 x) {
+ Float32x4.fromInt32x4Bits(Int32x4 x) {
var view = new Float32List.view(x._storage.buffer);
_storage[0] = view[0];
_storage[1] = view[1];
@@ -963,72 +1566,72 @@
}
/// Relational less than.
- Uint32x4 lessThan(Float32x4 other) {
+ Int32x4 lessThan(Float32x4 other) {
bool _cx = _storage[0] < other._storage[0];
bool _cy = _storage[1] < other._storage[1];
bool _cz = _storage[2] < other._storage[2];
bool _cw = _storage[3] < other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
}
/// Relational less than or equal.
- Uint32x4 lessThanOrEqual(Float32x4 other) {
+ Int32x4 lessThanOrEqual(Float32x4 other) {
bool _cx = _storage[0] <= other._storage[0];
bool _cy = _storage[1] <= other._storage[1];
bool _cz = _storage[2] <= other._storage[2];
bool _cw = _storage[3] <= other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
}
/// Relational greater than.
- Uint32x4 greaterThan(Float32x4 other) {
+ Int32x4 greaterThan(Float32x4 other) {
bool _cx = _storage[0] > other._storage[0];
bool _cy = _storage[1] > other._storage[1];
bool _cz = _storage[2] > other._storage[2];
bool _cw = _storage[3] > other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
}
/// Relational greater than or equal.
- Uint32x4 greaterThanOrEqual(Float32x4 other) {
+ Int32x4 greaterThanOrEqual(Float32x4 other) {
bool _cx = _storage[0] >= other._storage[0];
bool _cy = _storage[1] >= other._storage[1];
bool _cz = _storage[2] >= other._storage[2];
bool _cw = _storage[3] >= other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
}
/// Relational equal.
- Uint32x4 equal(Float32x4 other) {
+ Int32x4 equal(Float32x4 other) {
bool _cx = _storage[0] == other._storage[0];
bool _cy = _storage[1] == other._storage[1];
bool _cz = _storage[2] == other._storage[2];
bool _cw = _storage[3] == other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
}
/// Relational not-equal.
- Uint32x4 notEqual(Float32x4 other) {
+ Int32x4 notEqual(Float32x4 other) {
bool _cx = _storage[0] != other._storage[0];
bool _cy = _storage[1] != other._storage[1];
bool _cz = _storage[2] != other._storage[2];
bool _cw = _storage[3] != other._storage[3];
- return new Uint32x4(_cx == true ? 0xFFFFFFFF : 0x0,
+ return new Int32x4(_cx == true ? 0xFFFFFFFF : 0x0,
_cy == true ? 0xFFFFFFFF : 0x0,
_cz == true ? 0xFFFFFFFF : 0x0,
_cw == true ? 0xFFFFFFFF : 0x0);
@@ -1472,25 +2075,30 @@
}
-class Uint32x4 {
- final _storage = new Uint32List(4);
+/**
+ * Interface of Dart Int32x4 and operations.
+ * Int32x4 stores 4 32-bit bit-masks in "lanes".
+ * The lanes are "x", "y", "z", and "w" respectively.
+ */
+class Int32x4 {
+ final _storage = new Int32List(4);
- Uint32x4(int x, int y, int z, int w) {
+ Int32x4(int x, int y, int z, int w) {
_storage[0] = x;
_storage[1] = y;
_storage[2] = z;
_storage[3] = w;
}
- Uint32x4.bool(bool x, bool y, bool z, bool w) {
+ Int32x4.bool(bool x, bool y, bool z, bool w) {
_storage[0] = x == true ? 0xFFFFFFFF : 0x0;
_storage[1] = y == true ? 0xFFFFFFFF : 0x0;
_storage[2] = z == true ? 0xFFFFFFFF : 0x0;
_storage[3] = w == true ? 0xFFFFFFFF : 0x0;
}
- /// Returns a bit-wise copy of [x] as a Uint32x4.
- Uint32x4.fromFloat32x4Bits(Float32x4 x) {
+ /// Returns a bit-wise copy of [x] as a Int32x4.
+ Int32x4.fromFloat32x4Bits(Float32x4 x) {
var view = new Uint32List.view(x._storage.buffer);
_storage[0] = view[0];
_storage[1] = view[1];
@@ -1499,34 +2107,34 @@
}
/// The bit-wise or operator.
- Uint32x4 operator|(Uint32x4 other) {
+ Int32x4 operator|(Int32x4 other) {
int _x = _storage[0] | other._storage[0];
int _y = _storage[1] | other._storage[1];
int _z = _storage[2] | other._storage[2];
int _w = _storage[3] | other._storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
/// The bit-wise and operator.
- Uint32x4 operator&(Uint32x4 other) {
+ Int32x4 operator&(Int32x4 other) {
int _x = _storage[0] & other._storage[0];
int _y = _storage[1] & other._storage[1];
int _z = _storage[2] & other._storage[2];
int _w = _storage[3] & other._storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
/// The bit-wise xor operator.
- Uint32x4 operator^(Uint32x4 other) {
+ Int32x4 operator^(Int32x4 other) {
int _x = _storage[0] ^ other._storage[0];
int _y = _storage[1] ^ other._storage[1];
int _z = _storage[2] ^ other._storage[2];
int _w = _storage[3] ^ other._storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- Uint32x4 operator+(Uint32x4 other) {
- var r = new Uint32x4(0, 0, 0, 0);
+ Int32x4 operator+(Int32x4 other) {
+ var r = new Int32x4(0, 0, 0, 0);
r._storage[0] = (_storage[0] + other._storage[0]);
r._storage[1] = (_storage[1] + other._storage[1]);
r._storage[2] = (_storage[2] + other._storage[2]);
@@ -1534,8 +2142,8 @@
return r;
}
- Uint32x4 operator-(Uint32x4 other) {
- var r = new Uint32x4(0, 0, 0, 0);
+ Int32x4 operator-(Int32x4 other) {
+ var r = new Int32x4(0, 0, 0, 0);
r._storage[0] = (_storage[0] - other._storage[0]);
r._storage[1] = (_storage[1] - other._storage[1]);
r._storage[2] = (_storage[2] - other._storage[2]);
@@ -1820,7 +2428,7 @@
static const int WWWW = 0xFF;
/// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
- Uint32x4 shuffle(int mask) {
+ Int32x4 shuffle(int mask) {
if ((mask < 0) || (mask > 255)) {
throw new RangeError('mask $mask must be in the range [0..256)');
}
@@ -1828,13 +2436,13 @@
int _y = _storage[(mask >> 2) & 0x3];
int _z = _storage[(mask >> 4) & 0x3];
int _w = _storage[(mask >> 6) & 0x3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
/// Shuffle the lane values in [this] and [other]. The returned
- /// Uint32x4 will have XY lanes from [this] and ZW lanes from [other].
+ /// Int32x4 will have XY lanes from [this] and ZW lanes from [other].
/// Uses the same [mask] as [shuffle].
- Uint32x4 shuffleMix(Uint32x4 other, int mask) {
+ Int32x4 shuffleMix(Int32x4 other, int mask) {
if ((mask < 0) || (mask > 255)) {
throw new RangeError('mask $mask must be in the range [0..256)');
}
@@ -1842,43 +2450,43 @@
int _y = _storage[(mask >> 2) & 0x3];
int _z = other._storage[(mask >> 4) & 0x3];
int _w = other._storage[(mask >> 6) & 0x3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new x value.
- Uint32x4 withX(int x) {
+ /// Returns a new [Int32x4] copied from [this] with a new x value.
+ Int32x4 withX(int x) {
int _x = x;
int _y = _storage[1];
int _z = _storage[2];
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new y value.
- Uint32x4 withY(int y) {
+ /// Returns a new [Int32x4] copied from [this] with a new y value.
+ Int32x4 withY(int y) {
int _x = _storage[0];
int _y = y;
int _z = _storage[2];
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new z value.
- Uint32x4 withZ(int z) {
+ /// Returns a new [Int32x4] copied from [this] with a new z value.
+ Int32x4 withZ(int z) {
int _x = _storage[0];
int _y = _storage[1];
int _z = z;
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new w value.
- Uint32x4 withW(int w) {
+ /// Returns a new [Int32x4] copied from [this] with a new w value.
+ Int32x4 withW(int w) {
int _x = _storage[0];
int _y = _storage[1];
int _z = _storage[2];
int _w = w;
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
/// Extracted x value. Returns false for 0, true for any other value.
@@ -1890,48 +2498,48 @@
/// Extracted w value. Returns false for 0, true for any other value.
bool get flagW => _storage[3] != 0x0;
- /// Returns a new [Uint32x4] copied from [this] with a new x value.
- Uint32x4 withFlagX(bool x) {
+ /// Returns a new [Int32x4] copied from [this] with a new x value.
+ Int32x4 withFlagX(bool x) {
int _x = x == true ? 0xFFFFFFFF : 0x0;
int _y = _storage[1];
int _z = _storage[2];
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new y value.
- Uint32x4 withFlagY(bool y) {
+ /// Returns a new [Int32x4] copied from [this] with a new y value.
+ Int32x4 withFlagY(bool y) {
int _x = _storage[0];
int _y = y == true ? 0xFFFFFFFF : 0x0;
int _z = _storage[2];
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new z value.
- Uint32x4 withFlagZ(bool z) {
+ /// Returns a new [Int32x4] copied from [this] with a new z value.
+ Int32x4 withFlagZ(bool z) {
int _x = _storage[0];
int _y = _storage[1];
int _z = z == true ? 0xFFFFFFFF : 0x0;
int _w = _storage[3];
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
- /// Returns a new [Uint32x4] copied from [this] with a new w value.
- Uint32x4 withFlagW(bool w) {
+ /// Returns a new [Int32x4] copied from [this] with a new w value.
+ Int32x4 withFlagW(bool w) {
int _x = _storage[0];
int _y = _storage[1];
int _z = _storage[2];
int _w = w == true ? 0xFFFFFFFF : 0x0;
- return new Uint32x4(_x, _y, _z, _w);
+ return new Int32x4(_x, _y, _z, _w);
}
/// Merge [trueValue] and [falseValue] based on [this]' bit mask:
/// Select bit from [trueValue] when bit in [this] is on.
/// Select bit from [falseValue] when bit in [this] is off.
Float32x4 select(Float32x4 trueValue, Float32x4 falseValue) {
- var trueView = new Uint32List.view(trueValue._storage.buffer);
- var falseView = new Uint32List.view(falseValue._storage.buffer);
+ var trueView = new Int32List.view(trueValue._storage.buffer);
+ var falseView = new Int32List.view(falseValue._storage.buffer);
int cmx = _storage[0];
int cmy = _storage[1];
int cmz = _storage[2];
@@ -1949,7 +2557,7 @@
int _z = (cmz & stz) | (~cmz & sfz);
int _w = (cmw & stw) | (~cmw & sfw);
var r = new Float32x4(0.0, 0.0, 0.0, 0.0);
- var rView = new Uint32List.view(r._storage.buffer);
+ var rView = new Int32List.view(r._storage.buffer);
rView[0] = _x;
rView[1] = _y;
rView[2] = _z;
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index d23d384..4464fea 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -827,26 +827,26 @@
/**
- * A fixed-length list of Uint32x4 numbers that is viewable as a
+ * A fixed-length list of Int32x4 numbers that is viewable as a
* [TypedData]. For long lists, this implementation will be considerably more
* space- and time-efficient than the default [List] implementation.
*/
-abstract class Uint32x4List implements List<Uint32x4>, TypedData {
+abstract class Int32x4List implements List<Int32x4>, TypedData {
/**
- * Creates a [Uint32x4List] of the specified length (in elements),
+ * Creates a [Int32x4List] of the specified length (in elements),
* all of whose elements are initially zero.
*/
- external factory Uint32x4List(int length);
+ external factory Int32x4List(int length);
/**
- * Creates a [Uint32x4List] with the same size as the [elements] list
+ * Creates a [Int32x4List] with the same size as the [elements] list
* and copies over the elements.
*/
- external factory Uint32x4List.fromList(List<Uint32x4> elements);
+ external factory Int32x4List.fromList(List<Int32x4> elements);
/**
- * Creates a [Uint32x4List] _view_ of the specified region in the specified
- * byte buffer. Changes in the [Uint32x4List] will be visible in the byte
+ * Creates a [Int32x4List] _view_ of the specified region in the specified
+ * byte buffer. Changes in the [Int32x4List] will be visible in the byte
* buffer and vice versa. If the [offsetInBytes] index of the region is not
* specified, it defaults to zero (the first byte in the byte buffer).
* If the length is not specified, it defaults to null, which indicates
@@ -859,7 +859,7 @@
* Throws [ArgumentError] if [offsetInBytes] is not a multiple of
* BYTES_PER_ELEMENT.
*/
- external factory Uint32x4List.view(ByteBuffer buffer,
+ external factory Int32x4List.view(ByteBuffer buffer,
[int offsetInBytes = 0, int length]);
static const int BYTES_PER_ELEMENT = 16;
@@ -875,7 +875,7 @@
external factory Float32x4(double x, double y, double z, double w);
external factory Float32x4.splat(double v);
external factory Float32x4.zero();
- external factory Float32x4.fromUint32x4Bits(Uint32x4 x);
+ external factory Float32x4.fromInt32x4Bits(Int32x4 x);
/// Addition operator.
Float32x4 operator+(Float32x4 other);
@@ -889,17 +889,17 @@
Float32x4 operator/(Float32x4 other);
/// Relational less than.
- Uint32x4 lessThan(Float32x4 other);
+ Int32x4 lessThan(Float32x4 other);
/// Relational less than or equal.
- Uint32x4 lessThanOrEqual(Float32x4 other);
+ Int32x4 lessThanOrEqual(Float32x4 other);
/// Relational greater than.
- Uint32x4 greaterThan(Float32x4 other);
+ Int32x4 greaterThan(Float32x4 other);
/// Relational greater than or equal.
- Uint32x4 greaterThanOrEqual(Float32x4 other);
+ Int32x4 greaterThanOrEqual(Float32x4 other);
/// Relational equal.
- Uint32x4 equal(Float32x4 other);
+ Int32x4 equal(Float32x4 other);
/// Relational not-equal.
- Uint32x4 notEqual(Float32x4 other);
+ Int32x4 notEqual(Float32x4 other);
/// Returns a copy of [this] each lane being scaled by [s].
Float32x4 scale(double s);
@@ -1214,25 +1214,25 @@
/**
- * Interface of Dart Uint32x4 and operations.
- * Uint32x4 stores 4 32-bit bit-masks in "lanes".
+ * Interface of Dart Int32x4 and operations.
+ * Int32x4 stores 4 32-bit bit-masks in "lanes".
* The lanes are "x", "y", "z", and "w" respectively.
*/
-abstract class Uint32x4 {
- external factory Uint32x4(int x, int y, int z, int w);
- external factory Uint32x4.bool(bool x, bool y, bool z, bool w);
- external factory Uint32x4.fromFloat32x4Bits(Float32x4 x);
+abstract class Int32x4 {
+ external factory Int32x4(int x, int y, int z, int w);
+ external factory Int32x4.bool(bool x, bool y, bool z, bool w);
+ external factory Int32x4.fromFloat32x4Bits(Float32x4 x);
/// The bit-wise or operator.
- Uint32x4 operator|(Uint32x4 other);
+ Int32x4 operator|(Int32x4 other);
/// The bit-wise and operator.
- Uint32x4 operator&(Uint32x4 other);
+ Int32x4 operator&(Int32x4 other);
/// The bit-wise xor operator.
- Uint32x4 operator^(Uint32x4 other);
+ Int32x4 operator^(Int32x4 other);
/// Addition operator.
- Uint32x4 operator+(Uint32x4 other);
+ Int32x4 operator+(Int32x4 other);
/// Subtraction operator.
- Uint32x4 operator-(Uint32x4 other);
+ Int32x4 operator-(Int32x4 other);
/// Extract 32-bit mask from x lane.
int get x;
@@ -1505,21 +1505,21 @@
static const int WWWW = 0xFF;
/// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
- Uint32x4 shuffle(int mask);
+ Int32x4 shuffle(int mask);
/// Shuffle the lane values in [this] and [other]. The returned
- /// Uint32x4 will have XY lanes from [this] and ZW lanes from [other].
+ /// Int32x4 will have XY lanes from [this] and ZW lanes from [other].
/// Uses the same [mask] as [shuffle].
- Uint32x4 shuffleMix(Uint32x4 other, int mask);
+ Int32x4 shuffleMix(Int32x4 other, int mask);
- /// Returns a new [Uint32x4] copied from [this] with a new x value.
- Uint32x4 withX(int x);
- /// Returns a new [Uint32x4] copied from [this] with a new y value.
- Uint32x4 withY(int y);
- /// Returns a new [Uint32x4] copied from [this] with a new z value.
- Uint32x4 withZ(int z);
- /// Returns a new [Uint32x4] copied from [this] with a new w value.
- Uint32x4 withW(int w);
+ /// Returns a new [Int32x4] copied from [this] with a new x value.
+ Int32x4 withX(int x);
+ /// Returns a new [Int32x4] copied from [this] with a new y value.
+ Int32x4 withY(int y);
+ /// Returns a new [Int32x4] copied from [this] with a new z value.
+ Int32x4 withZ(int z);
+ /// Returns a new [Int32x4] copied from [this] with a new w value.
+ Int32x4 withW(int w);
/// Extracted x value. Returns false for 0, true for any other value.
bool get flagX;
@@ -1530,14 +1530,14 @@
/// Extracted w value. Returns false for 0, true for any other value.
bool get flagW;
- /// Returns a new [Uint32x4] copied from [this] with a new x value.
- Uint32x4 withFlagX(bool x);
- /// Returns a new [Uint32x4] copied from [this] with a new y value.
- Uint32x4 withFlagY(bool y);
- /// Returns a new [Uint32x4] copied from [this] with a new z value.
- Uint32x4 withFlagZ(bool z);
- /// Returns a new [Uint32x4] copied from [this] with a new w value.
- Uint32x4 withFlagW(bool w);
+ /// Returns a new [Int32x4] copied from [this] with a new x value.
+ Int32x4 withFlagX(bool x);
+ /// Returns a new [Int32x4] copied from [this] with a new y value.
+ Int32x4 withFlagY(bool y);
+ /// Returns a new [Int32x4] copied from [this] with a new z value.
+ Int32x4 withFlagZ(bool z);
+ /// Returns a new [Int32x4] copied from [this] with a new w value.
+ Int32x4 withFlagW(bool w);
/// Merge [trueValue] and [falseValue] based on [this]' bit mask:
/// Select bit from [trueValue] when bit in [this] is on.
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 7bfc06b..08468cf 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -24,11 +24,7 @@
Language/07_Classes/4_Abstract_Instance_Members_A07_t04: MissingStaticWarning
# TBF: Static members should not be accessible via subclasses.
-Language/07_Classes/7_Static_Methods_A01_t03: MissingStaticWarning
Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t05: MissingStaticWarning
-Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t02: MissingStaticWarning
-
-
# co19 issue #442, undefined name "Expect"
Language/15_Types/4_Interface_Types_A08_t03: fail, OK
@@ -265,8 +261,6 @@
Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t02: MissingStaticWarning
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: MissingStaticWarning
Language/12_Expressions/19_Conditional_A01_t14: MissingStaticWarning
Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t10: MissingStaticWarning
Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t11: MissingStaticWarning
@@ -298,9 +292,18 @@
Language/05_Variables/05_Variables_A06_t01: MissingCompileTimeError # co19-roll r651: Please triage this failure
Language/05_Variables/05_Variables_A06_t02: MissingCompileTimeError # co19-roll r651: Please triage this failure
Language/05_Variables/05_Variables_A06_t03: MissingCompileTimeError # co19-roll r651: Please triage this failure
-Language/07_Classes/8_Static_Variables_A01_t01: MissingStaticWarning # co19-roll r651: Please triage this failure
-Language/12_Expressions/01_Constants_A20_t04: CompileTimeError # co19-roll r651: Please triage this failure
Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t03: MissingStaticWarning # co19-roll r651: Please triage this failure
Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t13: CompileTimeError # co19-roll r651: Please triage this failure
Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
+
+# co19 issue 656
+LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 812e0fb..f6dd40e 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -54,6 +54,8 @@
[ $runtime == vm || $runtime == dartium || $compiler == dart2dart || $compiler == dart2js ]
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: fail # co19 issue 648
+
Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t04: fail, pass, ok # co19 issue 634
Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail, pass, ok # co19 issue 634
Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail, pass, ok # co19 issue 634
@@ -73,7 +75,6 @@
LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail, timeout # co19-roll r546: Please triage this failure
Language/12_Expressions/18_Assignment_A04_t09: RuntimeError # co19-roll r607: Please triage this failure
-Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
LibTest/collection/LinkedList/forEach_A02_t01: RuntimeError # co19-roll r607: Please triage this failure
LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
LibTest/core/Symbol/Symbol_A01_t04: RuntimeError # co19-roll r607: Please triage this failure
@@ -94,6 +95,8 @@
[ $runtime == vm || $runtime == dartium || $compiler == dart2js ]
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t02: FAIL, OK # co19 issue 654
+
LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -268,6 +271,24 @@
Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
+[ $compiler == dart2js ]
+Language/10_Generics/10_Generics_A05_t01: Fail # Co19 issue 655
+Language/12_Expressions/32_Type_Test_A04_t01: Fail # Co19 issue 655
+Language/12_Expressions/32_Type_Test_A04_t02: Fail # Co19 issue 655
+Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Co19 issue 655
+Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Co19 issue 655
+Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Co19 issue 655
+
+[ $compiler == dart2js && $unchecked ]
+Language/15_Types/1_Static_Types_A03_t01: Fail # Co19 issue 655
+
+[ $compiler == dart2js && $checked ]
+Language/10_Generics/10_Generics_A05_t02: Fail # Co19 issue 655
+Language/14_Libraries_and_Scripts/1_Imports_A03_t31: Fail # Co19 issue 655
+Language/15_Types/1_Static_Types_A03_t02: Fail # Co19 issue 655
+Language/15_Types/1_Static_Types_A03_t03: Fail # Co19 issue 655
+Language/15_Types/1_Static_Types_A03_t04: Fail # Co19 issue 655
+
### CHECKED MODE FAILURES ###
[ ($runtime == vm || $runtime == dartium || $compiler == dart2js) && $checked]
@@ -275,7 +296,7 @@
LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
LibTest/typed_data/Float32x4List/reduce_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/async/Future/catchError_A03_t05: RuntimeError # co19 issue 651.
+LibTest/async/Future/catchError_A03_t05: RuntimeError # co19-roll r641: Please triage this failure
[ ($runtime == vm || $compiler == dart2js) && $checked]
Language/14_Libraries_and_Scripts/1_Imports_A03_t46: PASS, FAIL, OK # co19 issue 560
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 5a7f031..0045ac0 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -10,6 +10,16 @@
Language/07_Classes/07_Classes_A13_t08: Fail # Missing CT error on member with same name a type parameter
Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
+Language/10_Generics/10_Generics_A05_t01: Fail # Issue 463
+Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
+Language/15_Types/1_Static_Types_A03_t01: Fail # Issue 463
+Language/12_Expressions/32_Type_Test_A04_t01: Fail # Issue 463
+Language/12_Expressions/32_Type_Test_A04_t02: Fail # Issue 463
+Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Issue 463
+Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Issue 463
+
+Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
+
LibTest/async/Stream/Stream.periodic_A01_t01: Pass, Fail # Issue 12562.
LibTest/core/Symbol/Symbol_A01_t02: CompileTimeError # co19-roll r607: Please triage this failure
@@ -72,6 +82,17 @@
LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
+LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t02: Fail # co19 issue 654
[ $compiler == dart2dart && $system == windows ]
@@ -86,7 +107,6 @@
LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
[ $compiler == dart2dart ]
-Language/03_Overview/2_Privacy_A01_t06: Fail # co19 issue 463
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
@@ -128,7 +148,6 @@
Language/12_Expressions/22_Equality_A05_t01: 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_A08_t02: 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/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
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 452137e..f9355da 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -14,6 +14,7 @@
# Crashes first, please. Then untriaged bugs. There is a section below
# for co19 bugs.
[ $compiler == dart2js ]
+Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
Language/07_Classes/07_Classes_A13_t03: Fail # Missing CT error on member with same name a type parameter
Language/07_Classes/07_Classes_A13_t05: Fail # Missing CT error on member with same name a type parameter
@@ -59,6 +60,15 @@
LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
+LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
[ $compiler == dart2js && $runtime != ie9 ]
LibTest/typed_data/ByteData/ByteData_A02_t01: fail # co19-roll r576: Please triage this failure
@@ -264,9 +274,6 @@
LibTest/core/Uri/Uri_A06_t03: Pass, Timeout # Issue 13511
LibTest/math/cos_A01_t01: Fail # co19 issue 44
-[ $compiler == dart2js && $runtime == ie9 && $checked ]
-LibTest/async/Future/catchError_A03_t05: Pass, RuntimeError # Issue 14712
-
#
# The following tests are failing. Please add the error message
# (either a compiler error or exception message). The error messages
@@ -275,8 +282,6 @@
[ $compiler == dart2js ]
Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError # compiler cancelled: cannot resolve type T
-Language/03_Overview/2_Privacy_A01_t06: RuntimeError # cannot resolve type _inaccessibleFuncType
-
[ $compiler == dart2js && $jscl ]
LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Expect.fail('Some exception expected')
@@ -517,9 +522,6 @@
[ $compiler == dart2js && $checked ]
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/12_Instance_Creation/1_New_A12_t02: 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
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 5f96286..72af666 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -9,7 +9,6 @@
Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
Language/12_Expressions/12_Spawning_an_Isolate_A01_t01: Fail # Issue 13921
Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t02: Fail # Issue 13719: Please triage this failure.
Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
LibTest/async/Future/Future_A01_t03: Fail # co19-roll r641: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 6915f46..bb615bd 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -4,7 +4,7 @@
[ $compiler == none && ($runtime == vm || $runtime == dartium) && $unchecked]
-Language/12_Expressions/01_Constants_A16_t04: fail # Issue 392, passes in checked mode b/c of type check
+
[ $compiler == none && ($runtime == vm || $runtime == dartium) ]
Language/13_Statements/03_Variable_Declaration_A04_t01: Fail, MissingCompileTimeError # Issue 7052
@@ -27,13 +27,18 @@
LibTest/core/RegExp/firstMatch_A01_t01: Fail # Issue 12508
LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
-Language/03_Overview/2_Privacy_A01_t06: Fail # Issue 463
+Language/10_Generics/10_Generics_A05_t01: Fail # Issue 463
+Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
+Language/15_Types/1_Static_Types_A03_t01: Fail # Issue 463
+Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Issue 463
+Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Issue 463
+Language/12_Expressions/32_Type_Test_A04_t01: Fail # Issue 463
+Language/12_Expressions/32_Type_Test_A04_t02: Fail # Issue 463
LibTest/async/Timer/Timer.periodic_A02_t01: Pass, Fail # co19 issue 537
Language/05_Variables/05_Variables_A05_t01: fail # Dart issue 12539
Language/05_Variables/05_Variables_A05_t02: fail # Dart issue 12539
-Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # Dart issue 12593
Language/13_Statements/06_For_A01_t11: fail # Dart issue 5675
Language/13_Statements/09_Switch_A01_t02: fail # Dart issue 12908
Language/13_Statements/12_Labels_A01_t03: fail # Dart issue 2238
@@ -62,6 +67,15 @@
LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
+LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
[ $compiler == none && $runtime == vm ]
LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # Issue 13398
@@ -97,6 +111,10 @@
LibTest/core/Uri/Uri_A06_t03: Pass, Timeout # co19-roll r576: Please triage this failure
[ $compiler == none && $checked && ($runtime == vm || $runtime == dartium) ]
+Language/10_Generics/10_Generics_A05_t02: Fail # Issue 463
+Language/15_Types/1_Static_Types_A03_t02: Fail # Issue 463
+Language/15_Types/1_Static_Types_A03_t03: Fail # Issue 463
+Language/15_Types/1_Static_Types_A03_t04: Fail # Issue 463
Language/14_Libraries_and_Scripts/1_Imports_A03_t31: Fail # Issue 14006, discussion on-going
LibTest/typed_data/Float32x4List/elementAt_A01_t01: Fail # Dart issue 12861
LibTest/typed_data/Float32x4List/fillRange_A01_t01: Fail # Dart issue 12861
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 64ef727..30d7484 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -157,11 +157,7 @@
case 'subtype': return new types.TypeMask.subtype(element);
case 'nonNullSubtype': return new types.TypeMask.nonNullSubtype(element);
}
- Expect.fail('Unknown HType constructor $how');
-}
-
-ssa.HType findHType(compiler, String name, [String how = 'nonNullExact']) {
- return new ssa.HType.fromMask(findTypeMask(compiler, name, how), compiler);
+ Expect.fail('Unknown TypeMask constructor $how');
}
String anyIdentifier = "[a-zA-Z][a-zA-Z0-9]*";
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 32a90c5..2160670 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -1351,9 +1351,9 @@
final expectedGType = [result.num];
result.checkNodeHasType('g', expectedGType);
result.checkNodeHasType('gNull', maybe(expectedGType));
- final expectedHType = [result.bool];
- result.checkNodeHasType('h', expectedHType);
- result.checkNodeHasType('hNull', maybe(expectedHType));
+ final expectedType = [result.bool];
+ result.checkNodeHasType('h', expectedType);
+ result.checkNodeHasType('hNull', maybe(expectedType));
final expectedIType = [result.base('A'), result.base('B'),
result.base('BB'), result.base('C'),
result.base('D')];
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index fd0c83f..e72f98a 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -15,7 +15,11 @@
import
'../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
show
- Node;
+ Node, Identifier;
+import
+ '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
+show
+ MirrorRenamer;
main() {
testUniqueMinification();
diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart
new file mode 100644
index 0000000..2776de6
--- /dev/null
+++ b/tests/compiler/dart2js/mirror_system_helper.dart
@@ -0,0 +1,139 @@
+// 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 mirror_system_helper;
+
+import 'dart:async';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
+import 'mock_compiler.dart';
+
+export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+
+const String SOURCE = 'source';
+final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
+
+// TODO(johnniwinther): Move this to a mirrors helper library.
+Future<MirrorSystem> createMirrorSystem(String source) {
+ MockCompiler compiler = new MockCompiler(
+ analyzeOnly: true,
+ analyzeAll: true,
+ preserveComments: true);
+ compiler.registerSource(SOURCE_URI, source);
+ compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
+ return compiler.runCompiler(null).then((_) {
+ return new Dart2JsMirrorSystem(compiler);
+ });
+}
+
+/**
+ * Returns [:true:] if [type] is an instance of [:decl:] with type arguments
+ * equal to [typeArgument].
+ */
+bool isInstance(ClassMirror decl, List<TypeMirror> typeArguments,
+ ClassMirror type) {
+ if (type.isOriginalDeclaration) return false;
+ if (!isSameDeclaration(decl, type)) return false;
+ return areEqualsTypes(typeArguments, type.typeArguments);
+}
+
+/**
+ * Returns [:true:] if [type] is the same type as [expected]. This method
+ * equates a non-generic declaration with its instantiation.
+ */
+bool isEqualType(TypeMirror expected, TypeMirror type) {
+ if (expected == type) return true;
+ if (expected is ClassMirror && type is ClassMirror) {
+ if (!isSameDeclaration(expected, type)) return false;
+ if (expected.isOriginalDeclaration || expected.typeArguments.isEmpty) {
+ return type.isOriginalDeclaration || type.typeArguments.isEmpty;
+ }
+ return areEqualsTypes(expected.typeArguments, type.typeArguments);
+ }
+ return true;
+}
+
+/**
+ * Returns [:true:] if [types] are equals to [expected] using the equalitry
+ * defined by [isEqualType].
+ */
+bool areEqualsTypes(List<TypeMirror> expected, List<TypeMirror> types) {
+ return checkSameList(expected, types, isEqualType);
+}
+
+/**
+ * Returns [:true:] if an instance of [type] with type arguments equal to
+ * [typeArguments] is found in [types].
+ */
+bool containsType(ClassMirror decl, List<TypeMirror> typeArguments,
+ Iterable<TypeMirror> types) {
+ return types.any((type) => isInstance(decl, typeArguments, type));
+}
+
+/**
+ * Returns the declaration of [type].
+ */
+TypeMirror toDeclaration(TypeMirror type) {
+ return type is ClassMirror ? type.originalDeclaration : type;
+}
+
+/**
+ * Returns [:true:] if [type] is of the same declaration as [expected].
+ */
+bool isSameDeclaration(TypeMirror expected, TypeMirror type) {
+ return toDeclaration(expected) == toDeclaration(type);
+}
+
+/**
+ * Returns [:true:] if a type of the declaration of [expected] is in [types].
+ */
+bool containsDeclaration(TypeMirror expected, Iterable<TypeMirror> types) {
+ for (var type in types) {
+ if (isSameDeclaration(expected, type)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * Returns [:true:] if declarations of [expected] are the same as those of
+ * [types], taking order into account.
+ */
+bool isSameDeclarationList(Iterable<TypeMirror> expected,
+ Iterable<TypeMirror> types) {
+ return checkSameList(expected, types, isSameDeclaration);
+}
+
+/**
+ * Returns [:true:] if declarations of [expected] are the same as those of
+ * [iterable], not taking order into account.
+ */
+bool isSameDeclarationSet(Iterable<TypeMirror> expected,
+ Iterable<TypeMirror> types) {
+ Set<TypeMirror> expectedSet = expected.map(toDeclaration).toSet();
+ Set<TypeMirror> typesSet = types.map(toDeclaration).toSet();
+ return expectedSet.length == typesSet.length &&
+ expectedSet.containsAll(typesSet);
+}
+
+/**
+ * Utility method for checking whether [expected] and [iterable] contains the
+ * same elements with respect to the checking function [check], takin order
+ * into account.
+ */
+bool checkSameList(Iterable<TypeMirror> expected,
+ Iterable<TypeMirror> types,
+ bool check(TypeMirror a, TypeMirror b)) {
+ if (expected.length != types.length) return false;
+ Iterator<TypeMirror> expectedIterator = expected.iterator;
+ Iterator<TypeMirror> typesIterator = types.iterator;
+ while (expectedIterator.moveNext() && typesIterator.moveNext()) {
+ if (!check(expectedIterator.current, typesIterator.current)) {
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
index 1e3307c..66c2e41 100644
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ b/tests/compiler/dart2js/mirrors_metadata_test.dart
@@ -3,29 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:expect/expect.dart';
-import 'dart:async';
import "package:async_helper/async_helper.dart";
-import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
-import 'mock_compiler.dart';
-
-const String SOURCE = 'source';
-Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
-
-Future<MirrorSystem> createMirrorSystem(String source) {
- MockCompiler compiler = new MockCompiler(
- analyzeOnly: true,
- analyzeAll: true,
- preserveComments: true);
- compiler.registerSource(SOURCE_URI, source);
- compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
- return compiler.runCompiler(null).then((_) {
- return new Dart2JsMirrorSystem(compiler);
- });
-}
+import 'dart:async';
+import 'mirror_system_helper.dart';
void validateDeclarationComment(String code,
String text,
diff --git a/tests/compiler/dart2js/mirrors_mixin_test.dart b/tests/compiler/dart2js/mirrors_mixin_test.dart
new file mode 100644
index 0000000..1486851
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors_mixin_test.dart
@@ -0,0 +1,240 @@
+// 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 mirrors_mixin_test;
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'mirror_system_helper.dart';
+
+const String CLASS_SOURCE = '''
+class A {}
+
+class S {}
+class M1<T> {}
+class M2 {}
+
+class C extends S with M1<A> {}
+class D extends S with M1, M2 {}
+class E extends S with M2, M1 implements A, M1 {}
+class E2 extends E {}
+
+class F = S with M1<A>;
+abstract class G = S with M1, M2;
+class H = S with M2, M1 implements A, M1;
+class H2 extends H {}
+''';
+
+void main() {
+ asyncTest(() => createMirrorSystem(CLASS_SOURCE).then((MirrorSystem mirrors) {
+ LibraryMirror library = mirrors.libraries[SOURCE_URI];
+
+ checkSimpleClass(var cls) {
+ Expect.isNotNull(cls);
+ Expect.isTrue(cls is ClassMirror);
+ Expect.isFalse(isMixinApplication(cls));
+ Expect.isFalse(cls.isNameSynthetic);
+ Expect.isFalse(cls.isObject);
+ Expect.isTrue(cls.superclass.isObject);
+ Expect.equals(0, cls.superinterfaces.length);
+
+ Expect.isTrue(getSuperclass(cls).isObject);
+ Expect.isTrue(getAppliedMixins(cls).isEmpty);
+ Expect.isTrue(getExplicitInterfaces(cls).isEmpty);
+ }
+
+ // class A {}
+ var A = library.classes['A'];
+ checkSimpleClass(A);
+
+ // class S {}
+ var S = library.classes['S'];
+ checkSimpleClass(S);
+
+ // class M1 {}
+ var M1 = library.classes['M1'];
+ checkSimpleClass(M1);
+
+ // class M2 {}
+ var M2 = library.classes['M2'];
+ checkSimpleClass(M2);
+
+ // class C extends S with M1<A> {}
+ var C = library.classes['C'];
+ Expect.isNotNull(C);
+ Expect.isTrue(C is ClassMirror);
+ Expect.isFalse(isMixinApplication(C));
+ Expect.isFalse(C.isObject);
+ Expect.equals(0, C.superinterfaces.length);
+ var C_super = C.superclass;
+ Expect.isNotNull(C_super);
+ Expect.isTrue(C_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(C_super));
+ Expect.isTrue(C_super.isNameSynthetic);
+ Expect.equals(1, C_super.superinterfaces.length);
+ Expect.isTrue(containsType(M1, [A], C_super.superinterfaces));
+ Expect.isTrue(isInstance(M1, [A], C_super.mixin));
+ Expect.isFalse(C_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, C_super.superclass));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(C)));
+ Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(C)));
+ Expect.isTrue(getExplicitInterfaces(C).isEmpty);
+
+ // D extends S with M1, M2 {}
+ var D = library.classes['D'];
+ Expect.isNotNull(D);
+ Expect.isTrue(D is ClassMirror);
+ Expect.isFalse(isMixinApplication(D));
+ Expect.isFalse(D.isObject);
+ Expect.equals(0, D.superinterfaces.length);
+ var D_super = D.superclass;
+ Expect.isNotNull(D_super);
+ Expect.isTrue(D_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(D_super));
+ Expect.isTrue(D_super.isNameSynthetic);
+ Expect.equals(1, D_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M2, D_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M2, D_super.mixin));
+ Expect.isFalse(D_super.isObject);
+ Expect.isFalse(isSameDeclaration(S, D_super.superclass));
+ var D_super_super = D_super.superclass;
+ Expect.isNotNull(D_super_super);
+ Expect.isTrue(D_super_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(D_super_super));
+ Expect.isTrue(D_super_super.isNameSynthetic);
+ Expect.equals(1, D_super_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M1, D_super_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M1, D_super_super.mixin));
+ Expect.isFalse(D_super_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, D_super_super.superclass));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(D)));
+ Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(D)));
+ Expect.isTrue(getExplicitInterfaces(D).isEmpty);
+
+ // class E extends S with M2, M1 implements A, M1 {}
+ var E = library.classes['E'];
+ Expect.isNotNull(E);
+ Expect.isTrue(E is ClassMirror);
+ Expect.isFalse(isMixinApplication(E));
+ Expect.isFalse(E.isObject);
+ Expect.equals(2, E.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(A, E.superinterfaces));
+ Expect.isTrue(containsDeclaration(M1, E.superinterfaces));
+ var E_super = E.superclass;
+ Expect.isNotNull(E_super);
+ Expect.isTrue(E_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(E_super));
+ Expect.isTrue(E_super.isNameSynthetic);
+ Expect.equals(1, E_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M1, E_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M1, E_super.mixin));
+ Expect.isFalse(E_super.isObject);
+ Expect.isFalse(isSameDeclaration(S, E_super.superclass));
+ var E_super_super = E_super.superclass;
+ Expect.isNotNull(E_super_super);
+ Expect.isTrue(E_super_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(E_super_super));
+ Expect.isTrue(E_super_super.isNameSynthetic);
+ Expect.equals(1, E_super_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M2, E_super_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M2, E_super_super.mixin));
+ Expect.isFalse(E_super_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, E_super_super.superclass));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(E)));
+ Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(E)));
+ Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(E)));
+
+ // class E2 extends E {}
+ var E2 = library.classes['E2'];
+ Expect.isTrue(isSameDeclaration(E, getSuperclass(E2)));
+ Expect.isTrue(getAppliedMixins(E2).isEmpty);
+ Expect.isTrue(getExplicitInterfaces(E2).isEmpty);
+
+ // class F = S with M1<A>;
+ var F = library.classes['F'];
+ Expect.isNotNull(F);
+ Expect.isTrue(F is ClassMirror);
+ Expect.isFalse(F.isAbstract);
+ Expect.isTrue(isMixinApplication(F));
+ Expect.isFalse(F.isNameSynthetic);
+ Expect.equals('F', F.simpleName);
+ Expect.isFalse(F.isObject);
+ Expect.equals(1, F.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M1, F.superinterfaces));
+ Expect.isTrue(isInstance(M1, [A], F.mixin));
+ var F_super = F.superclass;
+ Expect.isNotNull(F_super);
+ Expect.isTrue(F_super is ClassMirror);
+ Expect.isFalse(isMixinApplication(F_super));
+ Expect.isFalse(F_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, F_super));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(F)));
+ Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(F)));
+ Expect.isTrue(getExplicitInterfaces(F).isEmpty);
+
+ // typedef G = abstract S with M1, M2;
+ var G = library.classes['G'];
+ Expect.isNotNull(G);
+ Expect.isTrue(G is ClassMirror);
+ Expect.isTrue(G.isAbstract);
+ Expect.isTrue(isMixinApplication(G));
+ Expect.isFalse(G.isNameSynthetic);
+ Expect.equals('G', G.simpleName);
+ Expect.isFalse(G.isObject);
+ Expect.equals(1, G.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M2, G.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M2, G.mixin));
+ var G_super = G.superclass;
+ Expect.isNotNull(G_super);
+ Expect.isTrue(G_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(G_super));
+ Expect.equals(1, G_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M1, G_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M1, G_super.mixin));
+ Expect.isFalse(G_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, G_super.superclass));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(G)));
+ Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(G)));
+ Expect.isTrue(getExplicitInterfaces(G).isEmpty);
+
+ // typedef H = S with M2, M1 implements A, M1;
+ var H = library.classes['H'];
+ Expect.isNotNull(H);
+ Expect.isTrue(H is ClassMirror);
+ Expect.isFalse(H.isAbstract);
+ Expect.isTrue(isMixinApplication(H));
+ Expect.isFalse(H.isNameSynthetic);
+ Expect.equals('H', H.simpleName);
+ Expect.isFalse(H.isObject);
+ Expect.equals(3, H.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(A, H.superinterfaces));
+ Expect.isTrue(containsDeclaration(M1, H.superinterfaces));
+ Expect.isFalse(containsDeclaration(M2, H.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M1, H.mixin));
+ var H_super = H.superclass;
+ Expect.isNotNull(H_super);
+ Expect.isTrue(H_super is ClassMirror);
+ Expect.isTrue(isMixinApplication(H_super));
+ Expect.equals(1, H_super.superinterfaces.length);
+ Expect.isTrue(containsDeclaration(M2, H_super.superinterfaces));
+ Expect.isTrue(isSameDeclaration(M2, H_super.mixin));
+ Expect.isFalse(H_super.isObject);
+ Expect.isTrue(isSameDeclaration(S, H_super.superclass));
+
+ Expect.isTrue(isSameDeclaration(S, getSuperclass(H)));
+ Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(H)));
+ Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(H)));
+
+ // class H2 extends H {}
+ var H2 = library.classes['H2'];
+ Expect.isTrue(isSameDeclaration(H, getSuperclass(H2)));
+ Expect.isTrue(getAppliedMixins(H2).isEmpty);
+ Expect.isTrue(getExplicitInterfaces(H2).isEmpty);
+ }));
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 4acd9a2..f028c33 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -467,6 +467,7 @@
Uri uri = new Uri(scheme: "source");
var library = new LibraryElementX(new Script(uri, new MockFile(source)));
importLibrary(library, compiler.coreLibrary, compiler);
+ library.setExports(<Element>[]);
return library;
}
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index cd09732..ada744d4 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -374,10 +374,10 @@
rule(jsFixedArray, jsFixedArray, jsFixedArray);
- check(nonPrimitive1, nullType, (type) => type is HBoundedType);
- check(nonPrimitive2, nullType, (type) => type is HBoundedType);
- check(nullType, nonPrimitive1, (type) => type.isNullable);
- check(nullType, nonPrimitive2, (type) => type.isNullable);
+ check(nonPrimitive1, nullType, (type) => type == nonPrimitive1.nullable());
+ check(nonPrimitive2, nullType, (type) => type == nonPrimitive2.nullable());
+ check(nullType, nonPrimitive1, (type) => type == nonPrimitive1.nullable());
+ check(nullType, nonPrimitive2, (type) => type == nonPrimitive2.nullable());
ruleSet.validateCoverage();
}
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/union_type_test.dart
index 7cc13ba..984880f 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/union_type_test.dart
@@ -10,7 +10,7 @@
import "../../../sdk/lib/_internal/compiler/implementation/dart_types.dart";
main() {
- Compiler compiler = new MockCompiler();
+ MockCompiler compiler = new MockCompiler();
compiler.intClass.ensureResolved(compiler);
compiler.stringClass.ensureResolved(compiler);
diff --git a/tests/compiler/dart2js_extra/runtime_type_isolate.dart b/tests/compiler/dart2js_extra/runtime_type_isolate.dart
index 75815b8..b1b9504 100644
--- a/tests/compiler/dart2js_extra/runtime_type_isolate.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_isolate.dart
@@ -12,5 +12,5 @@
port.receive((msg, reply) {
Expect.equals(new Bar().runtimeType.toString(), 'Bar');
});
- port.toSendPort().send(null, null);
+ port.sendPort.send(null);
}
diff --git a/tests/compiler/dart2js_native/subclassing_super_call_test.dart b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
new file mode 100644
index 0000000..f13a42e
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
@@ -0,0 +1,134 @@
+// 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:_foreign_helper' show JS;
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+ findInterceptorForType, findConstructorForNativeSubclassType;
+
+// Test for super access from classes that extend native classes.
+
+class N1 native "N1" {
+}
+
+class N2 extends N1 native "N2" {
+ N2.init();
+ String text;
+ foo() native;
+}
+
+class AA extends N2 {
+ AA.init() : super.init();
+ String afield;
+ afun() => 'afun:$afield';
+}
+
+class BB extends AA {
+ BB.init() : super.init();
+
+ get text => super.text;
+ set text(value) => super.text = value;
+ foo() => super.foo();
+
+ get afield => super.afield;
+ set afield(value) => super.afield = value;
+ afun() => super.afun();
+}
+
+BB makeBB() native;
+
+@Creates('=Object')
+getBBPrototype() native;
+
+void setup() native r"""
+function N2() {}
+N2.prototype.foo = function() { return "foo:" + this.text; }
+function BB() {}
+BB.prototype.__proto__ = N2.prototype;
+makeBB = function(){return new BB;};
+
+getBBPrototype = function(){return BB.prototype;};
+""";
+
+var inscrutable;
+
+testSuperOnNative() {
+ BB b1 = makeBB();
+ BB b2 = makeBB();
+
+ var constructor = findConstructorForNativeSubclassType(BB, 'init');
+ Expect.isNotNull(constructor);
+ JS('', '#(#)', constructor, b1);
+ JS('', '#(#)', constructor, b2);
+
+ b1.text = inscrutable('one');
+ b2.text = inscrutable('two');
+
+ print('b1.text ${inscrutable(b1).text}');
+ print('b2.text ${inscrutable(b2).text}');
+
+ print('b1.foo() ${inscrutable(b1).foo()}');
+ print('b2.foo() ${inscrutable(b2).foo()}');
+
+ Expect.equals('one', b1.text);
+ Expect.equals('two', b2.text);
+
+ Expect.equals('foo:one', b1.foo());
+ Expect.equals('foo:two', b2.foo());
+
+ inscrutable(b1).text = inscrutable('three');
+ inscrutable(b2).text = inscrutable('four');
+
+ Expect.equals('three', inscrutable(b1).text);
+ Expect.equals('four', inscrutable(b2).text);
+
+ Expect.equals('foo:three', inscrutable(b1).foo());
+ Expect.equals('foo:four', inscrutable(b2).foo());
+}
+
+testSuperOnSubclassOfNative() {
+ BB b1 = makeBB();
+ BB b2 = makeBB();
+
+ var constructor = findConstructorForNativeSubclassType(BB, 'init');
+ Expect.isNotNull(constructor);
+ JS('', '#(#)', constructor, b1);
+ JS('', '#(#)', constructor, b2);
+
+ b1.afield = inscrutable('one');
+ b2.afield = inscrutable('two');
+
+ print('b1.afield ${inscrutable(b1).afield}');
+ print('b2.afield ${inscrutable(b2).afield}');
+
+ print('b1.afun() ${inscrutable(b1).afun()}');
+ print('b2.afun() ${inscrutable(b2).afun()}');
+
+ Expect.equals('one', b1.afield);
+ Expect.equals('two', b2.afield);
+
+ Expect.equals('afun:one', b1.afun());
+ Expect.equals('afun:two', b2.afun());
+
+
+ inscrutable(b1).afield = inscrutable('three');
+ inscrutable(b2).afield = inscrutable('four');
+
+ Expect.equals('three', inscrutable(b1).afield);
+ Expect.equals('four', inscrutable(b2).afield);
+
+ Expect.equals('afun:three', inscrutable(b1).afun());
+ Expect.equals('afun:four', inscrutable(b2).afun());
+}
+
+main() {
+ setup();
+ inscrutable = (x) => x;
+
+ setNativeSubclassDispatchRecord(getBBPrototype(), findInterceptorForType(BB));
+
+ testSuperOnNative();
+ testSuperOnSubclassOfNative();
+}
diff --git a/tests/corelib/collection_to_string_test.dart b/tests/corelib/collection_to_string_test.dart
index 97f25bc..2f3d4bd 100644
--- a/tests/corelib/collection_to_string_test.dart
+++ b/tests/corelib/collection_to_string_test.dart
@@ -241,8 +241,8 @@
if (startIndex - start > MAX_LENGTH - 6) { // Limit - ", ...)".length.
String prefix = stringRep.toString().substring(0, startIndex);
stringRep.clear();
- stringRep.write(prefix);
- stringRep.write(", ...");
+ stringRep.add(prefix);
+ stringRep.add(", ...");
}
}
} else if (stringRep.length - start > MAX_LENGTH - 1) { // 80 - ")".length.
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index f775363..cf4eb74 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -70,13 +70,12 @@
double_round4_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
double_round_to_double3_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
collection_length_test: Pass, Timeout # Issue 12844
-date_time7_test: Fail # Issue 14717. Timezone name extraction fails.
[ $runtime == opera ]
core_runtime_types_test: Fail
null_nosuchmethod_test: Fail # Issue: 7413
-date_time7_test: Fail # Issue 14691
-unicode_test: Fail # Issue 14694
+date_time7_test: Fail
+unicode_test: Fail
[ $compiler == dart2js ]
error_stack_trace1_test: RuntimeError # Issue 12399
@@ -94,6 +93,7 @@
*: Fail, Pass # TODO(ahe): Triage these tests.
[ $compiler == dart2js && $runtime == ie9 ]
+date_time7_test: Fail # BUG(3304): Maybe this doesn't time out?
string_base_vm_test: Fail # BUG(3304): Maybe this doesn't time out?
list_test: Fail # IE doesn't support typed data.
shuffle_test: Fail # IE doesn't support typed data.
@@ -107,10 +107,16 @@
compare_to2_test: Fail # inherited from VM
unicode_test: Fail # inherited from VM
+# Library changes
+[ $compiler == none || $compiler == dart2js || $compiler == dart2dart ]
+map_keys2_test: RuntimeError # Generic types aren't right.
+
[ $compiler == dart2js ]
map_values2_test: RuntimeError # Issue 8210
-iterable_to_list_test: RuntimeError # Issue 8210
-iterable_to_set_test: RuntimeError # Issue 8210
+
+## Tests failing after merge of experimental library branch.
+[ $compiler == dart2js ]
+# Tests fail due to bug in generics on constants, issue 6827
[ $compiler == dart2dart && $minified ]
error_stack_trace1_test: Fail # Fails in minified mode, test depends on method names.
@@ -147,8 +153,12 @@
collection_to_string_test: Pass, Crash # Issue: 11207
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
-iterable_element_at_test: StaticWarning, OK # Test generates errors on purpose.
-num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
-queue_test: StaticWarning # Issue 12274.
-string_test: StaticWarning, OK # Test generates error on purpose.
+collection_to_string_test: StaticWarning
+error_stack_trace_test: StaticWarning
+iterable_element_at_test: StaticWarning
+iterable_test: StaticWarning
+list_map_test: StaticWarning
+num_clamp_test: StaticWarning
+queue_test: StaticWarning
+string_codeunits_test: StaticWarning
+string_test: StaticWarning
diff --git a/tests/corelib/iterable_test.dart b/tests/corelib/iterable_test.dart
index e7f6299..f99bba6 100644
--- a/tests/corelib/iterable_test.dart
+++ b/tests/corelib/iterable_test.dart
@@ -9,7 +9,7 @@
import 'dart:collection';
-class MyIterable extends IterableBase {
+class MyIterable implements IterableBase {
get iterator => [].iterator;
}
diff --git a/tests/corelib/list_map_test.dart b/tests/corelib/list_map_test.dart
index 947f40a..8bd05eb 100644
--- a/tests/corelib/list_map_test.dart
+++ b/tests/corelib/list_map_test.dart
@@ -20,7 +20,7 @@
// Function that reverses l and r lists when used to map.
int rev(x) => 11 - x;
// A base list that starts out like l, but isn't const.
- List base = l.map((x) => x).toList();
+ Iterable base = l.map((x) => x).toList();
Iterable reversed = l.map(rev);
diff --git a/tests/corelib/map_keys2_test.dart b/tests/corelib/map_keys2_test.dart
index d297c2d..8d623eb 100644
--- a/tests/corelib/map_keys2_test.dart
+++ b/tests/corelib/map_keys2_test.dart
@@ -15,16 +15,16 @@
var map6 = new Map<String, bool>();
Expect.isTrue(map1.keys is Iterable<String>);
- Expect.isTrue(map1.keys is Iterable<bool>);
+ Expect.isFalse(map1.keys is Iterable<bool>);
Expect.isTrue(map2.keys is Iterable<String>);
- Expect.isTrue(map2.keys is Iterable<bool>);
+ Expect.isFalse(map2.keys is Iterable<bool>);
Expect.isTrue(map3.keys is Iterable<String>);
- Expect.isTrue(map3.keys is Iterable<bool>);
+ Expect.isFalse(map3.keys is Iterable<bool>);
Expect.isTrue(map4.keys is Iterable<String>);
- Expect.isTrue(map4.keys is Iterable<bool>);
+ Expect.isFalse(map4.keys is Iterable<bool>);
Expect.isTrue(map5.keys is Iterable<String>);
Expect.isFalse(map5.keys is Iterable<bool>);
diff --git a/tests/corelib/string_codeunits_test.dart b/tests/corelib/string_codeunits_test.dart
index 30b7f40..46db21f 100644
--- a/tests/corelib/string_codeunits_test.dart
+++ b/tests/corelib/string_codeunits_test.dart
@@ -6,7 +6,7 @@
main() {
test(String s) {
- List<int> units = s.codeUnits;
+ Iterable<int> units = s.codeUnits;
List<int> expectedUnits = <int>[];
for (int i = 0; i < s.length; i++) {
expectedUnits.add(s.codeUnitAt(i));
diff --git a/tests/html/custom/created_callback_test.dart b/tests/html/custom/created_callback_test.dart
index 3faa981..49845c1 100644
--- a/tests/html/custom/created_callback_test.dart
+++ b/tests/html/custom/created_callback_test.dart
@@ -215,7 +215,7 @@
var child = upgradingContext.firstChild;
expect(child.foo, 666);
- expect(upgradingContextChild is HTMLElement, isTrue);
+ expect(upgradingContextChild is HtmlElement, isFalse);
expect(upgradingContextChild is AccessWhileUpgradingElement, isFalse,
reason: 'Elements accessed while upgrading should not be upgraded.');
}
diff --git a/tests/html/html.status b/tests/html/html.status
index 946e119..0792441 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -409,7 +409,6 @@
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
audiocontext_test: StaticWarning
-custom/created_callback_test: StaticWarning
custom/document_register_basic_test: StaticWarning
datalistelement_test: StaticWarning
documentfragment_test: StaticWarning
@@ -417,7 +416,6 @@
element_test: StaticWarning
events_test: StaticWarning
htmlelement_test: StaticWarning
-isolates_test: StaticWarning
localstorage_test: StaticWarning
mutationobserver_test: StaticWarning
track_element_constructor_test: StaticWarning
diff --git a/tests/html/isolates_test.dart b/tests/html/isolates_test.dart
index fe35c20..f0da5f0 100644
--- a/tests/html/isolates_test.dart
+++ b/tests/html/isolates_test.dart
@@ -1,6 +1,7 @@
library IsolatesTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:async';
import 'dart:html';
import 'dart:convert';
import 'dart:isolate' as isolate;
diff --git a/tests/html/path_observer_test.dart b/tests/html/path_observer_test.dart
new file mode 100644
index 0000000..d6db89b
--- /dev/null
+++ b/tests/html/path_observer_test.dart
@@ -0,0 +1,255 @@
+// 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' show PathObserver;
+import 'package:unittest/html_config.dart';
+import 'package:mdv_observe/mdv_observe.dart';
+import 'package:unittest/unittest.dart';
+
+// This file contains code ported from:
+// https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
+
+main() {
+ useHtmlConfiguration();
+ group('PathObserver', observePathTests);
+}
+
+observePath(obj, path) => new PathObserver(obj, path);
+
+sym(x) => new Symbol(x);
+
+toSymbolMap(Map map) {
+ var result = new ObservableMap.linked();
+ map.forEach((key, value) {
+ if (value is Map) value = toSymbolMap(value);
+ result[new Symbol(key)] = value;
+ });
+ return result;
+}
+
+observePathTests() {
+
+ test('Degenerate Values', () {
+ expect(observePath(null, '').value, null);
+ expect(observePath(123, '').value, 123);
+ expect(observePath(123, 'foo.bar.baz').value, null);
+
+ // shouldn't throw:
+ observePath(123, '').values.listen((_) {}).cancel();
+ observePath(null, '').value = null;
+ observePath(123, '').value = 42;
+ observePath(123, 'foo.bar.baz').value = 42;
+
+ var foo = {};
+ expect(observePath(foo, '').value, foo);
+
+ foo = new Object();
+ expect(observePath(foo, '').value, foo);
+
+ expect(observePath(foo, 'a/3!').value, null);
+ });
+
+ test('get value at path ObservableBox', () {
+ var obj = new ObservableBox(new ObservableBox(new ObservableBox(1)));
+
+ expect(observePath(obj, '').value, obj);
+ expect(observePath(obj, 'value').value, obj.value);
+ expect(observePath(obj, 'value.value').value, obj.value.value);
+ expect(observePath(obj, 'value.value.value').value, 1);
+
+ obj.value.value.value = 2;
+ expect(observePath(obj, 'value.value.value').value, 2);
+
+ obj.value.value = new ObservableBox(3);
+ expect(observePath(obj, 'value.value.value').value, 3);
+
+ obj.value = new ObservableBox(4);
+ expect(observePath(obj, 'value.value.value').value, null);
+ expect(observePath(obj, 'value.value').value, 4);
+ });
+
+
+ test('get value at path ObservableMap', () {
+ var obj = toSymbolMap({'a': {'b': {'c': 1}}});
+
+ expect(observePath(obj, '').value, obj);
+ expect(observePath(obj, 'a').value, obj[sym('a')]);
+ expect(observePath(obj, 'a.b').value, obj[sym('a')][sym('b')]);
+ expect(observePath(obj, 'a.b.c').value, 1);
+
+ obj[sym('a')][sym('b')][sym('c')] = 2;
+ expect(observePath(obj, 'a.b.c').value, 2);
+
+ obj[sym('a')][sym('b')] = toSymbolMap({'c': 3});
+ expect(observePath(obj, 'a.b.c').value, 3);
+
+ obj[sym('a')] = toSymbolMap({'b': 4});
+ expect(observePath(obj, 'a.b.c').value, null);
+ expect(observePath(obj, 'a.b').value, 4);
+ });
+
+ test('set value at path', () {
+ var obj = toSymbolMap({});
+ observePath(obj, 'foo').value = 3;
+ expect(obj[sym('foo')], 3);
+
+ var bar = toSymbolMap({ 'baz': 3 });
+ observePath(obj, 'bar').value = bar;
+ expect(obj[sym('bar')], bar);
+
+ observePath(obj, 'bar.baz.bat').value = 'not here';
+ expect(observePath(obj, 'bar.baz.bat').value, null);
+ });
+
+ test('set value back to same', () {
+ var obj = toSymbolMap({});
+ var path = observePath(obj, 'foo');
+ var values = [];
+ path.values.listen((v) { values.add(v); });
+
+ path.value = 3;
+ expect(obj[sym('foo')], 3);
+ expect(path.value, 3);
+
+ observePath(obj, 'foo').value = 2;
+ deliverChangeRecords();
+ expect(path.value, 2);
+ expect(observePath(obj, 'foo').value, 2);
+
+ observePath(obj, 'foo').value = 3;
+ deliverChangeRecords();
+ expect(path.value, 3);
+
+ deliverChangeRecords();
+ expect(values, [2, 3]);
+ });
+
+ test('Observe and Unobserve - Paths', () {
+ var arr = toSymbolMap({});
+
+ arr[sym('foo')] = 'bar';
+ var fooValues = [];
+ var fooPath = observePath(arr, 'foo');
+ var fooSub = fooPath.values.listen((v) {
+ fooValues.add(v);
+ });
+ arr[sym('foo')] = 'baz';
+ arr[sym('bat')] = 'bag';
+ var batValues = [];
+ var batPath = observePath(arr, 'bat');
+ var batSub = batPath.values.listen((v) {
+ batValues.add(v);
+ });
+
+ deliverChangeRecords();
+ expect(fooValues, ['baz']);
+ expect(batValues, []);
+
+ arr[sym('foo')] = 'bar';
+ fooSub.cancel();
+ arr[sym('bat')] = 'boo';
+ batSub.cancel();
+ arr[sym('bat')] = 'boot';
+
+ deliverChangeRecords();
+ expect(fooValues, ['baz']);
+ expect(batValues, []);
+ });
+
+ test('Path Value With Indices', () {
+ var model = toObservable([]);
+ observePath(model, '0').values.listen(expectAsync1((v) {
+ expect(v, 123);
+ }));
+ model.add(123);
+ });
+
+ test('Path Observation', () {
+ var model = new TestModel(const Symbol('a'),
+ new TestModel(const Symbol('b'),
+ new TestModel(const Symbol('c'), 'hello, world')));
+
+ var path = observePath(model, 'a.b.c');
+ var lastValue = null;
+ var sub = path.values.listen((v) { lastValue = v; });
+
+ model.value.value.value = 'hello, mom';
+
+ expect(lastValue, null);
+ deliverChangeRecords();
+ expect(lastValue, 'hello, mom');
+
+ model.value.value = new TestModel(const Symbol('c'), 'hello, dad');
+ deliverChangeRecords();
+ expect(lastValue, 'hello, dad');
+
+ model.value = new TestModel(const Symbol('b'),
+ new TestModel(const Symbol('c'), 'hello, you'));
+ deliverChangeRecords();
+ expect(lastValue, 'hello, you');
+
+ model.value.value = 1;
+ deliverChangeRecords();
+ expect(lastValue, null);
+
+ // Stop observing
+ sub.cancel();
+
+ model.value.value = new TestModel(const Symbol('c'),
+ 'hello, back again -- but not observing');
+ deliverChangeRecords();
+ expect(lastValue, null);
+
+ // Resume observing
+ sub = path.values.listen((v) { lastValue = v; });
+
+ model.value.value.value = 'hello. Back for reals';
+ deliverChangeRecords();
+ expect(lastValue, 'hello. Back for reals');
+ });
+
+ test('observe map', () {
+ var model = toSymbolMap({'a': 1});
+ var path = observePath(model, 'a');
+
+ var values = [path.value];
+ var sub = path.values.listen((v) { values.add(v); });
+ expect(values, [1]);
+
+ model[sym('a')] = 2;
+ deliverChangeRecords();
+ expect(values, [1, 2]);
+
+ sub.cancel();
+ model[sym('a')] = 3;
+ deliverChangeRecords();
+ expect(values, [1, 2]);
+ });
+}
+
+class TestModel extends ObservableBase {
+ final Symbol fieldName;
+ var _value;
+
+ TestModel(this.fieldName, [initialValue]) : _value = initialValue;
+
+ get value => _value;
+
+ void set value(newValue) {
+ _value = notifyPropertyChange(fieldName, _value, newValue);
+ }
+
+ getValueWorkaround(key) {
+ if (key == fieldName) return value;
+ return null;
+ }
+ void setValueWorkaround(key, newValue) {
+ if (key == fieldName) value = newValue;
+ }
+
+ toString() => '#<$runtimeType $fieldName: $_value>';
+}
+
+_record(key, oldValue, newValue, [kind = ChangeRecord.FIELD]) =>
+ new ChangeRecord(key, oldValue, newValue, kind: kind);
diff --git a/tests/html/typed_arrays_simd_test.dart b/tests/html/typed_arrays_simd_test.dart
index f75ad2a..b0e3176 100644
--- a/tests/html/typed_arrays_simd_test.dart
+++ b/tests/html/typed_arrays_simd_test.dart
@@ -37,8 +37,8 @@
expect(val2.x, floatEquals(2.0));
expect(val2.y, floatEquals(4.0));
expect(val2.z, floatEquals(6.0));
- expect(val2.w, floatEquals(8.0));
- }
+ expect(val2.w, floatEquals(8.0));
+ }
});
test('test Float32x4List', () {
@@ -68,9 +68,9 @@
expect(counter.w, floatEquals(21.0));
});
- test('test Uint32x4', () {
+ test('test Int32x4', () {
if (Platform.supportsSimd) {
- final val = new Uint32x4(1, 2, 3, 4);
+ final val = new Int32x4(1, 2, 3, 4);
expect(val.x, equals(1));
expect(val.y, equals(2));
expect(val.z, equals(3));
@@ -79,7 +79,7 @@
expect(val2.x, equals(0));
expect(val2.y, equals(0));
expect(val2.z, equals(0));
- expect(val2.w, equals(0));
- }
+ expect(val2.w, equals(0));
+ }
});
}
diff --git a/tests/isolate/browser/typed_data_message_test.dart b/tests/isolate/browser/typed_data_message_test.dart
index e448390..9432290 100644
--- a/tests/isolate/browser/typed_data_message_test.dart
+++ b/tests/isolate/browser/typed_data_message_test.dart
@@ -66,7 +66,7 @@
SendPort replyTo = message[1];
if (data == -1) {
port.close();
- replyTo.send(count, null);
+ replyTo.send(count);
} else {
// Check if the received object is correct.
if (count < elements.length) {
@@ -74,7 +74,7 @@
}
// Bounce the received object back so that the sender
// can make sure that the object matches.
- replyTo.send(data, null);
+ replyTo.send(data);
count++;
}
});
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index fa6c738..a31db8c 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -15,7 +15,7 @@
isolate2_negative_test: Fail
isolate_import_negative_test: Fail
unresolved_ports_test: Pass
-mandel_isolate_test: Fail # issue 14452
+mandel_isolate_test: StaticWarning # test issue 14782; unittestConfiguration.timeout has only getter in Configuration
[ $compiler == dart2js && $jscl ]
browser/*: SkipByDesign # Browser specific tests
@@ -123,11 +123,8 @@
browser/typed_data_message_test: StaticWarning
isolate3_negative_test: CompileTimeError
isolate_import_negative_test: CompileTimeError
-isolate/mint_maker_test: StaticWarning
-isolate/unresolved_ports_test: StaticWarning
-mandel_isolate_stream_test: StaticWarning
-mandel_isolate_test: StaticWarning
mint_maker_test: StaticWarning
serialization_test: StaticWarning
-unresolved_ports_test: StaticWarning
+isolate/unresolved_ports_test: StaticWarning
+mandel_isolate_stream_test: StaticWarning
diff --git a/tests/isolate/isolate_complex_messages_test.dart b/tests/isolate/isolate_complex_messages_test.dart
index effeffe..3a18ec5 100644
--- a/tests/isolate/isolate_complex_messages_test.dart
+++ b/tests/isolate/isolate_complex_messages_test.dart
@@ -18,12 +18,12 @@
switch (msg[0]) {
case "init":
var remote = msg[1];
- remote.send(1, null);
- remote.send("Hello", null);
- remote.send("World", null);
- remote.send(const [null, 1, 2, 3, 4], null);
- remote.send(const [1, 2.0, true, false, 0xffffffffff], null);
- remote.send(const ["Hello", "World", 0xffffffffff], null);
+ remote.send(1);
+ remote.send("Hello");
+ remote.send("World");
+ remote.send(const [null, 1, 2, 3, 4]);
+ remote.send(const [1, 2.0, true, false, 0xffffffffff]);
+ remote.send(const ["Hello", "World", 0xffffffffff]);
// Shutdown the LogRunner.
remote.send(-1);
break;
diff --git a/tests/language/block_scope_test.dart b/tests/language/block_scope_test.dart
deleted file mode 100644
index cc19981..0000000
--- a/tests/language/block_scope_test.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-
-foo() => 123;
-
-void testShadowingScope1() {
- var foo = foo();
- Expect.equals(123, foo);
-}
-
-void testShadowingScope2() {
- {
- var foo = foo() + 444;
- Expect.equals(567, foo);
- }
- Expect.equals(123, foo());
-}
-
-void testShadowingCapture1() {
- var f;
- {
- var foo = 888;
- f = () => foo;
- }
- var foo = -888;
- Expect.equals(888, f());
-}
-
-void testShadowingCapture2() {
- var f = null;
- // this one uses a reentrant block
- for (int i = 0; i < 2; i++) {
- var foo = i + 888;
- if (f == null) f = () => foo;
- }
- var foo = -888;
-
- // this could break if it doesn't bind the right "foo"
- Expect.equals(888, f());
-}
-
-class BlockScopeTest1 {
- void testShadowingInstanceVar() {
- if (true) {
- var foo = foo() + 444;
- Expect.equals(1221, foo);
- }
- Expect.equals(777, foo());
- }
- static void testShadowingStatic() {
- if (true) {
- var bar = bar() + 444;
- Expect.equals(1221, bar);
- }
- Expect.equals(777, bar());
- }
-
- foo() => 777;
- static bar() => 777;
-}
-
-main() {
- testShadowingScope1();
- testShadowingScope2();
- testShadowingCapture1();
- testShadowingCapture2();
- new BlockScopeTest1().testShadowingInstanceVar();
- BlockScopeTest1.testShadowingStatic();
-}
diff --git a/tests/language/class_override_test.dart b/tests/language/class_override_test.dart
index 214a08d..190604b 100644
--- a/tests/language/class_override_test.dart
+++ b/tests/language/class_override_test.dart
@@ -17,7 +17,7 @@
B instance = new B();
try {
instance.foo();
- } on NoSuchMethodEror catch (error) { /// 00: continued
+ } on NoSuchMethodError catch (error) { /// 00: continued
} finally {
}
print("Success");
diff --git a/tests/language/div_with_power_of_two2_test.dart b/tests/language/div_with_power_of_two2_test.dart
index 936aadf..03a83ca 100644
--- a/tests/language/div_with_power_of_two2_test.dart
+++ b/tests/language/div_with_power_of_two2_test.dart
@@ -100,6 +100,6 @@
}
Expect.throws(() => divBy0(4),
(e) => e is IntegerDivisionByZeroException
- || e is RuntimeError);
+ || e is UnsupportedError);
}
}
diff --git a/tests/language/dynamic_prefix_core_test.dart b/tests/language/dynamic_prefix_core_test.dart
index 1aba87f..4a5362a 100644
--- a/tests/language/dynamic_prefix_core_test.dart
+++ b/tests/language/dynamic_prefix_core_test.dart
@@ -9,9 +9,9 @@
void main() {
// Should still be available because it is not a member of dart:core.
- Expect.isTrue(dynamic is Type);
-
- Expect.throws(() => mycore.dynamic is Type,
- (e) => e is NoSuchMethodError,
+ Expect.isTrue(dynamic is mycore.Type);
+
+ Expect.throws(() => mycore.dynamic is mycore.Type,
+ (e) => e is mycore.NoSuchMethodError,
'dynamic is not a member of dart:core');
}
diff --git a/tests/language/export_ambiguous_main_a.dart b/tests/language/export_ambiguous_main_a.dart
new file mode 100644
index 0000000..4a7b820
--- /dev/null
+++ b/tests/language/export_ambiguous_main_a.dart
@@ -0,0 +1,9 @@
+// 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 export_ambiguous_main_a;
+
+main() {
+ print('export_ambiguous_main_a');
+}
diff --git a/tests/language/export_ambiguous_main_b.dart b/tests/language/export_ambiguous_main_b.dart
new file mode 100644
index 0000000..734a620
--- /dev/null
+++ b/tests/language/export_ambiguous_main_b.dart
@@ -0,0 +1,9 @@
+// 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 export_ambiguous_main_b;
+
+main() {
+ print('export_ambiguous_main_b');
+}
diff --git a/tests/language/export_ambiguous_main_negative_test.dart b/tests/language/export_ambiguous_main_negative_test.dart
new file mode 100644
index 0000000..6087c67
--- /dev/null
+++ b/tests/language/export_ambiguous_main_negative_test.dart
@@ -0,0 +1,6 @@
+// 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.
+
+export 'export_ambiguous_main_a.dart';
+export 'export_ambiguous_main_b.dart';
diff --git a/tests/language/export_double_same_main_test.dart b/tests/language/export_double_same_main_test.dart
new file mode 100644
index 0000000..68ad600
--- /dev/null
+++ b/tests/language/export_double_same_main_test.dart
@@ -0,0 +1,6 @@
+// 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.
+
+export 'top_level_entry_test.dart';
+export 'export_main_test.dart' show main;
diff --git a/tests/language/export_main_override_test.dart b/tests/language/export_main_override_test.dart
new file mode 100644
index 0000000..6578288
--- /dev/null
+++ b/tests/language/export_main_override_test.dart
@@ -0,0 +1,9 @@
+// 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.
+
+export 'top_level_entry_test.dart';
+
+main() {
+ print('export_main_override');
+}
diff --git a/tests/language/export_main_test.dart b/tests/language/export_main_test.dart
new file mode 100644
index 0000000..1e920a7
--- /dev/null
+++ b/tests/language/export_main_test.dart
@@ -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.
+
+export 'top_level_entry_test.dart';
diff --git a/tests/language/hello_dart_test.dart b/tests/language/hello_dart_test.dart
index a60a5fa..dac39a4 100644
--- a/tests/language/hello_dart_test.dart
+++ b/tests/language/hello_dart_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
// Simple test program invoked with an option to eagerly
// compile all code that is loaded in the isolate.
-// VMOptions=--compile_all
+// VMOptions=--compile_all --error-on-bad-type --error-on-bad-override
class HelloDartTest {
static testMain() {
diff --git a/tests/language/instanceof3_test.dart b/tests/language/instanceof3_test.dart
index 746c8bf..ccc00e4 100644
--- a/tests/language/instanceof3_test.dart
+++ b/tests/language/instanceof3_test.dart
@@ -6,7 +6,8 @@
import "package:expect/expect.dart";
// In the type test 'e is T', if T does not denote a type available in the
-// current lexical scope, then T is mapped to dynamic and the test succeeds.
+// current lexical scope, then T is mapped to dynamic. Direct tests against
+// T cause a dynamic type error though.
isCheckedMode() {
try {
@@ -27,8 +28,8 @@
} on TypeError catch (error) {
got_type_error = true;
}
- // No type error.
- Expect.isFalse(got_type_error);
+ // Type error.
+ Expect.isTrue(got_type_error);
}
{
bool got_type_error = false;
@@ -38,8 +39,8 @@
} on TypeError catch (error) {
got_type_error = true;
}
- // No type error.
- Expect.isFalse(got_type_error);
+ // Type error.
+ Expect.isTrue(got_type_error);
}
{
bool got_type_error = false;
diff --git a/tests/language/is_not_class2_test.dart b/tests/language/is_not_class2_test.dart
index 710c72d..4766fb2 100644
--- a/tests/language/is_not_class2_test.dart
+++ b/tests/language/is_not_class2_test.dart
@@ -2,9 +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.
-// Dart test program for catch that we expect a class after an 'is'. This is
-// not a negative test since 'aa' is a malformed type and therefore should be
-// treated as dynamic.
+// Dart test program for catch that we expect a class after an 'is'. 'aa' is a
+// malformed type and a type error should be thrown upon test.
+
+import 'package:expect/expect.dart';
class A {
const A();
@@ -23,5 +24,5 @@
}
main() {
- IsNotClass2NegativeTest.testMain();
+ Expect.throws(IsNotClass2NegativeTest.testMain, (e) => e is TypeError);
}
diff --git a/tests/language/isnot_malformed_type_test.dart b/tests/language/isnot_malformed_type_test.dart
index 11abe66..867e9f7 100644
--- a/tests/language/isnot_malformed_type_test.dart
+++ b/tests/language/isnot_malformed_type_test.dart
@@ -5,10 +5,10 @@
import 'package:expect/expect.dart';
f(obj) {
- // 'Baz' is not loaded, mapped to dynamic.
+ // 'Baz' is not loaded, throws a type error on test.
return (obj is !Baz);
}
main () {
- Expect.isFalse(f(null));
+ Expect.throws(() => f(null), (e) => e is TypeError);
}
diff --git a/tests/language/language.status b/tests/language/language.status
index 9c6fe8b..9597d5f 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -9,7 +9,6 @@
mixin_super_constructor_named_test: Fail # Issue 12631
mixin_super_constructor_positionals_test: Fail # Issue 12631
built_in_identifier_prefix_test: Fail # Issue 6970
-throwing_lazy_variable_test: Fail # Issue 5802
f_bounded_equality_test: RuntimeError # Issue 14000
# These bugs refer currently ongoing language discussions.
@@ -19,7 +18,6 @@
closure_in_initializer_test: Fail # Issue 6422
# Regular bugs which should be fixed.
-lazy_static3_test: Fail # Issue 12593
duplicate_export_negative_test: Fail # Issue 6134
mixin_forwarding_constructor2_test: Fail # Issue 13641
@@ -45,11 +43,15 @@
compile_time_constant_checked3_test/04: Fail, OK
compile_time_constant_checked3_test/05: Fail, OK
compile_time_constant_checked3_test/06: Fail, OK
+malformed2_test/01: Fail, OK
[ $runtime == vm || (($runtime == drt || $runtime == dartium) && $compiler == none) ]
call_test: Fail # Issue 12602
dynamic_prefix_core_test: Fail # Issue 12478
+[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium) ]
+export_ambiguous_main_negative_test: Fail # Issue 14763
+
[ $compiler == none && $runtime == drt ]
mixin_illegal_object_test/01: pass # Issue 10952.
mixin_illegal_object_test/02: pass # Issue 10952.
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 65055be..e5498ee 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -16,17 +16,16 @@
function_type_alias9_test/00: crash # Issue 11987
# TBF: we should check conflicts not only for methods, but for accessors too
-override_field_test/02: fail
override_field_test/03: fail
method_override7_test/03: Fail # Issue 11496
-built_in_identifier_test/none: Fail # Issue 13023
-
# Please add new failing tests before this line.
# Section below is for invalid tests.
#
#
+ref_before_declaration_test/none: fail # test issue 14879, "P" is not defined
+bad_initializer2_negative_test: fail # tester issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
# test issue 11124, It is warning, not error to don't initialize final field
field3a_negative_test: Fail # Issue 11124
@@ -68,15 +67,9 @@
constructor_call_wrong_argument_count_negative_test: fail
instance_call_wrong_argument_count_negative_test: fail
-# test issue 11589, export D from 2 export directives
-export_cyclic_test: fail
-
# test issue 11590, runtime only negative test
field_method4_negative_test: fail
-# test issue 11592, Function type alias (typedef) is not a constant
-first_class_types_constants_test: fail
-
# test issue 11594, Reference to a not resolve identifier is static warning
import_combinators_negative_test: fail
interface_static_non_final_fields_negative_test: fail
@@ -127,14 +120,11 @@
static_field_test/03: fail # Issue 12541
static_field_test/04: fail # Issue 12541
-# test issue 13787; duplicate exports of the same declaration is not handled
-duplicate_export_test: fail # Issue 13787
-
# test issue 13916, Looks as no warning should be in this redirecting factory
redirecting_factory_infinite_steps_test/01: fail
-# test issue , disallow default values in redirecting factories
-redirecting_factory_default_values_test/none: fail # Issue 14471
+# test issue 14471, has (legitimate) static warning; but not annotated
+redirecting_factory_default_values_test/none: StaticWarning # Test issue 14471; has (legitimate) static warning; but not annotated
# test issue 13956, It is a static type warning if any of the type arguments to k' are not subtypes of the bounds of the corresponding formal type parameters of type.
default_factory2_test/none: fail
@@ -208,7 +198,6 @@
crash_6725_test: StaticWarning
default_factory_library_test: StaticWarning
default_factory_test: StaticWarning
-div_with_power_of_two2_test: StaticWarning
double_to_string_as_exponential2_test: StaticWarning
double_to_string_as_fixed2_test: StaticWarning
double_to_string_as_precision2_test: StaticWarning
@@ -218,6 +207,7 @@
dynamic_prefix_core_test: StaticWarning
empty_block_case_test: StaticWarning
error_stacktrace_test: StaticWarning
+export_ambiguous_main_negative_test: CompileTimeError
extend_type_parameter2_negative_test: CompileTimeError
extend_type_parameter_negative_test: CompileTimeError
external_test/20: StaticWarning
@@ -302,6 +292,7 @@
malbounded_type_cast_test: StaticWarning
malbounded_type_literal_test: StaticWarning
malformed_type_test: StaticWarning
+malformed2_test/01: MissingCompileTimeError
map_literal11_test: StaticWarning
map_literal2_negative_test: CompileTimeError
map_literal3_test: StaticWarning
@@ -313,6 +304,7 @@
method_override5_test: StaticWarning
method_override6_test: StaticWarning
method_override_test: StaticWarning
+mixin_illegal_static_access_test: StaticWarning
mixin_illegal_syntax_test/13: CompileTimeError
mixin_typedef_constructor_test: StaticWarning
mixin_type_parameter2_test: StaticWarning
@@ -392,7 +384,6 @@
prefix23_test: StaticWarning
prefix7_negative_test: CompileTimeError
property_field_override_test: StaticWarning
-redirecting_factory_default_values_test/none: StaticWarning
redirecting_factory_incompatible_signature_test: StaticWarning
regress_13494_test: StaticWarning
return_type_test: StaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 16b9f2f..9f967f0 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -23,6 +23,8 @@
built_in_identifier_test/none: Fail # Issue 13023
+export_double_same_main_test: Fail # Issue 14772
+
# Please add new failing tests before this line.
# Section below is for invalid tests.
#
@@ -204,7 +206,6 @@
crash_6725_test: StaticWarning
default_factory_library_test: StaticWarning
default_factory_test: StaticWarning
-div_with_power_of_two2_test: StaticWarning
double_to_string_as_exponential2_test: StaticWarning
double_to_string_as_fixed2_test: StaticWarning
double_to_string_as_precision2_test: StaticWarning
@@ -214,6 +215,7 @@
dynamic_prefix_core_test: StaticWarning
empty_block_case_test: StaticWarning
error_stacktrace_test: StaticWarning
+export_ambiguous_main_negative_test: CompileTimeError
extend_type_parameter2_negative_test: CompileTimeError
extend_type_parameter_negative_test: CompileTimeError
external_test/20: StaticWarning
@@ -298,6 +300,7 @@
malbounded_type_cast_test: StaticWarning
malbounded_type_literal_test: StaticWarning
malformed_type_test: StaticWarning
+malformed2_test/01: MissingCompileTimeError
map_literal11_test: StaticWarning
map_literal2_negative_test: CompileTimeError
map_literal3_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index e907c6d..7e671f6 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -4,7 +4,6 @@
[ $compiler == dart2js || $compiler == dart2dart ]
bad_constructor_test/05: CompileTimeError # Issue 13669
-block_scope_test: CompileTimeError # Issue 13204.
malformed_test/05: MissingCompileTimeError # Issue 12695
malformed_test/06: MissingCompileTimeError # Issue 12695
full_stacktrace1_test: Pass, RuntimeError # Issue 12698
@@ -30,6 +29,7 @@
ref_before_declaration_test/03: MissingCompileTimeError
ref_before_declaration_test/04: MissingCompileTimeError
ref_before_declaration_test/05: MissingCompileTimeError
+ref_before_declaration_test/06: MissingCompileTimeError
# VM specific tests that should not be run by dart2js.
vm/*: Skip # Issue 12699
@@ -70,6 +70,7 @@
compile_time_constant_checked3_test/04: MissingCompileTimeError, OK
compile_time_constant_checked3_test/05: MissingCompileTimeError, OK
compile_time_constant_checked3_test/06: MissingCompileTimeError, OK
+malformed2_test/01: MissingCompileTimeError, OK
generic_test: RuntimeError, OK
named_parameters_type_test/01: MissingRuntimeError, OK
named_parameters_type_test/02: MissingRuntimeError, OK
@@ -137,7 +138,6 @@
map_literal3_test: CompileTimeError # Issue 12793
method_override5_test: RuntimeError # Issue 12809
external_test/13: CompileTimeError # Issue 12887
-instanceof4_test/01: RuntimeError # Issue 12889
list_literal4_test: RuntimeError # Issue 12890
map_literal4_test: RuntimeError # Issue 12891
built_in_identifier_test/01: CompileTimeError # Issue 13022
@@ -238,7 +238,6 @@
map_literal3_test: Fail # Issue 12794
external_test/13: Fail # Issue 12888
built_in_identifier_test/01: Fail # Issue 13022
-lazy_static3_test: Fail # Issue 12593
list_literal1_test/01: Fail # Issue 12993
map_literal1_test/01: Fail # Issue 12993
method_override4_test: Fail # Issue 12810
@@ -255,7 +254,6 @@
constructor5_test: Fail
constructor6_test: Fail
closure_in_initializer_test: Fail
-throwing_lazy_variable_test: Fail # Issue 5802
f_bounded_equality_test: RuntimeError # Issue 14000
# Minified mode failures.
@@ -278,6 +276,7 @@
compile_time_constant_checked3_test/04: Fail, OK
compile_time_constant_checked3_test/05: Fail, OK
compile_time_constant_checked3_test/06: Fail, OK
+malformed2_test/01: Fail, OK
[ $compiler == dart2dart && $checked ]
# Dart VM problems
diff --git a/tests/language/library_ambiguous_test.dart b/tests/language/library_ambiguous_test.dart
index 1584b24..011f041 100644
--- a/tests/language/library_ambiguous_test.dart
+++ b/tests/language/library_ambiguous_test.dart
@@ -17,7 +17,7 @@
print(bar()); /// 01: runtime error
print(baz()); /// 02: runtime error
print(bay()); /// 03: runtime error
- print(main is bax); /// 04: static type warning
+ print(main is bax); /// 04: static type warning, runtime error
var x = new X(); /// 05: continued
print("No error expected if ambiguous definitions are not used.");
}
diff --git a/tests/language/list_tracer_in_list_test.dart b/tests/language/list_tracer_in_list_test.dart
new file mode 100644
index 0000000..643f8ad
--- /dev/null
+++ b/tests/language/list_tracer_in_list_test.dart
@@ -0,0 +1,11 @@
+// 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() {
+ var a = [[]];
+ a[0].add(42);
+ if (a[0].length != 1) {
+ throw 'Test failed';
+ }
+}
diff --git a/tests/language/malformed2_lib.dart b/tests/language/malformed2_lib.dart
new file mode 100644
index 0000000..50155a3
--- /dev/null
+++ b/tests/language/malformed2_lib.dart
@@ -0,0 +1,57 @@
+// 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 malformed_test;
+
+/// [o] is either `null` or `new List<String>()`.
+void testValue(var o) {
+ assert(o == null || o is List<String>);
+
+ test(true, () => o is Unresolved, "$o is Unresolved");
+ test(false, () => o is List<Unresolved>, "$o is List<Unresolved>");
+ test(true, () => o is! Unresolved, "$o is! Unresolved");
+ test(false, () => o is! List<Unresolved>, "$o is List<Unresolved>");
+
+ test(true, () => o as Unresolved, "$o as Unresolved");
+ test(false, () => o as List<Unresolved>, "$o as List<Unresolved>");
+
+ test(false, () {
+ try {
+ } on Unresolved catch (e) {
+ } catch (e) {
+ }
+ }, "on Unresolved catch: Nothing thrown.");
+ test(true, () {
+ try {
+ throw o;
+ } on Unresolved catch (e) {
+ } catch (e) {
+ }
+ }, "on Unresolved catch ($o)");
+ test(false, () {
+ try {
+ throw o;
+ } on List<String> catch (e) {
+ } on NullThrownError catch (e) {
+ } on Unresolved catch (e) {
+ } catch (e) {
+ }
+ }, "on List<String>/NullThrowError catch ($o)");
+ test(false, () {
+ try {
+ throw o;
+ } on List<Unresolved> catch (e) {
+ } on NullThrownError catch (e) {
+ } on Unresolved catch (e) {
+ } catch (e) {
+ }
+ }, "on List<Unresolved>/NullThrowError catch ($o)");
+
+ test(o != null && inCheckedMode(),
+ () { Unresolved u = o; },
+ "Unresolved u = $o;");
+ test(false,
+ () { List<Unresolved> u = o; },
+ "List<Unresolved> u = $o;");
+}
\ No newline at end of file
diff --git a/tests/language/malformed2_test.dart b/tests/language/malformed2_test.dart
new file mode 100644
index 0000000..cab3aba
--- /dev/null
+++ b/tests/language/malformed2_test.dart
@@ -0,0 +1,59 @@
+// 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 malformed_test;
+
+// This part includes the actual tests.
+part 'malformed2_lib.dart'; /// 00: static type warning
+
+bool inCheckedMode() {
+ try {
+ var i = 42;
+ String s = i;
+ } on TypeError catch (e) {
+ return true;
+ }
+ return false;
+}
+
+bool hasFailed = false;
+
+void fail(String message) {
+ try {
+ throw message;
+ } catch (e, s) {
+ print(e);
+ print(s);
+ }
+ hasFailed = true;
+}
+
+void checkFailures() {
+ if (hasFailed) throw 'Test failed.';
+}
+
+test(bool expectTypeError, f(), [String message]) {
+ message = message != null ? ' for $message' : '';
+ try {
+ f();
+ if (expectTypeError) {
+ fail('Missing type error$message.');
+ }
+ } on TypeError catch (e) {
+ if (expectTypeError) {
+ print('Type error$message: $e');
+ } else {
+ fail('Unexpected type error$message: $e');
+ }
+ }
+}
+
+const Unresolved c1 = 0; /// 01: static type warning, compile-time error
+
+void main() {
+ print(c1); /// 01: continued
+ testValue(new List<String>()); /// 00: continued
+ testValue(null); /// 00: continued
+ checkFailures();
+}
diff --git a/tests/language/malformed_test.dart b/tests/language/malformed_test.dart
index 8f15dff..2364696 100644
--- a/tests/language/malformed_test.dart
+++ b/tests/language/malformed_test.dart
@@ -9,10 +9,10 @@
import 'package:expect/expect.dart' as prefix; // Define 'prefix'.
checkIsUnresolved(var v) {
- Expect.isTrue(v is Unresolved);
- Expect.isTrue(v is Unresolved<int>);
- Expect.isTrue(v is prefix.Unresolved);
- Expect.isTrue(v is prefix.Unresolved<int>);
+ Expect.throws(() => v is Unresolved, (e) => e is TypeError);
+ Expect.throws(() => v is Unresolved<int>, (e) => e is TypeError);
+ Expect.throws(() => v is prefix.Unresolved, (e) => e is TypeError);
+ Expect.throws(() => v is prefix.Unresolved<int>, (e) => e is TypeError);
}
checkIsListUnresolved(bool expect, var v) {
@@ -29,10 +29,10 @@
}
checkAsUnresolved(var v) {
- Expect.equals(v, v as Unresolved);
- Expect.equals(v, v as Unresolved<int>);
- Expect.equals(v, v as prefix.Unresolved);
- Expect.equals(v, v as prefix.Unresolved<int>);
+ Expect.throws(() => v as Unresolved, (e) => e is TypeError);
+ Expect.throws(() => v as Unresolved<int>, (e) => e is TypeError);
+ Expect.throws(() => v as prefix.Unresolved, (e) => e is TypeError);
+ Expect.throws(() => v as prefix.Unresolved<int>, (e) => e is TypeError);
}
checkAsListUnresolved(bool expect, var v) {
@@ -125,24 +125,40 @@
Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true); /// 05: compile-time error
try {
- throw 'foo';
- } on Unresolved catch (e) {
- // Equivalent to 'on dynamic', catches 'foo'.
+ try {
+ throw 'foo';
+ } on Unresolved catch (e) {
+ Expect.fail("This code shouldn't be executed");
+ }
+ Expect.fail("This code shouldn't be executed");
+ } on TypeError catch (e) {
}
try {
- throw 'foo';
- } on Unresolved<int> catch (e) {
- // Equivalent to 'on dynamic', catches 'foo'.
+ try {
+ throw 'foo';
+ } on Unresolved<int> catch (e) {
+ Expect.fail("This code shouldn't be executed");
+ }
+ Expect.fail("This code shouldn't be executed");
+ } on TypeError catch (e) {
}
try {
- throw 'foo';
- } on prefix.Unresolved catch (e) {
- // Equivalent to 'on dynamic', catches 'foo'.
+ try {
+ throw 'foo';
+ } on prefix.Unresolved catch (e) {
+ Expect.fail("This code shouldn't be executed");
+ }
+ Expect.fail("This code shouldn't be executed");
+ } on TypeError catch (e) {
}
try {
- throw 'foo';
- } on prefix.Unresolved<int> catch (e) {
- // Equivalent to 'on dynamic', catches 'foo'.
+ try {
+ throw 'foo';
+ } on prefix.Unresolved<int> catch (e) {
+ Expect.fail("This code shouldn't be executed");
+ }
+ Expect.fail("This code shouldn't be executed");
+ } on TypeError catch (e) {
}
try {
throw 'foo';
diff --git a/tests/language/on_catch_malformed_type_test.dart b/tests/language/on_catch_malformed_type_test.dart
index a7e18ef..e4c1f86 100644
--- a/tests/language/on_catch_malformed_type_test.dart
+++ b/tests/language/on_catch_malformed_type_test.dart
@@ -3,8 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
// Check that malformed types in on-catch are handled correctly, that is,
-// are treated as dynamic and thus catches all in bith production and checked
-// mode.
+// throws a type error in both production and checked mode.
+
+import 'package:expect/expect.dart';
catchUnresolvedBefore() {
try {
@@ -18,15 +19,17 @@
}
catchUnresolvedAfter() {
- try {
- throw "foo";
- Expect.fail("This code shouldn't be executed");
- } on Unavailable catch(ex) {
- // This is tested before the catch block below.
- // In both production and checked mode the test is always true.
- } on String catch(oks) {
- Expect.fail("This code shouldn't be executed");
- }
+ Expect.throws(() {
+ try {
+ throw "foo";
+ Expect.fail("This code shouldn't be executed");
+ } on Unavailable catch(ex) {
+ // This is tested before the catch block below.
+ // In both production and checked mode the test causes a type error.
+ } on String catch(oks) {
+ Expect.fail("This code shouldn't be executed");
+ }
+ }, (e) => e is TypeError);
}
main() {
diff --git a/tests/language/ref_before_declaration_test.dart b/tests/language/ref_before_declaration_test.dart
index 00a61e0..9ecbac7 100644
--- a/tests/language/ref_before_declaration_test.dart
+++ b/tests/language/ref_before_declaration_test.dart
@@ -41,10 +41,22 @@
const y = "Honk if you like peace and quiet!"; /// 03: compile-time error
}
+ void test4() {
+ void Q() {
+ P(); // Refers to non-existing top-level function P
+ }
+ void P() { /// 06: compile-time error
+ Q(); /// 06: continued
+ } /// 06: continued
+
+ Function f = () {x = f;}; /// 07: compile-time error
+ }
+
test() {
test1();
test2();
test3();
+ test4();
}
}
diff --git a/tests/language/reflect_core_vm_test.dart b/tests/language/reflect_core_vm_test.dart
new file mode 100644
index 0000000..d6e52f1
--- /dev/null
+++ b/tests/language/reflect_core_vm_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test reflection of private functions in core classes.
+
+import "package:expect/expect.dart";
+import "dart:mirrors";
+
+main() {
+ var s = "string";
+ var im = reflect(s);
+ try {
+ im.invoke(const Symbol("_setAt"), [0, 65]);
+ Expect.isTrue(false); // Unreachable.
+ } catch (e) {
+ Expect.equals(true, e is NoSuchMethodError);
+ }
+}
+
diff --git a/tests/language/type_parameter_test.dart b/tests/language/type_parameter_test.dart
index 7a39eeb..9493e22 100644
--- a/tests/language/type_parameter_test.dart
+++ b/tests/language/type_parameter_test.dart
@@ -17,28 +17,28 @@
}
static
- T /// 01: static type warning
+ T /// 01: static type warning, dynamic type error
staticMethod(
- T /// 02: static type warning
+ T /// 02: static type warning, dynamic type error
a) {
final
- T /// 03: static type warning
+ T /// 03: static type warning, dynamic type error
a = "not_null";
print(a);
return a;
}
static final
- T /// 04: static type warning
+ T /// 04: static type warning, dynamic type error
staticFinalField = "not_null";
static const
- T /// 05: static type warning
+ T /// 05: static type warning, dynamic type error
staticConstField = "not_null";
static not_null() => "not_null";
static final
- T /// 06: static type warning
+ T /// 06: static type warning, dynamic type error
staticFinalField2 = not_null();
// Assigning null to a malformed type is not a dynamic error.
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 57789d3..84c66b4 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -3,9 +3,12 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == dart2analyzer ]
-lib/_internal: Skip # Slow like a hell - timeouts.
+lib: Skip # Slow like a hell - timeouts.
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
+lib/core/bool: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
+lib/core/int: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
+lib/core/string: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
lib/_chrome/dart2js/chrome_dart2js: CompileTimeError
lib/html/dart2js/html_dart2js: CompileTimeError
lib/html/dartium/html_dartium: CompileTimeError
@@ -79,3 +82,86 @@
lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError
lib/web_sql/dartium/web_sql_dartium: CompileTimeError
+
+[ $compiler == dart2analyzer ]
+lib/async/async_error: CompileTimeError
+lib/async/deferred_load: CompileTimeError
+lib/async/future: CompileTimeError
+lib/async/future_impl: CompileTimeError
+lib/async/schedule_microtask: CompileTimeError
+lib/async/stream: CompileTimeError
+lib/async/stream_controller: CompileTimeError
+lib/async/stream_impl: CompileTimeError
+lib/async/timer: CompileTimeError
+lib/async/zone: CompileTimeError
+lib/collection/collections: CompileTimeError
+lib/_collection_dev/iterable: CompileTimeError
+lib/_collection_dev/list: CompileTimeError
+lib/_collection_dev/symbol: CompileTimeError
+lib/collection/hash_map: CompileTimeError
+lib/collection/iterable: CompileTimeError
+lib/collection/linked_hash_map: CompileTimeError
+lib/collection/list: CompileTimeError
+lib/collection/queue: CompileTimeError
+lib/collection/splay_tree: CompileTimeError
+lib/convert/ascii: CompileTimeError
+lib/convert/byte_conversion: CompileTimeError
+lib/convert/converter: CompileTimeError
+lib/convert/encoding: CompileTimeError
+lib/convert/html_escape: CompileTimeError
+lib/convert/json: CompileTimeError
+lib/convert/latin1: CompileTimeError
+lib/convert/line_splitter: CompileTimeError
+lib/convert/string_conversion: CompileTimeError
+lib/convert/utf: CompileTimeError
+lib/core/iterable: CompileTimeError
+lib/core/list: CompileTimeError
+lib/core/map: CompileTimeError
+lib/core/print: CompileTimeError
+lib/core/set: CompileTimeError
+lib/core/string: CompileTimeError
+lib/core/symbol: CompileTimeError
+lib/core/uri: CompileTimeError
+lib/html/html_common/conversions: CompileTimeError
+lib/html/html_common/css_class_set: CompileTimeError
+lib/html/html_common/device: CompileTimeError
+lib/html/html_common/filtered_element_list: CompileTimeError
+lib/html/html_common/lists: CompileTimeError
+lib/io/bytes_builder: CompileTimeError
+lib/io/common: CompileTimeError
+lib/io/crypto: CompileTimeError
+lib/io/data_transformer: CompileTimeError
+lib/io/directory: CompileTimeError
+lib/io/directory_impl: CompileTimeError
+lib/io/eventhandler: CompileTimeError
+lib/io/file: CompileTimeError
+lib/io/file_impl: CompileTimeError
+lib/io/file_system_entity: CompileTimeError
+lib/io/http: CompileTimeError
+lib/io/http_date: CompileTimeError
+lib/io/http_headers: CompileTimeError
+lib/io/http_impl: CompileTimeError
+lib/io/http_parser: CompileTimeError
+lib/io/http_session: CompileTimeError
+lib/io/io_service: CompileTimeError
+lib/io/io_sink: CompileTimeError
+lib/io/link: CompileTimeError
+lib/io/options: CompileTimeError
+lib/io/platform: CompileTimeError
+lib/io/platform_impl: CompileTimeError
+lib/io/process: CompileTimeError
+lib/io/secure_server_socket: CompileTimeError
+lib/io/secure_socket: CompileTimeError
+lib/io/socket: CompileTimeError
+lib/io/stdio: CompileTimeError
+lib/io/string_transformer: CompileTimeError
+lib/io/timer_impl: CompileTimeError
+lib/io/websocket: CompileTimeError
+lib/io/websocket_impl: CompileTimeError
+lib/math/point: CompileTimeError
+lib/math/rectangle: CompileTimeError
+lib/utf/utf16: CompileTimeError
+lib/utf/utf32: CompileTimeError
+lib/utf/utf8: CompileTimeError
+lib/utf/utf_stream: CompileTimeError
+
diff --git a/tests/lib/async/event_helper.dart b/tests/lib/async/event_helper.dart
index a13bac0..08a6b8f 100644
--- a/tests/lib/async/event_helper.dart
+++ b/tests/lib/async/event_helper.dart
@@ -158,8 +158,8 @@
cancelOnError: cancelOnError);
}
- void addError(error, [stackTrace]) {
- super.addError(error, stackTrace);
+ void addError(error) {
+ super.addError(error);
if (cancelOnError) {
onDoneSignal.complete();
}
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index ed342bc..b497f1d 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -55,8 +55,8 @@
void testNeverComplete() {
final completer = new Completer<int>();
final future = completer.future;
- future.then((v) => Expect.fail("Value not expected"));
- future.catchError((e) => Expect.fail("Value not expected"));
+ future.then((v) => Expect.fails("Value not expected"));
+ future.catchError((e) => Expect.fails("Value not expected"));
}
void testComplete() {
diff --git a/tests/lib/async/future_value_chain4_test.dart b/tests/lib/async/future_value_chain4_test.dart
index 8e640b5..2f09cfe 100644
--- a/tests/lib/async/future_value_chain4_test.dart
+++ b/tests/lib/async/future_value_chain4_test.dart
@@ -10,9 +10,8 @@
then(valueHandler, {onError}) {
scheduleMicrotask(() { valueHandler(499); });
}
- catchError(_, {test}) => null;
+ catchError(_) => null;
whenComplete(_) => null;
- asStream() => null;
}
main() {
diff --git a/tests/lib/async/schedule_microtask3_test.dart b/tests/lib/async/schedule_microtask3_test.dart
index a93e52b..950d8e0 100644
--- a/tests/lib/async/schedule_microtask3_test.dart
+++ b/tests/lib/async/schedule_microtask3_test.dart
@@ -5,8 +5,7 @@
library run_async_test;
import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
main() {
test("run async timer after async test", () {
diff --git a/tests/lib/async/stream_controller_test.dart b/tests/lib/async/stream_controller_test.dart
index f729edc..be9e975 100644
--- a/tests/lib/async/stream_controller_test.dart
+++ b/tests/lib/async/stream_controller_test.dart
@@ -18,7 +18,7 @@
..error("error!")
..error("error too!")
..close();
- CaptureEvents actualEvents = new Events.capture(c.stream.asBroadcastStream());
+ Events actualEvents = new Events.capture(c.stream.asBroadcastStream());
expectedEvents.replay(c);
Expect.listEquals(expectedEvents.events, actualEvents.events);
@@ -167,7 +167,7 @@
..error("error!")
..error("error too!")
..close();
- CaptureEvents actualEvents = new Events.capture(c.stream);
+ Events actualEvents = new Events.capture(c.stream);
expectedEvents.replay(c);
Expect.listEquals(expectedEvents.events, actualEvents.events);
diff --git a/tests/lib/async/stream_event_transformed_test.dart b/tests/lib/async/stream_event_transformed_test.dart
index 62d1967..0cda9c8 100644
--- a/tests/lib/async/stream_event_transformed_test.dart
+++ b/tests/lib/async/stream_event_transformed_test.dart
@@ -13,7 +13,7 @@
DecrementingTransformerSink(this.outSink);
void add(int i) => outSink.add(i - 1);
- void addError(int e, [st]) => outSink.addError(e - 1, st);
+ void addError(int e, st) => outSink.addError(e - 1, st);
void close() => outSink.close();
}
@@ -23,7 +23,7 @@
FutureWaitingTransformerSink(this.outSink, this.closeFuture);
void add(Future future) { future.then(outSink.add); }
- void addError(Future e, [st]) { e.then((val) { outSink.addError(val, st); }); }
+ void addError(Future e, st) { e.then((val) { outSink.addError(val, st); }); }
void close() { closeFuture.whenComplete(outSink.close); }
}
@@ -32,7 +32,7 @@
ZoneTransformerSink(this.outSink);
void add(_) { outSink.add(Zone.current); }
- void addError(_, [st]) { outSink.add(Zone.current); }
+ void addError(_, st) { outSink.add(Zone.current); }
void close() {
outSink.add(Zone.current);
outSink.close();
@@ -44,7 +44,7 @@
TypeChangingSink(this.outSink);
void add(int data) { outSink.add(data.toString()); }
- void addError(error, [st]) { outSink.addError(error, st); }
+ void addError(error, st) { outSink.addError(error, st); }
void close() { outSink.close(); }
}
diff --git a/tests/lib/async/stream_transformer_test.dart b/tests/lib/async/stream_transformer_test.dart
index 3088076..8029a65 100644
--- a/tests/lib/async/stream_transformer_test.dart
+++ b/tests/lib/async/stream_transformer_test.dart
@@ -21,7 +21,7 @@
MyStreamSubscription(this.stream, this.cancelOnError);
- Future cancel() => null;
+ void cancel() {}
void onData(void handleData(T data)) {
this.handleData = handleData == null ? _defaultData: handleData;
}
@@ -33,8 +33,6 @@
}
void pause([Future resumeSignal]) {}
- void resume() {}
-
final isPaused = false;
Future asFuture([var futureValue]) => null;
}
diff --git a/tests/lib/async/zone_debug_test.dart b/tests/lib/async/zone_debug_test.dart
index 6b6e490..fca0a5e 100644
--- a/tests/lib/async/zone_debug_test.dart
+++ b/tests/lib/async/zone_debug_test.dart
@@ -28,7 +28,7 @@
debugZoneRegisterUnaryCallback(Zone self, ZoneDelegate parent, Zone origin,
f(arg)) {
List savedTrace = [stackTrace]..addAll(restoredStackTrace);
- return parent.registerUnaryCallback(origin, (arg) {
+ return parent.registerCallback(origin, (arg) {
restoredStackTrace = savedTrace;
return f(arg);
});
@@ -43,7 +43,7 @@
debugZoneRunUnary(Zone self, ZoneDelegate parent, Zone origin, f(arg), arg) {
stackTrace++;
restoredStackTrace = [];
- return parent.runUnary(origin, f, arg);
+ return parent.run1(origin, f, arg);
}
List expectedDebugTrace;
diff --git a/tests/lib/convert/chunked_conversion1_test.dart b/tests/lib/convert/chunked_conversion1_test.dart
index 0bbe44b..70d82f2 100644
--- a/tests/lib/convert/chunked_conversion1_test.dart
+++ b/tests/lib/convert/chunked_conversion1_test.dart
@@ -32,7 +32,7 @@
specialI(o) => add(o);
}
-abstract class MyChunkedBoolSink extends ChunkedConversionSink<bool> {
+class MyChunkedBoolSink extends ChunkedConversionSink<bool> {
MyChunkedBoolSink();
factory MyChunkedBoolSink.from(sink) = BoolAdapterSink;
factory MyChunkedBoolSink.withCallback(callback) {
diff --git a/tests/lib/convert/chunked_conversion_json_decode1_test.dart b/tests/lib/convert/chunked_conversion_json_decode1_test.dart
index 0ef8ff3..932eae4 100644
--- a/tests/lib/convert/chunked_conversion_json_decode1_test.dart
+++ b/tests/lib/convert/chunked_conversion_json_decode1_test.dart
@@ -118,7 +118,7 @@
new ChunkedConversionSink.withCallback((x) => result = x.single);
var stringConversionSink = decoder.startChunkedConversion(objectSink);
ByteConversionSink inputByteSink = stringConversionSink.asUtf8Sink(false);
- var tmpBytes = UTF8.encode(str);
+ Object tmpBytes = UTF8.encode(str);
tmpBytes.forEach((b) => inputByteSink.addSlice([0, b, 1], 1, 2, false));
inputByteSink.close();
return result;
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index da9fc83..520fa72 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -6,6 +6,7 @@
mirrors/delegate_test: RuntimeError # Issue 13864
[ $compiler == dart2js ]
+async/schedule_microtask3_test: RuntimeError # _enqueueImmediate runs after Timer. http://dartbug.com/9002
async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
math/double_pow_test: RuntimeError
@@ -133,6 +134,7 @@
[ $compiler == dart2dart ]
mirrors/*: Skip # http://dartbug.com/11511
async/schedule_microtask6_test: Fail # Issue 10957 - may be related to issue 10910
+async/schedule_microtask3_test: RuntimeError # Issue 13719: Please triage this failure.
[ $compiler == dart2dart && $minified ]
json/json_test: Fail # Issue 10961
@@ -142,9 +144,9 @@
[ $runtime == ff ]
# FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
-async/multiple_timer_test: Pass, Fail # Issue 14734
-async/timer_isolate_test: Pass, Fail # Issue 14734
-async/timer_test: Pass, Fail # Issue 14734
+async/multiple_timer_test: Pass, Fail
+async/timer_isolate_test: Pass, Fail
+async/timer_test: Pass, Fail
convert/chunked_conversion_utf88_test: Pass, Timeout # Issue 12029
convert/streamed_conversion_utf8_encode_test: Pass, Timeout # Issue 12029
convert/streamed_conversion_utf8_decode_test: Pass, Slow # Issue 12029
@@ -157,13 +159,12 @@
async/deferred/deferred_api_test: Pass, Timeout # http://dartbug.com/12635
convert/streamed_conversion_utf8_decode_test: Pass, Timeout # http://dartbug.com/12768
convert/utf85_test: Skip # Issue 12029.
-async/timer_isolate_test: Pass, Fail # Issue 14734
[ $compiler == dart2js ]
typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
[ $runtime == opera ]
-async/multiple_timer_test: Pass, Fail # Probably issue 14734
+async/multiple_timer_test: Pass, Fail
[ $runtime == opera && $system == windows]
# TODO(efortuna): Investigate.
@@ -174,6 +175,7 @@
mirrors/native_class_test: Fail, OK # This test is meant to run in a browser.
[ $compiler == none ]
+async/schedule_microtask3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
mirrors/hierarchy_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
mirrors/mixin_application_test/01: Fail, OK # TODO(ahe): Slight broken test to ensure test coverage on dart2js.
mirrors/intercepted_object_test: Fail, OK # TODO(ahe): Slight broken test to ensure test coverage on dart2js.
@@ -229,10 +231,28 @@
async/schedule_microtask_test: Fail # Issue 9001, Issue 9002
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
+async/future_test: StaticWarning
+async/future_value_chain4_test: StaticWarning
+async/schedule_microtask3_test: StaticWarning
+async/stream_controller_async_test: StaticWarning
+async/stream_controller_test: StaticWarning
+async/stream_event_transformed_test: StaticWarning
+async/stream_first_where_test: StaticWarning
+async/stream_from_iterable_test: StaticWarning
+async/stream_join_test: StaticWarning
+async/stream_last_where_test: StaticWarning
+async/stream_single_test: StaticWarning
+async/stream_single_to_multi_subscriber_test: StaticWarning
+async/stream_transform_test: StaticWarning
+async/stream_transformer_from_handlers_test: StaticWarning
+async/stream_transformer_test: StaticWarning
+async/zone_debug_test: StaticWarning
+convert/chunked_conversion1_test: StaticWarning
+convert/chunked_conversion_json_decode1_test: StaticWarning
+math/min_max_test: StaticWarning
mirrors/equality_test/02: StaticWarning # Issue 14524
mirrors/generic_f_bounded_mixin_application_test: CompileTimeError # Issue 14116
mirrors/invoke_named_test: StaticWarning # Issue 14522
-mirrors/metadata_allowed_values_test/none: CompileTimeError # Issue 14688
mirrors/private_symbol_test: StaticWarning # Issue 14524
mirrors/reflect_class_test: StaticWarning # Issue 14524
mirrors/type_variable_owner_test: StaticWarning # Issue 14524
diff --git a/tests/lib/math/min_max_test.dart b/tests/lib/math/min_max_test.dart
index 1f89185..2b16176 100644
--- a/tests/lib/math/min_max_test.dart
+++ b/tests/lib/math/min_max_test.dart
@@ -15,12 +15,12 @@
class Wrap implements Comparable {
final value;
Wrap(this.value);
- int compareTo(Wrap other) => value.compareTo(other.value);
- bool operator<(Wrap other) => compareTo(other) < 0;
- bool operator<=(Wrap other) => compareTo(other) <= 0;
- bool operator>(Wrap other) => compareTo(other) > 0;
- bool operator>=(Wrap other) => compareTo(other) >= 0;
- bool operator==(other) => other is Wrap && compareTo(other) == 0;
+ int compare(Wrap other) => value.compare(other.value);
+ bool operator<(Wrap other) => compare(other) < 0;
+ bool operator<=(Wrap other) => compare(other) <= 0;
+ bool operator>(Wrap other) => compare(other) > 0;
+ bool operator>=(Wrap other) => compare(other) >= 0;
+ bool operator==(other) => other is Wrap && compare(other) == 0;
String toString() => 'Wrap($value)';
int get hashCode => value.hashCode;
}
diff --git a/tests/lib/math/point_test.dart b/tests/lib/math/point_test.dart
index f15c635..8d9ab72 100644
--- a/tests/lib/math/point_test.dart
+++ b/tests/lib/math/point_test.dart
@@ -9,14 +9,14 @@
main() {
test('constructor', () {
- var point = new Point();
+ var point = new Point(0, 0);
expect(point.x, 0);
expect(point.y, 0);
expect('$point', 'Point(0, 0)');
});
test('constructor X', () {
- var point = new Point<int>(10);
+ var point = new Point<int>(10, 0);
expect(point.x, 10);
expect(point.y, 0);
expect('$point', 'Point(10, 0)');
diff --git a/tests/lib/mirrors/generic_class_declaration_test.dart b/tests/lib/mirrors/generic_class_declaration_test.dart
new file mode 100644
index 0000000..0b8260f
--- /dev/null
+++ b/tests/lib/mirrors/generic_class_declaration_test.dart
@@ -0,0 +1,83 @@
+// 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';
+
+import 'stringify.dart';
+
+class A<T> {
+ var instanceVariable;
+ get instanceGetter => null;
+ set instanceSetter(x) => x;
+ instanceMethod() => null;
+
+ var _instanceVariable;
+ get _instanceGetter => null;
+ set _instanceSetter(x) => x;
+ _instanceMethod() => null;
+
+ static var staticVariable;
+ static get staticGetter => null;
+ static set staticSetter(x) => x;
+ static staticMethod() => null;
+
+ static var _staticVariable;
+ static get _staticGetter => null;
+ static set _staticSetter(x) => x;
+ static _staticMethod() => null;
+}
+
+main() {
+ ClassMirror cm = reflect(new A<String>()).type;
+ Expect.setEquals(
+ ['Variable(s(_instanceVariable) in s(A), private)',
+ 'Variable(s(_staticVariable) in s(A), private, static)',
+ 'Variable(s(instanceVariable) in s(A))',
+ 'Variable(s(staticVariable) in s(A), static)'],
+ cm.declarations.values
+ .where((dm) => dm is VariableMirror).map(stringify),
+ 'variables');
+
+ Expect.setEquals(
+ ['Method(s(_instanceGetter) in s(A), private, getter)',
+ 'Method(s(_staticGetter) in s(A), private, static, getter)',
+ 'Method(s(instanceGetter) in s(A), getter)',
+ 'Method(s(staticGetter) in s(A), static, getter)'],
+ cm.declarations.values
+ .where((dm) => dm is MethodMirror && dm.isGetter).map(stringify),
+ 'getters');
+
+ Expect.setEquals(
+ ['Method(s(_instanceSetter=) in s(A), private, setter)',
+ 'Method(s(_staticSetter=) in s(A), private, static, setter)',
+ 'Method(s(instanceSetter=) in s(A), setter)',
+ 'Method(s(staticSetter=) in s(A), static, setter)'],
+ cm.declarations.values
+ .where((dm) => dm is MethodMirror && dm.isSetter).map(stringify),
+ 'setters');
+
+ Expect.setEquals(
+ ['Method(s(_instanceMethod) in s(A), private)',
+ 'Method(s(_staticMethod) in s(A), private, static)',
+ 'Method(s(instanceMethod) in s(A))',
+ 'Method(s(staticMethod) in s(A), static)'],
+ cm.declarations.values
+ .where((dm) => dm is MethodMirror && dm.isRegularMethod)
+ .map(stringify), 'methods');
+
+ Expect.setEquals(
+ ['Method(s(A) in s(A), constructor)'],
+ cm.declarations.values
+ .where((dm) => dm is MethodMirror && dm.isConstructor).map(stringify),
+ 'constructors');
+
+ Expect.setEquals(
+ ['TypeVariable(s(T) in s(A), upperBound = Class(s(Object) in '
+ 's(dart.core), top-level))'],
+ cm.declarations.values
+ .where((dm) => dm is TypeVariableMirror).map(stringify),
+ 'type variables');
+
+}
\ No newline at end of file
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index bc1b164..c7df4a3 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -63,39 +63,39 @@
var n = new Float32x4(2.0, 2.0, 0.001, 0.1);
var cmp;
cmp = m.lessThan(n);
- Expect.equals(0xFFFFFFFF, cmp.x);
+ Expect.equals(-1, cmp.x);
Expect.equals(0x0, cmp.y);
Expect.equals(0x0, cmp.z);
- Expect.equals(0xFFFFFFFF, cmp.w);
+ Expect.equals(-1, cmp.w);
cmp = m.lessThanOrEqual(n);
- Expect.equals(0xFFFFFFFF, cmp.x);
- Expect.equals(0xFFFFFFFF, cmp.y);
+ Expect.equals(-1, cmp.x);
+ Expect.equals(-1, cmp.y);
Expect.equals(0x0, cmp.z);
- Expect.equals(0xFFFFFFFF, cmp.w);
+ Expect.equals(-1, cmp.w);
cmp = m.equal(n);
Expect.equals(0x0, cmp.x);
- Expect.equals(0xFFFFFFFF, cmp.y);
+ Expect.equals(-1, cmp.y);
Expect.equals(0x0, cmp.z);
Expect.equals(0x0, cmp.w);
cmp = m.notEqual(n);
- Expect.equals(0xFFFFFFFF, cmp.x);
+ Expect.equals(-1, cmp.x);
Expect.equals(0x0, cmp.y);
- Expect.equals(0xFFFFFFFF, cmp.z);
- Expect.equals(0xFFFFFFFF, cmp.w);
+ Expect.equals(-1, cmp.z);
+ Expect.equals(-1, cmp.w);
cmp = m.greaterThanOrEqual(n);
Expect.equals(0x0, cmp.x);
- Expect.equals(0xFFFFFFFF, cmp.y);
- Expect.equals(0xFFFFFFFF, cmp.z);
+ Expect.equals(-1, cmp.y);
+ Expect.equals(-1, cmp.z);
Expect.equals(0x0, cmp.w);
cmp = m.greaterThan(n);
Expect.equals(0x0, cmp.x);
Expect.equals(0x0, cmp.y);
- Expect.equals(0xFFFFFFFF, cmp.z);
+ Expect.equals(-1, cmp.z);
Expect.equals(0x0, cmp.w);
}
@@ -220,7 +220,7 @@
}
testSelect() {
- var m = new Uint32x4.bool(true, true, false, false);
+ var m = new Int32x4.bool(true, true, false, false);
var t = new Float32x4(1.0, 2.0, 3.0, 4.0);
var f = new Float32x4(5.0, 6.0, 7.0, 8.0);
var s = m.select(t, f);
@@ -231,31 +231,31 @@
}
testConversions() {
- var m = new Uint32x4(0x3F800000, 0x40000000, 0x40400000, 0x40800000);
- var n = new Float32x4.fromUint32x4Bits(m);
+ var m = new Int32x4(0x3F800000, 0x40000000, 0x40400000, 0x40800000);
+ var n = new Float32x4.fromInt32x4Bits(m);
Expect.equals(1.0, n.x);
Expect.equals(2.0, n.y);
Expect.equals(3.0, n.z);
Expect.equals(4.0, n.w);
n = new Float32x4(5.0, 6.0, 7.0, 8.0);
- m = new Uint32x4.fromFloat32x4Bits(n);
+ m = new Int32x4.fromFloat32x4Bits(n);
Expect.equals(0x40A00000, m.x);
Expect.equals(0x40C00000, m.y);
Expect.equals(0x40E00000, m.z);
Expect.equals(0x41000000, m.w);
// Flip sign using bit-wise operators.
n = new Float32x4(9.0, 10.0, 11.0, 12.0);
- m = new Uint32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
- var nMask = new Uint32x4.fromFloat32x4Bits(n);
+ m = new Int32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
+ var nMask = new Int32x4.fromFloat32x4Bits(n);
nMask = nMask ^ m; // flip sign.
- n = new Float32x4.fromUint32x4Bits(nMask);
+ n = new Float32x4.fromInt32x4Bits(nMask);
Expect.equals(-9.0, n.x);
Expect.equals(-10.0, n.y);
Expect.equals(-11.0, n.z);
Expect.equals(-12.0, n.w);
- nMask = new Uint32x4.fromFloat32x4Bits(n);
+ nMask = new Int32x4.fromFloat32x4Bits(n);
nMask = nMask ^ m; // flip sign.
- n = new Float32x4.fromUint32x4Bits(nMask);
+ n = new Float32x4.fromInt32x4Bits(nMask);
Expect.equals(9.0, n.x);
Expect.equals(10.0, n.y);
Expect.equals(11.0, n.z);
@@ -264,25 +264,25 @@
testBitOperators() {
- var m = new Uint32x4(0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA);
- var n = new Uint32x4(0x55555555, 0x55555555, 0x55555555, 0x55555555);
- Expect.equals(0xAAAAAAAA, m.x);
- Expect.equals(0xAAAAAAAA, m.y);
- Expect.equals(0xAAAAAAAA, m.z);
- Expect.equals(0xAAAAAAAA, m.w);
- Expect.equals(0x55555555, n.x);
- Expect.equals(0x55555555, n.y);
- Expect.equals(0x55555555, n.z);
- Expect.equals(0x55555555, n.w);
+ var m = new Int32x4(0xAAAAAAA, 0xAAAAAAA, 0xAAAAAAA, 0xAAAAAAA);
+ var n = new Int32x4(0x5555555, 0x5555555, 0x5555555, 0x5555555);
+ Expect.equals(0xAAAAAAA, m.x);
+ Expect.equals(0xAAAAAAA, m.y);
+ Expect.equals(0xAAAAAAA, m.z);
+ Expect.equals(0xAAAAAAA, m.w);
+ Expect.equals(0x5555555, n.x);
+ Expect.equals(0x5555555, n.y);
+ Expect.equals(0x5555555, n.z);
+ Expect.equals(0x5555555, n.w);
Expect.equals(true, n.flagX);
Expect.equals(true, n.flagY);
Expect.equals(true, n.flagZ);
Expect.equals(true, n.flagW);
var o = m|n; // or
- Expect.equals(0xFFFFFFFF, o.x);
- Expect.equals(0xFFFFFFFF, o.y);
- Expect.equals(0xFFFFFFFF, o.z);
- Expect.equals(0xFFFFFFFF, o.w);
+ Expect.equals(0xFFFFFFF, o.x);
+ Expect.equals(0xFFFFFFF, o.y);
+ Expect.equals(0xFFFFFFF, o.z);
+ Expect.equals(0xFFFFFFF, o.w);
Expect.equals(true, o.flagX);
Expect.equals(true, o.flagY);
Expect.equals(true, o.flagZ);
@@ -292,14 +292,14 @@
Expect.equals(0x0, o.y);
Expect.equals(0x0, o.z);
Expect.equals(0x0, o.w);
- n = n.withX(0xAAAAAAAA);
- n = n.withY(0xAAAAAAAA);
- n = n.withZ(0xAAAAAAAA);
- n = n.withW(0xAAAAAAAA);
- Expect.equals(0xAAAAAAAA, n.x);
- Expect.equals(0xAAAAAAAA, n.y);
- Expect.equals(0xAAAAAAAA, n.z);
- Expect.equals(0xAAAAAAAA, n.w);
+ n = n.withX(0xAAAAAAA);
+ n = n.withY(0xAAAAAAA);
+ n = n.withZ(0xAAAAAAA);
+ n = n.withW(0xAAAAAAA);
+ Expect.equals(0xAAAAAAA, n.x);
+ Expect.equals(0xAAAAAAA, n.y);
+ Expect.equals(0xAAAAAAA, n.z);
+ Expect.equals(0xAAAAAAA, n.w);
o = m^n; // xor
Expect.equals(0x0, o.x);
Expect.equals(0x0, o.y);
@@ -331,7 +331,7 @@
Expect.equals(3.0, f.y);
Expect.equals(2.0, f.z);
Expect.equals(1.0, f.w);
- var m = new Uint32x4.bool(false, false, false, false);
+ var m = new Int32x4.bool(false, false, false, false);
Expect.equals(false, m.flagX);
Expect.equals(false, m.flagY);
Expect.equals(false, m.flagZ);
@@ -364,7 +364,7 @@
Expect.equals(2.0, f.y);
Expect.equals(3.0, f.z);
Expect.equals(4.0, f.w);
- var m = new Uint32x4.bool(false, true, true, false);
+ var m = new Int32x4.bool(false, true, true, false);
Expect.equals(false, m.flagX);
Expect.equals(true, m.flagY);
Expect.equals(true, m.flagZ);
diff --git a/tests/lib/typed_data/float32x4_unbox_regress_test.dart b/tests/lib/typed_data/float32x4_unbox_regress_test.dart
index e179f95..b288fb3 100644
--- a/tests/lib/typed_data/float32x4_unbox_regress_test.dart
+++ b/tests/lib/typed_data/float32x4_unbox_regress_test.dart
@@ -74,7 +74,7 @@
}
void testComparison(a, b) {
- Uint32x4 r = a.equal(b);
+ Int32x4 r = a.equal(b);
Expect.equals(true, r.flagX);
Expect.equals(false, r.flagY);
Expect.equals(false, r.flagZ);
diff --git a/tests/lib/typed_data/int32x4_arithmetic_test.dart b/tests/lib/typed_data/int32x4_arithmetic_test.dart
new file mode 100644
index 0000000..37094f8
--- /dev/null
+++ b/tests/lib/typed_data/int32x4_arithmetic_test.dart
@@ -0,0 +1,99 @@
+// 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.
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+
+// Library tag to be able to run in html test framework.
+library uint32x4_arithmetic_test;
+
+import "package:expect/expect.dart";
+import 'dart:typed_data';
+
+testAdd() {
+ var m = new Int32x4(0, 0, 0, 0);
+ var n = new Int32x4(-1, -1, -1, -1);
+ var o = m + n;
+ Expect.equals(-1, o.x);
+ Expect.equals(-1, o.y);
+ Expect.equals(-1, o.z);
+ Expect.equals(-1, o.w);
+
+ m = new Int32x4(0, 0, 0, 0);
+ n = new Int32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ o = m + n;
+ Expect.equals(-1, o.x);
+ Expect.equals(-1, o.y);
+ Expect.equals(-1, o.z);
+ Expect.equals(-1, o.w);
+
+ n = new Int32x4(1, 1, 1, 1);
+ m = new Int32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ o = m + n;
+ Expect.equals(0, o.x);
+ Expect.equals(0, o.y);
+ Expect.equals(0, o.z);
+ Expect.equals(0, o.w);
+
+ n = new Int32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ m = new Int32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ o = m + n;
+ Expect.equals(-2, o.x);
+ Expect.equals(-2, o.y);
+ Expect.equals(-2, o.z);
+ Expect.equals(-2, o.w);
+
+ n = new Int32x4(1, 0, 0, 0);
+ m = new Int32x4(2, 0, 0, 0);
+ o = n + m;
+ Expect.equals(3, o.x);
+ Expect.equals(0, o.y);
+ Expect.equals(0, o.z);
+ Expect.equals(0, o.w);
+
+ n = new Int32x4(1, 3, 0, 0);
+ m = new Int32x4(2, 4, 0, 0);
+ o = n + m;
+ Expect.equals(3, o.x);
+ Expect.equals(7, o.y);
+ Expect.equals(0, o.z);
+ Expect.equals(0, o.w);
+
+ n = new Int32x4(1, 3, 5, 0);
+ m = new Int32x4(2, 4, 6, 0);
+ o = n + m;
+ Expect.equals(3, o.x);
+ Expect.equals(7, o.y);
+ Expect.equals(11, o.z);
+ Expect.equals(0, o.w);
+
+ n = new Int32x4(1, 3, 5, 7);
+ m = new Int32x4(-2, -4, -6, -8);
+ o = n + m;
+ Expect.equals(-1, o.x);
+ Expect.equals(-1, o.y);
+ Expect.equals(-1, o.z);
+ Expect.equals(-1, o.w);
+}
+
+testSub() {
+ var m = new Int32x4(0, 0, 0, 0);
+ var n = new Int32x4(1, 1, 1, 1);
+ var o = m - n;
+ Expect.equals(-1, o.x);
+ Expect.equals(-1, o.y);
+ Expect.equals(-1, o.z);
+ Expect.equals(-1, o.w);
+
+ o = n - m;
+ Expect.equals(1, o.x);
+ Expect.equals(1, o.y);
+ Expect.equals(1, o.z);
+ Expect.equals(1, o.w);
+}
+
+main() {
+ for (int i = 0; i < 20; i++) {
+ testAdd();
+ testSub();
+ }
+}
diff --git a/tests/lib/typed_data/uint32x4_list_test.dart b/tests/lib/typed_data/int32x4_list_test.dart
similarity index 87%
rename from tests/lib/typed_data/uint32x4_list_test.dart
rename to tests/lib/typed_data/int32x4_list_test.dart
index b9bae4e..1ee42b6 100644
--- a/tests/lib/typed_data/uint32x4_list_test.dart
+++ b/tests/lib/typed_data/int32x4_list_test.dart
@@ -4,15 +4,15 @@
// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
// Library tag to be able to run in html test framework.
-library uint32x4_list_test;
+library int32x4_list_test;
import 'package:expect/expect.dart';
import 'dart:typed_data';
testLoadStore(array) {
Expect.equals(8, array.length);
- Expect.isTrue(array is List<Uint32x4>);
- array[0] = new Uint32x4(1, 2, 3, 4);
+ Expect.isTrue(array is List<Int32x4>);
+ array[0] = new Int32x4(1, 2, 3, 4);
Expect.equals(1, array[0].x);
Expect.equals(2, array[0].y);
Expect.equals(3, array[0].z);
@@ -38,8 +38,8 @@
}
testLoadStoreDeoptDriver() {
- Uint32x4List list = new Uint32x4List(4);
- Uint32x4 value = new Uint32x4(1, 2, 3, 4);
+ Int32x4List list = new Int32x4List(4);
+ Int32x4 value = new Int32x4(1, 2, 3, 4);
for (int i = 0; i < 20; i++) {
testLoadStoreDeopt(list, 0, value);
}
@@ -72,15 +72,15 @@
testLoadStoreDeopt(list, 0, value);
}
try {
- // non-Uint32x4 value.
+ // non-Int32x4 value.
testLoadStoreDeopt(list, 0, 4.toDouble());
} catch (_) {}
for (int i = 0; i < 20; i++) {
testLoadStoreDeopt(list, 0, value);
}
try {
- // non-Uint32x4List list.
- testLoadStoreDeopt([new Uint32x4(2, 3, 4, 5)], 0, value);
+ // non-Int32x4List list.
+ testLoadStoreDeopt([new Int32x4(2, 3, 4, 5)], 0, value);
} catch (_) {}
for (int i = 0; i < 20; i++) {
testLoadStoreDeopt(list, 0, value);
@@ -88,7 +88,7 @@
}
testListZero() {
- Uint32x4List list = new Uint32x4List(1);
+ Int32x4List list = new Int32x4List(1);
Expect.equals(0, list[0].x);
Expect.equals(0, list[0].y);
Expect.equals(0, list[0].z);
@@ -97,7 +97,7 @@
testView(array) {
Expect.equals(8, array.length);
- Expect.isTrue(array is List<Uint32x4>);
+ Expect.isTrue(array is List<Int32x4>);
Expect.equals(0, array[0].x);
Expect.equals(1, array[0].y);
Expect.equals(2, array[0].z);
@@ -110,7 +110,7 @@
testSublist(array) {
Expect.equals(8, array.length);
- Expect.isTrue(array is Uint32x4List);
+ Expect.isTrue(array is Int32x4List);
var a = array.sublist(0, 1);
Expect.equals(1, a.length);
Expect.equals(0, a[0].x);
@@ -135,7 +135,7 @@
main() {
var list;
- list = new Uint32x4List(8);
+ list = new Int32x4List(8);
for (int i = 0; i < 20; i++) {
testLoadStore(list);
}
@@ -144,7 +144,7 @@
for (int i = 0; i < uint32List.length; i++) {
uint32List[i] = i;
}
- list = new Uint32x4List.view(uint32List.buffer);
+ list = new Int32x4List.view(uint32List.buffer);
for (int i = 0; i < 20; i++) {
testView(list);
}
diff --git a/tests/lib/typed_data/uint32x4_shuffle_test.dart b/tests/lib/typed_data/int32x4_shuffle_test.dart
similarity index 78%
rename from tests/lib/typed_data/uint32x4_shuffle_test.dart
rename to tests/lib/typed_data/int32x4_shuffle_test.dart
index f3335a8..28e4eeb 100644
--- a/tests/lib/typed_data/uint32x4_shuffle_test.dart
+++ b/tests/lib/typed_data/int32x4_shuffle_test.dart
@@ -10,9 +10,9 @@
import 'dart:typed_data';
void testShuffle() {
- var m = new Uint32x4(1, 2, 3, 4);
+ var m = new Int32x4(1, 2, 3, 4);
var c;
- c = m.shuffle(Uint32x4.WZYX);
+ c = m.shuffle(Int32x4.WZYX);
Expect.equals(4, c.x);
Expect.equals(3, c.y);
Expect.equals(2, c.z);
@@ -20,7 +20,7 @@
}
void testShuffleNonConstant(mask) {
- var m = new Uint32x4(1, 2, 3, 4);
+ var m = new Int32x4(1, 2, 3, 4);
var c;
c = m.shuffle(mask);
if (mask == 1) {
@@ -29,7 +29,7 @@
Expect.equals(1, c.z);
Expect.equals(1, c.w);
} else {
- Expect.equals(Uint32x4.YYYY + 1, mask);
+ Expect.equals(Int32x4.YYYY + 1, mask);
Expect.equals(3, c.x);
Expect.equals(2, c.y);
Expect.equals(2, c.z);
@@ -38,9 +38,9 @@
}
void testShuffleMix() {
- var m = new Uint32x4(1, 2, 3, 4);
- var n = new Uint32x4(5, 6, 7, 8);
- var c = m.shuffleMix(n, Uint32x4.XYXY);
+ var m = new Int32x4(1, 2, 3, 4);
+ var n = new Int32x4(5, 6, 7, 8);
+ var c = m.shuffleMix(n, Int32x4.XYXY);
Expect.equals(1, c.x);
Expect.equals(2, c.y);
Expect.equals(5, c.z);
@@ -48,8 +48,8 @@
}
main() {
- var xxxx = Uint32x4.XXXX + 1;
- var yyyy = Uint32x4.YYYY + 1;
+ var xxxx = Int32x4.XXXX + 1;
+ var yyyy = Int32x4.YYYY + 1;
for (int i = 0; i < 20; i++) {
testShuffle();
testShuffleNonConstant(xxxx);
diff --git a/tests/lib/typed_data/uint32x4_sign_mask_test.dart b/tests/lib/typed_data/int32x4_sign_mask_test.dart
similarity index 65%
rename from tests/lib/typed_data/uint32x4_sign_mask_test.dart
rename to tests/lib/typed_data/int32x4_sign_mask_test.dart
index 052d0bf..b4e620e 100644
--- a/tests/lib/typed_data/uint32x4_sign_mask_test.dart
+++ b/tests/lib/typed_data/int32x4_sign_mask_test.dart
@@ -4,45 +4,45 @@
// VMOptions=--optimization-counter-threshold=10
// Library tag to be able to run in html test framework.
-library uint32x4_sign_mask;
+library int32x4_sign_mask;
import 'dart:typed_data';
import 'package:expect/expect.dart';
void testImmediates() {
- var f = new Uint32x4(1, 2, 3, 4);
+ var f = new Int32x4(1, 2, 3, 4);
var m = f.signMask;
Expect.equals(0x0, m);
- f = new Uint32x4(-1, -2, -3, -4);
+ f = new Int32x4(-1, -2, -3, -4);
m = f.signMask;
Expect.equals(0xf, m);
- f = new Uint32x4.bool(true, false, false, false);
+ f = new Int32x4.bool(true, false, false, false);
m = f.signMask;
Expect.equals(0x1, m);
- f = new Uint32x4.bool(false, true, false, false);
+ f = new Int32x4.bool(false, true, false, false);
m = f.signMask;
Expect.equals(0x2, m);
- f = new Uint32x4.bool(false, false, true, false);
+ f = new Int32x4.bool(false, false, true, false);
m = f.signMask;
Expect.equals(0x4, m);
- f = new Uint32x4.bool(false, false, false, true);
+ f = new Int32x4.bool(false, false, false, true);
m = f.signMask;
Expect.equals(0x8, m);
}
void testZero() {
- var f = new Uint32x4(0, 0, 0, 0);
+ var f = new Int32x4(0, 0, 0, 0);
var m = f.signMask;
Expect.equals(0x0, m);
- f = new Uint32x4(-0, -0, -0, -0);
+ f = new Int32x4(-0, -0, -0, -0);
m = f.signMask;
Expect.equals(0x0, m);
}
void testLogic() {
- var a = new Uint32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
- var b = new Uint32x4(0x70000000, 0x70000000, 0x70000000, 0x70000000);
- var c = new Uint32x4(0xf0000000, 0xf0000000, 0xf0000000, 0xf0000000);
+ var a = new Int32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
+ var b = new Int32x4(0x70000000, 0x70000000, 0x70000000, 0x70000000);
+ var c = new Int32x4(0xf0000000, 0xf0000000, 0xf0000000, 0xf0000000);
var m1 = (a & c).signMask;
Expect.equals(0xf, m1);
var m2 = (a & b).signMask;
diff --git a/tests/lib/typed_data/uint32x4_arithmetic_test.dart b/tests/lib/typed_data/uint32x4_arithmetic_test.dart
deleted file mode 100644
index a702082..0000000
--- a/tests/lib/typed_data/uint32x4_arithmetic_test.dart
+++ /dev/null
@@ -1,99 +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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
-
-// Library tag to be able to run in html test framework.
-library uint32x4_arithmetic_test;
-
-import "package:expect/expect.dart";
-import 'dart:typed_data';
-
-testAdd() {
- var m = new Uint32x4(0, 0, 0, 0);
- var n = new Uint32x4(-1, -1, -1, -1);
- var o = m + n;
- Expect.equals(4294967295, o.x);
- Expect.equals(4294967295, o.y);
- Expect.equals(4294967295, o.z);
- Expect.equals(4294967295, o.w);
-
- m = new Uint32x4(0, 0, 0, 0);
- n = new Uint32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- o = m + n;
- Expect.equals(4294967295, o.x);
- Expect.equals(4294967295, o.y);
- Expect.equals(4294967295, o.z);
- Expect.equals(4294967295, o.w);
-
- n = new Uint32x4(1, 1, 1, 1);
- m = new Uint32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- o = m + n;
- Expect.equals(0, o.x);
- Expect.equals(0, o.y);
- Expect.equals(0, o.z);
- Expect.equals(0, o.w);
-
- n = new Uint32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- m = new Uint32x4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- o = m + n;
- Expect.equals(4294967294, o.x);
- Expect.equals(4294967294, o.y);
- Expect.equals(4294967294, o.z);
- Expect.equals(4294967294, o.w);
-
- n = new Uint32x4(1, 0, 0, 0);
- m = new Uint32x4(2, 0, 0, 0);
- o = n + m;
- Expect.equals(3, o.x);
- Expect.equals(0, o.y);
- Expect.equals(0, o.z);
- Expect.equals(0, o.w);
-
- n = new Uint32x4(1, 3, 0, 0);
- m = new Uint32x4(2, 4, 0, 0);
- o = n + m;
- Expect.equals(3, o.x);
- Expect.equals(7, o.y);
- Expect.equals(0, o.z);
- Expect.equals(0, o.w);
-
- n = new Uint32x4(1, 3, 5, 0);
- m = new Uint32x4(2, 4, 6, 0);
- o = n + m;
- Expect.equals(3, o.x);
- Expect.equals(7, o.y);
- Expect.equals(11, o.z);
- Expect.equals(0, o.w);
-
- n = new Uint32x4(1, 3, 5, 7);
- m = new Uint32x4(2, 4, 6, 8);
- o = n + m;
- Expect.equals(3, o.x);
- Expect.equals(7, o.y);
- Expect.equals(11, o.z);
- Expect.equals(15, o.w);
-}
-
-testSub() {
- var m = new Uint32x4(0, 0, 0, 0);
- var n = new Uint32x4(1, 1, 1, 1);
- var o = m - n;
- Expect.equals(4294967295, o.x);
- Expect.equals(4294967295, o.y);
- Expect.equals(4294967295, o.z);
- Expect.equals(4294967295, o.w);
-
- o = n - m;
- Expect.equals(1, o.x);
- Expect.equals(1, o.y);
- Expect.equals(1, o.z);
- Expect.equals(1, o.w);
-}
-
-main() {
- for (int i = 0; i < 20; i++) {
- testAdd();
- testSub();
- }
-}
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index 63a3be8..1c42e5e 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -219,16 +219,15 @@
HttpServer.bind("127.0.0.1", 0).then((server) {
_server = server;
_server.listen(_requestReceivedHandler);
- replyTo.send(new IsolatedHttpServerStatus.started(_server.port),
- null);
+ replyTo.send(new IsolatedHttpServerStatus.started(_server.port));
});
} catch (e) {
- replyTo.send(new IsolatedHttpServerStatus.error(), null);
+ replyTo.send(new IsolatedHttpServerStatus.error());
}
} else if (command.isStop) {
_server.close();
_dispatchPort.close();
- replyTo.send(new IsolatedHttpServerStatus.stopped(), null);
+ replyTo.send(new IsolatedHttpServerStatus.stopped());
} else if (command.isChunkedEncoding) {
_chunkedEncoding = true;
}
diff --git a/tests/standalone/io/http_basic_test.dart b/tests/standalone/io/http_basic_test.dart
index 2d7eebd..f30a32b 100644
--- a/tests/standalone/io/http_basic_test.dart
+++ b/tests/standalone/io/http_basic_test.dart
@@ -170,15 +170,15 @@
HttpServer.bind("127.0.0.1", 0).then((server) {
_server = server;
_server.listen(_requestReceivedHandler);
- replyTo.send(new TestServerStatus.started(_server.port), null);
+ replyTo.send(new TestServerStatus.started(_server.port));
});
} catch (e) {
- replyTo.send(new TestServerStatus.error(), null);
+ replyTo.send(new TestServerStatus.error());
}
} else if (command.isStop) {
_server.close();
_dispatchPort.close();
- replyTo.send(new TestServerStatus.stopped(), null);
+ replyTo.send(new TestServerStatus.stopped());
} else if (command.isChunkedEncoding) {
_chunkedEncoding = true;
}
diff --git a/tests/standalone/io/http_connection_info_test.dart b/tests/standalone/io/http_connection_info_test.dart
index 0d4caa4..e503803 100644
--- a/tests/standalone/io/http_connection_info_test.dart
+++ b/tests/standalone/io/http_connection_info_test.dart
@@ -11,8 +11,8 @@
server.listen((request) {
var response = request.response;
- Expect.isTrue(request.connectionInfo.remoteHost is String);
- Expect.isTrue(response.connectionInfo.remoteHost is String);
+ Expect.isTrue(request.connectionInfo.remoteAddress is InternetAddress);
+ Expect.isTrue(response.connectionInfo.remoteAddress is InternetAddress);
Expect.equals(request.connectionInfo.localPort, server.port);
Expect.equals(response.connectionInfo.localPort, server.port);
Expect.isNotNull(clientPort);
@@ -26,7 +26,8 @@
HttpClient client = new HttpClient();
client.get("127.0.0.1", server.port, "/")
.then((request) {
- Expect.isTrue(request.connectionInfo.remoteHost is String);
+ Expect.isTrue(
+ request.connectionInfo.remoteAddress is InternetAddress);
Expect.equals(request.connectionInfo.remotePort, server.port);
clientPort = request.connectionInfo.localPort;
return request.close();
diff --git a/tests/standalone/io/http_read_test.dart b/tests/standalone/io/http_read_test.dart
index 2a0ad52..23e40ab 100644
--- a/tests/standalone/io/http_read_test.dart
+++ b/tests/standalone/io/http_read_test.dart
@@ -138,16 +138,15 @@
HttpServer.bind("127.0.0.1", 0).then((server) {
_server = server;
_server.listen(_requestReceivedHandler);
- replyTo.send(
- new IsolatedHttpServerStatus.started(_server.port), null);
+ replyTo.send(new IsolatedHttpServerStatus.started(_server.port));
});
} catch (e) {
- replyTo.send(new IsolatedHttpServerStatus.error(), null);
+ replyTo.send(new IsolatedHttpServerStatus.error());
}
} else if (command.isStop) {
_server.close();
_dispatchPort.close();
- replyTo.send(new IsolatedHttpServerStatus.stopped(), null);
+ replyTo.send(new IsolatedHttpServerStatus.stopped());
} else if (command.isChunkedEncoding) {
_chunkedEncoding = true;
}
diff --git a/tests/standalone/io/print_env.dart b/tests/standalone/io/print_env.dart
index 28f926c..4337451 100644
--- a/tests/standalone/io/print_env.dart
+++ b/tests/standalone/io/print_env.dart
@@ -5,5 +5,8 @@
import "dart:io";
main(List<String> arguments) {
+ if (!Platform.script.isAbsolute) {
+ throw "Platform.script is not absolute: ${Platform.script}";
+ }
print(Platform.environment[arguments[0]]);
}
diff --git a/tests/standalone/io/process_environment_test.dart b/tests/standalone/io/process_environment_test.dart
index c36ef8c..4376aab 100644
--- a/tests/standalone/io/process_environment_test.dart
+++ b/tests/standalone/io/process_environment_test.dart
@@ -20,6 +20,14 @@
environment: environment,
includeParentEnvironment: includeParent)
.then((result) {
+ if (result.exitCode != 0) {
+ print('print_env.dart subprocess failed '
+ 'with exit code ${result.exitCode}');
+ print('stdout:');
+ print(result.stdout);
+ print('stderr:');
+ print(result.stderr);
+ }
Expect.equals(0, result.exitCode);
callback(result.stdout);
});
diff --git a/tests/standalone/io/skipping_dart2js_compilations_test.dart b/tests/standalone/io/skipping_dart2js_compilations_test.dart
index 06efd12..95ae623 100644
--- a/tests/standalone/io/skipping_dart2js_compilations_test.dart
+++ b/tests/standalone/io/skipping_dart2js_compilations_test.dart
@@ -132,7 +132,7 @@
CommandCompletedHandler(FileUtils this.fileUtils, bool this._shouldHaveRun);
- void processCompletedTest(CommandOutput output) {
+ void processCompletedTest(runner.CommandOutput output) {
Expect.isTrue(output.exitCode == 0);
Expect.isTrue(output.stderr.length == 0);
if (_shouldHaveRun) {
@@ -212,7 +212,7 @@
var completedHandler = new CommandCompletedHandler(fileUtils, shouldRun);
var command = makeCompilationCommand(name, fileUtils);
var process = new runner.RunningProcess(command, 60);
- return process.run().then((CommandOutput output) {
+ return process.run().then((runner.CommandOutput output) {
completedHandler.processCompletedTest(output);
});
}
diff --git a/tests/standalone/io/socket_close_test.dart b/tests/standalone/io/socket_close_test.dart
index 475d97a..c00b89f 100644
--- a/tests/standalone/io/socket_close_test.dart
+++ b/tests/standalone/io/socket_close_test.dart
@@ -360,7 +360,7 @@
},
onError: errorHandlerServer
);
- replyTo.send(_server.port, null);
+ replyTo.send(_server.port);
});
} else {
Timer.run(waitForResult);
diff --git a/tests/standalone/io/socket_info_test.dart b/tests/standalone/io/socket_info_test.dart
index 395b6e4..7a5a20f 100644
--- a/tests/standalone/io/socket_info_test.dart
+++ b/tests/standalone/io/socket_info_test.dart
@@ -13,8 +13,8 @@
Expect.equals(socket.port, server.port);
Expect.equals(clientSocket.port, socket.remotePort);
Expect.equals(clientSocket.remotePort, socket.port);
- Expect.equals(socket.remoteHost, "127.0.0.1");
- Expect.equals(clientSocket.remoteHost, "127.0.0.1");
+ Expect.equals(socket.remoteAddress.address, "127.0.0.1");
+ Expect.equals(clientSocket.remoteAddress.address, "127.0.0.1");
server.close();
});
diff --git a/tests/standalone/package/package1_test.dart b/tests/standalone/package/package1_test.dart
index 0640511..20afaa0 100644
--- a/tests/standalone/package/package1_test.dart
+++ b/tests/standalone/package/package1_test.dart
@@ -5,4 +5,8 @@
// PackageRoot=none
library package1_test;
-import 'package:package1.dart';
+import 'package:package1.dart' as p1;
+
+main() {
+ p1.main();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 453bc99..fc8997f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
MAJOR 0
-MINOR 1
-BUILD 2
-PATCH 0
+MINOR 8
+BUILD 10
+PATCH 10
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index f94acd4..bee7334 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -77,7 +77,6 @@
- /sdk/dartsdk-{linux,macos,windows}-{ia32,x64}-release.zip
- /editor/darteditor-{linux,macos,windows}-{ia32,x64}.zip
- /editor/darteditor-installer-macos-{ia32,x64}.dmg
- - /editor/darteditor-installer-windows-{ia32,x64}.msi
- /editor-eclipse-update
/{index.html,features/,plugins/,artifacts.jar,content.jar}
"""
diff --git a/tools/dartium/download_file.dart b/tools/dartium/download_file.dart
new file mode 100644
index 0000000..6339ae8
--- /dev/null
+++ b/tools/dartium/download_file.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.
+
+import 'dart:async';
+import 'dart:io';
+
+Future downloadFile(Uri url, String destination) {
+ var client = new HttpClient();
+ return client.getUrl(url)
+ .then((HttpClientRequest request) => request.close())
+ .then((HttpClientResponse response) {
+ if (response.statusCode != HttpStatus.OK) {
+ throw new Exception("Http status code (${response.statusCode}) "
+ "was not 200. Aborting.");
+ }
+ var sink = new File(destination).openWrite();
+ return response.pipe(sink).then((_) {
+ client.close();
+ });
+ });
+}
+
+void main(List<String> arguments) {
+ die(String message) {
+ print(message);
+ exit(1);
+ }
+
+ if (arguments.length != 2) {
+ var scriptName = Platform.script.pathSegments.last;
+ die("Usage dart $scriptName <url> <destination-file>");
+ }
+
+ var url = Uri.parse(arguments[0]);
+ var destination = arguments[1];
+
+ if (!['http', 'https'].contains(url.scheme)) {
+ die("Unsupported scheme in uri $url");
+ }
+
+ print("Downloading $url to $destination.");
+ downloadFile(url, destination).then((_) {
+ print("Download finished.");
+ }).catchError((error) {
+ die("An unexpected error occured: $error.");
+ });
+}
diff --git a/tools/dartium/download_shellscript_template.bat b/tools/dartium/download_shellscript_template.bat
new file mode 100644
index 0000000..d41951d
--- /dev/null
+++ b/tools/dartium/download_shellscript_template.bat
@@ -0,0 +1,16 @@
+@REM Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+@REM for details. All rights reserved. Use of this source code is governed by a
+@REM BSD-style license that can be found in the LICENSE file.
+
+@REM This script will download VAR_DOWNLOAD_URL to VAR_DESTINATION in the
+@REM current working directory.
+
+@echo off
+
+set "CHROMIUM_DIR=%~dp0"
+set "SDK_BIN=%CHROMIUM_DIR%\..\dart-sdk\bin"
+
+set "DART=%SDK_BIN%\dart.exe"
+set "DOWNLOAD_SCRIPT=%CHROMIUM_DIR%\download_file.dart"
+
+"%DART%" "%DOWNLOAD_SCRIPT%" "VAR_DOWNLOAD_URL" "VAR_DESTINATION"
diff --git a/tools/dartium/download_shellscript_template.sh b/tools/dartium/download_shellscript_template.sh
new file mode 100644
index 0000000..3399945
--- /dev/null
+++ b/tools/dartium/download_shellscript_template.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# 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 script will download VAR_DOWNLOAD_URL to VAR_DESTINATION in the current
+# working directory.
+
+CHROMIUM_DIR="$(dirname $BASH_SOURCE)"
+SDK_BIN="$CHROMIUM_DIR/../dart-sdk/bin"
+
+DART="$SDK_BIN/dart"
+DOWNLOAD_SCRIPT="$CHROMIUM_DIR/download_file.dart"
+
+"$DART" "$DOWNLOAD_SCRIPT" "VAR_DOWNLOAD_URL" "VAR_DESTINATION"
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 00cf4d1..b218268 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -199,6 +199,44 @@
]
}
},
+ "CanvasRenderingContext2D": {
+ "members": {
+ "currentPath": [
+ "/**",
+ " * The current default path of this canvas context, if there is one.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Current default path]",
+ " * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#current-default-path)",
+ " * from WHATWG.",
+ " */"
+ ],
+ "imageSmoothingEnabled": [
+ "/**",
+ " * Whether images and patterns on this canvas will be smoothed when this",
+ " * canvas is scaled.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Image smoothing]",
+ " * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-smoothing)",
+ " * from WHATWG.",
+ " */"
+ ],
+ "webkitBackingStorePixelRatio": [
+ "/**",
+ " * The ratio between this canvas' backing store dimensions and the canvas'",
+ " * logical dimensions.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [High DPI Canvas tutorial]",
+ " * (http://www.html5rocks.com/en/tutorials/canvas/hidpi/) from HTML5Rocks.",
+ " */"
+ ]
+ }
+ },
"Clipboard": {
"members": {
"getData": [
@@ -416,6 +454,7 @@
" * save typing a few characters.",
" *",
" * [selectors] should be a string using CSS selector syntax.",
+ " *",
" * var element1 = document.querySelector('.className');",
" * var element2 = document.querySelector('#id');",
" *",
@@ -465,6 +504,24 @@
]
}
},
+ "DocumentFragment": {
+ "members": {
+ "querySelector": [
+ "/**",
+ " * Finds the first descendant element of this document fragment that matches",
+ " * the specified group of selectors.",
+ " *",
+ " * [selectors] should be a string using CSS selector syntax.",
+ " *",
+ " * var element1 = fragment.querySelector('.className');",
+ " * var element2 = fragment.querySelector('#id');",
+ " *",
+ " * For details about CSS selector syntax, see the",
+ " * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
+ " */"
+ ]
+ }
+ },
"Element": {
"comment": [
"/**",
@@ -707,8 +764,8 @@
],
"getBoundingClientRect": [
"/**",
- " * The smallest bounding rectangle that encompasses this element's padding,",
- " * scrollbar, and border.",
+ " * Returns the smallest bounding rectangle that encompasses this element's",
+ " * padding, scrollbar, and border.",
" *",
" * ## Other resources",
" *",
@@ -716,12 +773,14 @@
" * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)",
" * from MDN.",
" * * [The getBoundingClientRect() method]",
- " * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+ " * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)",
+ " * from W3C.",
" */"
],
"getClientRects": [
"/**",
- " * A list of bounding rectangles for each box associated with this element.",
+ " * Returns a list of bounding rectangles for each box associated with this",
+ " * element.",
" *",
" * ## Other resources",
" *",
@@ -729,7 +788,33 @@
" * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)",
" * from MDN.",
" * * [The getClientRects() method]",
- " * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+ " * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)",
+ " * from W3C.",
+ " */"
+ ],
+ "getDestinationInsertionPoints": [
+ "/**",
+ " * Returns a list of shadow DOM insertion points to which this element is",
+ " * distributed.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Shadow DOM specification]",
+ " * (https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)",
+ " * from W3C.",
+ " */"
+ ],
+ "getElementsByClassName": [
+ "/**",
+ " * Returns a list of nodes with the given class name inside this element.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [getElementsByClassName]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)",
+ " * from MDN.",
+ " * * [DOM specification]",
+ " * (http://www.w3.org/TR/domcore/) from W3C.",
" */"
],
"hidden": [
@@ -1138,9 +1223,8 @@
" * // Gets the first descendant [ImageElement]",
" * var img = element.querySelector('img');",
" *",
- " * See also:",
- " *",
- " * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)",
+ " * For details about CSS selector syntax, see the",
+ " * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
" */"
],
"resetEvent": [
@@ -1151,6 +1235,26 @@
" * See [EventStreamProvider] for usage information.",
" */"
],
+ "scrollByLines": [
+ "/**",
+ " * Scrolls the element by a number of lines.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [scrollByLines]",
+ " * (http://docs.webplatform.org/wiki/dom/methods/scrollByLines) from WebPlatform.org.",
+ " */"
+ ],
+ "scrollByPages": [
+ "/**",
+ " * Scrolls the element by a number of pages.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [scrollByPages]",
+ " * (http://docs.webplatform.org/wiki/dom/methods/scrollByPages) from WebPlatform.org.",
+ " */"
+ ],
"scrollEvent": [
"/**",
" * Static factory designed to expose `scroll` events to event",
@@ -1283,6 +1387,19 @@
" * See [EventStreamProvider] for usage information.",
" */"
],
+ "webkitGetRegionFlowRanges": [
+ "/**",
+ " * Returns an array of ranges of fragments in the flow.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [CSS regions and exclusions tutorial]",
+ " * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
+ " * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.",
+ " * * [CSS regions specification]",
+ " * (http://www.w3.org/TR/css3-regions/) from W3C.",
+ " */"
+ ],
"webkitRegionOverset": [
"/**",
" * The current state of this region.",
@@ -1300,6 +1417,33 @@
" * * [CSS regions specification]",
" * (http://www.w3.org/TR/css3-regions/) from W3C.",
" */"
+ ],
+ "webkitRequestFullscreen": [
+ "/**",
+ " * Displays this element fullscreen.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Using the full-screen API]",
+ " * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)",
+ " * tutorial from WebPlatform.org.",
+ " * * [Fullscreen specification]",
+ " * (http://www.w3.org/TR/fullscreen/) from W3C.",
+ " */"
+ ],
+ "webkitRequestPointerLock": [
+ "/**",
+ " * Locks the mouse pointer to this element.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Pointer lock and first person shooter controls]",
+ " * (http://www.html5rocks.com/en/tutorials/pointerlock/intro/) tutorial from",
+ " * HTML5Rocks.",
+ " *",
+ " * * [Pointer lock specification]",
+ " * (http://www.w3.org/TR/pointerlock/) from W3C.",
+ " */"
]
}
},
@@ -2223,6 +2367,209 @@
" * This method is more efficient than `nodes.add`, and is the preferred",
" * way of appending a child node.",
" */"
+ ],
+ "childNodes": [
+ "/**",
+ " * A list of this node's children.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.childNodes]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)",
+ " * from MDN.",
+ " */"
+ ],
+ "cloneNode": [
+ "/**",
+ " * Returns a copy of this node.",
+ " *",
+ " * If [deep] is `true`, then all of this node's children and decendents are",
+ " * copied as well. If [deep] is `false`, then only this node is copied.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.cloneNode]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from",
+ " * MDN.",
+ " */"
+ ],
+ "contains": [
+ "/**",
+ " * Returns true if this node contains the specified node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.contains]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.",
+ " */"
+ ],
+ "firstChild": [
+ "/**",
+ " * The first child of this node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.firstChild]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)",
+ " * from MDN.",
+ " */"
+ ],
+ "hasChildNodes": [
+ "/**",
+ " * Returns true if this node has any children.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.hasChildNodes]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from",
+ " * MDN.",
+ " */"
+ ],
+ "insertBefore": [
+ "/**",
+ " * Inserts all of the nodes into this node directly before refChild.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.insertBefore]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from",
+ " * MDN.",
+ " */"
+ ],
+ "lastChild": [
+ "/**",
+ " * The last child of this node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.lastChild]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)",
+ " * from MDN.",
+ " */"
+ ],
+ "nextSibling": [
+ "/**",
+ " * The next sibling node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.nextSibling]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)",
+ " * from MDN.",
+ " */"
+ ],
+ "nodeName": [
+ "/**",
+ " * The name of this node.",
+ " *",
+ " * This varies by this node's [nodeType].",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.nodeName]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)",
+ " * from MDN. This page contains a table of [nodeName] values for each",
+ " * [nodeType].",
+ " */"
+ ],
+ "nodeType": [
+ "/**",
+ " * The type of node.",
+ " *",
+ " * This value is one of:",
+ " *",
+ " * * [ATTRIBUTE_NODE] if this node is an attribute.",
+ " * * [CDATA_SECTION_NODE] if this node is a [CDataSection].",
+ " * * [COMMENT_NODE] if this node is a [Comment].",
+ " * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].",
+ " * * [DOCUMENT_NODE] if this node is a [Document].",
+ " * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.",
+ " * * [ELEMENT_NODE] if this node is an [Element].",
+ " * * [ENTITY_NODE] if this node is an entity.",
+ " * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.",
+ " * * [NOTATION_NODE] if this node is a notation.",
+ " * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].",
+ " * * [TEXT_NODE] if this node is a [Text] node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.nodeType]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.",
+ " */"
+ ],
+ "nodeValue": [
+ "/**",
+ " * The value of this node.",
+ " *",
+ " * This varies by this type's [nodeType].",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.nodeValue]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)",
+ " * from MDN. This page contains a table of [nodeValue] values for each",
+ " * [nodeType].",
+ " */"
+ ],
+ "ownerDocument": [
+ "/**",
+ " * The document this node belongs to.",
+ " *",
+ " * Returns `null` if this node does not belong to any document.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.ownerDocument]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from",
+ " * MDN.",
+ " */"
+ ],
+ "parentElement": [
+ "/**",
+ " * The parent element of this node.",
+ " *",
+ " * Returns `null` if this node either does not have a parent or its parent is",
+ " * not an element.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.parentElement]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from",
+ " * W3C.",
+ " */"
+ ],
+ "parentNode": [
+ "/**",
+ " * The parent node of this node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.parentNode]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from",
+ " * MDN.",
+ " */"
+ ],
+ "previousSibling": [
+ "/**",
+ " * The previous sibling node.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.previousSibling]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)",
+ " * from MDN.",
+ " */"
+ ],
+ "textContent": [
+ "/**",
+ " * All text within this node and its decendents.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [Node.textContent]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from",
+ " * MDN.",
+ " */"
]
}
},
@@ -2820,12 +3167,14 @@
" * Top-level container for the current browser tab or window.",
" *",
" * In a web browser, each window has a [Window] object, but within the context",
- " * of a script, a [Window] object represents only the current window. In",
- " * addition to the open window, each window, tab, and iframe has its own",
- " * [Window] object. A [Window] contains a [Document] object, which contains this",
- " * web page's content.",
+ " * of a script, this object represents only the current window.",
+ " * Each other window, tab, and iframe has its own [Window] object.",
" *",
- " * Use `window` to access properties of the current window. For example:",
+ " * Each window contains a [Document] object, which contains all of the window's",
+ " * content.",
+ " *",
+ " * Use the top-level `window` object to access the current window.",
+ " * For example:",
" *",
" * // Draw a scene when the window repaints.",
" * drawScene(num delta) {...}",
@@ -2835,8 +3184,12 @@
" * window.console.log('Jinkies!');",
" * window.console.error('Jeepers!');",
" *",
- " * **Note:** This class represents the current window, whereas [WindowBase] is",
- " * a representation of any window, including other tabs, windows, and frames.",
+ " * **Note:** This class represents only the current window, while [WindowBase]",
+ " * is a representation of any window, including other tabs, windows, and frames.",
+ " *",
+ " * ## See also",
+ " *",
+ " * * [WindowBase]",
" *",
" * ## Other resources",
" *",
@@ -3331,12 +3684,33 @@
" * `send` method is intended only for more complext HTTP requests where",
" * finer-grained control is needed.",
" *",
- " * See also:",
+ " * ## Other resources",
" *",
- " * * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
+ " * * [XMLHttpRequest.send]",
+ " * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
" * from MDN.",
" */"
],
+ "setRequestHeader": [
+ "/**",
+ " * Sets the value of an HTTP requst header.",
+ " *",
+ " * This method should be called after the request is opened, but before",
+ " * the request is sent.",
+ " *",
+ " * Multiple calls with the same header will combine all their values into a",
+ " * single header.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [XMLHttpRequest.setRequestHeader]",
+ " * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
+ " * from MDN.",
+ " * * [The setRequestHeader() method]",
+ " * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from",
+ " * W3C.",
+ " */"
+ ],
"status": [
"/**",
" * The http result code from the request (200, 404, etc).",
@@ -3349,6 +3723,24 @@
" * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
" */"
],
+ "timeout": [
+ "/**",
+ " * Length of time before a request is automatically terminated.",
+ " *",
+ " * When the time has passed, a [TimeoutEvent] is dispatched.",
+ " *",
+ " * If [timeout] is set to 0, then the request will not time out.",
+ " *",
+ " * ## Other resources",
+ " *",
+ " * * [XMLHttpRequest.timeout]",
+ " * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)",
+ " * from MDN.",
+ " * * [The timeout attribute]",
+ " * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)",
+ " * from W3C.",
+ " */"
+ ],
"upload": [
"/**",
" * [EventTarget] that can hold listeners to track the progress of the request.",
diff --git a/tools/dom/src/CanvasImageSource.dart b/tools/dom/src/CanvasImageSource.dart
index 69165cf..e030533 100644
--- a/tools/dom/src/CanvasImageSource.dart
+++ b/tools/dom/src/CanvasImageSource.dart
@@ -5,31 +5,39 @@
part of html;
/**
- * An object that can be drawn to a [CanvasRenderingContext2D] object with
- * [CanvasRenderingContext2D.drawImage],
- * [CanvasRenderingContext2D.drawImageToRect],
- * [CanvasRenderingContext2D.drawImageScaled], or
- * [CanvasRenderingContext2D.drawImageScaledFromSource].
+ * An object that can be drawn to a 2D canvas rendering context.
*
- * If the CanvasImageSource is an [ImageElement] then the element's image is
- * used. If the [ImageElement] is an animated image, then the poster frame is
- * used. If there is no poster frame, then the first frame of animation is used.
+ * The image drawn to the canvas depends on the type of this object:
*
- * If the CanvasImageSource is a [VideoElement] then the frame at the current
- * playback position is used as the image.
+ * * If this object is an [ImageElement], then this element's image is
+ * drawn to the canvas. If this element is an animated image, then this
+ * element's poster frame is drawn. If this element has no poster frame, then
+ * the first frame of animation is drawn.
*
- * If the CanvasImageSource is a [CanvasElement] then the element's bitmap is
- * used.
+ * * If this object is a [VideoElement], then the frame at this element's current
+ * playback position is drawn to the canvas.
*
- * ** Note: ** Currently, all versions of Internet Explorer do not support
- * drawing a VideoElement to a canvas. Also, you may experience problems drawing
+ * * If this object is a [CanvasElement], then this element's bitmap is drawn to
+ * the canvas.
+ *
+ * **Note:** Currently all versions of Internet Explorer do not support
+ * drawing a video element to a canvas. You may also encounter problems drawing
* a video to a canvas in Firefox if the source of the video is a data URL.
*
- * See also:
+ * ## See also
*
- * * [CanvasImageSource](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
- * from the WHATWG.
- * * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
- * from the WHATWG.
+ * * [CanvasRenderingContext2D.drawImage]
+ * * [CanvasRenderingContext2D.drawImageToRect]
+ * * [CanvasRenderingContext2D.drawImageScaled]
+ * * [CanvasRenderingContext2D.drawImageScaledFromSource]
+ *
+ * ## Other resources
+ *
+ * * [Image sources for 2D rendering contexts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
+ * from WHATWG.
+ * * [Drawing images]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
+ * from WHATWG.
*/
abstract class CanvasImageSource {}
diff --git a/tools/dom/src/CrossFrameTypes.dart b/tools/dom/src/CrossFrameTypes.dart
index f8ed874..679092d 100644
--- a/tools/dom/src/CrossFrameTypes.dart
+++ b/tools/dom/src/CrossFrameTypes.dart
@@ -7,13 +7,17 @@
/**
* Top-level container for a browser tab or window.
*
- * In a web browser, a [WindowBase] object represents any browser window. This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
*
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
* used to access the properties and content of the current window or tab.
*
+ * ## See also
+ *
+ * * [Window]
+ *
* ## Other resources
*
* * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
diff --git a/tools/dom/src/PathObserver.dart b/tools/dom/src/PathObserver.dart
new file mode 100644
index 0000000..bc07ac1
--- /dev/null
+++ b/tools/dom/src/PathObserver.dart
@@ -0,0 +1,288 @@
+// 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 html;
+
+// This code is inspired by ChangeSummary:
+// https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
+// ...which underlies MDV. Since we don't need the functionality of
+// ChangeSummary, we just implement what we need for data bindings.
+// This allows our implementation to be much simpler.
+
+// TODO(jmesserly): should we make these types stronger, and require
+// Observable objects? Currently, it is fine to say something like:
+// var path = new PathObserver(123, '');
+// print(path.value); // "123"
+//
+// Furthermore this degenerate case is allowed:
+// var path = new PathObserver(123, 'foo.bar.baz.qux');
+// print(path.value); // "null"
+//
+// Here we see that any invalid (i.e. not Observable) value will break the
+// path chain without producing an error or exception.
+//
+// Now the real question: should we do this? For the former case, the behavior
+// is correct but we could chose to handle it in the dart:html bindings layer.
+// For the latter case, it might be better to throw an error so users can find
+// the problem.
+
+
+/**
+ * A data-bound path starting from a view-model or model object, for example
+ * `foo.bar.baz`.
+ *
+ * When the [values] stream is being listened to, this will observe changes to
+ * the object and any intermediate object along the path, and send [values]
+ * accordingly. When all listeners are unregistered it will stop observing
+ * the objects.
+ *
+ * This class is used to implement [Node.bind] and similar functionality.
+ */
+// TODO(jmesserly): find a better home for this type.
+@Experimental
+class PathObserver {
+ /** The object being observed. */
+ final object;
+
+ /** The path string. */
+ final String path;
+
+ /** True if the path is valid, otherwise false. */
+ final bool _isValid;
+
+ // TODO(jmesserly): same issue here as ObservableMixin: is there an easier
+ // way to get a broadcast stream?
+ StreamController _values;
+ Stream _valueStream;
+
+ _PropertyObserver _observer, _lastObserver;
+
+ Object _lastValue;
+ bool _scheduled = false;
+
+ /**
+ * Observes [path] on [object] for changes. This returns an object that can be
+ * used to get the changes and get/set the value at this path.
+ * See [PathObserver.values] and [PathObserver.value].
+ */
+ PathObserver(this.object, String path)
+ : path = path, _isValid = _isPathValid(path) {
+
+ // TODO(jmesserly): if the path is empty, or the object is! Observable, we
+ // can optimize the PathObserver to be more lightweight.
+
+ _values = new StreamController.broadcast(sync: true,
+ onListen: _observe,
+ onCancel: _unobserve);
+
+ if (_isValid) {
+ var segments = [];
+ for (var segment in path.trim().split('.')) {
+ if (segment == '') continue;
+ var index = int.parse(segment, onError: (_) {});
+ segments.add(index != null ? index : new Symbol(segment));
+ }
+
+ // Create the property observer linked list.
+ // Note that the structure of a path can't change after it is initially
+ // constructed, even though the objects along the path can change.
+ for (int i = segments.length - 1; i >= 0; i--) {
+ _observer = new _PropertyObserver(this, segments[i], _observer);
+ if (_lastObserver == null) _lastObserver = _observer;
+ }
+ }
+ }
+
+ // TODO(jmesserly): we could try adding the first value to the stream, but
+ // that delivers the first record async.
+ /**
+ * Listens to the stream, and invokes the [callback] immediately with the
+ * current [value]. This is useful for bindings, which want to be up-to-date
+ * immediately.
+ */
+ StreamSubscription bindSync(void callback(value)) {
+ var result = values.listen(callback);
+ callback(value);
+ return result;
+ }
+
+ // TODO(jmesserly): should this be a change record with the old value?
+ // TODO(jmesserly): should this be a broadcast stream? We only need
+ // single-subscription in the bindings system, so single sub saves overhead.
+ /**
+ * Gets the stream of values that were observed at this path.
+ * This returns a single-subscription stream.
+ */
+ Stream get values => _values.stream;
+
+ /** Force synchronous delivery of [values]. */
+ void _deliverValues() {
+ _scheduled = false;
+
+ var newValue = value;
+ if (!identical(_lastValue, newValue)) {
+ _values.add(newValue);
+ _lastValue = newValue;
+ }
+ }
+
+ void _observe() {
+ if (_observer != null) {
+ _lastValue = value;
+ _observer.observe();
+ }
+ }
+
+ void _unobserve() {
+ if (_observer != null) _observer.unobserve();
+ }
+
+ void _notifyChange() {
+ if (_scheduled) return;
+ _scheduled = true;
+
+ // TODO(jmesserly): should we have a guarenteed order with respect to other
+ // paths? If so, we could implement this fairly easily by sorting instances
+ // of this class by birth order before delivery.
+ queueChangeRecords(_deliverValues);
+ }
+
+ /** Gets the last reported value at this path. */
+ get value {
+ if (!_isValid) return null;
+ if (_observer == null) return object;
+ _observer.ensureValue(object);
+ return _lastObserver.value;
+ }
+
+ /** Sets the value at this path. */
+ void set value(Object value) {
+ // TODO(jmesserly): throw if property cannot be set?
+ // MDV seems tolerant of these error.
+ if (_observer == null || !_isValid) return;
+ _observer.ensureValue(object);
+ var last = _lastObserver;
+ if (_setObjectProperty(last._object, last._property, value)) {
+ // Technically, this would get updated asynchronously via a change record.
+ // However, it is nice if calling the getter will yield the same value
+ // that was just set. So we use this opportunity to update our cache.
+ last.value = value;
+ }
+ }
+}
+
+// TODO(jmesserly): these should go away in favor of mirrors!
+_getObjectProperty(object, property) {
+ if (object is List && property is int) {
+ if (property >= 0 && property < object.length) {
+ return object[property];
+ } else {
+ return null;
+ }
+ }
+
+ // TODO(jmesserly): what about length?
+ if (object is Map) return object[property];
+
+ if (object is Observable) return object.getValueWorkaround(property);
+
+ return null;
+}
+
+bool _setObjectProperty(object, property, value) {
+ if (object is List && property is int) {
+ object[property] = value;
+ } else if (object is Map) {
+ object[property] = value;
+ } else if (object is Observable) {
+ (object as Observable).setValueWorkaround(property, value);
+ } else {
+ return false;
+ }
+ return true;
+}
+
+
+class _PropertyObserver {
+ final PathObserver _path;
+ final _property;
+ final _PropertyObserver _next;
+
+ // TODO(jmesserly): would be nice not to store both of these.
+ Object _object;
+ Object _value;
+ StreamSubscription _sub;
+
+ _PropertyObserver(this._path, this._property, this._next);
+
+ get value => _value;
+
+ void set value(Object newValue) {
+ _value = newValue;
+ if (_next != null) {
+ if (_sub != null) _next.unobserve();
+ _next.ensureValue(_value);
+ if (_sub != null) _next.observe();
+ }
+ }
+
+ void ensureValue(object) {
+ // If we're observing, values should be up to date already.
+ if (_sub != null) return;
+
+ _object = object;
+ value = _getObjectProperty(object, _property);
+ }
+
+ void observe() {
+ if (_object is Observable) {
+ assert(_sub == null);
+ _sub = (_object as Observable).changes.listen(_onChange);
+ }
+ if (_next != null) _next.observe();
+ }
+
+ void unobserve() {
+ if (_sub == null) return;
+
+ _sub.cancel();
+ _sub = null;
+ if (_next != null) _next.unobserve();
+ }
+
+ void _onChange(List<ChangeRecord> changes) {
+ for (var change in changes) {
+ // TODO(jmesserly): what to do about "new Symbol" here?
+ // Ideally this would only preserve names if the user has opted in to
+ // them being preserved.
+ // TODO(jmesserly): should we drop observable maps with String keys?
+ // If so then we only need one check here.
+ if (change.changes(_property)) {
+ value = _getObjectProperty(_object, _property);
+ _path._notifyChange();
+ return;
+ }
+ }
+ }
+}
+
+// From: https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
+
+const _pathIndentPart = r'[$a-z0-9_]+[$a-z0-9_\d]*';
+final _pathRegExp = new RegExp('^'
+ '(?:#?' + _pathIndentPart + ')?'
+ '(?:'
+ '(?:\\.' + _pathIndentPart + ')'
+ ')*'
+ r'$', caseSensitive: false);
+
+final _spacesRegExp = new RegExp(r'\s');
+
+bool _isPathValid(String s) {
+ s = s.replaceAll(_spacesRegExp, '');
+
+ if (s == '') return true;
+ if (s[0] == '.') return false;
+ return _pathRegExp.hasMatch(s);
+}
diff --git a/tools/dom/src/shared_html.dart b/tools/dom/src/shared_html.dart
index b0b3c47..c44effc 100644
--- a/tools/dom/src/shared_html.dart
+++ b/tools/dom/src/shared_html.dart
@@ -30,5 +30,39 @@
@Experimental()
ElementList queryAll(String relativeSelectors) => document.queryAll(relativeSelectors);
-Element querySelector(String selector) => document.querySelector(selector);
-ElementList querySelectorAll(String selector) => document.querySelectorAll(selector);
+/**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+Element querySelector(String selectors) => document.querySelector(selectors);
+
+/**
+ * Finds all descendant elements of this document that match the specified
+ * group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelectorAll]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ElementList querySelectorAll(String selectors) => document.querySelectorAll(selectors);
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index 32ec467..4b6c0d1 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -19,6 +19,7 @@
* save typing a few characters.
*
* [selectors] should be a string using CSS selector syntax.
+ *
* var items = document.querySelectorAll('.itemClassName');
*
* For details about CSS selector syntax, see the
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index c57cf1e..e57d98f 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -43,6 +43,17 @@
children.addAll(copy);
}
+ /**
+ * Finds all descendant elements of this document fragment that match the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
ElementList querySelectorAll(String selectors) =>
new _FrozenElementList._wrap(_querySelectorAll(selectors));
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 5c52b06..b742efd 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -586,6 +586,9 @@
* [selectors] should be a string using CSS selector syntax.
*
* var items = element.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
*/
@DomName('Element.querySelectorAll')
ElementList querySelectorAll(String selectors) =>
@@ -796,6 +799,11 @@
@DomName('Element.namespaceUri')
String get namespaceUri => _namespaceUri;
+ /**
+ * The string representation of this element.
+ *
+ * This is equivalent to reading the [localName] property.
+ */
String toString() => localName;
/**
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 2f7b2d7..bb01401 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -190,6 +190,9 @@
// Custom element created callback.
Node._created() : super._created();
+ /**
+ * A modifiable list of this node's children.
+ */
List<Node> get nodes {
return new _ChildNodeListLazy(this);
}
diff --git a/tools/publish_all_pkgs.py b/tools/publish_all_pkgs.py
index a43f57b..425d214 100644
--- a/tools/publish_all_pkgs.py
+++ b/tools/publish_all_pkgs.py
@@ -20,6 +20,8 @@
BLACK_LISTED_DIRECTORIES = ['.svn', 'async_helper', 'expect', 'third_party'];
def Main(argv):
+ pkgs_to_publish = []
+
for pkgdir in ['pkg', 'pkg/third_party']:
for name in os.listdir(pkgdir):
if os.path.isdir(os.path.join(pkgdir, name)):
diff --git a/tools/publish_pkg.py b/tools/publish_pkg.py
index 18f4cef..06cc3b4 100755
--- a/tools/publish_pkg.py
+++ b/tools/publish_pkg.py
@@ -19,122 +19,52 @@
import subprocess
import tempfile
-def ReplaceInFiles(paths, subs):
- '''Reads a series of files, applies a series of substitutions to each, and
- saves them back out. subs should be a list of (pattern, replace) tuples.'''
- for path in paths:
- contents = open(path).read()
- for pattern, replace in subs:
- contents = re.sub(pattern, replace, contents)
-
- dest = open(path, 'w')
- dest.write(contents)
- dest.close()
-
-def ReadVersion(file, field):
- for line in open(file).read().split('\n'):
- [k, v] = re.split('\s+', line)
- if field == k:
- return int(v)
-
def Main(argv):
HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
- versionFile = os.path.join(HOME, 'tools', 'VERSION')
- major = ReadVersion(versionFile, 'MAJOR')
- minor = ReadVersion(versionFile, 'MINOR')
- build = ReadVersion(versionFile, 'BUILD')
- patch = ReadVersion(versionFile, 'PATCH')
-
- # bleeding_edge has a fixed version number of 0.1.x.y . Don't allow users
- # to publish packages from bleeding_edge.
- if major == 0 and minor <= 1:
- print 'Error: Do not run this script from a bleeding_edge checkout.'
- return -1
-
- if patch != 0:
- version = '%d.%d.%d+%d' % (major, minor, build, patch)
- else:
- version = '%d.%d.%d' % (major, minor, build)
-
- tmpDir = tempfile.mkdtemp()
pkgName = os.path.basename(os.path.normpath(argv[1]))
- pubspec = os.path.join(tmpDir, pkgName, 'pubspec.yaml')
+ pubspec = os.path.join(HOME, argv[1], 'pubspec.yaml')
+ if not os.path.exists(pubspec):
+ print 'Error: did not find pubspec.yaml at ' + pubspec
+ return -1
- replaceInDart = []
- replaceInPubspec = []
+ with open(pubspec) as pubspecFile:
+ lines = pubspecFile.readlines()
- if os.path.exists(os.path.join(HOME, argv[1], 'pubspec.yaml')):
- #
- # If pubspec.yaml exists, add the SDK's version number if
- # no version number is present.
- #
- shutil.copytree(os.path.join(HOME, argv[1]),
- os.path.join(tmpDir, pkgName))
- with open(pubspec) as pubspecFile:
- lines = pubspecFile.readlines()
- with open(pubspec, 'w') as pubspecFile:
- foundVersion = False
+ version = None
+ foundSdkContraint = False
+ inDependencies = False
+ for line in lines:
+ if line.startswith('dependencies:'):
+ inDependencies = True
+ elif line.startswith('environment:'):
+ foundSdkContraint = True
+ elif line[0].isalpha():
inDependencies = False
- for line in lines:
- if line.startswith('dependencies:'):
- inDependencies = True
- elif line[0].isalpha():
- inDependencies = False
- if line.startswith('version:'):
- foundVersion = True
- if inDependencies:
- #
- # Within dependencies, don't print line that start with " sdk:"
- # and strip out "{ sdk: package_name }".
- #
- if not line.startswith(' sdk:'):
- line = re.sub(r'{(\s*)sdk:(\s+)([a-z0-9_]+)(\s*)}', '', line)
- pubspecFile.write(line)
- else:
- pubspecFile.write(line)
- if not foundVersion:
- pubspecFile.write('\nversion: ' + version + '\n')
- pubspecFile.write('environment:\n')
- pubspecFile.write(' sdk: ">=' + version + '"\n')
+ if line.startswith('version:'):
+ version = line[len('version:'):].strip()
+ if inDependencies:
+ if line.endswith(': any'):
+ print 'Error in %s: should not use "any" version constraint: %s' % (
+ pubspec, line)
+ return -1
- else:
- #
- # If there's a lib/ directory in the package, copy the package.
- # Otherwise, move the package's contents to lib/.
- #
- if os.path.exists(os.path.join(HOME, argv[1], 'lib')):
- shutil.copytree(os.path.join(HOME, argv[1]),
- os.path.join(tmpDir, pkgName))
- else:
- os.makedirs(os.path.join(tmpDir, pkgName))
- shutil.copytree(os.path.join(HOME, argv[1]),
- os.path.join(tmpDir, pkgName, 'lib'))
+ if not version:
+ print 'Error in %s: did not find package version.' % pubspec
+ return -1
- # Create pubspec.yaml .
- with open(pubspec, 'w') as pubspecFile:
- pubspecFile.write('name: ' + pkgName + '_unsupported\n')
- pubspecFile.write('author: None\n')
- pubspecFile.write('homepage: http://None\n')
- pubspecFile.write('version: ' + version + '\n')
- pubspecFile.write("description: >\n")
- pubspecFile.write(' A completely unsupported clone of Dart SDK library\n')
- pubspecFile.write(' ' + argv[1] + ' . This package will change in\n')
- pubspecFile.write(' unpredictable/incompatible ways without warning.\n')
- pubspecFile.write('dependencies:\n')
- pubspecFile.write('environment:\n')
- pubspecFile.write(' sdk: ">=' + version + '"\n')
+ if not foundSdkContraint:
+ print 'Error in %s: did not find SDK version constraint.' % pubspec
+ return -1
- libpath = os.path.join(HOME, argv[1], '../libraries.dart')
- if os.path.exists(libpath):
- # Copy libraries.dart into the package source code
- shutil.copy(libpath, os.path.join(tmpDir, pkgName, 'lib/libraries.dart'))
+ tmpDir = tempfile.mkdtemp()
- # Replace '../../libraries.dart' with '../libraries.dart'
- replaceInDart.append(
- (r'(import|part)(\s+)(\'|")\.\./(\.\./)*libraries.dart',
- r'\1\2\3\4libraries.dart'))
+ #
+ # If pubspec.yaml exists, check that the SDK's version constraint is valid
+ #
+ shutil.copytree(os.path.join(HOME, argv[1]),
+ os.path.join(tmpDir, pkgName))
if not os.path.exists(os.path.join(tmpDir, pkgName, 'LICENSE')):
with open(os.path.join(tmpDir, pkgName, 'LICENSE'), 'w') as licenseFile:
@@ -167,21 +97,16 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
''');
- replaceInDart.append(
- (r'(import|part)(\s+)(\'|")(\.\./)+pkg/([^/]+/)lib/', r'\1\2\3package:\5'))
-
- # Replace '../*/pkg' imports and parts.
- for root, dirs, files in os.walk(os.path.join(tmpDir, pkgName)):
- # TODO(dgrove): Remove this when dartbug.com/7487 is fixed.
- if '.svn' in dirs:
- shutil.rmtree(os.path.join(root, '.svn'))
- for name in files:
- if name.endswith('.dart'):
- ReplaceInFiles([os.path.join(root, name)], replaceInDart)
- elif name == 'pubspec.yaml':
- ReplaceInFiles([os.path.join(root, name)], replaceInPubspec)
-
print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n'
+
+ # TODO(jmesserly): this code puts things in the pub cache. Useful for testing
+ # without actually uploading.
+ #cacheDir = os.path.join(
+ # os.path.expanduser('~/.pub-cache/hosted/pub.dartlang.org'),
+ # pkgName + '-' + version)
+ #print 'Moving to ' + cacheDir
+ #shutil.move(os.path.join(tmpDir, pkgName), cacheDir)
+
subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName))
shutil.rmtree(tmpDir)
diff --git a/tools/signing_script.py b/tools/signing_script.py
index 0ce0a4c..4d45d7a 100755
--- a/tools/signing_script.py
+++ b/tools/signing_script.py
@@ -1,9 +1,10 @@
#!/usr/bin/env python
-#
+#
# 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 hashlib
import imp
import optparse
import os
@@ -136,12 +137,6 @@
config['bits'])
run([GSUTIL, 'cp', bucket, destination])
-def download_msi_installer_from_new_location(channel, config, destination):
- namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
- bucket = namer.editor_installer_filepath(
- config['revision'], config['system'], config['bits'], 'msi')
- run([GSUTIL, 'cp', bucket, destination])
-
def upload_to_new_location(channel, config, source_zip):
namer = bot_utils.GCSNamer(channel,
bot_utils.ReleaseType.SIGNED)
@@ -158,12 +153,6 @@
run([GSUTIL, 'setacl', 'public-read', bucket])
run([GSUTIL, 'setacl', 'public-read', bucket + '.md5sum'])
-def upload_msi_installer_to_new_location(channel, config, signed_msi):
- namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.SIGNED)
- bucket = namer.editor_installer_filepath(
- config['revision'], config['system'], config['bits'], 'msi')
- run([GSUTIL, 'cp', '-a', 'public-read', signed_msi, bucket])
-
def main():
if sys.platform != 'linux2':
print "This script was only tested on linux. Please run it on linux!"
@@ -224,7 +213,6 @@
'content_shell' : os.path.join('dart', 'chromium',
'content_shell.exe'),
- 'msi_scratch' : 'darteditor-installer-windows-%(bits)s.exe',
'editor_scratch' : 'DartEditor%(bits)s.exe',
'chrome_scratch' : 'chromium%(bits)s.exe',
'content_shell_scratch' : 'content_shell%(bits)s.exe',
@@ -268,16 +256,9 @@
else:
# We copy an .exe file
copy_file(from_path, to_path)
-
- # Download .*msi installer from GCS to presign directory
- if system == 'win32':
- presign_msi = os.path.join(
- presign_dir, locations[system]['msi_scratch'] % config)
- download_msi_installer_from_new_location(
- options.channel, config, presign_msi)
elif options.deploy:
copy_tree(destination_dir, deploy_dir)
-
+
for name in ['editor', 'chrome', 'content_shell']:
from_path = os.path.join(
postsign_dir, locations[system]['%s_scratch' % name] % config)
@@ -300,13 +281,6 @@
else:
upload_to_old_location(config, deploy_zip_file)
- # Upload *.msi installer and set 'public-read ACL
- if system == 'win32':
- postsign_msi = os.path.join(
- postsign_dir, locations[system]['msi_scratch'] % config)
- upload_msi_installer_to_new_location(
- options.channel, config, postsign_msi)
-
if __name__ == '__main__':
main()
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index 1d29041..326cce2 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -116,7 +116,7 @@
// TODO(amouravski): move HtmlDiff inside of the future chain below to re-use
// the MirrorSystem already analyzed.
_diff = new HtmlDiff(printWarnings:false);
- Future htmlDiff = _diff.run(currentDirectory.resolve(libPath));
+ Future htmlDiff = _diff.run(currentDirectory.resolveUri(path.toUri(libPath)));
// TODO(johnniwinther): Libraries for the compilation seem to be more like
// URIs. Perhaps Path should have a toURI() method.
diff --git a/utils/pub/pub.Makefile b/utils/pub/pub.Makefile
new file mode 100644
index 0000000..c1d628d
--- /dev/null
+++ b/utils/pub/pub.Makefile
@@ -0,0 +1,6 @@
+# This file is generated by gyp; do not edit.
+
+export builddir_name ?= dart/utils/pub/out
+.PHONY: all
+all:
+ $(MAKE) -C ../.. pub
diff --git a/utils/pub/pub.target.mk b/utils/pub/pub.target.mk
new file mode 100644
index 0000000..6362e21
--- /dev/null
+++ b/utils/pub/pub.target.mk
@@ -0,0 +1,38 @@
+# This file is generated by gyp; do not edit.
+
+TOOLSET := target
+TARGET := pub
+### Rules for action "generate_pub_snapshot":
+quiet_cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = ACTION dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot $@
+cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = LD_LIBRARY_PATH=$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd utils/pub; mkdir -p $(obj)/gen; "$(builddir)/dart" "--package-root=$(builddir)/packages/" "--generate-script-snapshot=$(obj)/gen/pub.dart.snapshot" ../../sdk/lib/_internal/pub/bin/pub.dart
+
+$(obj)/gen/pub.dart.snapshot: obj := $(abs_obj)
+$(obj)/gen/pub.dart.snapshot: builddir := $(abs_builddir)
+$(obj)/gen/pub.dart.snapshot: TOOLSET := $(TOOLSET)
+$(obj)/gen/pub.dart.snapshot: $(builddir)/dart sdk/lib/_internal/pub/bin/pub.dart sdk/lib/_internal/pub/lib/src/http.dart sdk/lib/_internal/pub/lib/src/utils.dart sdk/lib/_internal/pub/lib/src/command_deploy.dart sdk/lib/_internal/pub/lib/src/git_source.dart sdk/lib/_internal/pub/lib/src/command_install.dart sdk/lib/_internal/pub/lib/src/exit_codes.dart sdk/lib/_internal/pub/lib/src/command.dart sdk/lib/_internal/pub/lib/src/source_registry.dart sdk/lib/_internal/pub/lib/src/pubspec.dart sdk/lib/_internal/pub/lib/src/command_help.dart sdk/lib/_internal/pub/lib/src/oauth2.dart sdk/lib/_internal/pub/lib/src/command_uploader.dart sdk/lib/_internal/pub/lib/src/error_group.dart sdk/lib/_internal/pub/lib/src/directory_tree.dart sdk/lib/_internal/pub/lib/src/sdk.dart sdk/lib/_internal/pub/lib/src/dart.dart sdk/lib/_internal/pub/lib/src/hosted_source.dart sdk/lib/_internal/pub/lib/src/version.dart sdk/lib/_internal/pub/lib/src/git.dart sdk/lib/_internal/pub/lib/src/io.dart sdk/lib/_internal/pub/lib/src/system_cache.dart sdk/lib/_internal/pub/lib/src/safe_http_server.dart sdk/lib/_internal/pub/lib/src/command_update.dart sdk/lib/_internal/pub/lib/src/command_version.dart sdk/lib/_internal/pub/lib/src/validator.dart sdk/lib/_internal/pub/lib/src/command_cache.dart sdk/lib/_internal/pub/lib/src/source.dart sdk/lib/_internal/pub/lib/src/command_lish.dart sdk/lib/_internal/pub/lib/src/package.dart sdk/lib/_internal/pub/lib/src/log.dart sdk/lib/_internal/pub/lib/src/entrypoint.dart sdk/lib/_internal/pub/lib/src/lock_file.dart sdk/lib/_internal/pub/lib/src/path_source.dart sdk/lib/_internal/pub/lib/src/validator/name.dart sdk/lib/_internal/pub/lib/src/validator/size.dart sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart sdk/lib/_internal/pub/lib/src/validator/directory.dart sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart sdk/lib/_internal/pub/lib/src/validator/dependency.dart sdk/lib/_internal/pub/lib/src/validator/license.dart sdk/lib/_internal/pub/lib/src/validator/lib.dart sdk/lib/_internal/pub/lib/src/solver/version_solver.dart sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart sdk/lib/_internal/pub/test/command_line_config.dart sdk/lib/_internal/pub/test/version_test.dart sdk/lib/_internal/pub/test/io_test.dart sdk/lib/_internal/pub/test/pub_cache_test.dart sdk/lib/_internal/pub/test/test_pub.dart sdk/lib/_internal/pub/test/lock_file_test.dart sdk/lib/_internal/pub/test/real_version_test.dart sdk/lib/_internal/pub/test/utils_test.dart sdk/lib/_internal/pub/test/directory_tree_test.dart sdk/lib/_internal/pub/test/unknown_source_test.dart sdk/lib/_internal/pub/test/dev_dependency_test.dart sdk/lib/_internal/pub/test/package_files_test.dart sdk/lib/_internal/pub/test/pubspec_test.dart sdk/lib/_internal/pub/test/pub_test.dart sdk/lib/_internal/pub/test/pub_install_and_update_test.dart sdk/lib/_internal/pub/test/version_solver_test.dart sdk/lib/_internal/pub/test/descriptor.dart sdk/lib/_internal/pub/test/error_group_test.dart sdk/lib/_internal/pub/test/pub_uploader_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/utils.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart sdk/lib/_internal/pub/test/lish/force_does_not_publish_if_there_are_errors_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_an_error_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_a_warning_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_no_warnings_test.dart sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart sdk/lib/_internal/pub/test/update/git/update_to_incompatible_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_to_nonexistent_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_locked_test.dart sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_dependers_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_if_necessary_test.dart sdk/lib/_internal/pub/test/update/hosted/update_removed_constraints_test.dart sdk/lib/_internal/pub/test/validator/license_test.dart sdk/lib/_internal/pub/test/validator/utils.dart sdk/lib/_internal/pub/test/validator/pubspec_field_test.dart sdk/lib/_internal/pub/test/validator/dependency_test.dart sdk/lib/_internal/pub/test/validator/directory_test.dart sdk/lib/_internal/pub/test/validator/name_test.dart sdk/lib/_internal/pub/test/validator/lib_test.dart sdk/lib/_internal/pub/test/validator/size_test.dart sdk/lib/_internal/pub/test/validator/utf8_readme_test.dart sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart sdk/lib/_internal/pub/test/oauth2/utils.dart sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/descriptor/tar.dart sdk/lib/_internal/pub/test/descriptor/git.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/hosted/offline_test.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/install/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/broken_symlink_test.dart sdk/lib/_internal/pub/test/install/switch_source_test.dart sdk/lib/_internal/pub/test/install/git/check_out_transitive_test.dart sdk/lib/_internal/pub/test/install/git/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_with_trailing_slash_test.dart sdk/lib/_internal/pub/test/install/git/dependency_name_match_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_branch_test.dart sdk/lib/_internal/pub/test/install/git/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/git/check_out_and_update_test.dart sdk/lib/_internal/pub/test/install/git/check_out_twice_test.dart sdk/lib/_internal/pub/test/install/git/check_out_test.dart sdk/lib/_internal/pub/test/install/git/lock_version_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_name_test.dart sdk/lib/_internal/pub/test/install/git/check_out_revision_test.dart sdk/lib/_internal/pub/test/install/git/different_repo_name_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/hosted/do_not_update_on_removed_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_test.dart sdk/lib/_internal/pub/test/install/hosted/install_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/hosted/install_transitive_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_new_is_unsatisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_new_is_satisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/cached_pubspec_test.dart sdk/lib/_internal/pub/test/install/hosted/resolve_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/repair_cache_test.dart sdk/lib/_internal/pub/test/install/path/nonexistent_dir_test.dart sdk/lib/_internal/pub/test/install/path/absolute_path_test.dart sdk/lib/_internal/pub/test/install/path/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_symlink_test.dart sdk/lib/_internal/pub/test/install/path/absolute_symlink_test.dart sdk/lib/_internal/pub/test/install/path/no_pubspec_test.dart sdk/lib/_internal/pub/test/install/path/relative_path_test.dart sdk/lib/_internal/pub/test/install/path/path_is_file_test.dart sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart sdk/lib/_internal/libraries.dart sdk/lib/_internal/compiler/compiler.dart sdk/lib/_internal/compiler/implementation/dart_types.dart sdk/lib/_internal/compiler/implementation/string_validator.dart sdk/lib/_internal/compiler/implementation/world.dart sdk/lib/_internal/compiler/implementation/typechecker.dart sdk/lib/_internal/compiler/implementation/filenames.dart sdk/lib/_internal/compiler/implementation/dart2js.dart sdk/lib/_internal/compiler/implementation/patch_parser.dart sdk/lib/_internal/compiler/implementation/constants.dart sdk/lib/_internal/compiler/implementation/script.dart sdk/lib/_internal/compiler/implementation/library_loader.dart sdk/lib/_internal/compiler/implementation/enqueue.dart sdk/lib/_internal/compiler/implementation/compiler.dart sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart sdk/lib/_internal/compiler/implementation/warnings.dart sdk/lib/_internal/compiler/implementation/source_file_provider.dart sdk/lib/_internal/compiler/implementation/tree_validator.dart sdk/lib/_internal/compiler/implementation/apiimpl.dart sdk/lib/_internal/compiler/implementation/native_handler.dart sdk/lib/_internal/compiler/implementation/constant_system_dart.dart sdk/lib/_internal/compiler/implementation/dart2jslib.dart sdk/lib/_internal/compiler/implementation/compile_time_constants.dart sdk/lib/_internal/compiler/implementation/closure.dart sdk/lib/_internal/compiler/implementation/code_buffer.dart sdk/lib/_internal/compiler/implementation/source_file.dart sdk/lib/_internal/compiler/implementation/deferred_load.dart sdk/lib/_internal/compiler/implementation/resolved_visitor.dart sdk/lib/_internal/compiler/implementation/colors.dart sdk/lib/_internal/compiler/implementation/source_map_builder.dart sdk/lib/_internal/compiler/implementation/constant_system.dart sdk/lib/_internal/compiler/implementation/util/characters.dart sdk/lib/_internal/compiler/implementation/util/util.dart sdk/lib/_internal/compiler/implementation/util/uri_extras.dart sdk/lib/_internal/compiler/implementation/util/link_implementation.dart sdk/lib/_internal/compiler/implementation/util/link.dart sdk/lib/_internal/compiler/implementation/util/util_implementation.dart sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart sdk/lib/_internal/compiler/implementation/js_backend/namer.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart sdk/lib/_internal/compiler/implementation/js_backend/backend.dart sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart sdk/lib/_internal/compiler/implementation/lib/string_helper.dart sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_rti.dart sdk/lib/_internal/compiler/implementation/lib/core_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_array.dart sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart sdk/lib/_internal/compiler/implementation/lib/async_patch.dart sdk/lib/_internal/compiler/implementation/lib/collection_dev_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_helper.dart sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart sdk/lib/_internal/compiler/implementation/lib/native_helper.dart sdk/lib/_internal/compiler/implementation/lib/io_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_number.dart sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart sdk/lib/_internal/compiler/implementation/lib/constant_map.dart sdk/lib/_internal/compiler/implementation/lib/typed_data_patch.dart sdk/lib/_internal/compiler/implementation/lib/math_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_string.dart sdk/lib/_internal/compiler/implementation/lib/json_patch.dart sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart sdk/lib/_internal/compiler/implementation/lib/interceptors.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart sdk/lib/_internal/compiler/implementation/mirrors/util.dart sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart sdk/lib/_internal/compiler/implementation/resolution/scope.dart sdk/lib/_internal/compiler/implementation/resolution/resolution.dart sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart sdk/lib/_internal/compiler/implementation/resolution/members.dart sdk/lib/_internal/compiler/implementation/ssa/ssa.dart sdk/lib/_internal/compiler/implementation/ssa/bailout.dart sdk/lib/_internal/compiler/implementation/ssa/codegen.dart sdk/lib/_internal/compiler/implementation/ssa/types.dart sdk/lib/_internal/compiler/implementation/ssa/validate.dart sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart sdk/lib/_internal/compiler/implementation/ssa/optimize.dart sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart sdk/lib/_internal/compiler/implementation/ssa/nodes.dart sdk/lib/_internal/compiler/implementation/ssa/value_set.dart sdk/lib/_internal/compiler/implementation/ssa/builder.dart sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart sdk/lib/_internal/compiler/implementation/ssa/tracer.dart sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart sdk/lib/_internal/compiler/implementation/js/precedence.dart sdk/lib/_internal/compiler/implementation/js/nodes.dart sdk/lib/_internal/compiler/implementation/js/builder.dart sdk/lib/_internal/compiler/implementation/js/printer.dart sdk/lib/_internal/compiler/implementation/js/js.dart sdk/lib/_internal/compiler/implementation/types/types.dart sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart sdk/lib/_internal/compiler/implementation/types/type_mask.dart sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart sdk/lib/_internal/compiler/implementation/elements/elements.dart sdk/lib/_internal/compiler/implementation/elements/modelx.dart sdk/lib/_internal/compiler/implementation/universe/side_effects.dart sdk/lib/_internal/compiler/implementation/universe/selector_map.dart sdk/lib/_internal/compiler/implementation/universe/universe.dart sdk/lib/_internal/compiler/implementation/universe/function_set.dart sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart sdk/lib/_internal/compiler/implementation/scanner/listener.dart sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart sdk/lib/_internal/compiler/implementation/scanner/scanner.dart sdk/lib/_internal/compiler/implementation/scanner/keyword.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart sdk/lib/_internal/compiler/implementation/scanner/token.dart sdk/lib/_internal/compiler/implementation/scanner/parser.dart sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart sdk/lib/_internal/compiler/implementation/tree/visitors.dart sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart sdk/lib/_internal/compiler/implementation/tree/unparser.dart sdk/lib/_internal/compiler/implementation/tree/tree.dart sdk/lib/_internal/compiler/implementation/tree/nodes.dart sdk/lib/_internal/compiler/implementation/tree/dartstring.dart sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart sdk/lib/_internal/compiler/samples/compile_loop/compile_loop.dart sdk/lib/_internal/compiler/samples/leap/leap_leg.dart sdk/lib/_internal/compiler/samples/leap/request_cache.dart sdk/lib/_internal/compiler/samples/leap/leap_script.dart sdk/lib/_internal/compiler/samples/leap/leap_server.dart sdk/lib/_internal/compiler/samples/leap/leap.dart sdk/lib/_internal/compiler/samples/darttags/darttags.dart pkg/intl/lib/number_symbols.dart pkg/intl/lib/intl.dart pkg/intl/lib/number_format.dart pkg/intl/lib/date_format.dart pkg/intl/lib/number_symbols_data.dart pkg/intl/lib/date_symbol_data_http_request.dart pkg/intl/lib/intl_browser.dart pkg/intl/lib/bidi_utils.dart pkg/intl/lib/date_symbol_data_local.dart pkg/intl/lib/date_time_patterns.dart pkg/intl/lib/message_lookup_by_library.dart pkg/intl/lib/date_symbol_data_file.dart pkg/intl/lib/extract_messages.dart pkg/intl/lib/generate_localized.dart pkg/intl/lib/bidi_formatter.dart pkg/intl/lib/date_symbols.dart pkg/intl/lib/intl_standalone.dart pkg/intl/lib/src/date_format_helpers.dart pkg/intl/lib/src/http_request_data_reader.dart pkg/intl/lib/src/file_data_reader.dart pkg/intl/lib/src/date_format_internal.dart pkg/intl/lib/src/intl_message.dart pkg/intl/lib/src/intl_helpers.dart pkg/intl/lib/src/date_format_field.dart pkg/intl/lib/src/lazy_locale_data.dart pkg/intl/lib/src/data/dates/localeList.dart pkg/intl/test/date_time_format_local_odd_test.dart pkg/intl/test/data_directory.dart pkg/intl/test/date_time_format_local_even_test.dart pkg/intl/test/intl_message_basic_example_test.dart pkg/intl/test/number_test_data.dart pkg/intl/test/bidi_utils_test.dart pkg/intl/test/date_time_format_test_data.dart pkg/intl/test/number_closure_test.dart pkg/intl/test/date_time_format_file_even_test.dart pkg/intl/test/number_format_test.dart pkg/intl/test/intl_test.dart pkg/intl/test/find_default_locale_standalone_test.dart pkg/intl/test/date_time_format_test_core.dart pkg/intl/test/date_time_format_http_request_test.dart pkg/intl/test/date_time_format_uninitialized_test.dart pkg/intl/test/date_time_format_test_stub.dart pkg/intl/test/find_default_locale_browser_test.dart pkg/intl/test/bidi_format_test.dart pkg/intl/test/date_time_format_file_odd_test.dart pkg/intl/test/message_extraction/generate_from_json.dart pkg/intl/test/message_extraction/sample_with_messages.dart pkg/intl/test/message_extraction/make_hardcoded_translation.dart pkg/intl/test/message_extraction/part_of_sample_with_messages.dart pkg/intl/test/message_extraction/extract_to_json.dart pkg/intl/test/message_extraction/message_extraction_test.dart pkg/intl/tool/generate_locale_data_files.dart pkg/intl/example/basic/basic_example_runner.dart pkg/intl/example/basic/basic_example.dart pkg/intl/example/basic/messages_de.dart pkg/intl/example/basic/messages_all.dart pkg/intl/example/basic/messages_th_th.dart pkg/serialization/lib/serialization.dart pkg/serialization/lib/src/format.dart pkg/serialization/lib/src/serialization_rule.dart pkg/serialization/lib/src/serialization_helpers.dart pkg/serialization/lib/src/mirrors_helpers.dart pkg/serialization/lib/src/basic_rule.dart pkg/serialization/lib/src/reader_writer.dart pkg/serialization/test/serialization_test.dart pkg/serialization/test/test_models.dart pkg/serialization/test/polyfill_identity_map_test.dart pkg/serialization/test/no_library_test.dart pkg/analyzer_experimental/bin/analyzer.dart pkg/analyzer_experimental/lib/options.dart pkg/analyzer_experimental/lib/analyzer.dart pkg/analyzer_experimental/lib/src/utils.dart pkg/analyzer_experimental/lib/src/error_formatter.dart pkg/analyzer_experimental/lib/src/analyzer_impl.dart pkg/analyzer_experimental/lib/src/error.dart pkg/analyzer_experimental/lib/src/generated/constant.dart pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart pkg/analyzer_experimental/lib/src/generated/instrumentation.dart pkg/analyzer_experimental/lib/src/generated/source_io.dart pkg/analyzer_experimental/lib/src/generated/ast.dart pkg/analyzer_experimental/lib/src/generated/sdk.dart pkg/analyzer_experimental/lib/src/generated/element.dart pkg/analyzer_experimental/lib/src/generated/engine.dart pkg/analyzer_experimental/lib/src/generated/scanner.dart pkg/analyzer_experimental/lib/src/generated/java_core.dart pkg/analyzer_experimental/lib/src/generated/java_engine.dart pkg/analyzer_experimental/lib/src/generated/java_io.dart pkg/analyzer_experimental/lib/src/generated/parser.dart pkg/analyzer_experimental/lib/src/generated/java_junit.dart pkg/analyzer_experimental/lib/src/generated/sdk_io.dart pkg/analyzer_experimental/lib/src/generated/html.dart pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart pkg/analyzer_experimental/lib/src/generated/error.dart pkg/analyzer_experimental/lib/src/generated/source.dart pkg/analyzer_experimental/lib/src/generated/resolver.dart pkg/analyzer_experimental/test/utils.dart pkg/analyzer_experimental/test/error_test.dart pkg/analyzer_experimental/test/options_test.dart pkg/analyzer_experimental/test/generated/resolver_test.dart pkg/analyzer_experimental/test/generated/scanner_test.dart pkg/analyzer_experimental/test/generated/element_test.dart pkg/analyzer_experimental/test/generated/ast_test.dart pkg/analyzer_experimental/test/generated/test_support.dart pkg/analyzer_experimental/test/generated/parser_test.dart pkg/analyzer_experimental/example/scanner_driver.dart pkg/analyzer_experimental/example/resolver_driver.dart pkg/analyzer_experimental/example/parser_driver.dart pkg/webdriver/lib/webdriver.dart pkg/webdriver/lib/src/base64decoder.dart pkg/webdriver/test/webdriver_test.dart pkg/fixnum/lib/fixnum.dart pkg/fixnum/lib/src/int64.dart pkg/fixnum/lib/src/intx.dart pkg/fixnum/lib/src/int32.dart pkg/fixnum/test/int_32_test.dart pkg/fixnum/test/int_64_vm_test.dart pkg/fixnum/test/int_64_test.dart pkg/pathos/lib/path.dart pkg/pathos/test/pathos_test.dart pkg/pathos/test/pathos_windows_test.dart pkg/pathos/test/pathos_posix_test.dart pkg/crypto/lib/crypto.dart pkg/crypto/lib/src/crypto_utils.dart pkg/crypto/lib/src/hmac.dart pkg/crypto/lib/src/sha1.dart pkg/crypto/lib/src/hash_utils.dart pkg/crypto/lib/src/md5.dart pkg/crypto/lib/src/sha256.dart pkg/meta/lib/meta.dart pkg/oauth2/lib/oauth2.dart pkg/oauth2/lib/src/utils.dart pkg/oauth2/lib/src/expiration_exception.dart pkg/oauth2/lib/src/credentials.dart pkg/oauth2/lib/src/authorization_exception.dart pkg/oauth2/lib/src/authorization_code_grant.dart pkg/oauth2/lib/src/handle_access_token_response.dart pkg/oauth2/lib/src/client.dart pkg/oauth2/test/utils.dart pkg/oauth2/test/handle_access_token_response_test.dart pkg/oauth2/test/authorization_code_grant_test.dart pkg/oauth2/test/client_test.dart pkg/oauth2/test/utils_test.dart pkg/oauth2/test/credentials_test.dart pkg/http/lib/http.dart pkg/http/lib/testing.dart pkg/http/lib/src/io_client.dart pkg/http/lib/src/utils.dart pkg/http/lib/src/base_request.dart pkg/http/lib/src/streamed_response.dart pkg/http/lib/src/byte_stream.dart pkg/http/lib/src/base_client.dart pkg/http/lib/src/streamed_request.dart pkg/http/lib/src/base_response.dart pkg/http/lib/src/mock_client.dart pkg/http/lib/src/response.dart pkg/http/lib/src/request.dart pkg/http/lib/src/client.dart pkg/http/lib/src/multipart_file.dart pkg/http/lib/src/multipart_request.dart pkg/http/test/mock_client_test.dart pkg/http/test/utils.dart pkg/http/test/streamed_request_test.dart pkg/http/test/multipart_test.dart pkg/http/test/client_test.dart pkg/http/test/http_test.dart pkg/http/test/request_test.dart pkg/http/test/response_test.dart pkg/http/test/safe_http_server.dart pkg/expect/lib/expect.dart pkg/mdv_observe/lib/mdv_observe.dart pkg/mdv_observe/lib/src/observable_list.dart pkg/mdv_observe/lib/src/observable_map.dart pkg/mdv_observe/lib/src/observable_box.dart pkg/mdv_observe/test/utils.dart pkg/mdv_observe/test/list_change_test.dart pkg/mdv_observe/test/observable_list_test.dart pkg/mdv_observe/test/observe_test.dart pkg/mdv_observe/test/observable_map_test.dart pkg/logging/lib/logging.dart pkg/logging/test/logging_test.dart pkg/stack_trace/lib/stack_trace.dart pkg/stack_trace/lib/src/utils.dart pkg/stack_trace/lib/src/lazy_trace.dart pkg/stack_trace/lib/src/trace.dart pkg/stack_trace/lib/src/frame.dart pkg/stack_trace/test/frame_test.dart pkg/stack_trace/test/trace_test.dart pkg/yaml/lib/yaml.dart pkg/yaml/lib/src/composer.dart pkg/yaml/lib/src/utils.dart pkg/yaml/lib/src/yaml_exception.dart pkg/yaml/lib/src/deep_equals.dart pkg/yaml/lib/src/visitor.dart pkg/yaml/lib/src/yaml_map.dart pkg/yaml/lib/src/parser.dart pkg/yaml/lib/src/model.dart pkg/yaml/lib/src/constructor.dart pkg/yaml/test/yaml_test.dart pkg/scheduled_test/lib/scheduled_test.dart pkg/scheduled_test/lib/scheduled_process.dart pkg/scheduled_test/lib/scheduled_server.dart pkg/scheduled_test/lib/descriptor.dart pkg/scheduled_test/lib/src/utils.dart pkg/scheduled_test/lib/src/schedule_error.dart pkg/scheduled_test/lib/src/task.dart pkg/scheduled_test/lib/src/substitute_future.dart pkg/scheduled_test/lib/src/scheduled_future_matchers.dart pkg/scheduled_test/lib/src/value_future.dart pkg/scheduled_test/lib/src/mock_clock.dart pkg/scheduled_test/lib/src/future_group.dart pkg/scheduled_test/lib/src/schedule.dart pkg/scheduled_test/lib/src/scheduled_server/handler.dart pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart pkg/scheduled_test/lib/src/descriptor/descriptor.dart pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart pkg/scheduled_test/test/utils.dart pkg/scheduled_test/test/substitute_future_test.dart pkg/scheduled_test/test/scheduled_server_test.dart pkg/scheduled_test/test/scheduled_future_matchers_test.dart pkg/scheduled_test/test/metatest.dart pkg/scheduled_test/test/value_future_test.dart pkg/scheduled_test/test/scheduled_process_test.dart pkg/scheduled_test/test/descriptor/utils.dart pkg/scheduled_test/test/descriptor/file_test.dart pkg/scheduled_test/test/descriptor/nothing_test.dart pkg/scheduled_test/test/descriptor/pattern_test.dart pkg/scheduled_test/test/descriptor/directory_test.dart pkg/scheduled_test/test/descriptor/async_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart pkg/scheduled_test/test/scheduled_test/nested_task_test.dart pkg/scheduled_test/test/scheduled_test/on_exception_test.dart pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart pkg/scheduled_test/test/scheduled_test/abort_test.dart pkg/scheduled_test/test/scheduled_test/timeout_test.dart pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart pkg/scheduled_test/test/scheduled_test/signal_error_test.dart pkg/scheduled_test/test/scheduled_test/set_up_test.dart pkg/scheduled_test/test/scheduled_test/on_complete_test.dart pkg/scheduled_test/test/scheduled_test/simple_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart pkg/unittest/lib/unittest.dart pkg/unittest/lib/html_individual_config.dart pkg/unittest/lib/vm_config.dart pkg/unittest/lib/html_enhanced_config.dart pkg/unittest/lib/matcher.dart pkg/unittest/lib/interactive_html_config.dart pkg/unittest/lib/mock.dart pkg/unittest/lib/html_config.dart pkg/unittest/lib/compact_vm_config.dart pkg/unittest/lib/src/expect.dart pkg/unittest/lib/src/basematcher.dart pkg/unittest/lib/src/utils.dart pkg/unittest/lib/src/string_matchers.dart pkg/unittest/lib/src/pretty_print.dart pkg/unittest/lib/src/core_matchers.dart pkg/unittest/lib/src/interfaces.dart pkg/unittest/lib/src/description.dart pkg/unittest/lib/src/future_matchers.dart pkg/unittest/lib/src/numeric_matchers.dart pkg/unittest/lib/src/iterable_matchers.dart pkg/unittest/lib/src/map_matchers.dart pkg/unittest/lib/src/config.dart pkg/unittest/lib/src/test_case.dart pkg/unittest/lib/src/operator_matchers.dart pkg/unittest/test/mock_regexp_negative_test.dart pkg/unittest/test/matchers_minified_test.dart pkg/unittest/test/matchers_test.dart pkg/unittest/test/unittest_test.dart pkg/unittest/test/matchers_unminified_test.dart pkg/unittest/test/test_common.dart pkg/unittest/test/test_utils.dart pkg/unittest/test/pretty_print_test.dart pkg/unittest/test/pretty_print_minified_test.dart pkg/unittest/test/instance_test.dart pkg/unittest/test/pretty_print_unminified_test.dart pkg/unittest/test/mock_test.dart pkg/unittest/test/mock_stepwise_negative_test.dart pkg/args/lib/args.dart pkg/args/lib/src/parser.dart pkg/args/lib/src/usage.dart pkg/args/test/args_test.dart pkg/args/test/usage_test.dart pkg/args/test/command_test.dart pkg/args/test/parse_test.dart pkg/args/example/test_runner.dart pkg/source_maps/lib/span.dart pkg/source_maps/lib/source_maps.dart pkg/source_maps/lib/parser.dart pkg/source_maps/lib/builder.dart pkg/source_maps/lib/printer.dart pkg/source_maps/lib/src/utils.dart pkg/source_maps/lib/src/vlq.dart pkg/source_maps/test/vlq_test.dart pkg/source_maps/test/run.dart pkg/source_maps/test/builder_test.dart pkg/source_maps/test/utils_test.dart pkg/source_maps/test/common.dart pkg/source_maps/test/parser_test.dart pkg/source_maps/test/printer_test.dart pkg/source_maps/test/span_test.dart pkg/source_maps/test/end2end_test.dart FORCE_DO_CMD
+ $(call do_cmd,dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot)
+
+all_deps += $(obj)/gen/pub.dart.snapshot
+action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs := $(obj)/gen/pub.dart.snapshot
+
+
+### Rules for final target.
+# Build our special outputs first.
+$(obj).target/utils/pub/pub.stamp: | $(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs)
+
+# Preserve order dependency of special output on deps.
+$(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs): | $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp
+
+$(obj).target/utils/pub/pub.stamp: TOOLSET := $(TOOLSET)
+$(obj).target/utils/pub/pub.stamp: $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp FORCE_DO_CMD
+ $(call do_cmd,touch)
+
+all_deps += $(obj).target/utils/pub/pub.stamp
+# Add target alias
+.PHONY: pub
+pub: $(obj).target/utils/pub/pub.stamp
+
+# Add target alias to "all" target.
+.PHONY: all
+all: pub
+
diff --git a/utils/pub/solver/greedy_solver.dart b/utils/pub/solver/greedy_solver.dart
new file mode 100644
index 0000000..e664ea2
--- /dev/null
+++ b/utils/pub/solver/greedy_solver.dart
@@ -0,0 +1,556 @@
+// 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.
+
+/// Attempts to resolve a set of version constraints for a package dependency
+/// graph and select an appropriate set of best specific versions for all
+/// dependent packages. It works iteratively and tries to reach a stable
+/// solution where the constraints of all dependencies are met. If it fails to
+/// reach a solution after a certain number of iterations, it assumes the
+/// dependency graph is unstable and reports and error.
+///
+/// There are two fundamental operations in the process of iterating over the
+/// graph:
+///
+/// 1. Changing the selected concrete version of some package. (This includes
+/// adding and removing a package too, which is considering changing the
+/// version to or from "none".) In other words, a node has changed.
+/// 2. Changing the version constraint that one package places on another. In
+/// other words, and edge has changed.
+///
+/// Both of these events have a corresponding (potentional) async operation and
+/// roughly cycle back and forth between each other. When we change the version
+/// of package changes, we asynchronously load the pubspec for the new version.
+/// When that's done, we compare the dependencies of the new version versus the
+/// old one. For everything that differs, we change those constraints between
+/// this package and that dependency.
+///
+/// When a constraint on a package changes, we re-calculate the overall
+/// constraint on that package. I.e. with a shared dependency, we intersect all
+/// of the constraints that its depending packages place on it. If that overall
+/// constraint changes (say from "<3.0.0" to "<2.5.0"), then the currently
+/// picked version for that package may fall outside of the new constraint. If
+/// that happens, we find the new best version that meets the updated constraint
+/// and then the change the package to use that version. That cycles back up to
+/// the beginning again.
+library version_solver1;
+
+import 'dart:async';
+import 'dart:collection' show Queue;
+import 'dart:math' as math;
+
+import '../lock_file.dart';
+import '../log.dart' as log;
+import '../package.dart';
+import '../source.dart';
+import '../source_registry.dart';
+import '../version.dart';
+import 'version_solver.dart';
+
+class GreedyVersionSolver extends VersionSolver {
+ final _packages = <String, DependencyNode>{};
+ final _work = new Queue<WorkItem>();
+ int _numIterations = 0;
+
+ GreedyVersionSolver(SourceRegistry sources, Package root, LockFile lockFile,
+ List<String> useLatest)
+ : super(sources, root, lockFile, useLatest);
+
+ /// The non-backtracking solver always only tries one solution.
+ int get attemptedSolutions => 1;
+
+ void forceLatestVersion(String package) {
+ // TODO(nweiz): How do we want to detect and handle unknown dependencies
+ // here?
+ getDependency(package).useLatestVersion = true;
+ }
+
+ Future<List<PackageId>> runSolver() {
+ // Kick off the work by adding the root package at its concrete version to
+ // the dependency graph.
+ enqueue(new AddConstraint('(entrypoint)', new PackageRef.root(root)));
+
+ Future processNextWorkItem(_) {
+ while (true) {
+ // Stop if we are done.
+ if (_work.isEmpty) return new Future.value(buildResults());
+
+ // If we appear to be stuck in a loop, then we probably have an unstable
+ // graph, bail. We guess this based on a rough heuristic that it should
+ // only take a certain number of steps to solve a graph with a given
+ // number of connections.
+ // TODO(rnystrom): These numbers here are magic and arbitrary. Tune
+ // when we have a better picture of real-world package topologies.
+ _numIterations++;
+ if (_numIterations > math.max(50, _packages.length * 5)) {
+ throw new CouldNotSolveException();
+ }
+
+ // Run the first work item.
+ var future = _work.removeFirst().process(this);
+
+ // If we have an async operation to perform, chain the loop to resume
+ // when it's done. Otherwise, just loop synchronously.
+ if (future != null) {
+ return future.then(processNextWorkItem);
+ }
+ }
+ }
+
+ return processNextWorkItem(null);
+ }
+
+ void enqueue(WorkItem work) {
+ _work.add(work);
+ }
+
+ DependencyNode getDependency(String package) {
+ // There can be unused dependencies in the graph, so just create an empty
+ // one if needed.
+ _packages.putIfAbsent(package, () => new DependencyNode(package));
+ return _packages[package];
+ }
+
+ /// Sets the best selected version of [package] to [version].
+ void setVersion(String package, Version version) {
+ _packages[package].version = version;
+ }
+
+ /// Returns the most recent version of [dependency] that satisfies all of its
+ /// version constraints.
+ Future<Version> getBestVersion(DependencyNode dependency) {
+ return cache.getVersions(dependency.name,
+ dependency.source, dependency.description).then((versions) {
+ var best = null;
+ for (var ref in versions) {
+ if (dependency.useLatestVersion ||
+ dependency.constraint.allows(ref.version)) {
+ if (best == null || ref.version > best) best = ref.version;
+ }
+ }
+
+ // TODO(rnystrom): Better exception.
+ if (best == null) {
+ if (tryUnlockDepender(dependency)) return null;
+ throw new NoVersionException(dependency.name, dependency.constraint,
+ dependency.toList());
+ } else if (!dependency.constraint.allows(best)) {
+ if (tryUnlockDepender(dependency)) return null;
+ throw new CouldNotUpdateException(
+ dependency.name, dependency.constraint, best);
+ }
+
+ return best;
+ });
+ }
+
+ /// Looks for a package that depends (transitively) on [dependency] and has
+ /// its version locked in the lockfile. If one is found, enqueues an
+ /// [UnlockPackage] work item for it and returns true. Otherwise, returns
+ /// false.
+ ///
+ /// This does a breadth-first search; immediate dependers will be unlocked
+ /// first, followed by transitive dependers.
+ bool tryUnlockDepender(DependencyNode dependency, [Set<String> seen]) {
+ if (seen == null) seen = new Set();
+ // Avoid an infinite loop if there are circular dependencies.
+ if (seen.contains(dependency.name)) return false;
+ seen.add(dependency.name);
+
+ for (var dependerName in dependency.dependers) {
+ var depender = getDependency(dependerName);
+ var locked = lockFile.packages[dependerName];
+ if (locked != null && depender.version == locked.version &&
+ depender.source.name == locked.source.name) {
+ enqueue(new UnlockPackage(depender));
+ return true;
+ }
+ }
+
+ return dependency.dependers.map(getDependency).any((subdependency) =>
+ tryUnlockDepender(subdependency, seen));
+ }
+
+ List<PackageId> buildResults() {
+ return _packages.values
+ .where((dep) => dep.isDependedOn)
+ .map(_dependencyToPackageId)
+ .toList();
+ }
+
+ PackageId _dependencyToPackageId(DependencyNode dep) {
+ var description = dep.description;
+
+ // If the lockfile contains a fully-resolved description for the package,
+ // use that. This allows e.g. Git to ensure that the same commit is used.
+ var lockedPackage = lockFile.packages[dep.name];
+ if (lockedPackage != null && lockedPackage.version == dep.version &&
+ lockedPackage.source.name == dep.source.name &&
+ dep.source.descriptionsEqual(
+ description, lockedPackage.description)) {
+ description = lockedPackage.description;
+ }
+
+ return new PackageId(dep.name, dep.source, dep.version, description);
+ }
+}
+
+/// The constraint solver works by iteratively processing a queue of work items.
+/// Each item is a single atomic change to the dependency graph. Handling them
+/// in a queue lets us handle asynchrony (resolving versions requires
+/// information from servers) as well as avoid deeply nested recursion.
+abstract class WorkItem {
+ /// Processes this work item. Returns a future that completes when the work is
+ /// done. If `null` is returned, that means the work has completed
+ /// synchronously and the next item can be started immediately.
+ Future process(GreedyVersionSolver solver);
+}
+
+/// The best selected version for a package has changed to [version]. If the
+/// previous version of the package is `null`, that means the package is being
+/// added to the graph. If [version] is `null`, it is being removed.
+class ChangeVersion implements WorkItem {
+ /// The name of the package whose version is being changed.
+ final String package;
+
+ /// The source of the package whose version is changing.
+ final Source source;
+
+ /// The description identifying the package whose version is changing.
+ final description;
+
+ /// The new selected version.
+ final Version version;
+
+ ChangeVersion(this.package, this.source, this.description, this.version);
+
+ Future process(GreedyVersionSolver solver) {
+ log.fine("Changing $package to version $version.");
+
+ var dependency = solver.getDependency(package);
+ var oldVersion = dependency.version;
+ solver.setVersion(package, version);
+
+ // The dependencies between the old and new version may be different. Walk
+ // them both and update any constraints that differ between the two.
+ return Future.wait([
+ getDependencyRefs(solver, oldVersion),
+ getDependencyRefs(solver, version)]).then((list) {
+ var oldDependencyRefs = list[0];
+ var newDependencyRefs = list[1];
+
+ for (var oldRef in oldDependencyRefs.values) {
+ if (newDependencyRefs.containsKey(oldRef.name)) {
+ // The dependency is in both versions of this package, but its
+ // constraint may have changed.
+ var newRef = newDependencyRefs.remove(oldRef.name);
+ solver.enqueue(new AddConstraint(package, newRef));
+ } else {
+ // The dependency is not in the new version of the package, so just
+ // remove its constraint.
+ solver.enqueue(new RemoveConstraint(package, oldRef.name));
+ }
+ }
+
+ // Everything that's left is a depdendency that's only in the new
+ // version of the package.
+ for (var newRef in newDependencyRefs.values) {
+ solver.enqueue(new AddConstraint(package, newRef));
+ }
+ });
+ }
+
+ /// Get the dependencies at [version] of the package being changed.
+ Future<Map<String, PackageRef>> getDependencyRefs(VersionSolver solver,
+ Version version) {
+ // If there is no version, it means no package, so no dependencies.
+ if (version == null) {
+ return new Future<Map<String, PackageRef>>.value(<String, PackageRef>{});
+ }
+
+ var id = new PackageId(package, source, version, description);
+ return solver.cache.getPubspec(id).then((pubspec) {
+ var dependencies = <String, PackageRef>{};
+ for (var dependency in pubspec.dependencies) {
+ dependencies[dependency.name] = dependency;
+ }
+
+ // Include dev dependencies only from the root package.
+ if (id.isRoot) {
+ for (var dependency in pubspec.devDependencies) {
+ dependencies[dependency.name] = dependency;
+ }
+ }
+
+ return dependencies;
+ });
+ }
+}
+
+/// A constraint that a depending package places on a dependent package has
+/// changed.
+///
+/// This is an abstract class that contains logic for updating the dependency
+/// graph once a dependency has changed. Changing the dependency is the
+/// responsibility of subclasses.
+abstract class ChangeConstraint implements WorkItem {
+ Future process(GreedyVersionSolver solver);
+
+ void undo(GreedyVersionSolver solver);
+
+ Future _processChange(GreedyVersionSolver solver,
+ DependencyNode oldDependency,
+ DependencyNode newDependency) {
+ var name = newDependency.name;
+ var source = oldDependency.source != null ?
+ oldDependency.source : newDependency.source;
+ var description = oldDependency.description != null ?
+ oldDependency.description : newDependency.description;
+ var oldConstraint = oldDependency.constraint;
+ var newConstraint = newDependency.constraint;
+
+ // If the package is over-constrained, i.e. the packages depending have
+ // disjoint constraints, then try unlocking a depender that's locked by the
+ // lockfile. If there are no remaining locked dependencies, throw an error.
+ if (newConstraint != null && newConstraint.isEmpty) {
+ if (solver.tryUnlockDepender(newDependency)) {
+ undo(solver);
+ return null;
+ }
+
+ throw new DisjointConstraintException(name, newDependency.toList());
+ }
+
+ // If this constraint change didn't cause the overall constraint on the
+ // package to change, then we don't need to do any further work.
+ if (oldConstraint == newConstraint) return null;
+
+ // If the dependency has been cut free from the graph, just remove it.
+ if (!newDependency.isDependedOn) {
+ solver.enqueue(new ChangeVersion(name, source, description, null));
+ return null;
+ }
+
+ // If the dependency is on the root package, then we don't need to do
+ // anything since it's already at the best version.
+ if (name == solver.root.name) {
+ solver.enqueue(new ChangeVersion(
+ name, source, description, solver.root.version));
+ return null;
+ }
+
+ // If the dependency is on a package in the lockfile, use the lockfile's
+ // version for that package if it's valid given the other constraints.
+ var lockedPackage = solver.lockFile.packages[name];
+ if (lockedPackage != null && newDependency.source == lockedPackage.source) {
+ var lockedVersion = lockedPackage.version;
+ if (newConstraint.allows(lockedVersion)) {
+ solver.enqueue(
+ new ChangeVersion(name, source, description, lockedVersion));
+ return null;
+ }
+ }
+
+ // The constraint has changed, so see what the best version of the package
+ // that meets the new constraint is.
+ return solver.getBestVersion(newDependency).then((best) {
+ if (best == null) {
+ undo(solver);
+ } else if (newDependency.version != best) {
+ solver.enqueue(new ChangeVersion(name, source, description, best));
+ }
+ });
+ }
+}
+
+/// The constraint given by [ref] is being placed by [depender].
+class AddConstraint extends ChangeConstraint {
+ /// The package that has the dependency.
+ final String depender;
+
+ /// The package being depended on and the constraints being placed on it. The
+ /// source, version, and description in this ref are all considered
+ /// constraints on the dependent package.
+ final PackageRef ref;
+
+ AddConstraint(this.depender, this.ref);
+
+ Future process(GreedyVersionSolver solver) {
+ log.fine("Adding $depender's constraint $ref.");
+
+ var dependency = solver.getDependency(ref.name);
+ var oldDependency = dependency.clone();
+ dependency.placeConstraint(depender, ref);
+ return _processChange(solver, oldDependency, dependency);
+ }
+
+ void undo(GreedyVersionSolver solver) {
+ solver.getDependency(ref.name).removeConstraint(depender);
+ }
+}
+
+/// [depender] is no longer placing a constraint on [dependent].
+class RemoveConstraint extends ChangeConstraint {
+ /// The package that was placing a constraint on [dependent].
+ String depender;
+
+ /// The package that was being depended on.
+ String dependent;
+
+ /// The constraint that was removed.
+ PackageRef _removed;
+
+ RemoveConstraint(this.depender, this.dependent);
+
+ Future process(GreedyVersionSolver solver) {
+ log.fine("Removing $depender's constraint ($_removed) on $dependent.");
+
+ var dependency = solver.getDependency(dependent);
+ var oldDependency = dependency.clone();
+ _removed = dependency.removeConstraint(depender);
+ return _processChange(solver, oldDependency, dependency);
+ }
+
+ void undo(GreedyVersionSolver solver) {
+ solver.getDependency(dependent).placeConstraint(depender, _removed);
+ }
+}
+
+/// [package]'s version is no longer constrained by the lockfile.
+class UnlockPackage implements WorkItem {
+ /// The package being unlocked.
+ DependencyNode package;
+
+ UnlockPackage(this.package);
+
+ Future process(GreedyVersionSolver solver) {
+ log.fine("Unlocking ${package.name}.");
+
+ solver.lockFile.packages.remove(package.name);
+ return solver.getBestVersion(package).then((best) {
+ if (best == null) return null;
+ solver.enqueue(new ChangeVersion(
+ package.name, package.source, package.description, best));
+ });
+ }
+}
+
+/// Describes one [Package] in the [DependencyGraph] and keeps track of which
+/// packages depend on it and what constraints they place on it.
+class DependencyNode {
+ /// The name of the this dependency's package.
+ final String name;
+
+ /// The [PackageRefs] that represent constraints that depending packages have
+ /// placed on this one.
+ final Map<String, PackageRef> _refs;
+
+ /// The currently-selected best version for this dependency.
+ Version version;
+
+ /// Whether this dependency should always select the latest version.
+ bool useLatestVersion = false;
+
+ /// Gets whether or not any other packages are currently depending on this
+ /// one. If `false`, then it means this package is not part of the dependency
+ /// graph and should be omitted.
+ bool get isDependedOn => !_refs.isEmpty;
+
+ /// The names of all the packages that depend on this dependency.
+ Iterable<String> get dependers => _refs.keys;
+
+ /// Gets the overall constraint that all packages are placing on this one.
+ /// If no packages have a constraint on this one (which can happen when this
+ /// package is in the process of being added to the graph), returns `null`.
+ VersionConstraint get constraint {
+ if (_refs.isEmpty) return null;
+ return new VersionConstraint.intersection(
+ _refs.values.map((ref) => ref.constraint));
+ }
+
+ /// The source of this dependency's package.
+ Source get source {
+ var canonical = _canonicalRef();
+ if (canonical == null) return null;
+ return canonical.source;
+ }
+
+ /// The description of this dependency's package.
+ get description {
+ var canonical = _canonicalRef();
+ if (canonical == null) return null;
+ return canonical.description;
+ }
+
+ /// Return the PackageRef that has the canonical source and description for
+ /// this package. If any dependency is on the root package, that will be used;
+ /// otherwise, it will be the source and description that all dependencies
+ /// agree upon.
+ PackageRef _canonicalRef() {
+ if (_refs.isEmpty) return null;
+ var refs = _refs.values;
+ for (var ref in refs) {
+ if (ref.isRoot) return ref;
+ }
+ return refs.first;
+ }
+
+ DependencyNode(this.name)
+ : _refs = <String, PackageRef>{};
+
+ DependencyNode._clone(DependencyNode other)
+ : name = other.name,
+ version = other.version,
+ _refs = new Map<String, PackageRef>.from(other._refs);
+
+ /// Creates a copy of this dependency.
+ DependencyNode clone() => new DependencyNode._clone(this);
+
+ /// Places [ref] as a constraint from [package] onto this.
+ void placeConstraint(String package, PackageRef ref) {
+ var requiredDepender = _requiredDepender();
+ if (requiredDepender != null) {
+ var required = _refs[requiredDepender];
+ if (required.source.name != ref.source.name) {
+ throw new SourceMismatchException(name, [
+ new Dependency(requiredDepender, required),
+ new Dependency(package, ref)]);
+ } else if (!required.descriptionEquals(ref)) {
+ throw new DescriptionMismatchException(name, [
+ new Dependency(requiredDepender, required),
+ new Dependency(package, ref)]);
+ }
+ }
+
+ _refs[package] = ref;
+ }
+
+ /// Returns the name of a package whose constraint source and description
+ /// all other constraints must match. Returns null if there are no
+ /// requirements on new constraints.
+ String _requiredDepender() {
+ if (_refs.isEmpty) return null;
+
+ var dependers = _refs.keys.toList();
+ if (dependers.length == 1) {
+ var depender = dependers[0];
+ if (_refs[depender].isRoot) return null;
+ return depender;
+ }
+
+ return dependers[1];
+ }
+
+ /// Removes the constraint from [package] onto this.
+ PackageRef removeConstraint(String package) => _refs.remove(package);
+
+ /// Converts this to a list of [Dependency] objects like the error types
+ /// expect.
+ List<Dependency> toList() {
+ var result = <Dependency>[];
+ _refs.forEach((name, ref) {
+ result.add(new Dependency(name, ref));
+ });
+ return result;
+ }
+}