DUP n SWAP n

pull/150/head
obscuren 10 years ago
parent 3def9258be
commit a289a77d5d
  1. 12
      ethvm/stack.go
  2. 34
      ethvm/types.go
  3. 20
      ethvm/vm.go
  4. 2
      peer.go

@ -64,6 +64,18 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) {
return ints[0], ints[1]
}
func (st *Stack) Swapn(n int) (*big.Int, *big.Int) {
st.data[n], st.data[0] = st.data[0], st.data[n]
return st.data[n], st.data[0]
}
func (st *Stack) Dupn(n int) *big.Int {
st.Push(st.data[n])
return st.Peek()
}
func (st *Stack) Push(d *big.Int) {
st.data = append(st.data, new(big.Int).Set(d))
}

@ -105,6 +105,40 @@ const (
PUSH31 = 0x7e
PUSH32 = 0x7f
DUP1 = 0x80
DUP2 = 0x81
DUP3 = 0x82
DUP4 = 0x83
DUP5 = 0x84
DUP6 = 0x85
DUP7 = 0x86
DUP8 = 0x87
DUP9 = 0x88
DUP10 = 0x89
DUP11 = 0x8a
DUP12 = 0x8b
DUP13 = 0x8c
DUP14 = 0x8d
DUP15 = 0x8e
DUP16 = 0x8f
SWAP1 = 0x90
SWAP2 = 0x91
SWAP3 = 0x92
SWAP4 = 0x93
SWAP5 = 0x94
SWAP6 = 0x95
SWAP7 = 0x96
SWAP8 = 0x97
SWAP9 = 0x98
SWAP10 = 0x99
SWAP11 = 0x9a
SWAP12 = 0x9b
SWAP13 = 0x9c
SWAP14 = 0x9d
SWAP15 = 0x9e
SWAP16 = 0x9f
// 0xf0 range - closures
CREATE = 0xf0
CALL = 0xf1

@ -600,16 +600,20 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
case POP:
require(1)
stack.Pop()
case DUP:
require(1)
stack.Push(stack.Peek())
case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
n := int(op - DUP1 + 1)
stack.Dupn(n)
self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
n := int(op - SWAP1 + 1)
x, y := stack.Swapn(n)
self.Printf(" => 0x%x", stack.Peek().Bytes())
self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
case DUP:
// NOP
case SWAP:
require(2)
x, y := stack.Popn()
stack.Push(y)
stack.Push(x)
// NOP
case MLOAD:
require(1)
offset := stack.Pop()

@ -24,7 +24,7 @@ const (
// The size of the output buffer for writing messages
outputBufferSize = 50
// Current protocol version
ProtocolVersion = 27
ProtocolVersion = 28
// Interval for ping/pong message
pingPongTimer = 2 * time.Second
)

Loading…
Cancel
Save