module,repl: remove repl require() hack

Remove a hack that was introduced in commit bb6d468d from November 2010.
This is groundwork for a follow-up commit that makes it possible to use
internal modules in lib/repl.js.

PR-URL: https://github.com/nodejs/node/pull/4026
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
Ben Noordhuis 2015-11-25 22:27:29 +01:00
parent f4f1e89bf1
commit ee72ee7531
6 changed files with 44 additions and 39 deletions

View File

@ -5,7 +5,7 @@ const path = require('path');
const net = require('net'); const net = require('net');
const vm = require('vm'); const vm = require('vm');
const Module = require('module'); const Module = require('module');
const repl = Module.requireRepl(); const repl = require('repl');
const inherits = util.inherits; const inherits = util.inherits;
const assert = require('assert'); const assert = require('assert');
const spawn = require('child_process').spawn; const spawn = require('child_process').spawn;

View File

@ -1,6 +1,30 @@
'use strict'; 'use strict';
module.exports.stripBOM = stripBOM; module.exports = { makeRequireFunction, stripBOM };
// Invoke with makeRequireFunction.call(module) where |module| is the
// Module object to use as the context for the require() function.
function makeRequireFunction() {
const Module = this.constructor;
const self = this;
function require(path) {
return self.require(path);
}
require.resolve = function(request) {
return Module._resolveFilename(request, self);
};
require.main = process.mainModule;
// Enable support to add extra extension types.
require.extensions = Module._extensions;
require.cache = Module._cache;
return require;
}
/** /**
* Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)

View File

@ -274,17 +274,6 @@ Module._load = function(request, parent, isMain) {
debug('Module._load REQUEST %s parent: %s', request, parent.id); debug('Module._load REQUEST %s parent: %s', request, parent.id);
} }
// REPL is a special case, because it needs the real require.
if (request === 'internal/repl' || request === 'repl') {
if (Module._cache[request]) {
return Module._cache[request];
}
var replModule = new Module(request);
replModule._compile(NativeModule.getSource(request), `${request}.js`);
NativeModule._cache[request] = replModule;
return replModule.exports;
}
var filename = Module._resolveFilename(request, parent); var filename = Module._resolveFilename(request, parent);
var cachedModule = Module._cache[filename]; var cachedModule = Module._cache[filename];
@ -376,27 +365,9 @@ var resolvedArgv;
// the file. // the file.
// Returns exception, if any. // Returns exception, if any.
Module.prototype._compile = function(content, filename) { Module.prototype._compile = function(content, filename) {
var self = this;
// remove shebang // remove shebang
content = content.replace(shebangRe, ''); content = content.replace(shebangRe, '');
function require(path) {
return self.require(path);
}
require.resolve = function(request) {
return Module._resolveFilename(request, self);
};
require.main = process.mainModule;
// Enable support to add extra extension types
require.extensions = Module._extensions;
require.cache = Module._cache;
var dirname = path.dirname(filename);
// create wrapper function // create wrapper function
var wrapper = Module.wrap(content); var wrapper = Module.wrap(content);
@ -421,8 +392,10 @@ Module.prototype._compile = function(content, filename) {
global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0); global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0);
} }
} }
var args = [self.exports, require, self, filename, dirname]; const dirname = path.dirname(filename);
return compiledWrapper.apply(self.exports, args); const require = internalModule.makeRequireFunction.call(this);
const args = [this.exports, require, this, filename, dirname];
return compiledWrapper.apply(this.exports, args);
}; };
@ -488,10 +461,10 @@ Module._initPaths = function() {
Module.globalPaths = modulePaths.slice(0); Module.globalPaths = modulePaths.slice(0);
}; };
// bootstrap repl // TODO(bnoordhuis) Unused, remove in the future.
Module.requireRepl = function() { Module.requireRepl = internalUtil.deprecate(function() {
return Module._load('internal/repl', '.'); return NativeModule.require('internal/repl');
}; }, 'Module.requireRepl is deprecated.');
Module._preloadModules = function(requests) { Module._preloadModules = function(requests) {
if (!Array.isArray(requests)) if (!Array.isArray(requests))

View File

@ -21,6 +21,7 @@
'use strict'; 'use strict';
const internalModule = require('internal/module');
const util = require('util'); const util = require('util');
const inherits = util.inherits; const inherits = util.inherits;
const Stream = require('stream'); const Stream = require('stream');
@ -29,6 +30,7 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const Interface = require('readline').Interface; const Interface = require('readline').Interface;
const Console = require('console').Console; const Console = require('console').Console;
const Module = require('module');
const domain = require('domain'); const domain = require('domain');
const debug = util.debuglog('repl'); const debug = util.debuglog('repl');
@ -522,6 +524,8 @@ REPLServer.prototype.createContext = function() {
context.global.global = context; context.global.global = context;
} }
const module = new Module('<repl>');
const require = internalModule.makeRequireFunction.call(module);
context.module = module; context.module = module;
context.require = require; context.require = require;
@ -661,7 +665,7 @@ REPLServer.prototype.complete = function(line, callback) {
completionGroupsLoaded(); completionGroupsLoaded();
} else if (match = line.match(requireRE)) { } else if (match = line.match(requireRE)) {
// require('...<Tab>') // require('...<Tab>')
var exts = Object.keys(require.extensions); const exts = Object.keys(this.context.require.extensions);
var indexRe = new RegExp('^index(' + exts.map(regexpEscape).join('|') + var indexRe = new RegExp('^index(' + exts.map(regexpEscape).join('|') +
')$'); ')$');

View File

@ -144,7 +144,7 @@
// If -i or --interactive were passed, or stdin is a TTY. // If -i or --interactive were passed, or stdin is a TTY.
if (process._forceRepl || NativeModule.require('tty').isatty(0)) { if (process._forceRepl || NativeModule.require('tty').isatty(0)) {
// REPL // REPL
var cliRepl = Module.requireRepl(); var cliRepl = NativeModule.require('internal/repl');
cliRepl.createInternalRepl(process.env, function(err, repl) { cliRepl.createInternalRepl(process.env, function(err, repl) {
if (err) { if (err) {
throw err; throw err;

View File

@ -278,6 +278,10 @@ function error_test() {
expect: 'undefined\n' + prompt_unix }, expect: 'undefined\n' + prompt_unix },
{ client: client_unix, send: '/* \'\n"\n\'"\'\n*/', { client: client_unix, send: '/* \'\n"\n\'"\'\n*/',
expect: 'undefined\n' + prompt_unix }, expect: 'undefined\n' + prompt_unix },
// REPL should get a normal require() function, not one that allows
// access to internal modules without the --expose_internals flag.
{ client: client_unix, send: 'require("internal/repl")',
expect: /^Error: Cannot find module 'internal\/repl'/ },
]); ]);
} }