From c24c7998197a3b8c98237cc7653dafd4944e8ce2 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 26 Jul 2014 01:31:11 +0400 Subject: [PATCH] Fix NoSuchMethodError on private components of data classes A follow-up to https://github.com/JetBrains/kotlin/commit/d5681540ec47ee5c9a548ba56df8b4e20097549d --- .../jetbrains/jet/codegen/ImplementationBodyCodegen.java | 6 +++--- .../codegen/boxWithStdlib/dataClasses/privateValParams.kt | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 257e4364953..715b9e2462e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -833,9 +833,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Type componentType = signature.getReturnType(); InstructionAdapter iv = new InstructionAdapter(mv); if (!componentType.equals(Type.VOID_TYPE)) { - iv.load(0, classAsmType); - String desc = "()" + componentType.getDescriptor(); - iv.invokevirtual(classAsmType.getInternalName(), PropertyCodegen.getterName(parameter.getName()), desc, false); + PropertyDescriptor property = + bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, descriptorToDeclaration(parameter)); + genPropertyOnStack(iv, context, property, 0); } iv.areturn(componentType); } diff --git a/compiler/testData/codegen/boxWithStdlib/dataClasses/privateValParams.kt b/compiler/testData/codegen/boxWithStdlib/dataClasses/privateValParams.kt index 2996bb8839d..d667588ab98 100644 --- a/compiler/testData/codegen/boxWithStdlib/dataClasses/privateValParams.kt +++ b/compiler/testData/codegen/boxWithStdlib/dataClasses/privateValParams.kt @@ -1,4 +1,6 @@ -data class D(private val x: Long, private val y: Char) +data class D(private val x: Long, private val y: Char) { + fun foo() = "${component1()}${component2()}" +} fun box(): String { val d1 = D(42L, 'a') @@ -6,5 +8,6 @@ fun box(): String { if (d1 != d2) return "Fail equals" if (d1.hashCode() != d2.hashCode()) return "Fail hashCode" if (d1.toString() != d2.toString()) return "Fail toString" + if (d1.foo() != d2.foo()) return "Fail foo" return "OK" }