diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/execution.go | 3 | ||||
-rw-r--r-- | core/state_transition.go | 25 | ||||
-rw-r--r-- | core/vm_env.go | 4 |
3 files changed, 30 insertions, 2 deletions
diff --git a/core/execution.go b/core/execution.go index cad4e84aa..5e0cbd37e 100644 --- a/core/execution.go +++ b/core/execution.go @@ -33,8 +33,7 @@ func (self *Execution) Call(codeAddr []byte, caller vm.ContextRef) ([]byte, erro func (self *Execution) exec(code, contextAddr []byte, caller vm.ContextRef) (ret []byte, err error) { env := self.env - evm := vm.New(env) - + evm := vm.NewVm(env) if env.Depth() == vm.MaxCallDepth { caller.ReturnGas(self.Gas, self.price) diff --git a/core/state_transition.go b/core/state_transition.go index 8b0ca2ac4..00d9d486a 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -10,6 +10,8 @@ import ( "github.com/ethereum/go-ethereum/vm" ) +const tryJit = false + /* * The State transitioning model * @@ -184,6 +186,7 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) { return } + stateCopy := self.env.State().Copy() vmenv := self.env var ref vm.ContextRef if MessageCreatesContract(msg) { @@ -196,8 +199,30 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) { ref.SetCode(ret) } } + + if vmenv, ok := vmenv.(*VMEnv); ok && tryJit { + statelogger.Infof("CREATE: re-running using JIT (PH=%x)\n", stateCopy.Root()[:4]) + // re-run using the JIT (validation for the JIT) + goodState := vmenv.State().Copy() + vmenv.state = stateCopy + vmenv.SetVmType(vm.JitVmTy) + vmenv.Create(sender, contract.Address(), self.msg.Data(), self.gas, self.gasPrice, self.value) + statelogger.Infof("DONE PH=%x STD_H=%x JIT_H=%x\n", stateCopy.Root()[:4], goodState.Root()[:4], vmenv.State().Root()[:4]) + self.state.Set(goodState) + } } else { ret, err = vmenv.Call(self.From(), self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value) + + if vmenv, ok := vmenv.(*VMEnv); ok && tryJit { + statelogger.Infof("CALL: re-running using JIT (PH=%x)\n", stateCopy.Root()[:4]) + // re-run using the JIT (validation for the JIT) + goodState := vmenv.State().Copy() + vmenv.state = stateCopy + vmenv.SetVmType(vm.JitVmTy) + vmenv.Call(self.From(), self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value) + statelogger.Infof("DONE PH=%x STD_H=%x JIT_H=%x\n", stateCopy.Root()[:4], goodState.Root()[:4], vmenv.State().Root()[:4]) + self.state.Set(goodState) + } } if err != nil { diff --git a/core/vm_env.go b/core/vm_env.go index 624a63333..c7491bcdc 100644 --- a/core/vm_env.go +++ b/core/vm_env.go @@ -14,6 +14,7 @@ type VMEnv struct { msg Message depth int chain *ChainManager + typ vm.Type } func NewEnv(state *state.StateDB, chain *ChainManager, msg Message, block *types.Block) *VMEnv { @@ -22,6 +23,7 @@ func NewEnv(state *state.StateDB, chain *ChainManager, msg Message, block *types state: state, block: block, msg: msg, + typ: vm.StdVmTy, } } @@ -35,6 +37,8 @@ func (self *VMEnv) Value() *big.Int { return self.msg.Value() } func (self *VMEnv) State() *state.StateDB { return self.state } func (self *VMEnv) Depth() int { return self.depth } func (self *VMEnv) SetDepth(i int) { self.depth = i } +func (self *VMEnv) VmType() vm.Type { return self.typ } +func (self *VMEnv) SetVmType(t vm.Type) { self.typ = t } func (self *VMEnv) GetHash(n uint64) []byte { if block := self.chain.GetBlockByNumber(n); block != nil { return block.Hash() |