Added new insruction methods
This commit is contained in:
parent
90bb512f42
commit
c0a030ef0a
|
@ -17,6 +17,7 @@ type ClosureBody interface {
|
||||||
ethutil.RlpEncodable
|
ethutil.RlpEncodable
|
||||||
GetMem(*big.Int) *ethutil.Value
|
GetMem(*big.Int) *ethutil.Value
|
||||||
SetMem(*big.Int, *ethutil.Value)
|
SetMem(*big.Int, *ethutil.Value)
|
||||||
|
GetInstr(*big.Int) *ethutil.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basic inline closure object which implement the 'closure' interface
|
// Basic inline closure object which implement the 'closure' interface
|
||||||
|
@ -46,6 +47,10 @@ func (c *Closure) GetMem(x *big.Int) *ethutil.Value {
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Closure) GetInstr(x *big.Int) *ethutil.Value {
|
||||||
|
return c.object.GetInstr(x)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Closure) SetMem(x *big.Int, val *ethutil.Value) {
|
func (c *Closure) SetMem(x *big.Int, val *ethutil.Value) {
|
||||||
c.object.SetMem(x, val)
|
c.object.SetMem(x, val)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ type Contract struct {
|
||||||
//state *ethutil.Trie
|
//state *ethutil.Trie
|
||||||
state *State
|
state *State
|
||||||
address []byte
|
address []byte
|
||||||
|
script []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewContract(address []byte, Amount *big.Int, root []byte) *Contract {
|
func NewContract(address []byte, Amount *big.Int, root []byte) *Contract {
|
||||||
|
@ -45,6 +46,14 @@ func (c *Contract) GetMem(num *big.Int) *ethutil.Value {
|
||||||
return c.Addr(nb)
|
return c.Addr(nb)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Contract) GetInstr(pc *big.Int) *ethutil.Value {
|
||||||
|
if int64(len(c.script)-1) < pc.Int64() {
|
||||||
|
return ethutil.NewValue(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ethutil.NewValueFromBytes([]byte{c.script[pc.Int64()]})
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Contract) SetMem(num *big.Int, val *ethutil.Value) {
|
func (c *Contract) SetMem(num *big.Int, val *ethutil.Value) {
|
||||||
addr := ethutil.BigToBytes(num, 256)
|
addr := ethutil.BigToBytes(num, 256)
|
||||||
c.state.trie.Update(string(addr), string(val.Encode()))
|
c.state.trie.Update(string(addr), string(val.Encode()))
|
||||||
|
|
|
@ -72,7 +72,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
||||||
for {
|
for {
|
||||||
step++
|
step++
|
||||||
// Get the memory location of pc
|
// Get the memory location of pc
|
||||||
val := closure.GetMem(pc)
|
val := closure.GetInstr(pc)
|
||||||
// Get the opcode (it must be an opcode!)
|
// Get the opcode (it must be an opcode!)
|
||||||
op := OpCode(val.Uint())
|
op := OpCode(val.Uint())
|
||||||
if ethutil.Config.Debug {
|
if ethutil.Config.Debug {
|
||||||
|
@ -233,13 +233,37 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
||||||
|
|
||||||
// 0x10 range
|
// 0x10 range
|
||||||
case oAND:
|
case oAND:
|
||||||
|
x, y := stack.Popn()
|
||||||
|
if (x.Cmp(ethutil.BigTrue) >= 0) && (y.Cmp(ethutil.BigTrue) >= 0) {
|
||||||
|
stack.Push(ethutil.BigTrue)
|
||||||
|
} else {
|
||||||
|
stack.Push(ethutil.BigFalse)
|
||||||
|
}
|
||||||
|
|
||||||
case oOR:
|
case oOR:
|
||||||
|
x, y := stack.Popn()
|
||||||
|
if (x.Cmp(ethutil.BigInt0) >= 0) || (y.Cmp(ethutil.BigInt0) >= 0) {
|
||||||
|
stack.Push(ethutil.BigTrue)
|
||||||
|
} else {
|
||||||
|
stack.Push(ethutil.BigFalse)
|
||||||
|
}
|
||||||
case oXOR:
|
case oXOR:
|
||||||
|
x, y := stack.Popn()
|
||||||
|
stack.Push(base.Xor(x, y))
|
||||||
case oBYTE:
|
case oBYTE:
|
||||||
|
val, th := stack.Popn()
|
||||||
|
if th.Cmp(big.NewInt(32)) < 0 {
|
||||||
|
stack.Push(big.NewInt(int64(len(val.Bytes())-1) - th.Int64()))
|
||||||
|
} else {
|
||||||
|
stack.Push(ethutil.BigFalse)
|
||||||
|
}
|
||||||
|
|
||||||
// 0x20 range
|
// 0x20 range
|
||||||
case oSHA3:
|
case oSHA3:
|
||||||
|
size, offset := stack.Popn()
|
||||||
|
data := mem.Get(offset.Int64(), size.Int64())
|
||||||
|
|
||||||
|
stack.Push(ethutil.BigD(data))
|
||||||
// 0x30 range
|
// 0x30 range
|
||||||
case oADDRESS:
|
case oADDRESS:
|
||||||
stack.Push(ethutil.BigD(closure.Object().Address()))
|
stack.Push(ethutil.BigD(closure.Object().Address()))
|
||||||
|
|
Loading…
Reference in New Issue