run(code, options) {
		let script;
		let filename;

		if (typeof options === 'object') {
			filename = options.filename;
		} else {
			filename = options;
			options = {__proto__: null};
		}

		const {
			strict = this.options.strict,
			wrapper = this.options.wrapper,
			module: customModule,
			require: customRequire,
			dirname: customDirname = null
		} = options;

		let sandboxModule = customModule;
		let dirname = customDirname;

		if (code instanceof VMScript) {
			script = strict ? code._compileNodeVMStrict() : code._compileNodeVM();
			if (!sandboxModule) {
				const resolvedFilename = this.resolver.fs.resolve(code.filename);
				dirname = this.resolver.fs.dirname(resolvedFilename);
				sandboxModule = new (this._Module)(resolvedFilename, dirname);
				this.resolver.registerModule(sandboxModule, resolvedFilename, dirname, null, false);
			}
		} else {
			const unresolvedFilename = filename || 'vm.js';
			if (!sandboxModule) {
				if (filename) {
					const resolvedFilename = this.resolver.fs.resolve(filename);
					dirname = this.resolver.fs.dirname(resolvedFilename);
					sandboxModule = new (this._Module)(resolvedFilename, dirname);
					this.resolver.registerModule(sandboxModule, resolvedFilename, dirname, null, false);
				} else {
					sandboxModule = new (this._Module)(null, null);
					sandboxModule.id = unresolvedFilename;
				}
			}
			const prefix = strict ? STRICT_MODULE_PREFIX : MODULE_PREFIX;
			let scriptCode = this._compiler(code, unresolvedFilename);
			scriptCode = transformer(null, scriptCode, false, false, unresolvedFilename).code;
			script = new Script(prefix + scriptCode + MODULE_SUFFIX, {
				__proto__: null,
				filename: unresolvedFilename,
				displayErrors: false
			});
		}

		const closure = this._runScript(script);

		const usedRequire = customRequire || this._createRequireForModule(sandboxModule);

		const ret = Reflect.apply(closure, this.sandbox, [sandboxModule.exports, usedRequire, sandboxModule, filename, dirname]);
		return wrapper === 'commonjs' ? sandboxModule.exports : ret;
	}
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|VMScript)} code - Code to run.
@param {(string|Object)} [options] - Options map or filename.
@param {string} [options.filename="vm.js"] - Filename that shows up in any stack traces produced from this script.<br>
This is only used if code is a String.
@param {boolean} [options.strict] - If modules should be loaded in strict mode. Defaults to NodeVM options.
@param {("commonjs"|"none")} [options.wrapper] - <code>commonjs</code> to wrap script into CommonJS wrapper,
<code>none</code> to retrieve value returned by the script. Defaults to NodeVM options.
@return {*} Result of executed code.
@throws {SyntaxError} If there is a syntax error in the script.
@throws {*} If the script execution terminated with an exception it is propagated.
@fires NodeVM."console.debug"
@fires NodeVM."console.log"
@fires NodeVM."console.info"
@fires NodeVM."console.warn"
@fires NodeVM."console.error"
@fires NodeVM."console.dir"
@fires NodeVM."console.trace"