diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index cdfe31bb26a..0920d789efb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -444,6 +444,10 @@ public class FunctionCodegen { FrameMap frameMap = owner.prepareFrame(state.getInjector().getJetTypeMapper()); + if (kind instanceof OwnerKind.StaticDelegateKind) { + frameMap.leaveTemp(); + } + ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getReturnType(), owner, state); int var = 0; @@ -452,15 +456,13 @@ public class FunctionCodegen { } Type receiverType; - if (receiverParameter.exists()) { + if (hasReceiver) { receiverType = state.getInjector().getJetTypeMapper().mapType(receiverParameter.getType(), MapTypeMode.VALUE); + var += receiverType.getSize(); } else { receiverType = Type.DOUBLE_TYPE; } - if (hasReceiver) { - var += receiverType.getSize(); - } Type[] argTypes = jvmSignature.getArgumentTypes(); List paramDescrs = functionDescriptor.getValueParameters(); @@ -484,12 +486,15 @@ public class FunctionCodegen { int extra = hasReceiver ? 1 : 0; - Type[] argumentTypes = jvmSignature.getArgumentTypes(); for (int index = 0; index < paramDescrs.size(); index++) { ValueParameterDescriptor parameterDescriptor = paramDescrs.get(index); - Type t = argumentTypes[extra + index]; - Label endArg = null; + Type t = argTypes[extra + index]; + + if (frameMap.getIndex(parameterDescriptor) < 0) { + frameMap.enter(parameterDescriptor, t.getSize()); + } + if (parameterDescriptor.declaresDefaultValue()) { iv.load(maskIndex, Type.INT_TYPE); iv.iconst(1 << index); @@ -501,18 +506,14 @@ public class FunctionCodegen { assert jetParameter != null; codegen.gen(jetParameter.getDefaultValue(), t); - endArg = new Label(); - iv.goTo(endArg); + int ind = frameMap.getIndex(parameterDescriptor); + iv.store(ind, t); iv.mark(loadArg); } iv.load(var, t); var += t.getSize(); - - if (parameterDescriptor.declaresDefaultValue()) { - iv.mark(endArg); - } } if (!isStatic) { diff --git a/compiler/testData/codegen/functions/defaultargs6.kt b/compiler/testData/codegen/functions/defaultargs6.kt new file mode 100644 index 00000000000..21a9faeae3f --- /dev/null +++ b/compiler/testData/codegen/functions/defaultargs6.kt @@ -0,0 +1,7 @@ +trait A { + fun foo(x: Int, y: Int = x + 20, z: Int = y * 2) = z +} + +class B : A {} + +fun box() = if (B().foo(1) == 42) "OK" else "Fail" diff --git a/compiler/testData/codegen/functions/defaultargs7.kt b/compiler/testData/codegen/functions/defaultargs7.kt new file mode 100644 index 00000000000..107929fad00 --- /dev/null +++ b/compiler/testData/codegen/functions/defaultargs7.kt @@ -0,0 +1,5 @@ +class A(val expected: Int) { + fun foo(x: Int, y: Int = x + 20, z: Int = y * 2) = z == expected +} + +fun box() = if (A(42).foo(1)) "OK" else "Fail" diff --git a/compiler/testData/codegen/regressions/kt2270.kt b/compiler/testData/codegen/regressions/kt2270.kt new file mode 100644 index 00000000000..27d631e3d2f --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2270.kt @@ -0,0 +1,6 @@ +class A( + val i : Int, + val j : Int = i +) + +fun box() = if (A(1).j == 1) "OK" else "fail" diff --git a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java index 578dc674f0a..7b1abba69f2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java @@ -68,6 +68,14 @@ public class FunctionGenTest extends CodegenTestCase { // System.out.println(generateToText()); } + public void testDefaultArgs6() { + blackBoxFile("functions/defaultargs6.kt"); + } + + public void testDefaultArgs7() { + blackBoxFile("functions/defaultargs7.kt"); + } + public void testNoThisNoClosure() throws Exception { blackBoxFile("functions/nothisnoclosure.jet"); // System.out.println(generateToText()); @@ -121,7 +129,7 @@ public class FunctionGenTest extends CodegenTestCase { blackBoxFile("functions/invoke.kt"); } - public void test2481() { + public void testKt2481() { blackBoxFile("regressions/kt2481.kt"); } @@ -137,6 +145,10 @@ public class FunctionGenTest extends CodegenTestCase { blackBoxFile("regressions/kt2271.kt"); } + public void testKt2270() { + blackBoxFile("regressions/kt2270.kt"); + } + public static class WithJavaFunctionGenTest extends CodegenTestCase { private void blackBoxFileWithJava(@NotNull String ktFile) throws Exception { File javaClassesTempDirectory = new File(FileUtil.getTempDirectory(), "java-classes");