diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index 3da37cd3a..da5a41251 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -20,9 +20,21 @@ type Account struct { } type Log struct { - Address string - Data string - Topics []string + AddressF string `json:"address"` + DataF string `json:"data"` + TopicsF []string `json:"topics"` + BloomF string `json:"bloom"` +} + +func (self Log) Address() []byte { return ethutil.Hex2Bytes(self.AddressF) } +func (self Log) Data() []byte { return ethutil.Hex2Bytes(self.DataF) } +func (self Log) RlpData() interface{} { return nil } +func (self Log) Topics() [][]byte { + t := make([][]byte, len(self.TopicsF)) + for i, topic := range self.TopicsF { + t[i] = ethutil.Hex2Bytes(topic) + } + return t } func StateObjectFromAccount(addr string, account Account) *state.StateObject { @@ -53,7 +65,7 @@ type VmTest struct { Env Env Exec map[string]string Transaction map[string]string - Logs map[string]Log + Logs []Log Gas string Out string Post map[string]Account @@ -128,10 +140,10 @@ func RunVmTest(p string, t *testing.T) { } if len(test.Logs) > 0 { - genBloom := ethutil.LeftPadBytes(types.LogsBloom(logs).Bytes(), 64) // Logs within the test itself aren't correct, missing empty fields (32 0s) - for bloom /*logs*/, _ := range test.Logs { - if !bytes.Equal(genBloom, ethutil.Hex2Bytes(bloom)) { + for i, log := range test.Logs { + genBloom := ethutil.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 64) + if !bytes.Equal(genBloom, ethutil.Hex2Bytes(log.BloomF)) { t.Errorf("bloom mismatch") } } diff --git a/vm/stack.go b/vm/stack.go index 98795cc03..6091479cb 100644 --- a/vm/stack.go +++ b/vm/stack.go @@ -111,10 +111,10 @@ func NewMemory() *Memory { return &Memory{nil} } -func (m *Memory) Set(offset, size int64, value []byte) { +func (m *Memory) Set(offset, size uint64, value []byte) { if len(value) > 0 { totSize := offset + size - lenSize := int64(len(m.store) - 1) + lenSize := uint64(len(m.store) - 1) if totSize > lenSize { // Calculate the diff between the sizes diff := totSize - lenSize diff --git a/vm/vm_debug.go b/vm/vm_debug.go index c0a2d6d98..5b7258cc5 100644 --- a/vm/vm_debug.go +++ b/vm/vm_debug.go @@ -98,7 +98,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * } else { nop := OpCode(closure.GetOp(p)) if !(nop == JUMPDEST || destinations[from] != nil) { - panic(fmt.Sprintf("JUMP missed JUMPDEST (%v) %v", nop, p)) + panic(fmt.Sprintf("invalid jump destination (%v) %v", nop, p)) } else if nop == JUMP || nop == JUMPI { panic(fmt.Sprintf("not allowed to JUMP(I) in to JUMP")) } @@ -611,10 +611,10 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * self.Printf(" => %d", l) case CALLDATACOPY: var ( - size = int64(len(callData)) - mOff = stack.Pop().Int64() - cOff = stack.Pop().Int64() - l = stack.Pop().Int64() + size = uint64(len(callData)) + mOff = stack.Pop().Uint64() + cOff = stack.Pop().Uint64() + l = stack.Pop().Uint64() ) if cOff > size { @@ -654,10 +654,10 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * } var ( - size = int64(len(code)) - mOff = stack.Pop().Int64() - cOff = stack.Pop().Int64() - l = stack.Pop().Int64() + size = uint64(len(code)) + mOff = stack.Pop().Uint64() + cOff = stack.Pop().Uint64() + l = stack.Pop().Uint64() ) if cOff > size { @@ -760,7 +760,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * case MSTORE: // Store the value at stack top-1 in to memory at location stack top // Pop value of the stack val, mStart := stack.Popn() - mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(val, 256)) + mem.Set(mStart.Uint64(), 32, ethutil.BigToBytes(val, 256)) self.Printf(" => 0x%x", val) case MSTORE8: @@ -883,7 +883,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * stack.Push(ethutil.BigTrue) msg.Output = ret - mem.Set(retOffset.Int64(), retSize.Int64(), ret) + mem.Set(retOffset.Uint64(), retSize.Uint64(), ret) } self.Printf("resume %x", closure.Address())