Fix type error in js_dart2js.dart caught by DDC.

BUG=
R=vsm@google.com

Review-Url: https://codereview.chromium.org/2611423002 .
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index 1802f10..9d6ddd8 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -882,7 +882,6 @@
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
-  let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
   let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
   let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
   let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
@@ -52595,7 +52594,7 @@
   });
   dart.defineLazy(js, {
     get context() {
-      return js._wrapToDart(js._global);
+      return js.JsObject._check(js._wrapToDart(js._global));
     }
   });
   const _jsObject = Symbol('_jsObject');
@@ -52608,22 +52607,22 @@
       if (arguments$ === void 0) arguments$ = null;
       let ctor = constructor[_jsObject];
       if (arguments$ == null) {
-        return js._wrapToDart(new ctor());
+        return js.JsObject._check(js._wrapToDart(new ctor()));
       }
       let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
-      return js._wrapToDart(new ctor(...unwrapped));
+      return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
     }
     static fromBrowserObject(object) {
       if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
         dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
       }
-      return js._wrapToDart(js._convertToJS(object));
+      return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
     }
     static jsify(object) {
       if (!core.Map.is(object) && !core.Iterable.is(object)) {
         dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
       }
-      return js._wrapToDart(js.JsObject._convertDataTree(object));
+      return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
     }
     static _convertDataTree(data) {
       let _convertedObjects = collection.HashMap.identity();
@@ -52951,9 +52950,9 @@
   };
   dart.fn(js._convertToDart, dynamicToObject());
   js._wrapToDart = function(o) {
-    return js.JsObject._check(js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper));
+    return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
   };
-  dart.fn(js._wrapToDart, dynamicToJsObject());
+  dart.fn(js._wrapToDart, dynamicToObject());
   js._wrapToDartHelper = function(o) {
     if (typeof o == "function") {
       return new js.JsFunction._fromJs(o);
@@ -52963,7 +52962,7 @@
     }
     return new js.JsObject._fromJs(o);
   };
-  dart.fn(js._wrapToDartHelper, dynamicToJsObject());
+  dart.fn(js._wrapToDartHelper, dynamicToObject());
   dart.defineLazy(js, {
     get _dartProxies() {
       return new WeakMap();
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 70e86d0..2b4c910 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -882,7 +882,6 @@
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
-  let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
   let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
   let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
   let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
@@ -52595,7 +52594,7 @@
   });
   dart.defineLazy(js, {
     get context() {
-      return js._wrapToDart(js._global);
+      return js.JsObject._check(js._wrapToDart(js._global));
     }
   });
   const _jsObject = Symbol('_jsObject');
@@ -52608,22 +52607,22 @@
       if (arguments$ === void 0) arguments$ = null;
       let ctor = constructor[_jsObject];
       if (arguments$ == null) {
-        return js._wrapToDart(new ctor());
+        return js.JsObject._check(js._wrapToDart(new ctor()));
       }
       let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
-      return js._wrapToDart(new ctor(...unwrapped));
+      return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
     }
     static fromBrowserObject(object) {
       if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
         dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
       }
-      return js._wrapToDart(js._convertToJS(object));
+      return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
     }
     static jsify(object) {
       if (!core.Map.is(object) && !core.Iterable.is(object)) {
         dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
       }
-      return js._wrapToDart(js.JsObject._convertDataTree(object));
+      return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
     }
     static _convertDataTree(data) {
       let _convertedObjects = collection.HashMap.identity();
@@ -52951,9 +52950,9 @@
   };
   dart.fn(js._convertToDart, dynamicToObject());
   js._wrapToDart = function(o) {
-    return js.JsObject._check(js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper));
+    return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
   };
-  dart.fn(js._wrapToDart, dynamicToJsObject());
+  dart.fn(js._wrapToDart, dynamicToObject());
   js._wrapToDartHelper = function(o) {
     if (typeof o == "function") {
       return new js.JsFunction._fromJs(o);
@@ -52963,7 +52962,7 @@
     }
     return new js.JsObject._fromJs(o);
   };
-  dart.fn(js._wrapToDartHelper, dynamicToJsObject());
+  dart.fn(js._wrapToDartHelper, dynamicToObject());
   dart.defineLazy(js, {
     get _dartProxies() {
       return new WeakMap();
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index e067430..10c4a9a 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -880,7 +880,6 @@
 let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
 let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
 let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
-let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
 let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
 let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
 let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
@@ -52593,7 +52592,7 @@
 });
 dart.defineLazy(js, {
   get context() {
-    return js._wrapToDart(js._global);
+    return js.JsObject._check(js._wrapToDart(js._global));
   }
 });
 const _jsObject = Symbol('_jsObject');
@@ -52606,22 +52605,22 @@
     if (arguments$ === void 0) arguments$ = null;
     let ctor = constructor[_jsObject];
     if (arguments$ == null) {
-      return js._wrapToDart(new ctor());
+      return js.JsObject._check(js._wrapToDart(new ctor()));
     }
     let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
-    return js._wrapToDart(new ctor(...unwrapped));
+    return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
   }
   static fromBrowserObject(object) {
     if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
       dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
     }
-    return js._wrapToDart(js._convertToJS(object));
+    return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
   }
   static jsify(object) {
     if (!core.Map.is(object) && !core.Iterable.is(object)) {
       dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
     }
-    return js._wrapToDart(js.JsObject._convertDataTree(object));
+    return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
   }
   static _convertDataTree(data) {
     let _convertedObjects = collection.HashMap.identity();
@@ -52949,9 +52948,9 @@
 };
 dart.fn(js._convertToDart, dynamicToObject());
 js._wrapToDart = function(o) {
-  return js.JsObject._check(js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper));
+  return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
 };
-dart.fn(js._wrapToDart, dynamicToJsObject());
+dart.fn(js._wrapToDart, dynamicToObject());
 js._wrapToDartHelper = function(o) {
   if (typeof o == "function") {
     return new js.JsFunction._fromJs(o);
@@ -52961,7 +52960,7 @@
   }
   return new js.JsObject._fromJs(o);
 };
-dart.fn(js._wrapToDartHelper, dynamicToJsObject());
+dart.fn(js._wrapToDartHelper, dynamicToObject());
 dart.defineLazy(js, {
   get _dartProxies() {
     return new WeakMap();
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index 96c65a8..7820c1b 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -883,7 +883,6 @@
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
-  let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
   let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
   let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
   let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
@@ -52596,7 +52595,7 @@
   });
   dart.defineLazy(js, {
     get context() {
-      return js._wrapToDart(js._global);
+      return js.JsObject._check(js._wrapToDart(js._global));
     }
   });
   const _jsObject = Symbol('_jsObject');
@@ -52609,22 +52608,22 @@
       if (arguments$ === void 0) arguments$ = null;
       let ctor = constructor[_jsObject];
       if (arguments$ == null) {
-        return js._wrapToDart(new ctor());
+        return js.JsObject._check(js._wrapToDart(new ctor()));
       }
       let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
-      return js._wrapToDart(new ctor(...unwrapped));
+      return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
     }
     static fromBrowserObject(object) {
       if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
         dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
       }
-      return js._wrapToDart(js._convertToJS(object));
+      return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
     }
     static jsify(object) {
       if (!core.Map.is(object) && !core.Iterable.is(object)) {
         dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
       }
-      return js._wrapToDart(js.JsObject._convertDataTree(object));
+      return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
     }
     static _convertDataTree(data) {
       let _convertedObjects = collection.HashMap.identity();
@@ -52952,9 +52951,9 @@
   };
   dart.fn(js._convertToDart, dynamicToObject());
   js._wrapToDart = function(o) {
-    return js.JsObject._check(js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper));
+    return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
   };
-  dart.fn(js._wrapToDart, dynamicToJsObject());
+  dart.fn(js._wrapToDart, dynamicToObject());
   js._wrapToDartHelper = function(o) {
     if (typeof o == "function") {
       return new js.JsFunction._fromJs(o);
@@ -52964,7 +52963,7 @@
     }
     return new js.JsObject._fromJs(o);
   };
-  dart.fn(js._wrapToDartHelper, dynamicToJsObject());
+  dart.fn(js._wrapToDartHelper, dynamicToObject());
   dart.defineLazy(js, {
     get _dartProxies() {
       return new WeakMap();
diff --git a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
index dfd1029..073b986 100644
--- a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
+++ b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
Binary files differ
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 ae590ad..eb15560 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
@@ -502,9 +502,9 @@
   }
 }
 
-JsObject _wrapToDart(o) => _putIfAbsent(_dartProxies, o, _wrapToDartHelper);
+Object _wrapToDart(o) => _putIfAbsent(_dartProxies, o, _wrapToDartHelper);
 
-JsObject _wrapToDartHelper(o) {
+Object _wrapToDartHelper(o) {
   if (JS('bool', 'typeof # == "function"', o)) {
     return new JsFunction._fromJs(o);
   }
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index b08f7ac..fd612c0 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -629,7 +629,7 @@
   }
 }
 
-JsObject _wrapToDart(o) {
+Object _wrapToDart(o) {
   if (JS('bool', 'typeof # == "function"', o)) {
     return _getDartProxy(
         o, DART_CLOSURE_PROPERTY_NAME, (o) => new JsFunction._fromJs(o));
diff --git a/tests/lib_strong/html/js_test.dart b/tests/lib_strong/html/js_test.dart
index 55b6eef..c55b926 100644
--- a/tests/lib_strong/html/js_test.dart
+++ b/tests/lib_strong/html/js_test.dart
@@ -649,6 +649,13 @@
       context.deleteProperty('callback');
     });
 
+    test('pass a Dart function to JS and back', () {
+      var dartFunction = () => 42;
+      context['dartFunction'] = dartFunction;
+      expect(identical(context['dartFunction'], dartFunction), isTrue);
+      context.deleteProperty('dartFunction');
+    });
+
     test('callback as parameter', () {
       expect(context.callMethod('getTypeOf', [context['razzle']]),
           equals("function"));