From c9c50e4107a99d80109b0ea366a1033445e3db45 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 26 Dec 2013 11:17:15 +0400 Subject: [PATCH] KT-4348: Array access operator overloading doesn't work with vararg's #KT-4348 Fixed --- .../jet/codegen/ExpressionCodegen.java | 31 +++++++++++++------ .../testData/codegen/box/arrays/kt4348.kt | 17 ++++++++++ .../BlackBoxCodegenTestGenerated.java | 5 +++ 3 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/box/arrays/kt4348.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 8ff82852f4a..74c161ba7c6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2288,17 +2288,28 @@ public class ExpressionCodegen extends JetVisitor implem } private int pushMethodArguments(@NotNull ResolvedCall resolvedCall, List valueParameterTypes) { + return pushMethodArguments(resolvedCall, valueParameterTypes, false); + } + + private int pushMethodArguments(@NotNull ResolvedCall resolvedCall, List valueParameterTypes, boolean skipLast) { @SuppressWarnings("unchecked") List valueArguments = resolvedCall.getValueArgumentsByIndex(); CallableDescriptor fd = resolvedCall.getResultingDescriptor(); + List valueParameters = fd.getValueParameters(); - if (fd.getValueParameters().size() != valueArguments.size()) { + if (valueParameters.size() != valueArguments.size()) { throw new IllegalStateException(); } int mask = 0; - for (ValueParameterDescriptor valueParameter : fd.getValueParameters()) { + + for (Iterator iterator = valueParameters.iterator(); iterator.hasNext(); ) { + ValueParameterDescriptor valueParameter = iterator.next(); + if (skipLast && !iterator.hasNext()) { + continue; + } + ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameter.getIndex()); Type parameterType = valueParameterTypes.get(valueParameter.getIndex()); if (resolvedValueArgument instanceof ExpressionValueArgument) { @@ -3380,20 +3391,22 @@ public class ExpressionCodegen extends JetVisitor implem assert resolvedCall != null : "couldn't find resolved call: " + expression.getText(); Callable callable = resolveToCallable(operationDescriptor, false); + Method asmMethod = resolveToCallableMethod(operationDescriptor, false, context).getSignature().getAsmMethod(); + Type[] argumentTypes = asmMethod.getArgumentTypes(); + if (callable instanceof CallableMethod) { genThisAndReceiverFromResolvedCall(receiver, resolvedCall, (CallableMethod) callable); + pushMethodArguments(resolvedCall, ((CallableMethod) callable).getValueParameterTypes(), !isGetter); } else { gen(array, arrayType); // intrinsic method - } - int index = operationDescriptor.getReceiverParameter() != null ? 1 : 0; + int index = operationDescriptor.getReceiverParameter() != null ? 1 : 0; - Method asmMethod = resolveToCallableMethod(operationDescriptor, false, context).getSignature().getAsmMethod(); - Type[] argumentTypes = asmMethod.getArgumentTypes(); - for (JetExpression jetExpression : expression.getIndexExpressions()) { - gen(jetExpression, argumentTypes[index]); - index++; + for (JetExpression jetExpression : expression.getIndexExpressions()) { + gen(jetExpression, argumentTypes[index]); + index++; + } } Type elementType = isGetter ? asmMethod.getReturnType() : ArrayUtil.getLastElement(argumentTypes); diff --git a/compiler/testData/codegen/box/arrays/kt4348.kt b/compiler/testData/codegen/box/arrays/kt4348.kt new file mode 100644 index 00000000000..8952fd00a70 --- /dev/null +++ b/compiler/testData/codegen/box/arrays/kt4348.kt @@ -0,0 +1,17 @@ +fun String.get(vararg value: Any) : String { + return if (value[0] == 44 && value[1] == "example") "OK" else "fail" +} + +fun Int.get(vararg value: Any) : Int { + return if (value[0] == 44 && value[1] == "example") 1 else 0 +} +fun main(args: Array) { + 12 [44, "example"] +} + +fun box(): String { + if ("foo" [44, "example"] != "OK") return "fail1" + if (11 [44, "example"] != 1) return "fail2" + + return "OK" +} \ 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 a4975a83296..da9a5508ecd 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -193,6 +193,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/arrays/kt33.kt"); } + @TestMetadata("kt4348.kt") + public void testKt4348() throws Exception { + doTest("compiler/testData/codegen/box/arrays/kt4348.kt"); + } + @TestMetadata("kt503.kt") public void testKt503() throws Exception { doTest("compiler/testData/codegen/box/arrays/kt503.kt");