diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java index 96944548a00..315d45f0f96 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java @@ -251,7 +251,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer descTypes = new ArrayList(); Parameters constructorParams = constructorInlineBuilder.buildParameters(); - int[] capturedIndexes = new int[constructorParams.getReal().size() + constructorParams.getCaptured().size()]; + int[] capturedIndexes = new int[constructorParams.getParameters().size()]; int index = 0; int size = 0; @@ -432,7 +432,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer hiddenParameters = invocationParamBuilder.buildParameters().getReal(); + List hiddenParameters = invocationParamBuilder.buildParameters().getParameters(); recordParameterValueInLocalVal(hiddenParameters.toArray(new ParameterInfo[hiddenParameters.size()])); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index d19f0c2544e..0330c9c599b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -488,7 +488,7 @@ public class InlineCodegenUtil { public static int calcMarkerShift(@NotNull Parameters parameters, @NotNull MethodNode node) { int markerShiftTemp = getIndexAfterLastMarker(node); - return markerShiftTemp - parameters.getRealArgsSizeOnStack() + parameters.getArgsSizeOnStack(); + return markerShiftTemp - parameters.getRealParametersSizeOnStack() + parameters.getArgsSizeOnStack(); } private static int getIndexAfterLastMarker(@NotNull MethodNode node) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java index d7e4720e3c3..d07f084c789 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java @@ -340,8 +340,8 @@ public class MethodInliner { @NotNull private MethodNode prepareNode(@NotNull MethodNode node, int finallyDeepShift) { - final int capturedParamsSize = parameters.getCapturedArgsSizeOnStack(); - final int realParametersSize = parameters.getRealArgsSizeOnStack(); + final int capturedParamsSize = parameters.getCapturedParametersSizeOnStack(); + final int realParametersSize = parameters.getRealParametersSizeOnStack(); Type[] types = Type.getArgumentTypes(node.desc); Type returnType = Type.getReturnType(node.desc); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/Parameters.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/Parameters.kt index c45874e7b54..5e446422b43 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/Parameters.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/Parameters.kt @@ -19,15 +19,23 @@ package org.jetbrains.kotlin.codegen.inline import org.jetbrains.org.objectweb.asm.Type import java.util.* -internal class Parameters(val real: List, val captured: List) : Iterable { +internal class Parameters(val parameters: List) : Iterable { private val actualDeclShifts: Array private val paramToDeclByteCodeIndex: HashMap = hashMapOf() - val realArgsSizeOnStack = real.sumBy { it.type.size } - val capturedArgsSizeOnStack = captured.sumBy { it.type.size } + val argsSizeOnStack = parameters.sumBy { it.type.size } - val argsSizeOnStack = realArgsSizeOnStack + capturedArgsSizeOnStack + val realParametersSizeOnStack: Int + get() = argsSizeOnStack - capturedParametersSizeOnStack + + val capturedParametersSizeOnStack by lazy { + captured.sumBy { it.type.size } + } + + val captured by lazy { + parameters.filterIsInstance() + } init { val declIndexesToActual = arrayOfNulls(argsSizeOnStack) @@ -54,21 +62,15 @@ internal class Parameters(val real: List, val captured: List { - return (real + captured).iterator() + return parameters.iterator() } val capturedTypes: List get() = captured.map { it.getType() } - - companion object { - fun shift(capturedParams: List, realSize: Int): List { - return capturedParams.withIndex().map { it.value.newIndex(it.index + realSize) } - } - } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.kt index f68bc3d0545..829eb2abaea 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.kt @@ -18,49 +18,45 @@ package org.jetbrains.kotlin.codegen.inline import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.org.objectweb.asm.Type -import java.util.* internal class ParametersBuilder private constructor() { - private val valueAndHiddenParams = arrayListOf() - private val capturedParams = arrayListOf() - private var valueParamStart = 0 - var nextValueParameterIndex = 0 + private val params = arrayListOf() + + private var valueParamFirstIndex = 0 + + var nextParameterOffset = 0 private set - private var nextCaptured = 0 + private var nextValueParameterIndex = 0 fun addThis(type: Type, skipped: Boolean): ParameterInfo { - val info = ParameterInfo(type, skipped, nextValueParameterIndex, -1, valueAndHiddenParams.size) - addParameter(info) - return info + return addParameter(ParameterInfo(type, skipped, nextParameterOffset, -1, nextValueParameterIndex)) } fun addNextParameter(type: Type, skipped: Boolean): ParameterInfo { - return addParameter(ParameterInfo(type, skipped, nextValueParameterIndex, null, valueAndHiddenParams.size)) + return addParameter(ParameterInfo(type, skipped, nextParameterOffset, null, nextValueParameterIndex)) } fun addNextValueParameter(type: Type, skipped: Boolean, remapValue: StackValue?, parameterIndex: Int): ParameterInfo { return addParameter(ParameterInfo( - type, skipped, nextValueParameterIndex, remapValue, - if (parameterIndex == -1) valueAndHiddenParams.size else parameterIndex + valueParamStart + type, skipped, nextParameterOffset, remapValue, + if (parameterIndex == -1) nextValueParameterIndex else parameterIndex + valueParamFirstIndex )) } fun addCapturedParam(original: CapturedParamInfo, newFieldName: String): CapturedParamInfo { - val info = CapturedParamInfo(original.desc, newFieldName, original.isSkipped, nextCapturedIndex(), original.index) + val info = CapturedParamInfo(original.desc, newFieldName, original.isSkipped, nextParameterOffset, original.index) info.lambda = original.lambda - return addCapturedParameter(info) + return addParameter(info) } - private fun nextCapturedIndex(): Int = nextCaptured - fun addCapturedParam(desc: CapturedParamDesc, newFieldName: String, skipInConstructor: Boolean): CapturedParamInfo { - return addCapturedParameter(CapturedParamInfo(desc, newFieldName, false, nextCapturedIndex(), null, skipInConstructor)) + return addParameter(CapturedParamInfo(desc, newFieldName, false, nextParameterOffset, null, skipInConstructor, -1)) } fun addCapturedParamCopy(copyFrom: CapturedParamInfo): CapturedParamInfo { - return addCapturedParameter(copyFrom.newIndex(nextCapturedIndex())) + return addParameter(copyFrom.cloneWithNewDeclarationIndex(-1)) } fun addCapturedParam( @@ -72,41 +68,48 @@ internal class ParametersBuilder private constructor() { original: ParameterInfo? ): CapturedParamInfo { val info = CapturedParamInfo( - CapturedParamDesc(containingLambdaType, fieldName, type), newFieldName, skipped, nextCapturedIndex(), original?.index ?: -1 + CapturedParamDesc(containingLambdaType, fieldName, type), newFieldName, skipped, nextParameterOffset, original?.index ?: -1 ) if (original != null) { info.lambda = original.lambda } - return addCapturedParameter(info) + return addParameter(info) } - private fun addParameter(info: ParameterInfo): ParameterInfo { - valueAndHiddenParams.add(info) - nextValueParameterIndex += info.getType().size - return info - } - - private fun addCapturedParameter(info: CapturedParamInfo): CapturedParamInfo { - capturedParams.add(info) - nextCaptured += info.getType().size + private fun addParameter(info: T): T { + params.add(info) + nextParameterOffset += info.getType().size + if (info !is CapturedParamInfo) { + nextValueParameterIndex++ + } return info } fun markValueParametersStart() { - this.valueParamStart = valueAndHiddenParams.size + this.valueParamFirstIndex = params.size + this.nextValueParameterIndex = valueParamFirstIndex } fun listCaptured(): List { - return Collections.unmodifiableList(capturedParams) + return params.filterIsInstance() } /*TODO use Parameters instead*/ fun listAllParams(): List { - return valueAndHiddenParams + capturedParams + return params } fun buildParameters(): Parameters { - return Parameters(Collections.unmodifiableList(valueAndHiddenParams), Parameters.shift(listCaptured(), nextValueParameterIndex)) + var nextDeclarationIndex = (params.maxBy { it.declarationIndex }?.declarationIndex ?: -1) + 1 + + return Parameters(params.map { param -> + if (param is CapturedParamInfo) { + param.cloneWithNewDeclarationIndex(nextDeclarationIndex++) + } + else { + param + } + }) } companion object {