diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Stack.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Stack.kt new file mode 100644 index 00000000000..1ab3c2d2ae7 --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Stack.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common.interpreter.stack + +interface Stack { + fun pushFrame(frame: Frame) + fun popFrame(): Frame + fun peekFrame(): Frame +} + +interface Frame { + fun addVar(state: State) + fun getVar(name: String): State +} \ No newline at end of file diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/StackImpl.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/StackImpl.kt new file mode 100644 index 00000000000..cfc468bb5b8 --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/StackImpl.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common.interpreter.stack + +import java.util.NoSuchElementException + +class StackImpl : Stack { + private val stack: MutableList = mutableListOf() + + override fun pushFrame(frame: Frame) { + stack.add(frame) + } + + override fun popFrame(): Frame { + if (stack.isEmpty()) { + throw IndexOutOfBoundsException("Stack is empty") + } + return stack.removeAt(stack.size - 1) + } + + override fun peekFrame(): Frame { + if (stack.isEmpty()) { + throw IndexOutOfBoundsException("Stack is empty") + } + return stack.get(stack.size - 1) + } +} + +class InterpreterFrame : Frame { + val pool: MutableList = mutableListOf() + + override fun addVar(state: State) { + pool.add(state) + } + + override fun getVar(name: String): State { + return pool.firstOrNull { it.getName() == name } + ?: throw NoSuchElementException("Frame pool doesn't contains variable with name $name") + } +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt new file mode 100644 index 00000000000..aaa753169ab --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common.interpreter.stack + +import org.jetbrains.kotlin.ir.expressions.IrConst + +interface State { + fun getState(): List + fun getName(): String +} + +class Primitive(public val varName: String, public val value: IrConst) : State { + override fun getState(): List { + return listOf(this) + } + + override fun getName(): String { + return varName + } +} +class Complex(public val objName: String, public val values: List) : State { + override fun getState(): List { + return values + } + + override fun getName(): String { + return objName + } +} \ No newline at end of file