Moved 0 check to state object for now

poc8
obscuren 11 years ago
parent 0251fae5cc
commit 7fb5e993e3
  1. 7
      ethchain/state_object.go
  2. 26
      ethchain/vm.go

@ -90,6 +90,13 @@ func (c *StateObject) SetAddr(addr []byte, value interface{}) {
func (c *StateObject) SetStorage(num *big.Int, val *ethutil.Value) { func (c *StateObject) SetStorage(num *big.Int, val *ethutil.Value) {
addr := ethutil.BigToBytes(num, 256) addr := ethutil.BigToBytes(num, 256)
// FIXME This should be handled in the Trie it self
if val.BigInt().Cmp(ethutil.Big0) == 0 {
c.state.trie.Delete(string(addr))
return
}
//fmt.Printf("sstore %x => %v\n", addr, val) //fmt.Printf("sstore %x => %v\n", addr, val)
c.SetAddr(addr, val) c.SetAddr(addr, val)
} }

@ -325,21 +325,21 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
stack.Push(base) stack.Push(base)
case LT: case LT:
require(2) require(2)
y, x := stack.Popn() x, y := stack.Popn()
vm.Printf(" %v < %v", x, y) vm.Printf(" %v < %v", y, x)
// x < y // x < y
if x.Cmp(y) < 0 { if y.Cmp(x) < 0 {
stack.Push(ethutil.BigTrue) stack.Push(ethutil.BigTrue)
} else { } else {
stack.Push(ethutil.BigFalse) stack.Push(ethutil.BigFalse)
} }
case GT: case GT:
require(2) require(2)
y, x := stack.Popn() x, y := stack.Popn()
vm.Printf(" %v > %v", x, y) vm.Printf(" %v > %v", y, x)
// x > y // x > y
if x.Cmp(y) > 0 { if y.Cmp(x) > 0 {
stack.Push(ethutil.BigTrue) stack.Push(ethutil.BigTrue)
} else { } else {
stack.Push(ethutil.BigFalse) stack.Push(ethutil.BigFalse)
@ -520,7 +520,10 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
case MLOAD: case MLOAD:
require(1) require(1)
offset := stack.Pop() offset := stack.Pop()
stack.Push(ethutil.BigD(mem.Get(offset.Int64(), 32))) val := ethutil.BigD(mem.Get(offset.Int64(), 32))
stack.Push(val)
vm.Printf(" => 0x%x", val.Bytes())
case MSTORE: // Store the value at stack top-1 in to memory at location stack top case MSTORE: // Store the value at stack top-1 in to memory at location stack top
require(2) require(2)
// Pop value of the stack // Pop value of the stack
@ -541,15 +544,14 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
val := closure.GetMem(loc) val := closure.GetMem(loc)
stack.Push(val.BigInt()) stack.Push(val.BigInt())
vm.Printf(" {} 0x%x", val) vm.Printf(" {0x%x} 0x%x", loc.Bytes(), val)
case SSTORE: case SSTORE:
require(2) require(2)
val, loc := stack.Popn() val, loc := stack.Popn()
// FIXME This should be handled in the Trie it self //if val.Cmp(big.NewInt(0)) != 0 {
if val.Cmp(big.NewInt(0)) != 0 { closure.SetStorage(loc, ethutil.NewValue(val))
closure.SetStorage(loc, ethutil.NewValue(val)) //}
}
// Add the change to manifest // Add the change to manifest
vm.state.manifest.AddStorageChange(closure.Object(), loc.Bytes(), val) vm.state.manifest.AddStorageChange(closure.Object(), loc.Bytes(), val)

Loading…
Cancel
Save