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