Create simple stack model for interpreter

This commit is contained in:
Ivan Kylchik
2019-11-04 19:49:32 +03:00
parent f6373a647e
commit a582d88cf4
3 changed files with 92 additions and 0 deletions
@@ -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
}
@@ -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<Frame> = 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<State> = 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")
}
}
@@ -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<State>
fun getName(): String
}
class Primitive<T>(public val varName: String, public val value: IrConst<T>) : State {
override fun getState(): List<State> {
return listOf(this)
}
override fun getName(): String {
return varName
}
}
class Complex(public val objName: String, public val values: List<State>) : State {
override fun getState(): List<State> {
return values
}
override fun getName(): String {
return objName
}
}