Chnged to use GetOp instead & added error + checking
This commit is contained in:
parent
91c876831a
commit
feef194829
@ -63,7 +63,7 @@ func RunVmTest(js string) (failed int) {
|
||||
// When an error is returned it doesn't always mean the tests fails.
|
||||
// Have to come up with some conditional failing mechanism.
|
||||
if err != nil {
|
||||
helper.Log.Infoln(err)
|
||||
log.Println(err)
|
||||
}
|
||||
|
||||
rexp := helper.FromHex(test.Out)
|
||||
@ -96,6 +96,7 @@ func RunVmTest(js string) (failed int) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
helper.Logger.SetLogLevel(5)
|
||||
if len(os.Args) == 1 {
|
||||
log.Fatalln("no json supplied")
|
||||
}
|
||||
|
51
vm/errors.go
Normal file
51
vm/errors.go
Normal file
@ -0,0 +1,51 @@
|
||||
package vm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
type OutOfGasError struct {
|
||||
req, has *big.Int
|
||||
}
|
||||
|
||||
func OOG(req, has *big.Int) OutOfGasError {
|
||||
return OutOfGasError{req, has}
|
||||
}
|
||||
|
||||
func (self OutOfGasError) Error() string {
|
||||
return fmt.Sprintf("out of gas! require %v, have %v", self.req, self.has)
|
||||
}
|
||||
|
||||
func IsOOGErr(err error) bool {
|
||||
_, ok := err.(OutOfGasError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type StackError struct {
|
||||
req, has int
|
||||
}
|
||||
|
||||
func StackErr(req, has int) StackError {
|
||||
return StackError{req, has}
|
||||
}
|
||||
|
||||
func (self StackError) Error() string {
|
||||
return fmt.Sprintf("stack error! require %v, have %v", self.req, self.has)
|
||||
}
|
||||
|
||||
func IsStack(err error) bool {
|
||||
_, ok := err.(StackError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type DepthError struct{}
|
||||
|
||||
func (self DepthError) Error() string {
|
||||
return fmt.Sprintf("Max call depth exceeded (%d)", MaxCallDepth)
|
||||
}
|
||||
|
||||
func IsDepthErr(err error) bool {
|
||||
_, ok := err.(DepthError)
|
||||
return ok
|
||||
}
|
@ -36,7 +36,7 @@ func (self *Execution) exec(code, caddr []byte, caller ClosureRef) (ret []byte,
|
||||
|
||||
snapshot := env.State().Copy()
|
||||
defer func() {
|
||||
if err != nil {
|
||||
if IsDepthErr(err) || IsOOGErr(err) {
|
||||
env.State().Set(snapshot)
|
||||
}
|
||||
}()
|
||||
@ -76,7 +76,7 @@ func (self *Execution) exec(code, caddr []byte, caller ClosureRef) (ret []byte,
|
||||
if self.vm.Depth() == MaxCallDepth {
|
||||
c.UseGas(self.Gas)
|
||||
|
||||
return c.Return(nil), fmt.Errorf("Max call depth exceeded (%d)", MaxCallDepth)
|
||||
return c.Return(nil), DepthError{}
|
||||
}
|
||||
|
||||
// Executer the closure and get the return value (if any)
|
||||
|
@ -107,7 +107,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||
|
||||
step++
|
||||
// Get the memory location of pc
|
||||
op = OpCode(closure.Get(pc).Uint())
|
||||
op = closure.GetOp(int(pc.Uint64()))
|
||||
|
||||
// XXX Leave this Println intact. Don't change this to the log system.
|
||||
// Used for creating diffs between implementations
|
||||
@ -246,11 +246,11 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||
if !closure.UseGas(gas) {
|
||||
self.Endl()
|
||||
|
||||
err := fmt.Errorf("Insufficient gas for %v. req %v has %v", op, gas, closure.Gas)
|
||||
tmp := new(big.Int).Set(closure.Gas)
|
||||
|
||||
closure.UseGas(closure.Gas)
|
||||
|
||||
return closure.Return(nil), err
|
||||
return closure.Return(nil), OOG(gas, tmp)
|
||||
}
|
||||
|
||||
mem.Resize(newMemSize.Uint64())
|
||||
|
Loading…
Reference in New Issue
Block a user