forked from cerc-io/plugeth
core/vm: don't copy JumpTable when no EIP mods are needed (#23977)
This commit is contained in:
parent
a69d4b273d
commit
163f1665dd
@ -33,7 +33,7 @@ type Config struct {
|
|||||||
NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls)
|
NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls)
|
||||||
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
|
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
|
||||||
|
|
||||||
JumpTable JumpTable // EVM instruction table, automatically populated if unset
|
JumpTable *JumpTable // EVM instruction table, automatically populated if unset
|
||||||
|
|
||||||
ExtraEips []int // Additional EIPS that are to be enabled
|
ExtraEips []int // Additional EIPS that are to be enabled
|
||||||
}
|
}
|
||||||
@ -68,39 +68,37 @@ type EVMInterpreter struct {
|
|||||||
|
|
||||||
// NewEVMInterpreter returns a new instance of the Interpreter.
|
// NewEVMInterpreter returns a new instance of the Interpreter.
|
||||||
func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {
|
func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {
|
||||||
// We use the STOP instruction whether to see
|
// If jump table was not initialised we set the default one.
|
||||||
// the jump table was initialised. If it was not
|
if cfg.JumpTable == nil {
|
||||||
// we'll set the default jump table.
|
|
||||||
if cfg.JumpTable[STOP] == nil {
|
|
||||||
var jt JumpTable
|
|
||||||
switch {
|
switch {
|
||||||
case evm.chainRules.IsLondon:
|
case evm.chainRules.IsLondon:
|
||||||
jt = londonInstructionSet
|
cfg.JumpTable = &londonInstructionSet
|
||||||
case evm.chainRules.IsBerlin:
|
case evm.chainRules.IsBerlin:
|
||||||
jt = berlinInstructionSet
|
cfg.JumpTable = &berlinInstructionSet
|
||||||
case evm.chainRules.IsIstanbul:
|
case evm.chainRules.IsIstanbul:
|
||||||
jt = istanbulInstructionSet
|
cfg.JumpTable = &istanbulInstructionSet
|
||||||
case evm.chainRules.IsConstantinople:
|
case evm.chainRules.IsConstantinople:
|
||||||
jt = constantinopleInstructionSet
|
cfg.JumpTable = &constantinopleInstructionSet
|
||||||
case evm.chainRules.IsByzantium:
|
case evm.chainRules.IsByzantium:
|
||||||
jt = byzantiumInstructionSet
|
cfg.JumpTable = &byzantiumInstructionSet
|
||||||
case evm.chainRules.IsEIP158:
|
case evm.chainRules.IsEIP158:
|
||||||
jt = spuriousDragonInstructionSet
|
cfg.JumpTable = &spuriousDragonInstructionSet
|
||||||
case evm.chainRules.IsEIP150:
|
case evm.chainRules.IsEIP150:
|
||||||
jt = tangerineWhistleInstructionSet
|
cfg.JumpTable = &tangerineWhistleInstructionSet
|
||||||
case evm.chainRules.IsHomestead:
|
case evm.chainRules.IsHomestead:
|
||||||
jt = homesteadInstructionSet
|
cfg.JumpTable = &homesteadInstructionSet
|
||||||
default:
|
default:
|
||||||
jt = frontierInstructionSet
|
cfg.JumpTable = &frontierInstructionSet
|
||||||
}
|
}
|
||||||
for i, eip := range cfg.ExtraEips {
|
for i, eip := range cfg.ExtraEips {
|
||||||
if err := EnableEIP(eip, &jt); err != nil {
|
copy := *cfg.JumpTable
|
||||||
|
if err := EnableEIP(eip, ©); err != nil {
|
||||||
// Disable it, so caller can check if it's activated or not
|
// Disable it, so caller can check if it's activated or not
|
||||||
cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...)
|
cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...)
|
||||||
log.Error("EIP activation failed", "eip", eip, "error", err)
|
log.Error("EIP activation failed", "eip", eip, "error", err)
|
||||||
}
|
}
|
||||||
|
cfg.JumpTable = ©
|
||||||
}
|
}
|
||||||
cfg.JumpTable = jt
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &EVMInterpreter{
|
return &EVMInterpreter{
|
||||||
|
Loading…
Reference in New Issue
Block a user