run(code, filename) {
    if (this.options.compiler !== 'javascript') {
      code = _compileToJS(code, this.options.compiler, filename);
    }

    let dirname;
    let returned;

    if (filename) {
      filename = pa.resolve(filename);
      dirname = pa.dirname(filename);
    } else {
      filename = null;
      dirname = null;
    }

    const module = SCRIPT_CACHE.exp._compiledVM.runInContext(this._context, {
      displayErrors: false
    });

    const script = code instanceof VMScript ? code : new VMScript(code, filename);
    script._compileNodeVM();

    try {
      const closure = script._compiledNodeVM.runInContext(this._context, {
        filename: script.filename,
        displayErrors: false
      });

      returned = closure.call(this._context, module.exports, this._prepareRequire(dirname), module, filename, dirname);
    } catch (e) {
      throw this._internal.Decontextify.value(e);
    }

    if (this.options.wrapper === 'commonjs') {
      return this._internal.Decontextify.value(module.exports);
    } else {
      return this._internal.Decontextify.value(returned);
    }
  }
Run the code in NodeVM.

First time you run this method, code is executed same way like in node's regular `require` - it's executed with
`module`, `require`, `exports`, `__dirname`, `__filename` variables and expect result in `module.exports'.

@param {String} code Code to run.
@param {String} [filename] Filename that shows up in any stack traces produced from this script.
@return {*} Result of executed code.