Index: lib/compiler/implementation/js_backend/emitter.dart |
diff --git a/lib/compiler/implementation/js_backend/emitter.dart b/lib/compiler/implementation/js_backend/emitter.dart |
index 85ac2fe4f0da98878d1fdfebe11e26612d27408f..202bc87f53da9587a4bf3402877eed0b5e72f8f9 100644 |
--- a/lib/compiler/implementation/js_backend/emitter.dart |
+++ b/lib/compiler/implementation/js_backend/emitter.dart |
@@ -1253,8 +1253,8 @@ $classesCollector.$mangledName = {'': |
// Do not generate no such method handlers if there is no class. |
if (compiler.codegenWorld.instantiatedClasses.isEmpty) return; |
- String noSuchMethodName = |
- namer.publicInstanceMethodNameByArity(Compiler.NO_SUCH_METHOD, 2); |
+ String noSuchMethodName = namer.publicInstanceMethodNameByArity( |
+ Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT); |
// Keep track of the JavaScript names we've already added so we |
// do not introduce duplicates (bad for code size). |
@@ -1279,14 +1279,36 @@ $classesCollector.$mangledName = {'': |
} |
CodeBuffer generateMethod(String methodName, Selector selector) { |
+ // Values match JSInvocationMirror in js-helper library. |
+ const int METHOD = 0; |
+ const int GETTER = 1; |
+ const int SETTER = 2; |
+ int type = METHOD; |
+ if (selector.isGetter()) { |
+ type = GETTER; |
+ } else if (selector.isSetter()) { |
+ type = SETTER; |
+ } |
CodeBuffer args = new CodeBuffer(); |
for (int i = 0; i < selector.argumentCount; i++) { |
if (i != 0) args.add(', '); |
args.add('\$$i'); |
} |
+ CodeBuffer argNames = new CodeBuffer(); |
+ List<SourceString> names = selector.getOrderedNamedArguments(); |
+ for (int i = 0; i < names.length; i++) { |
+ if (i != 0) argNames.add(', '); |
+ argNames.add('"'); |
+ argNames.add(names[i].slowToString()); |
+ argNames.add('"'); |
+ } |
+ String internalName = namer.instanceMethodInvocationName( |
+ selector.library, new SourceString(methodName), selector); |
CodeBuffer buffer = new CodeBuffer(); |
buffer.add('function($args) {\n'); |
- buffer.add(' return this.$noSuchMethodName("$methodName", [$args]);\n'); |
+ buffer.add(' return this.$noSuchMethodName(' |
+ '\$.createInvocationMirror("$methodName", "$internalName",' |
+ ' $type, [$args], [$argNames]));\n'); |
buffer.add(' }'); |
return buffer; |
} |