aboutsummaryrefslogtreecommitdiffstats
path: root/ethvm/vm_debug.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-15 23:12:26 +0800
committerobscuren <geffobscura@gmail.com>2014-10-15 23:12:26 +0800
commit311c6f8a3fed5ac03ee4b442fd0f420072bc41b4 (patch)
treede823080f3704d7690fd7172c9742962b66baf3a /ethvm/vm_debug.go
parent266d21209478bdb8c89e1ffb95d7f0de34635968 (diff)
downloadgo-tangerine-311c6f8a3fed5ac03ee4b442fd0f420072bc41b4.tar.gz
go-tangerine-311c6f8a3fed5ac03ee4b442fd0f420072bc41b4.tar.zst
go-tangerine-311c6f8a3fed5ac03ee4b442fd0f420072bc41b4.zip
Fixed remote Arithmetic tests
Diffstat (limited to 'ethvm/vm_debug.go')
-rw-r--r--ethvm/vm_debug.go117
1 files changed, 73 insertions, 44 deletions
diff --git a/ethvm/vm_debug.go b/ethvm/vm_debug.go
index df8cbb10c..d3d3d7696 100644
--- a/ethvm/vm_debug.go
+++ b/ethvm/vm_debug.go
@@ -40,10 +40,27 @@ func NewDebugVm(env Environment) *DebugVm {
func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
self.depth++
+ var (
+ op OpCode
+
+ mem = &Memory{}
+ stack = NewStack()
+ pc = big.NewInt(0)
+ step = 0
+ prevStep = 0
+ require = func(m int) {
+ if stack.Len() < m {
+ panic(fmt.Sprintf("%04v (%v) stack err size = %d, required = %d", pc, op, stack.Len(), m))
+ }
+ }
+ )
+
if self.Recoverable {
// Recover from any require exception
defer func() {
if r := recover(); r != nil {
+ self.Endl()
+
ret = closure.Return(nil)
err = fmt.Errorf("%v", r)
}
@@ -62,21 +79,6 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
vmlogger.Debugf("(%s) %x gas: %v (d) %x\n", self.Fn, closure.Address(), closure.Gas, closure.Args)
- var (
- op OpCode
-
- mem = &Memory{}
- stack = NewStack()
- pc = big.NewInt(0)
- step = 0
- prevStep = 0
- require = func(m int) {
- if stack.Len() < m {
- panic(fmt.Sprintf("%04v (%v) stack err size = %d, required = %d", pc, op, stack.Len(), m))
- }
- }
- )
-
for {
prevStep = step
// The base for all big integer arithmetic
@@ -223,7 +225,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Add(y, x)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
// Pop result back on the stack
@@ -235,7 +237,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Sub(y, x)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
// Pop result back on the stack
@@ -247,60 +249,84 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Mul(y, x)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
case DIV:
require(2)
- x, y := stack.Popn()
- self.Printf(" %v / %v", y, x)
+ x, y := stack.Pop(), stack.Pop()
+ self.Printf(" %v / %v", x, y)
- if x.Cmp(ethutil.Big0) != 0 {
- base.Div(y, x)
+ if y.Cmp(ethutil.Big0) != 0 {
+ base.Div(x, y)
}
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
case SDIV:
require(2)
- x, y := stack.Popn()
- self.Printf(" %v / %v", y, x)
+ x, y := S256(stack.Pop()), S256(stack.Pop())
- if x.Cmp(ethutil.Big0) != 0 {
- base.Div(y, x)
- }
+ self.Printf(" %v / %v", x, y)
- To256(base)
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ n := new(big.Int)
+ if new(big.Int).Mul(x, y).Cmp(ethutil.Big0) < 0 {
+ n.SetInt64(-1)
+ } else {
+ n.SetInt64(1)
+ }
+
+ base.Div(x.Abs(x), y.Abs(y)).Mul(base, n)
+
+ U256(base)
+ }
self.Printf(" = %v", base)
- // Pop result back on the stack
stack.Push(base)
case MOD:
require(2)
- x, y := stack.Popn()
+ x, y := stack.Pop(), stack.Pop()
- self.Printf(" %v %% %v", y, x)
+ self.Printf(" %v %% %v", x, y)
- base.Mod(y, x)
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ base.Mod(x, y)
+ }
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
stack.Push(base)
case SMOD:
require(2)
- x, y := stack.Popn()
+ x, y := S256(stack.Pop()), S256(stack.Pop())
- self.Printf(" %v %% %v", y, x)
+ self.Printf(" %v %% %v", x, y)
- base.Mod(y, x)
+ if y.Cmp(ethutil.Big0) == 0 {
+ base.Set(ethutil.Big0)
+ } else {
+ n := new(big.Int)
+ if x.Cmp(ethutil.Big0) < 0 {
+ n.SetInt64(-1)
+ } else {
+ n.SetInt64(1)
+ }
- To256(base)
+ base.Mod(x.Abs(x), y.Abs(y)).Mul(base, n)
+
+ U256(base)
+ }
self.Printf(" = %v", base)
stack.Push(base)
@@ -313,7 +339,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Exp(y, x, Pow256)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
@@ -321,6 +347,9 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
case NEG:
require(1)
base.Sub(Pow256, stack.Pop())
+
+ base = U256(base)
+
stack.Push(base)
case LT:
require(2)
@@ -346,17 +375,17 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
case SLT:
require(2)
- x, y := stack.Popn()
+ y, x := S256(stack.Pop()), S256(stack.Pop())
self.Printf(" %v < %v", y, x)
// x < y
- if y.Cmp(x) < 0 {
+ if y.Cmp(S256(x)) < 0 {
stack.Push(ethutil.BigTrue)
} else {
stack.Push(ethutil.BigFalse)
}
case SGT:
require(2)
- x, y := stack.Popn()
+ y, x := S256(stack.Pop()), S256(stack.Pop())
self.Printf(" %v > %v", y, x)
// x > y
@@ -426,7 +455,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Add(x, y)
base.Mod(base, z)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)
@@ -441,7 +470,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Mul(x, y)
base.Mod(base, z)
- To256(base)
+ U256(base)
self.Printf(" = %v", base)