code: func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM {
  	evm := &EVM{
  		Context:      ctx,
  		StateDB:      statedb,
  		vmConfig:     vmConfig,
  		chainConfig:  chainConfig,
  		chainRules:   chainConfig.Rules(ctx.BlockNumber),
  		interpreters: make([]Interpreter, 0, 1),
  	}
  
  	if chainConfig.IsEWASM(ctx.BlockNumber) {
  		// to be implemented by EVM-C and Wagon PRs.
  		// if vmConfig.EWASMInterpreter != "" {
  		//  extIntOpts := strings.Split(vmConfig.EWASMInterpreter, ":")
  		//  path := extIntOpts[0]
  		//  options := []string{}
  		//  if len(extIntOpts) > 1 {
  		//    options = extIntOpts[1..]
  		//  }
  		//  evm.interpreters = append(evm.interpreters, NewEVMVCInterpreter(evm, vmConfig, options))
  		// } else {
  		// 	evm.interpreters = append(evm.interpreters, NewEWASMInterpreter(evm, vmConfig))
  		// }
  		panic("No supported ewasm interpreter yet.")
  	}
  
  	// vmConfig.EVMInterpreter will be used by EVM-C, it won't be checked here
  	// as we always want to have the built-in EVM as the failover option.
  	evm.interpreters = append(evm.interpreters, NewEVMInterpreter(evm, vmConfig))
  	evm.interpreter = evm.interpreters[0]
  
  	return evm
  }
docs: // NewEVM returns a new EVM. The returned EVM is not thread safe and should
  // only ever be used *once*.