Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
index 3118874217d4d8cebfdf1478105c9cb3c626cab5..284715d245a936361b175bcf1b5ccdccabbd03e4 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
@@ -3159,18 +3159,35 @@ class CodeEmitterTask extends CompilerTask { |
block.statements.add(buildInterceptorCheck(backend.jsArrayClass)); |
} |
+ // Recognize JavaScript functions that correspond to Dart constructors |
+ // (generated by defineClass that adds the property 'builtin$cls'). |
+ // TODO(ahe): Either integrate this with native dispatchProperty, or use a |
+ // mixin approach in defineClass. |
+ block.statements.add( |
+ js.if_(r'typeof receiver == "function" && "builtin$cls" in receiver', |
+ buildReturnInterceptor(backend.jsRuntimeType))); |
+ |
+ // Recognize JavaScript object literals that are used to encode function |
+ // types. These objects are generated by |
+ // [TypeRepresentationGenerator.visitFunctionType] and always have the |
ngeoffray
2013/09/10 10:42:26
missing something after 'and'.
|
+ // "func" property (namer.functionTypeTag()). |
+ // TODO(ahe): This should be a real Dart object and we should be able to |
+ // remove this test (so I'm keeping the redundant "object" test). |
+ block.statements.add( |
+ js.if_(r'typeof receiver == "object"' |
+ // JavaScript object literals have Object as constructor. |
+ ' && receiver.constructor === Object' |
+ ' && "${namer.functionTypeTag()}" in receiver', |
+ buildReturnInterceptor(backend.jsFunctionType))); |
+ |
if (hasNative) { |
block.statements.add( |
- js.if_( |
- js('(typeof receiver) != "object"'), |
- js.return_(js('receiver')))); |
+ js.if_('typeof receiver != "object"', js.return_('receiver'))); |
- // if (receiver instanceof $.Object) return receiver; |
- // return $.getNativeInterceptor(receiver); |
block.statements.add( |
js.if_(js('receiver instanceof #', |
js(namer.isolateAccess(compiler.objectClass))), |
- js.return_(js('receiver')))); |
+ js.return_('receiver'))); |
block.statements.add( |
js.return_( |
js(namer.isolateAccess(backend.getNativeInterceptorMethod))( |