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.*
internal class Parameters(val real: List, val captured: 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 = realArgsSizeOnStack + capturedArgsSizeOnStack
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 {
if (index < real.size) {
return real.get(index)
}
return captured.get(index - real.size)
}
override fun iterator(): Iterator {
return (real + captured).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) }
}
}
}