diff options
Diffstat (limited to 'ethvm/vm.go')
-rw-r--r-- | ethvm/vm.go | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/ethvm/vm.go b/ethvm/vm.go index ddad0d366..29dc2515c 100644 --- a/ethvm/vm.go +++ b/ethvm/vm.go @@ -439,6 +439,36 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { } else { stack.Push(ethutil.BigFalse) } + case ADDMOD: + require(3) + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Add(x, y) + base.Mod(base, z) + + ensure256(base) + + self.Printf(" = %v", base) + + stack.Push(base) + case MULMOD: + require(3) + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Mul(x, y) + base.Mod(base, z) + + ensure256(base) + + self.Printf(" = %v", base) + + stack.Push(base) // 0x20 range case SHA3: @@ -600,16 +630,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() |