diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index d0e5967e6e77..1321888512d9 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -181,10 +181,11 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( } var ( - op OpCode // current opcode - mem = NewMemory() // bound memory - stack = newstack() // local stack - callContext = &ScopeContext{ + op OpCode // current opcode + jumpTable *JumpTable = in.table + mem = NewMemory() // bound memory + stack = newstack() // local stack + callContext = &ScopeContext{ Memory: mem, Stack: stack, Contract: contract, @@ -227,6 +228,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during // the execution of one of the operations or until the done flag is set by the // parent context. + _ = jumpTable[0] // nil-check the jumpTable out of the loop for { if debug { // Capture pre-execution values for tracing. @@ -247,7 +249,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( // Get the operation from the jump table and validate the stack to ensure there are // enough stack items available to perform the operation. op = contract.GetOp(pc) - operation := in.table[op] + operation := jumpTable[op] cost = operation.constantGas // For tracing // Validate stack if sLen := stack.len(); sLen < operation.minStack {