core/vm: improve JUMPDEST analysis
* JUMPDEST analysis is faster because less type conversions are performed. * The map of JUMPDEST locations is now created lazily at the first JUMP. * The result of the analysis is kept around for recursive invocations through CALL/CALLCODE. Fixes #1147
This commit is contained in:
@ -16,6 +16,8 @@ type Context struct {
|
||||
caller ContextRef
|
||||
self ContextRef
|
||||
|
||||
jumpdests destinations // result of JUMPDEST analysis.
|
||||
|
||||
Code []byte
|
||||
CodeAddr *common.Address
|
||||
|
||||
@ -24,10 +26,17 @@ type Context struct {
|
||||
Args []byte
|
||||
}
|
||||
|
||||
// Create a new context for the given data items
|
||||
// Create a new context for the given data items.
|
||||
func NewContext(caller ContextRef, object ContextRef, value, gas, price *big.Int) *Context {
|
||||
c := &Context{caller: caller, self: object, Args: nil}
|
||||
|
||||
if parent, ok := caller.(*Context); ok {
|
||||
// Reuse JUMPDEST analysis from parent context if available.
|
||||
c.jumpdests = parent.jumpdests
|
||||
} else {
|
||||
c.jumpdests = make(destinations)
|
||||
}
|
||||
|
||||
// Gas should be a pointer so it can safely be reduced through the run
|
||||
// This pointer will be off the state transition
|
||||
c.Gas = gas //new(big.Int).Set(gas)
|
||||
|
Reference in New Issue
Block a user