diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index f964f1ccce8..cb596f83c7f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -532,7 +532,7 @@ public class AsmUtil { JetType type = descriptor.getReturnType(); if (type == null || isNullableType(type)) return; - Type asmType = state.getTypeMapper().mapReturnType(type); + Type asmType = state.getTypeMapper().mapReturnType(descriptor); if (asmType.getSort() == Type.OBJECT || asmType.getSort() == Type.ARRAY) { v.dup(); v.visitLdcInsn(descriptor.getContainingDeclaration().getName().asString()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 4605f19e407..648519a90d9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2006,8 +2006,7 @@ public class ExpressionCodegen extends JetVisitor implem if (callable instanceof CallableMethod) { CallableMethod callableMethod = (CallableMethod) callable; invokeMethodWithArguments(callableMethod, resolvedCall, receiver); - //noinspection ConstantConditions - Type returnType = typeMapper.mapReturnType(resolvedCall.getResultingDescriptor().getReturnType()); + Type returnType = typeMapper.mapReturnType(resolvedCall.getResultingDescriptor()); StackValue.coerce(callableMethod.getSignature().getAsmMethod().getReturnType(), returnType, v); return StackValue.onStack(returnType); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index d59d4b6a302..d0fa8f0b3aa 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -788,13 +788,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private void generateComponentFunction(@NotNull FunctionDescriptor function, @NotNull final ValueParameterDescriptor parameter) { - JetType returnType = function.getReturnType(); - assert returnType != null : "Return type of component function should not be null: " + function; - final Type componentType = typeMapper.mapReturnType(returnType); - - JvmMethodSignature signature = typeMapper.mapSignature(function); - - functionCodegen.generateMethod(myClass, signature, function, new FunctionGenerationStrategy() { + functionCodegen.generateMethod(myClass, typeMapper.mapSignature(function), function, new FunctionGenerationStrategy() { @Override public void generateBody( @NotNull MethodVisitor mv, @@ -802,6 +796,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull MethodContext context, @Nullable MemberCodegen parentCodegen ) { + Type componentType = signature.getAsmMethod().getReturnType(); InstructionAdapter iv = new InstructionAdapter(mv); if (!componentType.equals(Type.VOID_TYPE)) { iv.load(0, classAsmType); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 13f36d99578..14d6a67af42 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -143,19 +143,23 @@ public class JetTypeMapper extends BindingTraceAware { } @NotNull - public Type mapReturnType(@NotNull JetType jetType) { - return mapReturnType(jetType, null); + public Type mapReturnType(@NotNull CallableDescriptor descriptor) { + return mapReturnType(descriptor, null); } @NotNull - private Type mapReturnType(@NotNull JetType jetType, @Nullable BothSignatureWriter signatureVisitor) { - if (jetType.equals(KotlinBuiltIns.getInstance().getUnitType())) { - if (signatureVisitor != null) { - signatureVisitor.writeAsmType(Type.VOID_TYPE); + private Type mapReturnType(@NotNull CallableDescriptor descriptor, @Nullable BothSignatureWriter sw) { + JetType returnType = descriptor.getReturnType(); + assert returnType != null : "Function has no return type: " + descriptor; + if (returnType.equals(KotlinBuiltIns.getInstance().getUnitType()) && !(descriptor instanceof PropertyGetterDescriptor)) { + if (sw != null) { + sw.writeAsmType(Type.VOID_TYPE); } return Type.VOID_TYPE; } - return mapType(jetType, signatureVisitor, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false); + else { + return mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false); + } } @NotNull @@ -602,14 +606,7 @@ public class JetTypeMapper extends BindingTraceAware { } sw.writeReturnType(); - JetType returnType = f.getReturnType(); - assert returnType != null : "Function " + f + " has no return type"; - if (f instanceof PropertyGetterDescriptor) { - mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false); - } - else { - mapReturnType(returnType, sw); - } + mapReturnType(f, sw); sw.writeReturnTypeEnd(); }