pull generateTraitMethods() out of generatePrimaryConstructor(), don't inappropriately reuse ExpressionCodegen

This commit is contained in:
Dmitry Jemerov
2012-07-12 20:10:26 +02:00
parent 40e4e32eab
commit 5ab1608ced
@@ -291,6 +291,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
throw new RuntimeException("Error generating primary constructor of class " + myClass.getName() + " with kind " + kind, e); throw new RuntimeException("Error generating primary constructor of class " + myClass.getName() + " with kind " + kind, e);
} }
generateTraitMethods();
generateAccessors(); generateAccessors();
} }
@@ -736,22 +738,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
generateInitializers(codegen, iv, myClass.getDeclarations(), bindingContext, typeMapper); generateInitializers(codegen, iv, myClass.getDeclarations(), bindingContext, typeMapper);
generateTraitMethods(codegen);
mv.visitInsn(RETURN); mv.visitInsn(RETURN);
FunctionCodegen.endVisit(mv, "constructor", myClass); FunctionCodegen.endVisit(mv, "constructor", myClass);
FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor, OwnerKind.IMPLEMENTATION); FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor, OwnerKind.IMPLEMENTATION);
} }
private void generateTraitMethods(ExpressionCodegen codegen) { private void generateTraitMethods() {
if (myClass instanceof JetClass && (((JetClass)myClass).isTrait() || ((JetClass)myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD))) if (myClass instanceof JetClass && (((JetClass)myClass).isTrait() || ((JetClass)myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD)))
return; return;
for (Pair<CallableMemberDescriptor, CallableMemberDescriptor> needDelegates : getTraitImplementations(descriptor)) { for (Pair<CallableMemberDescriptor, CallableMemberDescriptor> needDelegates : getTraitImplementations(descriptor)) {
CallableMemberDescriptor callableDescriptor = needDelegates.first; CallableMemberDescriptor callableDescriptor = needDelegates.first;
if (needDelegates.second instanceof SimpleFunctionDescriptor) { if (needDelegates.second instanceof SimpleFunctionDescriptor) {
generateDelegationToTraitImpl(codegen, (FunctionDescriptor) needDelegates.second, (FunctionDescriptor) needDelegates.first); generateDelegationToTraitImpl((FunctionDescriptor) needDelegates.second, (FunctionDescriptor) needDelegates.first);
} }
else if (needDelegates.second instanceof PropertyDescriptor) { else if (needDelegates.second instanceof PropertyDescriptor) {
PropertyDescriptor property = (PropertyDescriptor) needDelegates.second; PropertyDescriptor property = (PropertyDescriptor) needDelegates.second;
@@ -759,7 +759,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
for (PropertyAccessorDescriptor accessor : property.getAccessors()) { for (PropertyAccessorDescriptor accessor : property.getAccessors()) {
for (PropertyAccessorDescriptor inheritedAccessor : inheritedAccessors) { for (PropertyAccessorDescriptor inheritedAccessor : inheritedAccessors) {
if (inheritedAccessor.getClass() == accessor.getClass()) { // same accessor kind if (inheritedAccessor.getClass() == accessor.getClass()) { // same accessor kind
generateDelegationToTraitImpl(codegen, accessor, inheritedAccessor); generateDelegationToTraitImpl(accessor, inheritedAccessor);
} }
} }
} }
@@ -768,7 +768,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
private void generateDelegationToTraitImpl(ExpressionCodegen codegen, FunctionDescriptor fun, @NotNull FunctionDescriptor inheritedFun) { private void generateDelegationToTraitImpl(FunctionDescriptor fun, @NotNull FunctionDescriptor inheritedFun) {
DeclarationDescriptor containingDeclaration = fun.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = fun.getContainingDeclaration();
if (containingDeclaration instanceof ClassDescriptor) { if (containingDeclaration instanceof ClassDescriptor) {
ClassDescriptor declaration = (ClassDescriptor) containingDeclaration; ClassDescriptor declaration = (ClassDescriptor) containingDeclaration;
@@ -822,8 +822,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
FrameMap frameMap = context.prepareFrame(state.getInjector().getJetTypeMapper());
codegen.generateThisOrOuter(descriptor); ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
codegen.generateThisOrOuter(descriptor); // ??? wouldn't it be a good idea to put it?
Type[] argTypes = function.getArgumentTypes(); Type[] argTypes = function.getArgumentTypes();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);