github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/vm/stack.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2014 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package vm 26 27 import ( 28 "fmt" 29 "math/big" 30 ) 31 32 //堆栈是用于基本堆栈操作的对象。弹出到堆栈的项是 33 //需要更改和修改。堆栈不负责新添加 34 //初始化的对象。 35 type Stack struct { 36 data []*big.Int 37 } 38 39 func newstack() *Stack { 40 return &Stack{data: make([]*big.Int, 0, 1024)} 41 } 42 43 //data返回基础的big.int数组。 44 func (st *Stack) Data() []*big.Int { 45 return st.data 46 } 47 48 func (st *Stack) push(d *big.Int) { 49 //注:在basecheck中检查推送限制(1024) 50 //stackitem:=新建(big.int).set(d) 51 //st.data=附加(st.data,stackitem) 52 st.data = append(st.data, d) 53 } 54 func (st *Stack) pushN(ds ...*big.Int) { 55 st.data = append(st.data, ds...) 56 } 57 58 func (st *Stack) pop() (ret *big.Int) { 59 ret = st.data[len(st.data)-1] 60 st.data = st.data[:len(st.data)-1] 61 return 62 } 63 64 func (st *Stack) len() int { 65 return len(st.data) 66 } 67 68 func (st *Stack) swap(n int) { 69 st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] 70 } 71 72 func (st *Stack) dup(pool *intPool, n int) { 73 st.push(pool.get().Set(st.data[st.len()-n])) 74 } 75 76 func (st *Stack) peek() *big.Int { 77 return st.data[st.len()-1] 78 } 79 80 //返回堆栈中的第n项 81 func (st *Stack) Back(n int) *big.Int { 82 return st.data[st.len()-n-1] 83 } 84 85 func (st *Stack) require(n int) error { 86 if st.len() < n { 87 return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) 88 } 89 return nil 90 } 91 92 //打印转储堆栈的内容 93 func (st *Stack) Print() { 94 fmt.Println("### stack ###") 95 if len(st.data) > 0 { 96 for i, val := range st.data { 97 fmt.Printf("%-3d %v\n", i, val) 98 } 99 } else { 100 fmt.Println("-- empty --") 101 } 102 fmt.Println("#############") 103 }