Index: lib/compiler/implementation/ssa/codegen.dart |
=================================================================== |
--- lib/compiler/implementation/ssa/codegen.dart (revision 6568) |
+++ lib/compiler/implementation/ssa/codegen.dart (working copy) |
@@ -15,7 +15,42 @@ |
SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator( |
compiler, work, parameters, parameterNames); |
codegen.visitGraph(graph); |
- return 'function($parameters) {\n${codegen.buffer}}'; |
+ |
+ FunctionElement element = work.element; |
+ String code; |
+ if (element.isInstanceMember() |
+ && element.enclosingElement.isClass() |
+ && element.enclosingElement.isNative() |
+ && native.isOverriddenMethod(element, |
+ element.enclosingElement, |
+ compiler.emitter.nativeEmitter)) { |
+ // Record that this method is overridden. In case of optional |
+ // arguments, the emitter will generate stubs to handle them, |
+ // and needs to know if the method is overridden. |
+ compiler.emitter.nativeEmitter.overriddenMethods.add(element); |
+ |
+ String methodName; |
+ Namer namer = compiler.namer; |
+ if (element.kind == ElementKind.FUNCTION) { |
+ FunctionParameters parameters = element.computeParameters(compiler); |
+ methodName = namer.instanceMethodName( |
+ element.getLibrary(), element.name, parameters.parameterCount); |
+ } else if (element.kind == ElementKind.GETTER) { |
+ methodName = namer.getterName(element.getLibrary(), element.name); |
+ } else if (element.kind == ElementKind.SETTER) { |
+ methodName = namer.setterName(element.getLibrary(), element.name); |
+ } else { |
+ compiler.internalError('unexpected kind: "${element.kind}"', |
+ element: element); |
+ } |
+ StringBuffer buffer = new StringBuffer(); |
+ native.generateMethodWithPrototypeCheck( |
floitsch
2012/04/16 17:59:47
create native.generateMethodWithPrototypeCheckForE
ngeoffray
2012/04/17 08:04:18
Done.
|
+ compiler, buffer, methodName, '${codegen.buffer}', parameters); |
+ code = buffer.toString(); |
+ } else { |
+ code = codegen.buffer.toString(); |
+ } |
+ return 'function($parameters) {\n$code}'; |
}); |
} |