diff options
author | obscuren <geffobscura@gmail.com> | 2015-03-23 23:59:09 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-03-23 23:59:09 +0800 |
commit | 0330077d76b48934ab024a309000f83c78047d8a (patch) | |
tree | 2a3ffbcd5bd941b30ed28d0eb5c30553a25324e0 /core/vm/stack.go | |
parent | d7eaa97a297151637af090ecb05bbd6d260d90b8 (diff) | |
download | go-tangerine-0330077d76b48934ab024a309000f83c78047d8a.tar.gz go-tangerine-0330077d76b48934ab024a309000f83c78047d8a.tar.zst go-tangerine-0330077d76b48934ab024a309000f83c78047d8a.zip |
moved state and vm to core
Diffstat (limited to 'core/vm/stack.go')
-rw-r--r-- | core/vm/stack.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/core/vm/stack.go b/core/vm/stack.go new file mode 100644 index 000000000..c5c2774db --- /dev/null +++ b/core/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("#############") +} |