diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 43b8a799043..c88e4970746 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -241,14 +241,14 @@ public class ClosureCodegen extends ParentCodegenAwareImpl { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); - iv.load(0, superClass); - iv.invokespecial(superClass.getInternalName(), "", "()V"); - int k = 1; for (FieldInfo fieldInfo : args) { k = AsmUtil.genAssignInstanceFieldFromParam(fieldInfo, k, iv); } + iv.load(0, superClass); + iv.invokespecial(superClass.getInternalName(), "", "()V"); + iv.visitInsn(RETURN); FunctionCodegen.endVisit(iv, "constructor", fun); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 67b2142b1ee..81d4d42ea87 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1156,6 +1156,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { InstructionAdapter iv = codegen.v; + if (closure != null) { + List argsFromClosure = ClosureCodegen.calculateConstructorParameters(typeMapper, closure, classAsmType); + int k = 1; + for (FieldInfo info : argsFromClosure) { + k = AsmUtil.genAssignInstanceFieldFromParam(info, k, iv); + } + } + if (superCall == null) { genSimpleSuperCall(iv); } @@ -1166,14 +1174,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { generateDelegatorToConstructorCall(iv, codegen, constructorDescriptor); } - if (closure != null) { - List argsFromClosure = ClosureCodegen.calculateConstructorParameters(typeMapper, closure, classAsmType); - int k = 1; - for (FieldInfo info : argsFromClosure) { - k = AsmUtil.genAssignInstanceFieldFromParam(info, k, iv); - } - } - int n = 0; for (JetDelegationSpecifier specifier : myClass.getDelegationSpecifiers()) { if (specifier == superCall) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java index 869969100f9..e2c1de2b67c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java @@ -200,7 +200,6 @@ public class LambdaTransformer { Map indexToLambda = invocation.getLambdasToInline(); AbstractInsnNode cur = constructor.instructions.getFirst(); - cur = cur.getNext(); //skip super call List capturedLambdas = new ArrayList(); //captured var of inlined parameter CapturedParamOwner owner = new CapturedParamOwner() { @Override diff --git a/compiler/testData/codegen/box/super/kt4982.kt b/compiler/testData/codegen/box/super/kt4982.kt new file mode 100644 index 00000000000..d8abff3d5a9 --- /dev/null +++ b/compiler/testData/codegen/box/super/kt4982.kt @@ -0,0 +1,21 @@ +abstract class WaitFor { + { + condition() + } + + abstract fun condition() : Boolean; +} + +fun box(): String { + val local = "" + var result = "fail" + val s = object: WaitFor() { + + override fun condition(): Boolean { + result = "OK" + return result.length == 2 + } + } + + return result; +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index c7e2d7b5816..3b78bb7628a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -5142,6 +5142,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/super/kt4173_3.kt"); } + @TestMetadata("kt4982.kt") + public void testKt4982() throws Exception { + doTest("compiler/testData/codegen/box/super/kt4982.kt"); + } + @TestMetadata("multipleSuperTraits.kt") public void testMultipleSuperTraits() throws Exception { doTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt");