Index: sdk/lib/_internal/js_runtime/lib/interceptors.dart |
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart |
index 0247af4ab45094c9af83d02c647d4dfd7e6c0c48..620ff44a0ad53594135832f59c7bbdf899bad6db 100644 |
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart |
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart |
@@ -22,6 +22,7 @@ import 'dart:_js_helper' show allMatchesInStringUnchecked, |
checkString, |
defineProperty, |
diagnoseIndexError, |
+ getIsolateAffinityTag, |
getRuntimeType, |
initNativeDispatch, |
initNativeDispatchFlag, |
@@ -40,6 +41,7 @@ import 'dart:_js_helper' show allMatchesInStringUnchecked, |
StringMatch, |
firstMatchAfter, |
NoInline; |
+ |
import 'dart:_foreign_helper' show |
JS, |
JS_EFFECT, |
@@ -52,6 +54,9 @@ part 'js_array.dart'; |
part 'js_number.dart'; |
part 'js_string.dart'; |
+final String DART_CLOSURE_PROPERTY_NAME = |
+ getIsolateAffinityTag(r'_$dart_dartClosure'); |
+ |
String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol); |
_symbolMapToStringMap(Map<Symbol, dynamic> map) { |
@@ -170,6 +175,9 @@ getNativeInterceptor(object) { |
// are 'plain' Objects. This test could be simplified and the dispatch path |
// be faster if Object.prototype was pre-patched with a non-leaf dispatch |
// record. |
+ if (JS('bool', 'typeof # == "function"', object)) { |
+ return JS_INTERCEPTOR_CONSTANT(JavaScriptFunction); |
+ } |
var proto = JS('', 'Object.getPrototypeOf(#)', object); |
if (JS('bool', '# == null || # === Object.prototype', proto, proto)) { |
return JS_INTERCEPTOR_CONSTANT(PlainJavaScriptObject); |
@@ -394,13 +402,24 @@ abstract class JSObject { |
* Interceptor base class for JavaScript objects not recognized as some more |
* specific native type. |
*/ |
-abstract class JavaScriptObject extends Interceptor implements JSObject { |
+class JavaScriptObject extends Interceptor implements JSObject { |
const JavaScriptObject(); |
// It would be impolite to stash a property on the object. |
int get hashCode => 0; |
Type get runtimeType => JSObject; |
+ |
+ /** |
+ * Returns the result of the JavaScript objects `toString` method. |
+ */ |
+ String toString() { |
+ try { |
+ return JS('String', 'String(#)', this); |
+ } catch(e) { |
Siggi Cherem (dart-lang)
2015/09/18 20:34:10
under what circumstances do you expect an exceptio
Jacob
2015/10/01 00:47:33
Just matching the toString() method that was in da
|
+ return super.toString(); |
+ } |
+ } |
} |
@@ -424,3 +443,18 @@ class UnknownJavaScriptObject extends JavaScriptObject { |
String toString() => JS('String', 'String(#)', this); |
} |
+ |
+/** |
+ * Interceptor for JavaScript function objects and Dart functions that have |
+ * been converted to JavaScript functions. |
+ * These interceptor methods are not always used as the JavaScript function |
+ * object has also been mangled to support Dart function calling conventions. |
+ */ |
+class JavaScriptFunction extends JavaScriptObject implements Function { |
+ const JavaScriptFunction(); |
+ |
+ String toString() { |
+ var dartClosure = JS('', '#.#', this, DART_CLOSURE_PROPERTY_NAME); |
+ return dartClosure == null ? super.toString() : dartClosure.toString(); |
+ } |
+} |