diff options
author | obscuren <geffobscura@gmail.com> | 2014-08-08 19:04:18 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-08-08 19:04:18 +0800 |
commit | 3fc24013ef200f20eaa9deed6647270924126976 (patch) | |
tree | 6d3e02804cf555680604558aca98a473faa58400 /ethvm/vm.go | |
parent | d6b0ab3028ba8d7a565d35ab7b8054ee921ba683 (diff) | |
download | go-tangerine-3fc24013ef200f20eaa9deed6647270924126976.tar.gz go-tangerine-3fc24013ef200f20eaa9deed6647270924126976.tar.zst go-tangerine-3fc24013ef200f20eaa9deed6647270924126976.zip |
Fixed issue with overflowing 256 bit integers
Diffstat (limited to 'ethvm/vm.go')
-rw-r--r-- | ethvm/vm.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/ethvm/vm.go b/ethvm/vm.go index e469fa826..995fd897b 100644 --- a/ethvm/vm.go +++ b/ethvm/vm.go @@ -245,6 +245,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Add(y, x) + ensure256(base) + self.Printf(" = %v", base) // Pop result back on the stack stack.Push(base) @@ -255,6 +257,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Sub(y, x) + ensure256(base) + self.Printf(" = %v", base) // Pop result back on the stack stack.Push(base) @@ -265,6 +269,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Mul(y, x) + ensure256(base) + self.Printf(" = %v", base) // Pop result back on the stack stack.Push(base) @@ -277,6 +283,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Div(y, x) } + ensure256(base) + self.Printf(" = %v", base) // Pop result back on the stack stack.Push(base) @@ -289,6 +297,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Div(y, x) } + ensure256(base) + self.Printf(" = %v", base) // Pop result back on the stack stack.Push(base) @@ -300,6 +310,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Mod(y, x) + ensure256(base) + self.Printf(" = %v", base) stack.Push(base) case SMOD: @@ -310,6 +322,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Mod(y, x) + ensure256(base) + self.Printf(" = %v", base) stack.Push(base) @@ -321,6 +335,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { base.Exp(y, x, Pow256) + ensure256(base) + self.Printf(" = %v", base) stack.Push(base) @@ -838,3 +854,18 @@ func (self *Vm) Endl() *Vm { return self } + +func ensure256(x *big.Int) { + maxInt, _ := new(big.Int).SetString("115792089237316195423570985008687907853269984665640564039457584007913129639935", 0) + if x.Cmp(maxInt) >= 0 { + x.SetInt64(0) + + return + } + + // Could have done this with an OR, but big ints are costly. + + if x.Cmp(new(big.Int)) < 0 { + x.SetInt64(0) + } +} |