All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.codegen.inline.Parameters.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-Beta1
Show newest version
/*
 * 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) }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy