Minor improvements and fixes to the new vm structure

This commit is contained in:
obscuren 2014-07-22 15:57:54 +02:00
parent 1e8b54abfb
commit 490ca410c0
6 changed files with 18 additions and 24 deletions

View File

@ -25,7 +25,7 @@ func Disassemble(script []byte) (asm []string) {
pc.Add(pc, ethutil.Big1) pc.Add(pc, ethutil.Big1)
a := int64(op) - int64(PUSH1) + 1 a := int64(op) - int64(PUSH1) + 1
if int(pc.Int64()+a) > len(script) { if int(pc.Int64()+a) > len(script) {
return nil return
} }
data := script[pc.Int64() : pc.Int64()+a] data := script[pc.Int64() : pc.Int64()+a]
@ -40,5 +40,5 @@ func Disassemble(script []byte) (asm []string) {
pc.Add(pc, ethutil.Big1) pc.Add(pc, ethutil.Big1)
} }
return return asm
} }

View File

@ -563,10 +563,9 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
} }
code := closure.Script[cOff : cOff+l] code := closure.Script[cOff : cOff+l]
//fmt.Println("len:", l, "code off:", cOff, "mem off:", mOff) fmt.Println("len:", l, "code off:", cOff, "mem off:", mOff)
mem.Set(mOff, l, code) mem.Set(mOff, l, code)
//fmt.Println(Code(mem.Get(mOff, l)))
case GASPRICE: case GASPRICE:
stack.Push(closure.Price) stack.Push(closure.Price)
@ -673,6 +672,8 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
stack.Push(pc) stack.Push(pc)
case MSIZE: case MSIZE:
stack.Push(big.NewInt(int64(mem.Len()))) stack.Push(big.NewInt(int64(mem.Len())))
vm.Printf(" => %v", mem.Len()).Endl()
case GAS: case GAS:
stack.Push(closure.Gas) stack.Push(closure.Gas)
// 0x60 range // 0x60 range

View File

@ -11,7 +11,7 @@ import (
type Code []byte type Code []byte
func (self Code) String() string { func (self Code) String() string {
return "" //strings.Join(Disassemble(self), " ") return string(self) //strings.Join(Disassemble(self), " ")
} }
type Storage map[string]*ethutil.Value type Storage map[string]*ethutil.Value

View File

@ -18,7 +18,7 @@ func Disassemble(script []byte) (asm []string) {
// Get the opcode (it must be an opcode!) // Get the opcode (it must be an opcode!)
op := OpCode(val) op := OpCode(val)
asm = append(asm, fmt.Sprintf("%04v: %v", pc, op)) asm = append(asm, fmt.Sprintf("%v", op))
switch op { switch op {
case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
@ -32,7 +32,7 @@ func Disassemble(script []byte) (asm []string) {
if len(data) == 0 { if len(data) == 0 {
data = []byte{0} data = []byte{0}
} }
asm = append(asm, fmt.Sprintf("%04v: 0x%x", pc, data)) asm = append(asm, fmt.Sprintf("0x%x", data))
pc.Add(pc, big.NewInt(a-1)) pc.Add(pc, big.NewInt(a-1))
} }

View File

@ -48,7 +48,6 @@ type Environment interface {
Coinbase() []byte Coinbase() []byte
Time() int64 Time() int64
Difficulty() *big.Int Difficulty() *big.Int
Data() []string
Value() *big.Int Value() *big.Int
} }
@ -420,7 +419,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
require(2) require(2)
val, th := stack.Popn() val, th := stack.Popn()
if th.Cmp(big.NewInt(32)) < 0 && th.Cmp(big.NewInt(int64(len(val.Bytes())))) < 0 { if th.Cmp(big.NewInt(32)) < 0 && th.Cmp(big.NewInt(int64(len(val.Bytes())))) < 0 {
byt := big.NewInt(int64(val.Bytes()[th.Int64()])) byt := big.NewInt(int64(ethutil.LeftPadBytes(val.Bytes(), 32)[th.Int64()]))
stack.Push(byt) stack.Push(byt)
self.Printf(" => 0x%x", byt.Bytes()) self.Printf(" => 0x%x", byt.Bytes())
@ -530,10 +529,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
} }
code := closure.Code[cOff : cOff+l] code := closure.Code[cOff : cOff+l]
//fmt.Println("len:", l, "code off:", cOff, "mem off:", mOff)
mem.Set(mOff, l, code) mem.Set(mOff, l, code)
//fmt.Println(Code(mem.Get(mOff, l)))
case GASPRICE: case GASPRICE:
stack.Push(closure.Price) stack.Push(closure.Price)
@ -638,7 +635,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// Add the change to manifest // Add the change to manifest
self.env.State().Manifest().AddStorageChange(closure.Object(), loc.Bytes(), val) self.env.State().Manifest().AddStorageChange(closure.Object(), loc.Bytes(), val)
self.Printf(" {0x%x : 0x%x}", loc, val) self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
case JUMP: case JUMP:
require(1) require(1)
pc = stack.Pop() pc = stack.Pop()
@ -802,7 +799,6 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
return closure.Return(nil), nil return closure.Return(nil), nil
default: default:
vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op) vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
fmt.Println(ethstate.Code(closure.Code))
return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op) return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op)
} }

View File

@ -15,17 +15,14 @@ import (
type TestEnv struct { type TestEnv struct {
} }
func (self TestEnv) GetObject() Object { return nil } func (self TestEnv) Origin() []byte { return nil }
func (self TestEnv) Origin() []byte { return nil } func (self TestEnv) BlockNumber() *big.Int { return nil }
func (self TestEnv) BlockNumber() *big.Int { return nil } func (self TestEnv) PrevHash() []byte { return nil }
func (self TestEnv) PrevHash() []byte { return nil } func (self TestEnv) Coinbase() []byte { return nil }
func (self TestEnv) Coinbase() []byte { return nil } func (self TestEnv) Time() int64 { return 0 }
func (self TestEnv) Time() int64 { return 0 } func (self TestEnv) Difficulty() *big.Int { return nil }
func (self TestEnv) Difficulty() *big.Int { return nil } func (self TestEnv) Value() *big.Int { return nil }
func (self TestEnv) Data() []string { return nil } func (self TestEnv) State() *ethstate.State { return nil }
func (self TestEnv) Value() *big.Int { return nil }
func (self TestEnv) GetBalance(addr []byte) *big.Int { return nil }
func (self TestEnv) State() *ethstate.State { return nil }
func TestVm(t *testing.T) { func TestVm(t *testing.T) {
ethlog.AddLogSystem(ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4))) ethlog.AddLogSystem(ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4)))