diff options
author | obscuren <geffobscura@gmail.com> | 2014-03-22 01:22:47 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-03-22 01:22:47 +0800 |
commit | 01c1bce9c5dfa2b2bcdf934afec3f206823f895f (patch) | |
tree | 03c6e06ced15c61e2997b3d7d42fa11b2426d7c5 /ethchain/vm.go | |
parent | 9a9e252cabdc6283d7f4e523860f0e4addf62152 (diff) | |
download | dexon-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.go | 21 |
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++ } |