Index: pkg/fletchc/lib/src/function_codegen.dart |
diff --git a/pkg/fletchc/lib/src/function_codegen.dart b/pkg/fletchc/lib/src/function_codegen.dart |
deleted file mode 100644 |
index 2f9e4d676e6cda049d33c18616f68153e2411a62..0000000000000000000000000000000000000000 |
--- a/pkg/fletchc/lib/src/function_codegen.dart |
+++ /dev/null |
@@ -1,134 +0,0 @@ |
-// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE.md file. |
- |
-library fletchc.function_codegen; |
- |
-import 'package:compiler/src/resolution/tree_elements.dart' show |
- TreeElements; |
- |
-import 'package:compiler/src/elements/elements.dart'; |
-import 'package:compiler/src/tree/tree.dart'; |
- |
-import 'fletch_context.dart'; |
- |
-import 'fletch_function_builder.dart' show |
- FletchFunctionBuilder; |
- |
-import 'fletch_registry.dart' show |
- FletchRegistry; |
- |
-import 'closure_environment.dart'; |
- |
-import 'codegen_visitor.dart'; |
- |
-class FunctionCodegen extends CodegenVisitor with FletchRegistryMixin { |
- final FletchRegistry registry; |
- int setterResultSlot; |
- |
- FunctionCodegen(FletchFunctionBuilder functionBuilder, |
- FletchContext context, |
- TreeElements elements, |
- this.registry, |
- ClosureEnvironment closureEnvironment, |
- FunctionElement function) |
- : super(functionBuilder, context, elements, |
- closureEnvironment, function); |
- |
- FunctionElement get function => element; |
- |
- // If the function is a setter, push the argument to later be returned. |
- // TODO(ajohnsen): If the argument is semantically final, we don't have to |
- // do this. |
- bool get hasAssignmentSemantics => |
- function.isSetter || function.name == '[]='; |
- |
- void compile() { |
- if (checkCompileError(function)) { |
- assembler.methodEnd(); |
- return; |
- } |
- |
- ClassElement enclosing = function.enclosingClass; |
- // Generate implicit 'null' check for '==' functions. |
- if (enclosing != null && function.name == '==') { |
- BytecodeLabel notNull = new BytecodeLabel(); |
- assembler.loadParameter(1); |
- assembler.loadLiteralNull(); |
- assembler.identicalNonNumeric(); |
- assembler.branchIfFalse(notNull); |
- // TODO(ajohnsen): Consider creating an injected operator== into 'null', |
- // to avoid this extra check. |
- assembler.loadParameter(0); |
- assembler.loadLiteralNull(); |
- assembler.identicalNonNumeric(); |
- assembler.ret(); |
- assembler.bind(notNull); |
- } |
- |
- FunctionSignature functionSignature = function.functionSignature; |
- int parameterCount = functionSignature.parameterCount; |
- |
- if (hasAssignmentSemantics) { |
- setterResultSlot = assembler.stackSize; |
- // The result is always the last argument. |
- assembler.loadParameter(functionBuilder.arity - 1); |
- } |
- |
- // Skip 'this' if present. |
- int parameterIndex = functionBuilder.arity - parameterCount; |
- |
- functionSignature.orderedForEachParameter((ParameterElement parameter) { |
- // For constructors, the argument is passed as boxed (from the initializer |
- // inlining). |
- LocalValue value = createLocalValueForParameter( |
- parameter, |
- parameterIndex, |
- isCapturedValueBoxed: element.isGenerativeConstructor); |
- pushVariableDeclaration(value); |
- parameterIndex++; |
- }); |
- |
- ClosureInfo info = closureEnvironment.closures[function]; |
- if (info != null) { |
- int index = 0; |
- if (info.isThisFree) { |
- thisValue = new UnboxedLocalValue(assembler.stackSize, null); |
- assembler.loadParameter(0); |
- assembler.loadField(index++); |
- } |
- for (LocalElement local in info.free) { |
- pushVariableDeclaration(createLocalValueFor(local)); |
- // TODO(ajohnsen): Use a specialized helper for loading the closure. |
- assembler.loadParameter(0); |
- assembler.loadField(index++); |
- } |
- } |
- |
- FunctionExpression node = function.node; |
- if (node != null) { |
- node.body.accept(this); |
- } |
- |
- // Emit implicit 'return null' if no terminator is present. |
- if (!assembler.endsWithTerminator) generateImplicitReturn(node); |
- |
- assembler.methodEnd(); |
- } |
- |
- void generateImplicitReturn(FunctionExpression node) { |
- if (hasAssignmentSemantics) { |
- assembler.loadSlot(setterResultSlot); |
- assembler.ret(); |
- } else { |
- assembler.returnNull(); |
- } |
- } |
- |
- void optionalReplaceResultValue() { |
- if (hasAssignmentSemantics) { |
- assembler.pop(); |
- assembler.loadSlot(setterResultSlot); |
- } |
- } |
-} |