github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/vm/stack.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:36</date> 10 //</624450083387084800> 11 12 13 package vm 14 15 import ( 16 "fmt" 17 "math/big" 18 ) 19 20 //堆栈是用于基本堆栈操作的对象。弹出到堆栈的项是 21 //需要更改和修改。堆栈不负责新添加 22 //初始化的对象。 23 type Stack struct { 24 data []*big.Int 25 } 26 27 func newstack() *Stack { 28 return &Stack{data: make([]*big.Int, 0, 1024)} 29 } 30 31 //data返回基础的big.int数组。 32 func (st *Stack) Data() []*big.Int { 33 return st.data 34 } 35 36 func (st *Stack) push(d *big.Int) { 37 //注:在basecheck中检查推送限制(1024) 38 //stackitem:=新建(big.int).set(d) 39 //st.data=附加(st.data,stackitem) 40 st.data = append(st.data, d) 41 } 42 func (st *Stack) pushN(ds ...*big.Int) { 43 st.data = append(st.data, ds...) 44 } 45 46 func (st *Stack) pop() (ret *big.Int) { 47 ret = st.data[len(st.data)-1] 48 st.data = st.data[:len(st.data)-1] 49 return 50 } 51 52 func (st *Stack) len() int { 53 return len(st.data) 54 } 55 56 func (st *Stack) swap(n int) { 57 st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] 58 } 59 60 func (st *Stack) dup(pool *intPool, n int) { 61 st.push(pool.get().Set(st.data[st.len()-n])) 62 } 63 64 func (st *Stack) peek() *big.Int { 65 return st.data[st.len()-1] 66 } 67 68 //返回堆栈中的第n项 69 func (st *Stack) Back(n int) *big.Int { 70 return st.data[st.len()-n-1] 71 } 72 73 func (st *Stack) require(n int) error { 74 if st.len() < n { 75 return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) 76 } 77 return nil 78 } 79 80 //打印转储堆栈的内容 81 func (st *Stack) Print() { 82 fmt.Println("### stack ###") 83 if len(st.data) > 0 { 84 for i, val := range st.data { 85 fmt.Printf("%-3d %v\n", i, val) 86 } 87 } else { 88 fmt.Println("-- empty --") 89 } 90 fmt.Println("#############") 91 } 92