org.jetbrains.kotlin.codegen.inline.Parameters.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2015 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.inline
import org.jetbrains.org.objectweb.asm.Type
import java.util.*
class Parameters(val parameters: List) : Iterable {
private val actualDeclShifts: Array
private val paramToDeclByteCodeIndex: HashMap = hashMapOf()
val argsSizeOnStack = parameters.sumOf { it.type.size }
val realParametersSizeOnStack: Int
get() = argsSizeOnStack - capturedParametersSizeOnStack
val capturedParametersSizeOnStack by lazy {
captured.sumOf { it.type.size }
}
val captured by lazy {
parameters.filterIsInstance()
}
init {
val declIndexesToActual = arrayOfNulls(argsSizeOnStack)
withIndex().forEach { it ->
declIndexesToActual[it.value.declarationIndex] = it.index
}
actualDeclShifts = arrayOfNulls(argsSizeOnStack)
var realSize = 0
for (i in declIndexesToActual.indices) {
val byDeclarationIndex = get(declIndexesToActual[i] ?: continue)
actualDeclShifts[realSize] = byDeclarationIndex
paramToDeclByteCodeIndex.put(byDeclarationIndex, realSize)
realSize += byDeclarationIndex.type.size
}
}
fun getDeclarationSlot(info: ParameterInfo): Int {
return paramToDeclByteCodeIndex[info]!!
}
fun getParameterByDeclarationSlot(index: Int): ParameterInfo {
return actualDeclShifts[index]!!
}
private fun get(index: Int): ParameterInfo {
return parameters[index]
}
override fun iterator(): Iterator {
return parameters.iterator()
}
val capturedTypes: List
get() = captured.map(CapturedParamInfo::type)
}