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