| Index: pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
|
| index eb15560da2f817068f6d4cdabc2903a118e38134..3b9fbadcc07db73c480368400babfd368e8465c1 100644
|
| --- a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
|
| +++ b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
|
| @@ -284,19 +284,24 @@ class JsObject {
|
| * Proxies a JavaScript Function object.
|
| */
|
| class JsFunction extends JsObject {
|
| -
|
| /**
|
| * Returns a [JsFunction] that captures its 'this' binding and calls [f]
|
| * with the value of this passed as the first argument.
|
| */
|
| factory JsFunction.withThis(Function f) {
|
| - return new JsFunction._fromJs(JS('', 'function(/*...arguments*/) {'
|
| + return new JsFunction._fromJs(JS(
|
| + '',
|
| + 'function(/*...arguments*/) {'
|
| ' let args = [#(this)];'
|
| ' for (let arg of arguments) {'
|
| ' args.push(#(arg));'
|
| ' }'
|
| ' return #(#(...args));'
|
| - '}', _convertToDart, _convertToDart, _convertToJS, f));
|
| + '}',
|
| + _convertToDart,
|
| + _convertToDart,
|
| + _convertToJS,
|
| + f));
|
| }
|
|
|
| JsFunction._fromJs(jsObject) : super._fromJs(jsObject);
|
| @@ -305,15 +310,17 @@ class JsFunction extends JsObject {
|
| * Invokes the JavaScript function with arguments [args]. If [thisArg] is
|
| * supplied it is the value of `this` for the invocation.
|
| */
|
| - dynamic apply(List args, {thisArg}) => _convertToDart(JS('', '#.apply(#, #)',
|
| - _jsObject, _convertToJS(thisArg),
|
| + dynamic apply(List args, {thisArg}) => _convertToDart(JS(
|
| + '',
|
| + '#.apply(#, #)',
|
| + _jsObject,
|
| + _convertToJS(thisArg),
|
| args == null ? null : new List.from(args.map(_convertToJS))));
|
| }
|
|
|
| // TODO(jmesserly): this is totally unnecessary in dev_compiler.
|
| /** A [List] that proxies a JavaScript array. */
|
| class JsArray<E> extends JsObject with ListMixin<E> {
|
| -
|
| /**
|
| * Creates a new JavaScript array.
|
| */
|
| @@ -421,7 +428,8 @@ class JsArray<E> extends JsObject with ListMixin<E> {
|
| int length = end - start;
|
| if (length == 0) return;
|
| if (skipCount < 0) throw new ArgumentError(skipCount);
|
| - var args = <Object>[start, length]..addAll(iterable.skip(skipCount).take(length));
|
| + var args = <Object>[start, length]
|
| + ..addAll(iterable.skip(skipCount).take(length));
|
| callMethod('splice', args);
|
| }
|
|
|
| @@ -435,7 +443,8 @@ class JsArray<E> extends JsObject with ListMixin<E> {
|
| // We include the the instanceof Object test to filter out cross frame objects
|
| // on FireFox. Surprisingly on FireFox the instanceof Window test succeeds for
|
| // cross frame windows while the instanceof Object test fails.
|
| -bool _isBrowserType(o) => JS('bool',
|
| +bool _isBrowserType(o) => JS(
|
| + 'bool',
|
| '# instanceof Object && ('
|
| '# instanceof Blob || '
|
| '# instanceof Event || '
|
| @@ -445,7 +454,16 @@ bool _isBrowserType(o) => JS('bool',
|
| '# instanceof Node || '
|
| // Int8Array.__proto__ is TypedArray.
|
| '(window.Int8Array && # instanceof Int8Array.__proto__) || '
|
| - '# instanceof Window)', o, o, o, o, o, o, o, o, o);
|
| + '# instanceof Window)',
|
| + o,
|
| + o,
|
| + o,
|
| + o,
|
| + o,
|
| + o,
|
| + o,
|
| + o,
|
| + o);
|
|
|
| class _DartObject {
|
| final _dartObj;
|
| @@ -453,11 +471,7 @@ class _DartObject {
|
| }
|
|
|
| dynamic _convertToJS(dynamic o) {
|
| - if (o == null ||
|
| - o is String ||
|
| - o is num ||
|
| - o is bool ||
|
| - _isBrowserType(o)) {
|
| + if (o == null || o is String || o is num || o is bool || _isBrowserType(o)) {
|
| return o;
|
| } else if (o is DateTime) {
|
| return Primitives.lazyAsJsDate(o);
|
| @@ -473,10 +487,15 @@ dynamic _convertToJS(dynamic o) {
|
| }
|
|
|
| dynamic _wrapDartFunction(f) {
|
| - var wrapper = JS('', 'function(/*...arguments*/) {'
|
| + var wrapper = JS(
|
| + '',
|
| + 'function(/*...arguments*/) {'
|
| ' let args = Array.prototype.map.call(arguments, #);'
|
| ' return #(#(...args));'
|
| - '}', _convertToDart, _convertToJS, f);
|
| + '}',
|
| + _convertToDart,
|
| + _convertToJS,
|
| + f);
|
| JS('', '#.set(#, #)', _dartProxies, wrapper, f);
|
|
|
| return wrapper;
|
| @@ -495,7 +514,7 @@ Object _convertToDart(o) {
|
| var ms = JS('num', '#.getTime()', o);
|
| return new DateTime.fromMillisecondsSinceEpoch(ms);
|
| } else if (o is _DartObject &&
|
| - JS('bool', 'dart.jsobject != dart.getReifiedType(#)', o)) {
|
| + JS('bool', 'dart.jsobject != dart.getReifiedType(#)', o)) {
|
| return o._dartObj;
|
| } else {
|
| return _wrapToDart(o);
|
| @@ -541,7 +560,7 @@ Object _putIfAbsent(weakMap, o, getValue(o)) {
|
| /// JavaScript. We may remove the need to call this method completely in the
|
| /// future if Dart2Js is refactored so that its function calling conventions
|
| /// are more compatible with JavaScript.
|
| -Function /*=F*/ allowInterop/*<F extends Function>*/(Function /*=F*/ f) => f;
|
| +Function/*=F*/ allowInterop/*<F extends Function>*/(Function/*=F*/ f) => f;
|
|
|
| Expando<Function> _interopCaptureThisExpando = new Expando<Function>();
|
|
|
| @@ -554,7 +573,8 @@ Expando<Function> _interopCaptureThisExpando = new Expando<Function>();
|
| Function allowInteropCaptureThis(Function f) {
|
| var ret = _interopCaptureThisExpando[f];
|
| if (ret == null) {
|
| - ret = JS('',
|
| + ret = JS(
|
| + '',
|
| 'function(/*...arguments*/) {'
|
| ' let args = [this];'
|
| ' for (let arg of arguments) {'
|
|
|