Browse Source

Moved state reset to defered function

obscuren 11 years ago
parent
commit
86f789333a
1 changed files with 6 additions and 5 deletions
  1. 6 5
      ethvm/execution.go

+ 6 - 5
ethvm/execution.go

@@ -28,6 +28,11 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err
 	env := self.vm.Env()
 
 	snapshot := env.State().Copy()
+	defer func() {
+		if err != nil {
+			env.State().Set(snapshot)
+		}
+	}()
 
 	msg := env.State().Manifest().AddMessage(&ethstate.Message{
 		To: self.address, From: caller.Address(),
@@ -49,7 +54,7 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err
 		caller.Object().SubAmount(self.value)
 		stateObject.AddAmount(self.value)
 
-		// Precompiled contracts (address.go) 1, 2 & 3.
+		// Pre-compiled contracts (address.go) 1, 2 & 3.
 		naddr := ethutil.BigD(codeAddr).Uint64()
 		if p := Precompiled[naddr]; p != nil {
 			if self.gas.Cmp(p.Gas) >= 0 {
@@ -74,9 +79,5 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err
 		}
 	}
 
-	if err != nil {
-		env.State().Set(snapshot)
-	}
-
 	return
 }