aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain/vm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-03-22 01:22:47 +0800
committerobscuren <geffobscura@gmail.com>2014-03-22 01:22:47 +0800
commit01c1bce9c5dfa2b2bcdf934afec3f206823f895f (patch)
tree03c6e06ced15c61e2997b3d7d42fa11b2426d7c5 /ethchain/vm.go
parent9a9e252cabdc6283d7f4e523860f0e4addf62152 (diff)
downloaddexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar.gz
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar.bz2
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar.lz
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar.xz
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.tar.zst
dexon-01c1bce9c5dfa2b2bcdf934afec3f206823f895f.zip
Removed regular ints from the virtual machine and closures
Diffstat (limited to 'ethchain/vm.go')
-rw-r--r--ethchain/vm.go21
1 files changed, 15 insertions, 6 deletions
diff --git a/ethchain/vm.go b/ethchain/vm.go
index 8b5bb93c0..bc3a9edaf 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -49,7 +49,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
// New stack (should this be shared?)
stack := NewStack()
// Instruction pointer
- pc := int64(0)
+ pc := big.NewInt(0)
// Current step count
step := 0
// The base for all big integer arithmetic
@@ -226,7 +226,8 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
// 0x50 range
case oPUSH: // Push PC+1 on to the stack
- pc++
+ pc.Add(pc, ethutil.Big1)
+
val := closure.GetMem(pc).BigInt()
stack.Push(val)
case oPOP:
@@ -250,14 +251,22 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(base, 256))
case oSLOAD:
loc := stack.Pop()
- val := closure.GetMem(loc.Int64())
+ val := closure.GetMem(loc)
stack.Push(val.BigInt())
case oSSTORE:
+ val, loc := stack.Popn()
+ closure.SetMem(loc, ethutil.NewValue(val))
case oJUMP:
+ pc = stack.Pop()
case oJUMPI:
+ pos, cond := stack.Popn()
+ if cond.Cmp(big.NewInt(0)) > 0 {
+ pc = pos
+ }
case oPC:
+ stack.Push(pc)
case oMSIZE:
-
+ stack.Push(big.NewInt(int64(mem.Len())))
// 0x60 range
case oCALL:
// Pop return size and offset
@@ -304,7 +313,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
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)
dataItems := make([]string, int(length.Uint64()))
for i := from.Int64(); i < length.Int64(); i++ {
- dataItems[j] = contract.GetMem(j).Str()
+ dataItems[j] = contract.GetMem(big.NewInt(j)).Str()
j++
}