Restructure src/node.js startup code
This patch introduces a logical structure and sequence for the bootstrap code found src/node.js.
This commit is contained in:
parent
cc5e9130bb
commit
91cc2d8c4b
560
src/node.js
560
src/node.js
@ -1,53 +1,100 @@
|
|||||||
|
// Hello, and welcome to hacking node.js!
|
||||||
|
//
|
||||||
|
// This file is invoked by node::Load in src/node.cc, and responsible for
|
||||||
|
// bootstrapping the node.js core. Special caution is given to the performance
|
||||||
|
// of the startup process, so many dependencies are invoked lazily.
|
||||||
(function(process) {
|
(function(process) {
|
||||||
|
|
||||||
global = this;
|
global = this;
|
||||||
|
|
||||||
|
function startup() {
|
||||||
|
startup.globalVariables();
|
||||||
|
startup.globalTimeouts();
|
||||||
|
startup.globalConsole();
|
||||||
|
|
||||||
|
startup.processAssert();
|
||||||
|
startup.processNextTick();
|
||||||
|
startup.processStdio();
|
||||||
|
startup.processKillAndExit();
|
||||||
|
startup.processSignalHandlers();
|
||||||
|
|
||||||
|
startup.removedMethods();
|
||||||
|
|
||||||
|
startup.resolveArgv0();
|
||||||
|
|
||||||
|
if (startup.runThirdPartyMain()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startup.runDebugger()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startup.runScript()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startup.runEval()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
startup.runRepl();
|
||||||
|
}
|
||||||
|
|
||||||
|
startup.globalVariables = function() {
|
||||||
global.process = process;
|
global.process = process;
|
||||||
global.global = global;
|
global.global = global;
|
||||||
global.GLOBAL = global;
|
global.GLOBAL = global;
|
||||||
global.root = global;
|
global.root = global;
|
||||||
|
global.Buffer = NativeModule.require('buffer').Buffer;
|
||||||
/** deprecation errors ************************************************/
|
|
||||||
|
|
||||||
function removed(reason) {
|
|
||||||
return function() {
|
|
||||||
throw new Error(reason);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
startup.globalTimeouts = function() {
|
||||||
|
global.setTimeout = function() {
|
||||||
|
var t = NativeModule.require('timers');
|
||||||
|
return t.setTimeout.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
global.setInterval = function() {
|
||||||
|
var t = NativeModule.require('timers');
|
||||||
|
return t.setInterval.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
global.clearTimeout = function() {
|
||||||
|
var t = NativeModule.require('timers');
|
||||||
|
return t.clearTimeout.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
global.clearInterval = function() {
|
||||||
|
var t = NativeModule.require('timers');
|
||||||
|
return t.clearInterval.apply(this, arguments);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.globalConsole = function() {
|
||||||
|
global.__defineGetter__('console', function() {
|
||||||
|
return NativeModule.require('console');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
startup._lazyConstants = null;
|
||||||
|
|
||||||
|
startup.lazyConstants = function() {
|
||||||
|
if (!startup._lazyConstants) {
|
||||||
|
startup._lazyConstants = process.binding('constants');
|
||||||
}
|
}
|
||||||
|
return startup._lazyConstants;
|
||||||
|
};
|
||||||
|
|
||||||
process.debug =
|
startup.processAssert = function() {
|
||||||
removed('process.debug() use console.error() instead');
|
|
||||||
process.error =
|
|
||||||
removed('process.error() use console.error() instead');
|
|
||||||
process.watchFile =
|
|
||||||
removed('process.watchFile() has moved to fs.watchFile()');
|
|
||||||
process.unwatchFile =
|
|
||||||
removed('process.unwatchFile() has moved to fs.unwatchFile()');
|
|
||||||
process.mixin =
|
|
||||||
removed('process.mixin() has been removed.');
|
|
||||||
process.createChildProcess =
|
|
||||||
removed('childProcess API has changed. See doc/api.txt.');
|
|
||||||
process.inherits =
|
|
||||||
removed('process.inherits() has moved to sys.inherits.');
|
|
||||||
process._byteLength =
|
|
||||||
removed('process._byteLength() has moved to Buffer.byteLength');
|
|
||||||
|
|
||||||
process.assert = function(x, msg) {
|
process.assert = function(x, msg) {
|
||||||
if (!x) throw new Error(msg || 'assertion error');
|
if (!x) {
|
||||||
|
throw new Error(msg || 'assertion error');
|
||||||
|
}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var Script = process.binding('evals').Script;
|
startup.processNextTick = function() {
|
||||||
var runInThisContext = Script.runInThisContext;
|
|
||||||
|
|
||||||
// lazy loaded.
|
|
||||||
var constants;
|
|
||||||
function lazyConstants() {
|
|
||||||
if (!constants) constants = process.binding('constants');
|
|
||||||
return constants;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// nextTick()
|
|
||||||
|
|
||||||
var nextTickQueue = [];
|
var nextTickQueue = [];
|
||||||
|
|
||||||
process._tickCallback = function() {
|
process._tickCallback = function() {
|
||||||
@ -74,10 +121,237 @@
|
|||||||
nextTickQueue.push(callback);
|
nextTickQueue.push(callback);
|
||||||
process._needTickCallback();
|
process._needTickCallback();
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.processStdio = function() {
|
||||||
|
var stdout, stdin;
|
||||||
|
|
||||||
|
process.__defineGetter__('stdout', function() {
|
||||||
|
if (stdout) return stdout;
|
||||||
|
|
||||||
|
var binding = process.binding('stdio'),
|
||||||
|
net = NativeModule.require('net'),
|
||||||
|
fs = NativeModule.require('fs'),
|
||||||
|
tty = NativeModule.require('tty'),
|
||||||
|
fd = binding.stdoutFD;
|
||||||
|
|
||||||
|
if (binding.isatty(fd)) {
|
||||||
|
stdout = new tty.WriteStream(fd);
|
||||||
|
} else if (binding.isStdoutBlocking()) {
|
||||||
|
stdout = new fs.WriteStream(null, {fd: fd});
|
||||||
|
} else {
|
||||||
|
stdout = new net.Stream(fd);
|
||||||
|
// FIXME Should probably have an option in net.Stream to create a
|
||||||
|
// stream from an existing fd which is writable only. But for now
|
||||||
|
// we'll just add this hack and set the `readable` member to false.
|
||||||
|
// Test: ./node test/fixtures/echo.js < /etc/passwd
|
||||||
|
stdout.readable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stdout;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.__defineGetter__('stdin', function() {
|
||||||
|
if (stdin) return stdin;
|
||||||
|
|
||||||
|
var binding = process.binding('stdio'),
|
||||||
|
net = NativeModule.require('net'),
|
||||||
|
fs = NativeModule.require('fs'),
|
||||||
|
tty = NativeModule.require('tty'),
|
||||||
|
fd = binding.openStdin();
|
||||||
|
|
||||||
|
if (binding.isatty(fd)) {
|
||||||
|
stdin = new tty.ReadStream(fd);
|
||||||
|
} else if (binding.isStdinBlocking()) {
|
||||||
|
stdin = new fs.ReadStream(null, {fd: fd});
|
||||||
|
} else {
|
||||||
|
stdin = new net.Stream(fd);
|
||||||
|
stdin.readable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stdin;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.openStdin = function() {
|
||||||
|
process.stdin.resume();
|
||||||
|
return process.stdin;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.processKillAndExit = function() {
|
||||||
|
process.exit = function(code) {
|
||||||
|
process.emit('exit', code || 0);
|
||||||
|
process.reallyExit(code || 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
process.kill = function(pid, sig) {
|
||||||
|
sig = sig || 'SIGTERM';
|
||||||
|
|
||||||
|
if (!startup.lazyConstants()[sig]) {
|
||||||
|
throw new Error('Unknown signal: ' + sig);
|
||||||
|
}
|
||||||
|
|
||||||
|
process._kill(pid, startup.lazyConstants()[sig]);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.processSignalHandlers = function() {
|
||||||
|
// Load events module in order to access prototype elements on process like
|
||||||
|
// process.addListener.
|
||||||
|
var events = NativeModule.require('events');
|
||||||
|
var signalWatchers = {};
|
||||||
|
var addListener = process.addListener;
|
||||||
|
var removeListener = process.removeListener;
|
||||||
|
|
||||||
|
function isSignal(event) {
|
||||||
|
return event.slice(0, 3) === 'SIG' && startup.lazyConstants()[event];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap addListener for the special signal types
|
||||||
|
process.on = process.addListener = function(type, listener) {
|
||||||
|
var ret = addListener.apply(this, arguments);
|
||||||
|
if (isSignal(type)) {
|
||||||
|
if (!signalWatchers.hasOwnProperty(type)) {
|
||||||
|
var b = process.binding('signal_watcher');
|
||||||
|
var w = new b.SignalWatcher(startup.lazyConstants()[type]);
|
||||||
|
w.callback = function() { process.emit(type); };
|
||||||
|
signalWatchers[type] = w;
|
||||||
|
w.start();
|
||||||
|
|
||||||
|
} else if (this.listeners(type).length === 1) {
|
||||||
|
signalWatchers[event].start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
process.removeListener = function(type, listener) {
|
||||||
|
var ret = removeListener.apply(this, arguments);
|
||||||
|
if (isSignal(type)) {
|
||||||
|
process.assert(signalWatchers.hasOwnProperty(type));
|
||||||
|
|
||||||
|
if (this.listeners(type).length === 0) {
|
||||||
|
signalWatchers[type].stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup._removedProcessMethods = {
|
||||||
|
'debug': 'process.debug() use console.error() instead',
|
||||||
|
'error': 'process.error() use console.error() instead',
|
||||||
|
'watchFile': 'process.watchFile() has moved to fs.watchFile()',
|
||||||
|
'unwatchFile': 'process.unwatchFile() has moved to fs.unwatchFile()',
|
||||||
|
'mixin': 'process.mixin() has been removed.',
|
||||||
|
'createChildProcess': 'childProcess API has changed. See doc/api.txt.',
|
||||||
|
'inherits': 'process.inherits() has moved to sys.inherits.',
|
||||||
|
'_byteLength': 'process._byteLength() has moved to Buffer.byteLength',
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.removedMethods = function() {
|
||||||
|
for (var method in startup._removedProcessMethods) {
|
||||||
|
var reason = startup._removedProcessMethods[method];
|
||||||
|
process[method] = startup._removedMethod(reason);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
startup._removedMethod = function(reason) {
|
||||||
|
return function() {
|
||||||
|
throw new Error(reason);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.resolveArgv0 = function() {
|
||||||
|
var cwd = process.cwd();
|
||||||
|
var isWindows = process.platform === 'win32';
|
||||||
|
|
||||||
|
// Make process.argv[0] into a full path, but only touch argv[0] if it's
|
||||||
|
// not a system $PATH lookup.
|
||||||
|
// TODO: Make this work on Windows as well. Note that "node" might
|
||||||
|
// execute cwd\node.exe, or some %PATH%\node.exe on Windows,
|
||||||
|
// and that every directory has its own cwd, so d:node.exe is valid.
|
||||||
|
var argv0 = process.argv[0];
|
||||||
|
if (!isWindows && argv0.indexOf('/') !== -1 && argv0.charAt(0) !== '/') {
|
||||||
|
var path = NativeModule.require('path');
|
||||||
|
process.argv[0] = path.join(cwd, process.argv[0]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.runThirdPartyMain = function() {
|
||||||
|
// To allow people to extend Node in different ways, this hook allows
|
||||||
|
// one to drop a file lib/_third_party_main.js into the build directory
|
||||||
|
// which will be executed instead of Node's normal loading.
|
||||||
|
if (!NativeModule.exists('_third_party_main')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
process.nextTick(function() {
|
||||||
|
NativeModule.require('_third_party_main');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.runDebugger = function() {
|
||||||
|
if (!(process.argv[1] == 'debug')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the debugger agent
|
||||||
|
var d = NativeModule.require('_debugger');
|
||||||
|
d.start();
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.runScript = function() {
|
||||||
|
if (!process.argv[1]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make process.argv[1] into a full path
|
||||||
|
if (!(/^http:\/\//).exec(process.argv[1])) {
|
||||||
|
var path = NativeModule.require('path');
|
||||||
|
process.argv[1] = path.resolve(process.argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var Module = NativeModule.require('module');
|
||||||
|
|
||||||
|
// REMOVEME: nextTick should not be necessary. This hack to get
|
||||||
|
// test/simple/test-exception-handler2.js working.
|
||||||
|
process.nextTick(Module.runMain);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.runEval = function() {
|
||||||
|
// -e, --eval
|
||||||
|
if (!process._eval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var Module = NativeModule.require('module');
|
||||||
|
|
||||||
|
var rv = new Module()._compile('return eval(process._eval)', 'eval');
|
||||||
|
console.log(rv);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
startup.runRepl = function() {
|
||||||
|
var Module = NativeModule.require('module');
|
||||||
|
// REPL
|
||||||
|
Module.requireRepl().start();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Below you find a minimal module system, which is used to load the node
|
||||||
|
// core modules found in lib/*.js. All core modules are compiled into the
|
||||||
|
// node binary, so they can be loaded faster.
|
||||||
|
|
||||||
|
var Script = process.binding('evals').Script;
|
||||||
|
var runInThisContext = Script.runInThisContext;
|
||||||
|
|
||||||
// Native modules don't need a full require function. So we can bootstrap
|
|
||||||
// most of the system with this mini module system.
|
|
||||||
var NativeModule = (function() {
|
|
||||||
function NativeModule(id) {
|
function NativeModule(id) {
|
||||||
this.filename = id + '.js';
|
this.filename = id + '.js';
|
||||||
this.id = id;
|
this.id = id;
|
||||||
@ -145,207 +419,5 @@
|
|||||||
NativeModule._cache[this.id] = this;
|
NativeModule._cache[this.id] = this;
|
||||||
};
|
};
|
||||||
|
|
||||||
return NativeModule;
|
startup();
|
||||||
})();
|
|
||||||
|
|
||||||
var Module = NativeModule.require('module').Module;
|
|
||||||
|
|
||||||
// Load events module in order to access prototype elements on process like
|
|
||||||
// process.addListener.
|
|
||||||
var events = NativeModule.require('events');
|
|
||||||
|
|
||||||
// Signal Handlers
|
|
||||||
(function() {
|
|
||||||
var signalWatchers = {};
|
|
||||||
var addListener = process.addListener;
|
|
||||||
var removeListener = process.removeListener;
|
|
||||||
|
|
||||||
function isSignal(event) {
|
|
||||||
return event.slice(0, 3) === 'SIG' && lazyConstants()[event];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap addListener for the special signal types
|
|
||||||
process.on = process.addListener = function(type, listener) {
|
|
||||||
var ret = addListener.apply(this, arguments);
|
|
||||||
if (isSignal(type)) {
|
|
||||||
if (!signalWatchers.hasOwnProperty(type)) {
|
|
||||||
var b = process.binding('signal_watcher');
|
|
||||||
var w = new b.SignalWatcher(lazyConstants()[type]);
|
|
||||||
w.callback = function() { process.emit(type); };
|
|
||||||
signalWatchers[type] = w;
|
|
||||||
w.start();
|
|
||||||
|
|
||||||
} else if (this.listeners(type).length === 1) {
|
|
||||||
signalWatchers[event].start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
process.removeListener = function(type, listener) {
|
|
||||||
var ret = removeListener.apply(this, arguments);
|
|
||||||
if (isSignal(type)) {
|
|
||||||
process.assert(signalWatchers.hasOwnProperty(type));
|
|
||||||
|
|
||||||
if (this.listeners(type).length === 0) {
|
|
||||||
signalWatchers[type].stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
|
||||||
global.setTimeout = function() {
|
|
||||||
var t = NativeModule.require('timers');
|
|
||||||
return t.setTimeout.apply(this, arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
global.setInterval = function() {
|
|
||||||
var t = NativeModule.require('timers');
|
|
||||||
return t.setInterval.apply(this, arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
global.clearTimeout = function() {
|
|
||||||
var t = NativeModule.require('timers');
|
|
||||||
return t.clearTimeout.apply(this, arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
global.clearInterval = function() {
|
|
||||||
var t = NativeModule.require('timers');
|
|
||||||
return t.clearInterval.apply(this, arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var stdout, stdin;
|
|
||||||
|
|
||||||
|
|
||||||
process.__defineGetter__('stdout', function() {
|
|
||||||
if (stdout) return stdout;
|
|
||||||
|
|
||||||
var binding = process.binding('stdio'),
|
|
||||||
net = NativeModule.require('net'),
|
|
||||||
fs = NativeModule.require('fs'),
|
|
||||||
tty = NativeModule.require('tty'),
|
|
||||||
fd = binding.stdoutFD;
|
|
||||||
|
|
||||||
if (binding.isatty(fd)) {
|
|
||||||
stdout = new tty.WriteStream(fd);
|
|
||||||
} else if (binding.isStdoutBlocking()) {
|
|
||||||
stdout = new fs.WriteStream(null, {fd: fd});
|
|
||||||
} else {
|
|
||||||
stdout = new net.Stream(fd);
|
|
||||||
// FIXME Should probably have an option in net.Stream to create a
|
|
||||||
// stream from an existing fd which is writable only. But for now
|
|
||||||
// we'll just add this hack and set the `readable` member to false.
|
|
||||||
// Test: ./node test/fixtures/echo.js < /etc/passwd
|
|
||||||
stdout.readable = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return stdout;
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
process.__defineGetter__('stdin', function() {
|
|
||||||
if (stdin) return stdin;
|
|
||||||
|
|
||||||
var binding = process.binding('stdio'),
|
|
||||||
net = NativeModule.require('net'),
|
|
||||||
fs = NativeModule.require('fs'),
|
|
||||||
tty = NativeModule.require('tty'),
|
|
||||||
fd = binding.openStdin();
|
|
||||||
|
|
||||||
if (binding.isatty(fd)) {
|
|
||||||
stdin = new tty.ReadStream(fd);
|
|
||||||
} else if (binding.isStdinBlocking()) {
|
|
||||||
stdin = new fs.ReadStream(null, {fd: fd});
|
|
||||||
} else {
|
|
||||||
stdin = new net.Stream(fd);
|
|
||||||
stdin.readable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return stdin;
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
process.openStdin = function() {
|
|
||||||
process.stdin.resume();
|
|
||||||
return process.stdin;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Lazy load console object
|
|
||||||
global.__defineGetter__('console', function() {
|
|
||||||
return NativeModule.require('console');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
global.Buffer = NativeModule.require('buffer').Buffer;
|
|
||||||
|
|
||||||
process.exit = function(code) {
|
|
||||||
process.emit('exit', code || 0);
|
|
||||||
process.reallyExit(code || 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
process.kill = function(pid, sig) {
|
|
||||||
sig = sig || 'SIGTERM';
|
|
||||||
if (!lazyConstants()[sig]) throw new Error('Unknown signal: ' + sig);
|
|
||||||
process._kill(pid, lazyConstants()[sig]);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var cwd = process.cwd();
|
|
||||||
var path = NativeModule.require('path');
|
|
||||||
var isWindows = process.platform === 'win32';
|
|
||||||
|
|
||||||
// Make process.argv[0] and process.argv[1] into full paths, but only
|
|
||||||
// touch argv[0] if it's not a system $PATH lookup.
|
|
||||||
// TODO: Make this work on Windows as well. Note that "node" might
|
|
||||||
// execute cwd\node.exe, or some %PATH%\node.exe on Windows,
|
|
||||||
// and that every directory has its own cwd, so d:node.exe is valid.
|
|
||||||
var argv0 = process.argv[0];
|
|
||||||
if (!isWindows && argv0.indexOf('/') !== -1 && argv0.charAt(0) !== '/') {
|
|
||||||
process.argv[0] = path.join(cwd, process.argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// To allow people to extend Node in different ways, this hook allows
|
|
||||||
// one to drop a file lib/_third_party_main.js into the build directory
|
|
||||||
// which will be executed instead of Node's normal loading.
|
|
||||||
if (NativeModule.exists('_third_party_main')) {
|
|
||||||
process.nextTick(function() {
|
|
||||||
NativeModule.require('_third_party_main');
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv[1]) {
|
|
||||||
if (process.argv[1] == 'debug') {
|
|
||||||
// Start the debugger agent
|
|
||||||
var d = NativeModule.require('_debugger');
|
|
||||||
d.start();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load Module
|
|
||||||
// make process.argv[1] into a full path
|
|
||||||
if (!(/^http:\/\//).exec(process.argv[1])) {
|
|
||||||
process.argv[1] = path.resolve(process.argv[1]);
|
|
||||||
}
|
|
||||||
// REMOVEME: nextTick should not be necessary. This hack to get
|
|
||||||
// test/simple/test-exception-handler2.js working.
|
|
||||||
process.nextTick(Module.runMain);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process._eval) {
|
|
||||||
// -e, --eval
|
|
||||||
var rv = new Module()._compile('return eval(process._eval)', 'eval');
|
|
||||||
console.log(rv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// REPL
|
|
||||||
Module.requireRepl().start();
|
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user