4
4
"fmt"
5
5
"math/big"
6
6
7
- "github.com/ethereum/go-ethereum/ethutil"
8
7
"github.com/ethereum/go-ethereum/state"
9
8
"github.com/ethereum/go-ethereum/vm"
10
9
)
@@ -36,6 +35,11 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
36
35
env := self .vm .Env ()
37
36
chainlogger .Debugf ("pre state %x\n " , env .State ().Root ())
38
37
38
+ if self .vm .Env ().Depth () == vm .MaxCallDepth {
39
+ // Consume all gas (by not returning it) and return a depth error
40
+ return nil , vm.DepthError {}
41
+ }
42
+
39
43
from , to := env .State ().GetStateObject (caller .Address ()), env .State ().GetOrNewStateObject (self .address )
40
44
// Skipping transfer is used on testing for the initial call
41
45
if ! self .SkipTransfer {
@@ -50,24 +54,14 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
50
54
51
55
snapshot := env .State ().Copy ()
52
56
defer func () {
53
- if vm .IsDepthErr (err ) || vm .IsOOGErr (err ) {
57
+ if /* vm.IsDepthErr(err) ||*/ vm .IsOOGErr (err ) {
54
58
env .State ().Set (snapshot )
55
59
}
56
60
chainlogger .Debugf ("post state %x\n " , env .State ().Root ())
57
61
}()
58
62
59
63
self .object = to
60
- // Pre-compiled contracts (address.go) 1, 2 & 3.
61
- naddr := ethutil .BigD (contextAddr ).Uint64 ()
62
- if p := vm .Precompiled [naddr ]; p != nil {
63
- if self .Gas .Cmp (p .Gas (len (self .input ))) >= 0 {
64
- ret = p .Call (self .input )
65
- self .vm .Printf ("NATIVE_FUNC(%x) => %x" , naddr , ret )
66
- self .vm .Endl ()
67
- }
68
- } else {
69
- ret , err = self .vm .Run (to , caller , code , self .value , self .Gas , self .price , self .input )
70
- }
64
+ ret , err = self .vm .Run (to , caller , code , self .value , self .Gas , self .price , self .input )
71
65
72
66
return
73
67
}
0 commit comments