core/vm: use pointers to operations vs. copy by value

This commit is contained in:
Péter Szilágyi 2020-07-16 15:32:01 +03:00
parent 9e88224eb8
commit 508891e64b
No known key found for this signature in database
GPG Key ID: E9AE538CEDF8293D
3 changed files with 19 additions and 165 deletions

@ -68,12 +68,11 @@ func enable1884(jt *JumpTable) {
jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884 jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884
// New opcode // New opcode
jt[SELFBALANCE] = operation{ jt[SELFBALANCE] = &operation{
execute: opSelfBalance, execute: opSelfBalance,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
} }
} }
@ -87,12 +86,11 @@ func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx
// - Adds an opcode that returns the current chains EIP-155 unique identifier // - Adds an opcode that returns the current chains EIP-155 unique identifier
func enable1344(jt *JumpTable) { func enable1344(jt *JumpTable) {
// New opcode // New opcode
jt[CHAINID] = operation{ jt[CHAINID] = &operation{
execute: opChainID, execute: opChainID,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
} }
} }
@ -113,29 +111,26 @@ func enable2200(jt *JumpTable) {
// - Adds opcodes that jump to and return from subroutines // - Adds opcodes that jump to and return from subroutines
func enable2315(jt *JumpTable) { func enable2315(jt *JumpTable) {
// New opcode // New opcode
jt[BEGINSUB] = operation{ jt[BEGINSUB] = &operation{
execute: opBeginSub, execute: opBeginSub,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
valid: true,
} }
// New opcode // New opcode
jt[JUMPSUB] = operation{ jt[JUMPSUB] = &operation{
execute: opJumpSub, execute: opJumpSub,
constantGas: GasSlowStep, constantGas: GasSlowStep,
minStack: minStack(1, 0), minStack: minStack(1, 0),
maxStack: maxStack(1, 0), maxStack: maxStack(1, 0),
jumps: true, jumps: true,
valid: true,
} }
// New opcode // New opcode
jt[RETURNSUB] = operation{ jt[RETURNSUB] = &operation{
execute: opReturnSub, execute: opReturnSub,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
valid: true,
jumps: true, jumps: true,
} }
} }

@ -32,7 +32,7 @@ type Config struct {
NoRecursion bool // Disables call, callcode, delegate call and create NoRecursion bool // Disables call, callcode, delegate call and create
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
JumpTable [256]operation // EVM instruction table, automatically populated if unset JumpTable [256]*operation // EVM instruction table, automatically populated if unset
EWASMInterpreter string // External EWASM interpreter options EWASMInterpreter string // External EWASM interpreter options
EVMInterpreter string // External EVM interpreter options EVMInterpreter string // External EVM interpreter options
@ -96,7 +96,7 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {
// We use the STOP instruction whether to see // We use the STOP instruction whether to see
// the jump table was initialised. If it was not // the jump table was initialised. If it was not
// we'll set the default jump table. // we'll set the default jump table.
if !cfg.JumpTable[STOP].valid { if cfg.JumpTable[STOP] == nil {
var jt JumpTable var jt JumpTable
switch { switch {
case evm.chainRules.IsYoloV1: case evm.chainRules.IsYoloV1:
@ -221,7 +221,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (
// enough stack items available to perform the operation. // enough stack items available to perform the operation.
op = contract.GetOp(pc) op = contract.GetOp(pc)
operation := in.cfg.JumpTable[op] operation := in.cfg.JumpTable[op]
if !operation.valid { if operation == nil {
return nil, &ErrInvalidOpCode{opcode: op} return nil, &ErrInvalidOpCode{opcode: op}
} }
// Validate stack // Validate stack

File diff suppressed because it is too large Load Diff