diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index e6aa45a4727..49c1881abd6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1404,7 +1404,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } else { argumentGenerator = - generateSuperCallImplicitArguments(iv, codegen, constructorDescriptor, delegateConstructor, delegateConstructorCallable, + generateSuperCallImplicitArguments(iv, codegen, constructorDescriptor, delegateConstructor, delegationConstructorCall, + delegateConstructorCallable, delegatingParameters, parameters); } @@ -1423,6 +1424,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull ExpressionCodegen codegen, @NotNull ConstructorDescriptor constructorDescriptor, @NotNull ConstructorDescriptor superConstructor, + @NotNull ResolvedCall superConstructorCall, @NotNull CallableMethod superCallable, @NotNull List superParameters, @NotNull List parameters @@ -1465,7 +1467,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (isAnonymousObject(descriptor)) { List superValues = superParameters.subList(superIndex, superParameters.size()); - return new ObjectSuperCallArgumentGenerator(superValues, iv, offset); + return new ObjectSuperCallArgumentGenerator(superValues, iv, offset, superConstructorCall); } else { return new CallBasedArgumentGenerator(codegen, codegen.defaultCallGenerator, superConstructor.getValueParameters(), @@ -1506,49 +1508,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { delegatingCallable.getValueParameterTypes()); } - private static class ObjectSuperCallArgumentGenerator extends ArgumentGenerator { - private final List parameters; - private final InstructionAdapter iv; - private int offset; - - public ObjectSuperCallArgumentGenerator( - @NotNull List superParameters, - @NotNull InstructionAdapter iv, - int firstValueParamOffset - ) { - this.parameters = superParameters; - this.iv = iv; - this.offset = firstValueParamOffset; - } - - @Override - public void generateExpression(int i, @NotNull ExpressionValueArgument argument) { - generateSuperCallArgument(i); - } - - @Override - public void generateDefault(int i, @NotNull DefaultValueArgument argument) { - Type type = parameters.get(i).getAsmType(); - pushDefaultValueOnStack(type, iv); - } - - @Override - public void generateVararg(int i, @NotNull VarargValueArgument argument) { - generateSuperCallArgument(i); - } - - private void generateSuperCallArgument(int i) { - Type type = parameters.get(i).getAsmType(); - iv.load(offset, type); - offset += type.getSize(); - } - - @Override - protected void reorderArgumentsIfNeeded(@NotNull List args) { - - } - } - private void generateEnumEntries() { if (descriptor.getKind() != ClassKind.ENUM_CLASS) return; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ObjectSuperCallArgumentGenerator.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ObjectSuperCallArgumentGenerator.java new file mode 100644 index 00000000000..83c6976a609 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ObjectSuperCallArgumentGenerator.java @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; +import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument; +import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument; +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; +import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument; +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature; +import org.jetbrains.org.objectweb.asm.Type; +import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; + +import java.util.List; + +import static org.jetbrains.kotlin.codegen.AsmUtil.pushDefaultValueOnStack; + +class ObjectSuperCallArgumentGenerator extends ArgumentGenerator { + private final List parameters; + private final InstructionAdapter iv; + private int offset; + + public ObjectSuperCallArgumentGenerator( + @NotNull List superParameters, + @NotNull InstructionAdapter iv, + int firstValueParamOffset, + @NotNull ResolvedCall superConstructorCall + ) { + this.parameters = superParameters; + this.iv = iv; + this.offset = firstValueParamOffset; + } + + @Override + public void generateExpression(int i, @NotNull ExpressionValueArgument argument) { + generateSuperCallArgument(i); + } + + @Override + public void generateDefault(int i, @NotNull DefaultValueArgument argument) { + Type type = parameters.get(i).getAsmType(); + pushDefaultValueOnStack(type, iv); + } + + @Override + public void generateVararg(int i, @NotNull VarargValueArgument argument) { + generateSuperCallArgument(i); + } + + private void generateSuperCallArgument(int i) { + Type type = parameters.get(i).getAsmType(); + iv.load(offset, type); + offset += type.getSize(); + } + + @Override + protected void reorderArgumentsIfNeeded(@NotNull List args) { + + } +}