about summary refs log tree commit diff
path: root/pkg/lang/vm/stack.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/stack.go')
-rw-r--r--pkg/lang/vm/stack.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/pkg/lang/vm/stack.go b/pkg/lang/vm/stack.go
new file mode 100644
index 0000000..433c0b7
--- /dev/null
+++ b/pkg/lang/vm/stack.go
@@ -0,0 +1,37 @@
+package vm
+
+import "jinx/pkg/lang/vm/value"
+
+type CallStack []*LocalStack
+
+func (cs *CallStack) Push() {
+	*cs = append(*cs, &LocalStack{})
+}
+
+func (cs *CallStack) Pop() {
+	*cs = (*cs)[:len(*cs)-1]
+}
+
+func (cs *CallStack) Top() *LocalStack {
+	return (*cs)[len(*cs)-1]
+}
+
+func (cs *CallStack) Prev() *LocalStack {
+	return (*cs)[len(*cs)-2]
+}
+
+type LocalStack []value.Value
+
+func (ls *LocalStack) Push(v value.Value) {
+	*ls = append(*ls, v)
+}
+
+func (ls *LocalStack) Pop() value.Value {
+	v := (*ls)[len(*ls)-1]
+	*ls = (*ls)[:len(*ls)-1]
+	return v
+}
+
+func (ls *LocalStack) At(at int) value.Value {
+	return (*ls)[at]
+}