2011-03-10 00:54:52 -08:00
|
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
// copy of this software and associated documentation files (the
|
|
|
|
// "Software"), to deal in the Software without restriction, including
|
|
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
|
|
// following conditions:
|
|
|
|
//
|
|
|
|
// The above copyright notice and this permission notice shall be included
|
|
|
|
// in all copies or substantial portions of the Software.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
// 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.
|
2010-12-02 12:11:23 -08:00
|
|
|
(function(process) {
|
|
|
|
global = this;
|
2009-11-07 14:37:22 +01:00
|
|
|
|
2011-07-19 01:46:38 -07:00
|
|
|
var EventEmitter;
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
function startup() {
|
2011-07-01 19:30:15 -07:00
|
|
|
|
2011-09-15 00:28:45 +02:00
|
|
|
if ('NODE_USE_UV' in process.env) {
|
|
|
|
process.features.uv = process.env.NODE_USE_UV != '0';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ('NODE_USE_HTTP1' in process.env) {
|
|
|
|
process.features.http1 = process.env.NODE_USE_HTTP1 != '0';
|
|
|
|
}
|
2011-07-01 19:30:15 -07:00
|
|
|
|
2011-08-11 02:47:43 +02:00
|
|
|
// make sure --use-uv is propagated to child processes
|
|
|
|
if (process.features.uv) {
|
|
|
|
process.env.NODE_USE_UV = '1';
|
|
|
|
} else {
|
|
|
|
delete process.env.NODE_USE_UV;
|
|
|
|
}
|
|
|
|
|
2011-07-19 01:46:38 -07:00
|
|
|
EventEmitter = NativeModule.require('events').EventEmitter;
|
|
|
|
process.__proto__ = EventEmitter.prototype;
|
|
|
|
process.EventEmitter = EventEmitter; // process.EventEmitter is deprecated
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.globalVariables();
|
|
|
|
startup.globalTimeouts();
|
|
|
|
startup.globalConsole();
|
2010-11-21 14:20:22 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processAssert();
|
|
|
|
startup.processNextTick();
|
|
|
|
startup.processStdio();
|
|
|
|
startup.processKillAndExit();
|
|
|
|
startup.processSignalHandlers();
|
2010-11-21 14:20:22 -08:00
|
|
|
|
2011-05-11 00:41:16 -07:00
|
|
|
startup.processChannel();
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.removedMethods();
|
2010-11-21 14:20:22 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.resolveArgv0();
|
2010-01-18 10:27:27 -08:00
|
|
|
|
2011-03-15 10:35:49 -07:00
|
|
|
// There are various modes that Node can run in. The most common two
|
|
|
|
// are running from a script and running the REPL - but there are a few
|
|
|
|
// others like the debugger or running --eval arguments. Here we decide
|
|
|
|
// which mode we run in.
|
|
|
|
|
|
|
|
if (NativeModule.exists('_third_party_main')) {
|
|
|
|
// 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.
|
|
|
|
process.nextTick(function() {
|
|
|
|
NativeModule.require('_third_party_main');
|
|
|
|
});
|
|
|
|
|
|
|
|
} else if (process.argv[1] == 'debug') {
|
|
|
|
// Start the debugger agent
|
|
|
|
var d = NativeModule.require('_debugger');
|
|
|
|
d.start();
|
|
|
|
|
2011-07-05 12:07:08 +01:00
|
|
|
} else if (process._eval != null) {
|
|
|
|
// User passed '-e' or '--eval' arguments to Node.
|
|
|
|
var Module = NativeModule.require('module');
|
|
|
|
var path = NativeModule.require('path');
|
|
|
|
var cwd = process.cwd();
|
|
|
|
|
|
|
|
var module = new Module('eval');
|
|
|
|
module.filename = path.join(cwd, 'eval');
|
|
|
|
module.paths = Module._nodeModulePaths(cwd);
|
2011-07-25 23:54:44 +02:00
|
|
|
module._compile('eval(process._eval)', 'eval');
|
2011-07-05 12:07:08 +01:00
|
|
|
|
2011-03-15 10:35:49 -07:00
|
|
|
} else if (process.argv[1]) {
|
|
|
|
// make process.argv[1] into a full path
|
2011-08-16 20:12:54 +03:00
|
|
|
var path = NativeModule.require('path');
|
|
|
|
process.argv[1] = path.resolve(process.argv[1]);
|
2010-01-18 10:27:27 -08:00
|
|
|
|
2011-03-15 10:35:49 -07:00
|
|
|
var Module = NativeModule.require('module');
|
|
|
|
// REMOVEME: nextTick should not be necessary. This hack to get
|
|
|
|
// test/simple/test-exception-handler2.js working.
|
|
|
|
// Main entry point into most programs:
|
|
|
|
process.nextTick(Module.runMain);
|
2010-08-27 02:50:12 -06:00
|
|
|
|
2011-03-15 10:35:49 -07:00
|
|
|
} else {
|
2011-03-15 10:50:24 -07:00
|
|
|
var binding = process.binding('stdio');
|
|
|
|
var fd = binding.openStdin();
|
2011-03-15 10:35:49 -07:00
|
|
|
var Module = NativeModule.require('module');
|
2011-03-15 10:50:24 -07:00
|
|
|
|
|
|
|
if (NativeModule.require('tty').isatty(fd)) {
|
|
|
|
// REPL
|
|
|
|
Module.requireRepl().start();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// Read all of stdin - execute it.
|
|
|
|
process.stdin.resume();
|
|
|
|
process.stdin.setEncoding('utf8');
|
|
|
|
|
|
|
|
var code = '';
|
|
|
|
process.stdin.on('data', function(d) {
|
|
|
|
code += d;
|
|
|
|
});
|
|
|
|
|
|
|
|
process.stdin.on('end', function() {
|
|
|
|
new Module()._compile(code, '[stdin]');
|
|
|
|
});
|
|
|
|
}
|
2010-09-01 05:01:38 -06:00
|
|
|
}
|
2011-01-24 23:15:10 +01:00
|
|
|
}
|
2010-08-06 12:31:41 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.globalVariables = function() {
|
|
|
|
global.process = process;
|
|
|
|
global.global = global;
|
|
|
|
global.GLOBAL = global;
|
|
|
|
global.root = global;
|
|
|
|
global.Buffer = NativeModule.require('buffer').Buffer;
|
2010-12-02 12:11:23 -08:00
|
|
|
};
|
2010-11-16 15:44:06 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.globalTimeouts = function() {
|
|
|
|
global.setTimeout = function() {
|
|
|
|
var t = NativeModule.require('timers');
|
|
|
|
return t.setTimeout.apply(this, arguments);
|
|
|
|
};
|
2010-11-21 15:07:34 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
global.setInterval = function() {
|
|
|
|
var t = NativeModule.require('timers');
|
|
|
|
return t.setInterval.apply(this, arguments);
|
|
|
|
};
|
2011-01-12 22:05:45 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
global.clearTimeout = function() {
|
|
|
|
var t = NativeModule.require('timers');
|
|
|
|
return t.clearTimeout.apply(this, arguments);
|
|
|
|
};
|
2010-11-15 10:22:24 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
global.clearInterval = function() {
|
|
|
|
var t = NativeModule.require('timers');
|
|
|
|
return t.clearInterval.apply(this, arguments);
|
|
|
|
};
|
|
|
|
};
|
2010-08-06 12:31:41 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.globalConsole = function() {
|
2011-07-27 16:36:03 -07:00
|
|
|
global.__defineGetter__('console', function() {
|
|
|
|
return NativeModule.require('console');
|
|
|
|
});
|
2011-01-24 23:15:10 +01:00
|
|
|
};
|
2010-08-06 12:31:41 -07:00
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup._lazyConstants = null;
|
|
|
|
|
|
|
|
startup.lazyConstants = function() {
|
|
|
|
if (!startup._lazyConstants) {
|
|
|
|
startup._lazyConstants = process.binding('constants');
|
|
|
|
}
|
|
|
|
return startup._lazyConstants;
|
|
|
|
};
|
2010-08-06 12:31:41 -07:00
|
|
|
|
2011-01-27 16:35:35 -08:00
|
|
|
var assert;
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processAssert = function() {
|
2011-01-27 16:35:35 -08:00
|
|
|
// Note that calls to assert() are pre-processed out by JS2C for the
|
|
|
|
// normal build of node. They persist only in the node_g build.
|
|
|
|
// Similarly for debug().
|
|
|
|
assert = process.assert = function(x, msg) {
|
|
|
|
if (!x) throw new Error(msg || 'assertion error');
|
2011-01-12 22:05:45 +01:00
|
|
|
};
|
2011-01-24 23:15:10 +01:00
|
|
|
};
|
2011-01-12 22:05:45 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processNextTick = function() {
|
|
|
|
var nextTickQueue = [];
|
2011-01-14 20:14:47 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
process._tickCallback = function() {
|
|
|
|
var l = nextTickQueue.length;
|
|
|
|
if (l === 0) return;
|
2011-01-14 20:14:47 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
try {
|
|
|
|
for (var i = 0; i < l; i++) {
|
|
|
|
nextTickQueue[i]();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
nextTickQueue.splice(0, i + 1);
|
|
|
|
if (i + 1 < l) {
|
|
|
|
process._needTickCallback();
|
|
|
|
}
|
|
|
|
throw e; // process.nextTick error, or 'error' event on first tick
|
|
|
|
}
|
2011-01-14 20:14:47 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
nextTickQueue.splice(0, l);
|
2011-01-12 22:05:45 +01:00
|
|
|
};
|
2010-08-06 12:31:41 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
process.nextTick = function(callback) {
|
|
|
|
nextTickQueue.push(callback);
|
|
|
|
process._needTickCallback();
|
|
|
|
};
|
|
|
|
};
|
2011-01-12 22:05:45 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processStdio = function() {
|
2011-07-27 16:36:03 -07:00
|
|
|
var stdout, stdin;
|
|
|
|
|
|
|
|
process.__defineGetter__('stdout', function() {
|
|
|
|
if (stdout) return stdout;
|
|
|
|
|
|
|
|
var binding = process.binding('stdio'),
|
|
|
|
fd = binding.stdoutFD;
|
|
|
|
|
2011-09-12 18:10:42 -07:00
|
|
|
// Note stdout._type is used for test-module-load-list.js
|
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
if (binding.isatty(fd)) {
|
2011-09-12 18:10:42 -07:00
|
|
|
var tty = NativeModule.require('tty');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdout = new tty.WriteStream(fd);
|
2011-09-12 18:10:42 -07:00
|
|
|
stdout._type = "tty";
|
2011-09-27 12:38:23 -07:00
|
|
|
|
|
|
|
// FIXME Hack to have stdout not keep the event loop alive.
|
|
|
|
// See https://github.com/joyent/node/issues/1726
|
|
|
|
binding.unref();
|
|
|
|
stdout.on('close', function() {
|
|
|
|
binding.ref();
|
|
|
|
});
|
2011-07-27 16:36:03 -07:00
|
|
|
} else if (binding.isStdoutBlocking()) {
|
2011-09-12 18:10:42 -07:00
|
|
|
var fs = NativeModule.require('fs');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdout = new fs.WriteStream(null, {fd: fd});
|
2011-09-12 18:10:42 -07:00
|
|
|
stdout._type = "fs";
|
2011-07-27 16:36:03 -07:00
|
|
|
} else {
|
2011-09-12 18:10:42 -07:00
|
|
|
var net = NativeModule.require('net');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdout = new net.Stream(fd);
|
2011-09-12 18:10:42 -07:00
|
|
|
|
2011-09-27 12:38:23 -07:00
|
|
|
// FIXME Hack to have stdout not keep the event loop alive.
|
|
|
|
// See https://github.com/joyent/node/issues/1726
|
|
|
|
binding.unref();
|
|
|
|
stdout.on('close', function() {
|
|
|
|
binding.ref();
|
|
|
|
});
|
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
// 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;
|
2011-09-12 18:10:42 -07:00
|
|
|
stdout._type = "pipe";
|
2011-07-27 16:36:03 -07:00
|
|
|
}
|
2011-01-24 23:15:10 +01:00
|
|
|
|
2011-09-15 13:57:41 -07:00
|
|
|
// For supporting legacy API we put the FD here.
|
|
|
|
stdout.fd = fd;
|
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
return stdout;
|
|
|
|
});
|
2011-01-24 23:15:10 +01:00
|
|
|
|
2011-07-19 01:46:38 -07:00
|
|
|
var stderr = process.stderr = new EventEmitter();
|
2011-02-07 15:14:21 -08:00
|
|
|
stderr.writable = true;
|
|
|
|
stderr.readable = false;
|
|
|
|
stderr.write = process.binding('stdio').writeError;
|
2011-02-03 14:03:44 -08:00
|
|
|
stderr.end = stderr.destroy = stderr.destroySoon = function() { };
|
2011-09-15 13:57:41 -07:00
|
|
|
// For supporting legacy API we put the FD here.
|
|
|
|
// XXX this could break things if anyone ever closes this stream?
|
|
|
|
stderr.fd = 2;
|
2011-02-03 14:03:44 -08:00
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
process.__defineGetter__('stdin', function() {
|
|
|
|
if (stdin) return stdin;
|
2011-01-24 23:15:10 +01:00
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
var binding = process.binding('stdio'),
|
|
|
|
fd = binding.openStdin();
|
2011-01-24 23:15:10 +01:00
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
if (binding.isatty(fd)) {
|
2011-09-12 18:10:42 -07:00
|
|
|
var tty = NativeModule.require('tty');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdin = new tty.ReadStream(fd);
|
|
|
|
} else if (binding.isStdinBlocking()) {
|
2011-09-12 18:10:42 -07:00
|
|
|
var fs = NativeModule.require('fs');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdin = new fs.ReadStream(null, {fd: fd});
|
|
|
|
} else {
|
2011-09-12 18:10:42 -07:00
|
|
|
var net = NativeModule.require('net');
|
2011-07-27 16:36:03 -07:00
|
|
|
stdin = new net.Stream(fd);
|
|
|
|
stdin.readable = true;
|
|
|
|
}
|
|
|
|
|
2011-09-15 13:57:41 -07:00
|
|
|
// For supporting legacy API we put the FD here.
|
|
|
|
stdin.fd = fd;
|
|
|
|
|
2011-07-27 16:36:03 -07:00
|
|
|
return stdin;
|
|
|
|
});
|
2011-01-14 20:14:47 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
process.openStdin = function() {
|
|
|
|
process.stdin.resume();
|
|
|
|
return process.stdin;
|
2011-01-14 20:14:47 +01:00
|
|
|
};
|
2011-01-24 23:15:10 +01:00
|
|
|
};
|
2011-01-14 20:14:47 +01:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processKillAndExit = function() {
|
|
|
|
process.exit = function(code) {
|
|
|
|
process.emit('exit', code || 0);
|
|
|
|
process.reallyExit(code || 0);
|
2011-01-14 20:14:47 +01:00
|
|
|
};
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
process.kill = function(pid, sig) {
|
2011-02-15 09:40:41 -08:00
|
|
|
// preserve null signal
|
|
|
|
if (0 === sig) {
|
|
|
|
process._kill(pid, 0);
|
|
|
|
} else {
|
|
|
|
sig = sig || 'SIGTERM';
|
|
|
|
if (startup.lazyConstants()[sig]) {
|
|
|
|
process._kill(pid, startup.lazyConstants()[sig]);
|
|
|
|
} else {
|
|
|
|
throw new Error('Unknown signal: ' + sig);
|
|
|
|
}
|
2011-01-24 23:15:10 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.processSignalHandlers = function() {
|
|
|
|
// Load events module in order to access prototype elements on process like
|
|
|
|
// process.addListener.
|
2010-12-02 12:11:23 -08:00
|
|
|
var signalWatchers = {};
|
|
|
|
var addListener = process.addListener;
|
|
|
|
var removeListener = process.removeListener;
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2010-12-02 12:11:23 -08:00
|
|
|
function isSignal(event) {
|
2011-01-24 23:15:10 +01:00
|
|
|
return event.slice(0, 3) === 'SIG' && startup.lazyConstants()[event];
|
2010-09-19 11:20:25 -07:00
|
|
|
}
|
|
|
|
|
2010-12-02 12:11:23 -08:00
|
|
|
// 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');
|
2011-01-24 23:15:10 +01:00
|
|
|
var w = new b.SignalWatcher(startup.lazyConstants()[type]);
|
2010-12-02 12:11:23 -08:00
|
|
|
w.callback = function() { process.emit(type); };
|
|
|
|
signalWatchers[type] = w;
|
|
|
|
w.start();
|
|
|
|
|
|
|
|
} else if (this.listeners(type).length === 1) {
|
2011-02-21 19:31:01 -05:00
|
|
|
signalWatchers[type].start();
|
2010-12-02 12:11:23 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2010-12-02 12:11:23 -08:00
|
|
|
process.removeListener = function(type, listener) {
|
|
|
|
var ret = removeListener.apply(this, arguments);
|
|
|
|
if (isSignal(type)) {
|
2011-01-27 16:35:35 -08:00
|
|
|
assert(signalWatchers.hasOwnProperty(type));
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2010-12-02 12:11:23 -08:00
|
|
|
if (this.listeners(type).length === 0) {
|
|
|
|
signalWatchers[type].stop();
|
|
|
|
}
|
2010-09-19 11:20:25 -07:00
|
|
|
}
|
|
|
|
|
2010-12-02 12:11:23 -08:00
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-05-11 00:41:16 -07:00
|
|
|
|
|
|
|
startup.processChannel = function() {
|
|
|
|
// If we were spawned with env NODE_CHANNEL_FD then load that up and
|
|
|
|
// start parsing data from that stream.
|
|
|
|
if (process.env.NODE_CHANNEL_FD) {
|
|
|
|
var fd = parseInt(process.env.NODE_CHANNEL_FD);
|
|
|
|
assert(fd >= 0);
|
|
|
|
var cp = NativeModule.require('child_process');
|
2011-05-11 13:32:40 -07:00
|
|
|
cp._forkChild(fd);
|
2011-05-11 00:41:16 -07:00
|
|
|
assert(process.send);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup._removedProcessMethods = {
|
2011-01-27 16:59:28 -08:00
|
|
|
'assert': 'process.assert() use require("assert").ok() instead',
|
2011-01-24 23:15:10 +01:00
|
|
|
'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',
|
2010-12-02 12:11:23 -08:00
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup.removedMethods = function() {
|
|
|
|
for (var method in startup._removedProcessMethods) {
|
|
|
|
var reason = startup._removedProcessMethods[method];
|
|
|
|
process[method] = startup._removedMethod(reason);
|
|
|
|
}
|
2010-12-02 12:11:23 -08:00
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
startup._removedMethod = function(reason) {
|
|
|
|
return function() {
|
|
|
|
throw new Error(reason);
|
|
|
|
};
|
2010-12-02 12:11:23 -08:00
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
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]);
|
|
|
|
}
|
|
|
|
};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
// 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.
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-03-30 10:06:19 -07:00
|
|
|
var Script = process.binding('evals').NodeScript;
|
2011-01-24 23:15:10 +01:00
|
|
|
var runInThisContext = Script.runInThisContext;
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-06-17 13:51:40 +02:00
|
|
|
// A special hook to test the new platform layer. Use the command-line
|
|
|
|
// flag --use-uv to enable the libuv backend instead of the legacy
|
|
|
|
// backend.
|
|
|
|
function translateId(id) {
|
2011-06-29 15:14:55 +02:00
|
|
|
switch (id) {
|
2011-07-26 00:39:57 +02:00
|
|
|
case 'http':
|
2011-08-02 21:28:31 +02:00
|
|
|
return process.features.http1 ? 'http' : 'http2';
|
2011-07-26 00:39:57 +02:00
|
|
|
|
|
|
|
case 'https':
|
2011-08-02 21:28:31 +02:00
|
|
|
return process.features.http1 ? 'https' : 'https2';
|
2011-07-26 00:39:57 +02:00
|
|
|
|
2011-06-29 15:14:55 +02:00
|
|
|
case 'net':
|
2011-07-23 23:16:48 +02:00
|
|
|
return process.features.uv ? 'net_uv' : 'net_legacy';
|
2011-06-29 15:14:55 +02:00
|
|
|
|
2011-09-20 15:57:23 -07:00
|
|
|
case 'tty':
|
|
|
|
return process.features.uv ? 'tty_uv' : 'tty_legacy';
|
|
|
|
|
2011-07-31 15:58:10 -07:00
|
|
|
case 'child_process':
|
|
|
|
return process.features.uv ? 'child_process_uv' :
|
|
|
|
'child_process_legacy';
|
|
|
|
|
2011-06-29 15:14:55 +02:00
|
|
|
case 'timers':
|
2011-07-23 23:16:48 +02:00
|
|
|
return process.features.uv ? 'timers_uv' : 'timers_legacy';
|
2011-06-29 15:14:55 +02:00
|
|
|
|
2011-08-20 03:47:40 +02:00
|
|
|
case 'dgram':
|
|
|
|
return process.features.uv ? 'dgram_uv' : 'dgram_legacy';
|
|
|
|
|
2011-07-05 00:17:20 +02:00
|
|
|
case 'dns':
|
2011-07-23 23:16:48 +02:00
|
|
|
return process.features.uv ? 'dns_uv' : 'dns_legacy';
|
2011-07-05 00:17:20 +02:00
|
|
|
|
2011-06-29 15:14:55 +02:00
|
|
|
default:
|
|
|
|
return id;
|
2011-06-17 13:51:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
function NativeModule(id) {
|
2011-06-17 13:51:40 +02:00
|
|
|
id = translateId(id);
|
2011-01-24 23:15:10 +01:00
|
|
|
this.filename = id + '.js';
|
|
|
|
this.id = id;
|
|
|
|
this.exports = {};
|
|
|
|
this.loaded = false;
|
|
|
|
}
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
NativeModule._source = process.binding('natives');
|
|
|
|
NativeModule._cache = {};
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
NativeModule.require = function(id) {
|
2011-06-17 13:51:40 +02:00
|
|
|
id = translateId(id);
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
if (id == 'native_module') {
|
|
|
|
return NativeModule;
|
|
|
|
}
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
var cached = NativeModule.getCached(id);
|
|
|
|
if (cached) {
|
|
|
|
return cached.exports;
|
|
|
|
}
|
2010-09-19 11:20:25 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
if (!NativeModule.exists(id)) {
|
|
|
|
throw new Error('No such native module ' + id);
|
|
|
|
}
|
2011-01-05 11:12:36 -08:00
|
|
|
|
2011-07-27 19:30:32 -07:00
|
|
|
process.moduleLoadList.push("NativeModule " + id);
|
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
var nativeModule = new NativeModule(id);
|
2010-06-07 16:15:41 -07:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
nativeModule.compile();
|
|
|
|
nativeModule.cache();
|
2011-01-13 16:30:27 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
return nativeModule.exports;
|
|
|
|
};
|
2010-12-21 19:14:29 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
NativeModule.getCached = function(id) {
|
2011-06-17 13:51:40 +02:00
|
|
|
id = translateId(id);
|
2011-01-24 23:15:10 +01:00
|
|
|
return NativeModule._cache[id];
|
2011-01-12 22:05:45 +01:00
|
|
|
}
|
2010-12-02 12:11:23 -08:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
NativeModule.exists = function(id) {
|
2011-06-17 13:51:40 +02:00
|
|
|
id = translateId(id);
|
2011-01-24 23:15:10 +01:00
|
|
|
return (id in NativeModule._source);
|
2010-06-07 16:15:41 -07:00
|
|
|
}
|
2009-09-07 14:09:18 +02:00
|
|
|
|
2011-01-24 23:15:10 +01:00
|
|
|
NativeModule.getSource = function(id) {
|
2011-06-17 13:51:40 +02:00
|
|
|
id = translateId(id);
|
2011-01-24 23:15:10 +01:00
|
|
|
return NativeModule._source[id];
|
|
|
|
}
|
|
|
|
|
|
|
|
NativeModule.wrap = function(script) {
|
|
|
|
return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
NativeModule.wrapper = [
|
2011-07-29 11:56:05 -07:00
|
|
|
'(function (exports, require, module, __filename, __dirname) { ',
|
2011-01-24 23:15:10 +01:00
|
|
|
'\n});'
|
|
|
|
];
|
|
|
|
|
|
|
|
NativeModule.prototype.compile = function() {
|
|
|
|
var source = NativeModule.getSource(this.id);
|
|
|
|
source = NativeModule.wrap(source);
|
|
|
|
|
|
|
|
var fn = runInThisContext(source, this.filename, true);
|
|
|
|
fn(this.exports, NativeModule.require, this, this.filename);
|
|
|
|
|
|
|
|
this.loaded = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
NativeModule.prototype.cache = function() {
|
|
|
|
NativeModule._cache[this.id] = this;
|
|
|
|
};
|
|
|
|
|
|
|
|
startup();
|
2010-03-11 22:05:09 -08:00
|
|
|
});
|