forked from cerc-io/plugeth
Fixed issue with overflowing 256 bit integers
This commit is contained in:
parent
d6b0ab3028
commit
3fc24013ef
31
ethvm/vm.go
31
ethvm/vm.go
@ -245,6 +245,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Add(y, x)
|
base.Add(y, x)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
// Pop result back on the stack
|
// Pop result back on the stack
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -255,6 +257,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Sub(y, x)
|
base.Sub(y, x)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
// Pop result back on the stack
|
// Pop result back on the stack
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -265,6 +269,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Mul(y, x)
|
base.Mul(y, x)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
// Pop result back on the stack
|
// Pop result back on the stack
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -277,6 +283,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
base.Div(y, x)
|
base.Div(y, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
// Pop result back on the stack
|
// Pop result back on the stack
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -289,6 +297,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
base.Div(y, x)
|
base.Div(y, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
// Pop result back on the stack
|
// Pop result back on the stack
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -300,6 +310,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Mod(y, x)
|
base.Mod(y, x)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
case SMOD:
|
case SMOD:
|
||||||
@ -310,6 +322,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Mod(y, x)
|
base.Mod(y, x)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
|
|
||||||
@ -321,6 +335,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
|
|
||||||
base.Exp(y, x, Pow256)
|
base.Exp(y, x, Pow256)
|
||||||
|
|
||||||
|
ensure256(base)
|
||||||
|
|
||||||
self.Printf(" = %v", base)
|
self.Printf(" = %v", base)
|
||||||
|
|
||||||
stack.Push(base)
|
stack.Push(base)
|
||||||
@ -838,3 +854,18 @@ func (self *Vm) Endl() *Vm {
|
|||||||
|
|
||||||
return self
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user