forked from cerc-io/plugeth
Removed regular ints from the virtual machine and closures
This commit is contained in:
parent
9a9e252cab
commit
01c1bce9c5
@ -15,7 +15,8 @@ type Callee interface {
|
|||||||
type ClosureBody interface {
|
type ClosureBody interface {
|
||||||
Callee
|
Callee
|
||||||
ethutil.RlpEncodable
|
ethutil.RlpEncodable
|
||||||
GetMem(int64) *ethutil.Value
|
GetMem(*big.Int) *ethutil.Value
|
||||||
|
SetMem(*big.Int, *ethutil.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basic inline closure object which implement the 'closure' interface
|
// Basic inline closure object which implement the 'closure' interface
|
||||||
@ -36,7 +37,7 @@ func NewClosure(callee Callee, object ClosureBody, state *State, gas, val *big.I
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retuns the x element in data slice
|
// Retuns the x element in data slice
|
||||||
func (c *Closure) GetMem(x int64) *ethutil.Value {
|
func (c *Closure) GetMem(x *big.Int) *ethutil.Value {
|
||||||
m := c.object.GetMem(x)
|
m := c.object.GetMem(x)
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return ethutil.EmptyValue()
|
return ethutil.EmptyValue()
|
||||||
@ -45,6 +46,10 @@ func (c *Closure) GetMem(x int64) *ethutil.Value {
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Closure) SetMem(x *big.Int, val *ethutil.Value) {
|
||||||
|
c.object.SetMem(x, val)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Closure) Address() []byte {
|
func (c *Closure) Address() []byte {
|
||||||
return c.object.Address()
|
return c.object.Address()
|
||||||
}
|
}
|
||||||
|
@ -39,12 +39,17 @@ func (c *Contract) State() *State {
|
|||||||
return c.state
|
return c.state
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Contract) GetMem(num int64) *ethutil.Value {
|
func (c *Contract) GetMem(num *big.Int) *ethutil.Value {
|
||||||
nb := ethutil.BigToBytes(big.NewInt(num), 256)
|
nb := ethutil.BigToBytes(num, 256)
|
||||||
|
|
||||||
return c.Addr(nb)
|
return c.Addr(nb)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Contract) SetMem(num *big.Int, val *ethutil.Value) {
|
||||||
|
addr := ethutil.BigToBytes(num, 256)
|
||||||
|
c.state.trie.Update(string(addr), string(val.Encode()))
|
||||||
|
}
|
||||||
|
|
||||||
// Return the gas back to the origin. Used by the Virtual machine or Closures
|
// Return the gas back to the origin. Used by the Virtual machine or Closures
|
||||||
func (c *Contract) ReturnGas(val *big.Int, state *State) {
|
func (c *Contract) ReturnGas(val *big.Int, state *State) {
|
||||||
c.Amount.Add(c.Amount, val)
|
c.Amount.Add(c.Amount, val)
|
||||||
|
@ -237,6 +237,10 @@ func (m *Memory) Get(offset, size int64) []byte {
|
|||||||
return m.store[offset : offset+size]
|
return m.store[offset : offset+size]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Memory) Len() int {
|
||||||
|
return len(m.store)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Memory) Print() {
|
func (m *Memory) Print() {
|
||||||
fmt.Println("### MEM ###")
|
fmt.Println("### MEM ###")
|
||||||
if len(m.store) > 0 {
|
if len(m.store) > 0 {
|
||||||
|
@ -49,7 +49,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
// New stack (should this be shared?)
|
// New stack (should this be shared?)
|
||||||
stack := NewStack()
|
stack := NewStack()
|
||||||
// Instruction pointer
|
// Instruction pointer
|
||||||
pc := int64(0)
|
pc := big.NewInt(0)
|
||||||
// Current step count
|
// Current step count
|
||||||
step := 0
|
step := 0
|
||||||
// The base for all big integer arithmetic
|
// The base for all big integer arithmetic
|
||||||
@ -226,7 +226,8 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
|
|
||||||
// 0x50 range
|
// 0x50 range
|
||||||
case oPUSH: // Push PC+1 on to the stack
|
case oPUSH: // Push PC+1 on to the stack
|
||||||
pc++
|
pc.Add(pc, ethutil.Big1)
|
||||||
|
|
||||||
val := closure.GetMem(pc).BigInt()
|
val := closure.GetMem(pc).BigInt()
|
||||||
stack.Push(val)
|
stack.Push(val)
|
||||||
case oPOP:
|
case oPOP:
|
||||||
@ -250,14 +251,22 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(base, 256))
|
mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(base, 256))
|
||||||
case oSLOAD:
|
case oSLOAD:
|
||||||
loc := stack.Pop()
|
loc := stack.Pop()
|
||||||
val := closure.GetMem(loc.Int64())
|
val := closure.GetMem(loc)
|
||||||
stack.Push(val.BigInt())
|
stack.Push(val.BigInt())
|
||||||
case oSSTORE:
|
case oSSTORE:
|
||||||
|
val, loc := stack.Popn()
|
||||||
|
closure.SetMem(loc, ethutil.NewValue(val))
|
||||||
case oJUMP:
|
case oJUMP:
|
||||||
|
pc = stack.Pop()
|
||||||
case oJUMPI:
|
case oJUMPI:
|
||||||
|
pos, cond := stack.Popn()
|
||||||
|
if cond.Cmp(big.NewInt(0)) > 0 {
|
||||||
|
pc = pos
|
||||||
|
}
|
||||||
case oPC:
|
case oPC:
|
||||||
|
stack.Push(pc)
|
||||||
case oMSIZE:
|
case oMSIZE:
|
||||||
|
stack.Push(big.NewInt(int64(mem.Len())))
|
||||||
// 0x60 range
|
// 0x60 range
|
||||||
case oCALL:
|
case oCALL:
|
||||||
// Pop return size and offset
|
// Pop return size and offset
|
||||||
@ -304,7 +313,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
ethutil.Config.Log.Debugln("Invalid opcode", op)
|
ethutil.Config.Log.Debugln("Invalid opcode", op)
|
||||||
}
|
}
|
||||||
|
|
||||||
pc++
|
pc.Add(pc, ethutil.Big1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,7 +691,7 @@ func makeInlineTx(addr []byte, value, from, length *big.Int, contract *Contract,
|
|||||||
j := int64(0)
|
j := int64(0)
|
||||||
dataItems := make([]string, int(length.Uint64()))
|
dataItems := make([]string, int(length.Uint64()))
|
||||||
for i := from.Int64(); i < length.Int64(); i++ {
|
for i := from.Int64(); i < length.Int64(); i++ {
|
||||||
dataItems[j] = contract.GetMem(j).Str()
|
dataItems[j] = contract.GetMem(big.NewInt(j)).Str()
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,3 +33,9 @@ func CurrencyToString(num *big.Int) string {
|
|||||||
|
|
||||||
return fmt.Sprintf("%v Wei", num)
|
return fmt.Sprintf("%v Wei", num)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
Big1 = big.NewInt(1)
|
||||||
|
Big0 = big.NewInt(0)
|
||||||
|
Big256 = big.NewInt(0xff)
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user