aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/context.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-05-29 20:40:45 +0800
committerFelix Lange <fjl@twurst.com>2015-06-03 22:25:05 +0800
commitea2718c9462ae351baab5eaa05a7e1ef9dc916fa (patch)
treedd91f4e77fc779ffd3170272ea9025bcdfc002ef /core/vm/context.go
parentb4818a003aabb1722f8413ba98fa5b6262ef9673 (diff)
downloadgo-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar.gz
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar.bz2
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar.lz
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar.xz
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.tar.zst
go-tangerine-ea2718c9462ae351baab5eaa05a7e1ef9dc916fa.zip
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
Diffstat (limited to 'core/vm/context.go')
-rw-r--r--core/vm/context.go11
1 files changed, 10 insertions, 1 deletions
diff --git a/core/vm/context.go b/core/vm/context.go
index 29bb9f74e..de03f84f0 100644
--- a/core/vm/context.go
+++ b/core/vm/context.go
@@ -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)