diff options
Diffstat (limited to 'vm/stack.go')
-rw-r--r-- | vm/stack.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/vm/stack.go b/vm/stack.go new file mode 100644 index 000000000..c5c2774db --- /dev/null +++ b/vm/stack.go @@ -0,0 +1,65 @@ +package vm + +import ( + "fmt" + "math/big" +) + +func newStack() *stack { + return &stack{} +} + +type stack struct { + data []*big.Int + ptr int +} + +func (st *stack) push(d *big.Int) { + stackItem := new(big.Int).Set(d) + if len(st.data) > st.ptr { + st.data[st.ptr] = stackItem + } else { + st.data = append(st.data, stackItem) + } + st.ptr++ +} + +func (st *stack) pop() (ret *big.Int) { + st.ptr-- + ret = st.data[st.ptr] + return +} + +func (st *stack) len() int { + return st.ptr +} + +func (st *stack) swap(n int) { + st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] +} + +func (st *stack) dup(n int) { + st.push(st.data[st.len()-n]) +} + +func (st *stack) peek() *big.Int { + return st.data[st.len()-1] +} + +func (st *stack) require(n int) { + if st.len() < n { + panic(fmt.Sprintf("stack underflow (%d <=> %d)", len(st.data), n)) + } +} + +func (st *stack) Print() { + fmt.Println("### stack ###") + if len(st.data) > 0 { + for i, val := range st.data { + fmt.Printf("%-3d %v\n", i, val) + } + } else { + fmt.Println("-- empty --") + } + fmt.Println("#############") +} |