github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/core/vm/stack.go (about) 1 package vm 2 3 import ( 4 "fmt" 5 "math/big" 6 ) 7 8 // stack is an object for basic stack operations. Items popped to the stack are 9 // expected to be changed and modified. stack does not take care of adding newly 10 // initialised objects. 11 type Stack struct { 12 data []*big.Int 13 } 14 15 func newstack() *Stack { 16 return &Stack{data: make([]*big.Int, 0, 1024)} 17 } 18 19 func (st *Stack) Data() []*big.Int { 20 return st.data 21 } 22 23 func (st *Stack) push(d *big.Int) { 24 // NOTE push limit (1024) is checked in baseCheck 25 //stackItem := new(big.Int).Set(d) 26 //st.data = append(st.data, stackItem) 27 st.data = append(st.data, d) 28 } 29 func (st *Stack) pushN(ds ...*big.Int) { 30 st.data = append(st.data, ds...) 31 } 32 33 func (st *Stack) pop() (ret *big.Int) { 34 ret = st.data[len(st.data)-1] 35 st.data = st.data[:len(st.data)-1] 36 return 37 } 38 39 func (st *Stack) len() int { 40 return len(st.data) 41 } 42 43 func (st *Stack) swap(n int) { 44 st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] 45 } 46 47 func (st *Stack) dup(pool *intPool, n int) { 48 st.push(pool.get().Set(st.data[st.len()-n])) 49 } 50 51 func (st *Stack) peek() *big.Int { 52 return st.data[st.len()-1] 53 } 54 55 // Back returns the n'th item in stack 56 func (st *Stack) Back(n int) *big.Int { 57 return st.data[st.len()-n-1] 58 } 59 60 func (st *Stack) require(n int) error { 61 if st.len() < n { 62 return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) 63 } 64 return nil 65 } 66 67 func (st *Stack) Print() { 68 fmt.Println("### stack ###") 69 if len(st.data) > 0 { 70 for i, val := range st.data { 71 fmt.Printf("%-3d %v\n", i, val) 72 } 73 } else { 74 fmt.Println("-- empty --") 75 } 76 fmt.Println("#############") 77 }