Browse Source

lint util.js and src/node.js

v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
558e5ba2b0
  1. 5
      Makefile
  2. 165
      lib/util.js
  3. 884
      src/node.js

5
Makefile

@ -130,11 +130,8 @@ bench-idle:
sleep 1 sleep 1
./node benchmark/idle_clients.js & ./node benchmark/idle_clients.js &
GJSLINT = PYTHONPATH=tools/closure_linter/ \
python tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc
jslint: jslint:
$(GJSLINT) -r lib/ -r src/ -r test/ PYTHONPATH=tools/closure_linter/ python tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ -r test/
cpplint: cpplint:
@python tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c) @python tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c)

165
lib/util.js

@ -31,7 +31,7 @@ var error = exports.error = function(x) {
* Echos the value of a value. Trys to print the value out * Echos the value of a value. Trys to print the value out
* in the best way possible given the different types. * in the best way possible given the different types.
* *
* @param {Object} value The object to print out. * @param {Object} obj The object to print out.
* @param {Boolean} showHidden Flag that shows hidden (not enumerable) * @param {Boolean} showHidden Flag that shows hidden (not enumerable)
* properties of objects. * properties of objects.
* @param {Number} depth Depth in which to descend in object. Default is 2. * @param {Number} depth Depth in which to descend in object. Default is 2.
@ -43,30 +43,32 @@ exports.inspect = function(obj, showHidden, depth, colors) {
var stylize = function(str, styleType) { var stylize = function(str, styleType) {
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
var styles = { 'bold' : [1, 22] var styles =
, 'italic' : [3, 23] { 'bold' : [1, 22],
, 'underline' : [4, 24] 'italic' : [3, 23],
, 'inverse' : [7, 27] 'underline' : [4, 24],
, 'white' : [37, 39] 'inverse' : [7, 27],
, 'grey' : [90, 39] 'white' : [37, 39],
, 'black' : [30, 39] 'grey' : [90, 39],
, 'blue' : [34, 39] 'black' : [30, 39],
, 'cyan' : [36, 39] 'blue' : [34, 39],
, 'green' : [32, 39] 'cyan' : [36, 39],
, 'magenta' : [35, 39] 'green' : [32, 39],
, 'red' : [31, 39] 'magenta' : [35, 39],
, 'yellow' : [33, 39] 'red' : [31, 39],
}; 'yellow' : [33, 39] };
var style = { 'special': 'grey'
, 'number': 'blue' var style =
, 'boolean': 'blue' { 'special': 'grey',
, 'undefined': 'red' 'number': 'blue',
, 'null': 'red' 'boolean': 'blue',
, 'string': 'green' 'undefined': 'red',
, 'date': 'magenta' 'null': 'red',
//, "name": intentionally not styling 'string': 'green',
, 'regexp': 'cyan' 'date': 'magenta',
}[styleType]; // "name": intentionally not styling
'regexp': 'cyan' }[styleType];
if (style) { if (style) {
return '\033[' + styles[style][0] + 'm' + str + return '\033[' + styles[style][0] + 'm' + str +
'\033[' + styles[style][1] + 'm'; '\033[' + styles[style][1] + 'm';
@ -91,14 +93,20 @@ exports.inspect = function(obj, showHidden, depth, colors) {
// Primitive types cannot have properties // Primitive types cannot have properties
switch (typeof value) { switch (typeof value) {
case 'undefined': return stylize('undefined', 'undefined'); case 'undefined':
case 'string': return stylize( return stylize('undefined', 'undefined');
JSON.stringify(value).replace(/'/g, "\\'")
.replace(/\\"/g, '"') case 'string':
.replace(/(^"|"$)/g, "'"), var simple = JSON.stringify(value).replace(/'/g, "\\'")
'string'); .replace(/\\"/g, '"')
case 'number': return stylize('' + value, 'number'); .replace(/(^"|"$)/g, "'");
case 'boolean': return stylize('' + value, 'boolean'); return stylize(simple, 'string');
case 'number':
return stylize('' + value, 'number');
case 'boolean':
return stylize('' + value, 'boolean');
} }
// For some reason typeof null is "object", so special case here. // For some reason typeof null is "object", so special case here.
if (value === null) { if (value === null) {
@ -114,13 +122,14 @@ exports.inspect = function(obj, showHidden, depth, colors) {
if (isRegExp(value)) { if (isRegExp(value)) {
return stylize('' + value, 'regexp'); return stylize('' + value, 'regexp');
} else { } else {
return stylize('[Function' + (value.name ? ': ' + value.name : '') + ']', 'special'); var name = value.name ? ': ' + value.name : '';
return stylize('[Function' + name + ']', 'special');
} }
} }
// Dates without properties can be shortcutted // Dates without properties can be shortcutted
if (isDate(value) && keys.length === 0) { if (isDate(value) && keys.length === 0) {
return stylize(value.toUTCString(), 'date'); return stylize(value.toUTCString(), 'date');
} }
var base, type, braces; var base, type, braces;
@ -135,7 +144,8 @@ exports.inspect = function(obj, showHidden, depth, colors) {
// Make functions say that they are functions // Make functions say that they are functions
if (typeof value === 'function') { if (typeof value === 'function') {
base = (isRegExp(value)) ? ' ' + value : ' [Function' + (value.name ? ': ' + value.name : '') + ']'; var n = value.name ? ': ' + value.name : '';
base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']';
} else { } else {
base = ''; base = '';
} }
@ -222,20 +232,18 @@ exports.inspect = function(obj, showHidden, depth, colors) {
var numLinesEst = 0; var numLinesEst = 0;
var length = output.reduce(function(prev, cur) { var length = output.reduce(function(prev, cur) {
numLinesEst++; numLinesEst++;
if (cur.indexOf('\n') >= 0) { if (cur.indexOf('\n') >= 0) numLinesEst++;
numLinesEst++; return prev + cur.length + 1;
} }, 0);
return prev + cur.length + 1;
},0);
if (length > (require('readline').columns || 50)) { if (length > (require('readline').columns || 50)) {
output = braces[0] output = braces[0] +
+ (base === '' ? '' : base + '\n ') (base === '' ? '' : base + '\n ') +
+ ' ' ' ' +
+ output.join(',\n ') output.join(',\n ') +
+ ' ' ' ' +
+ braces[1]; braces[1];
} else { } else {
output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
@ -248,21 +256,22 @@ exports.inspect = function(obj, showHidden, depth, colors) {
function isArray(ar) { function isArray(ar) {
return ar instanceof Array return ar instanceof Array ||
|| Array.isArray(ar) Array.isArray(ar) ||
|| (ar && ar !== Object.prototype && isArray(ar.__proto__)); (ar && ar !== Object.prototype && isArray(ar.__proto__));
} }
function isRegExp(re) { function isRegExp(re) {
var s = ''+ re; var s = '' + re;
return re instanceof RegExp // easy case return re instanceof RegExp || // easy case
|| typeof(re) === 'function' // duck-type for context-switching evalcx case // duck-type for context-switching evalcx case
&& re.constructor.name === 'RegExp' typeof(re) === 'function' &&
&& re.compile re.constructor.name === 'RegExp' &&
&& re.test re.compile &&
&& re.exec re.test &&
&& s.match(/^\/.*\/[gim]{0,3}$/); re.exec &&
s.match(/^\/.*\/[gim]{0,3}$/);
} }
@ -279,7 +288,8 @@ var pWarning;
exports.p = function() { exports.p = function() {
if (!pWarning) { if (!pWarning) {
pWarning = 'util.p will be removed in future versions of Node. Use util.puts(util.inspect()) instead.\n'; pWarning = 'util.p will be removed in future versions of Node. ' +
'Use util.puts(util.inspect()) instead.\n';
exports.error(pWarning); exports.error(pWarning);
} }
for (var i = 0, len = arguments.length; i < len; ++i) { for (var i = 0, len = arguments.length; i < len; ++i) {
@ -293,15 +303,16 @@ function pad(n) {
} }
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
'Oct', 'Nov', 'Dec'];
// 26 Feb 16:19:34 // 26 Feb 16:19:34
function timestamp() { function timestamp() {
var d = new Date(); var d = new Date();
return [d.getDate() var time = [pad(d.getHours()),
, months[d.getMonth()] pad(d.getMinutes()),
, [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':') pad(d.getSeconds())].join(':');
].join(' '); return [d.getDate(), months[d.getMonth()], time].join(' ');
} }
@ -313,7 +324,8 @@ exports.log = function(msg) {
var execWarning; var execWarning;
exports.exec = function() { exports.exec = function() {
if (!execWarning) { if (!execWarning) {
execWarning = 'util.exec has moved to the "child_process" module. Please update your source code.'; execWarning = 'util.exec has moved to the "child_process" module.' +
' Please update your source code.';
error(execWarning); error(execWarning);
} }
return require('child_process').exec.apply(this, arguments); return require('child_process').exec.apply(this, arguments);
@ -330,8 +342,13 @@ exports.pump = function(readStream, writeStream, callback) {
} }
} }
if (!readStream.pause) readStream.pause = function() {readStream.emit('pause');}; if (!readStream.pause) {
if (!readStream.resume) readStream.resume = function() {readStream.emit('resume');}; readStream.pause = function() {readStream.emit('pause');};
}
if (!readStream.resume) {
readStream.resume = function() {readStream.emit('resume');};
}
readStream.addListener('data', function(chunk) { readStream.addListener('data', function(chunk) {
if (writeStream.write(chunk) === false) readStream.pause(); if (writeStream.write(chunk) === false) readStream.pause();
@ -368,6 +385,7 @@ exports.pump = function(readStream, writeStream, callback) {
}); });
}; };
/** /**
* Inherit the prototype methods from one constructor into another. * Inherit the prototype methods from one constructor into another.
* *
@ -382,11 +400,8 @@ exports.pump = function(readStream, writeStream, callback) {
* @param {function} superCtor Constructor function to inherit prototype from. * @param {function} superCtor Constructor function to inherit prototype from.
*/ */
exports.inherits = function(ctor, superCtor) { exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor; ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, { ctor.prototype = Object.create(superCtor.prototype, {
constructor: { constructor: { value: ctor, enumerable: false }
value: ctor, });
enumerable: false
}
});
}; };

884
src/node.js

@ -1,536 +1,554 @@
(function (process) { (function(process) {
global = this; global = this;
global.process = process; global.process = process;
global.global = global; global.global = global;
global.GLOBAL = global; global.GLOBAL = global;
global.root = global; global.root = global;
/** deprecation errors ************************************************/ /** deprecation errors ************************************************/
function removed (reason) { function removed(reason) {
return function () { return function() {
throw new Error(reason); throw new Error(reason);
}; };
} }
process.debug = removed("process.debug() has moved. Use require('sys') to bring it back.");
process.error = removed("process.error() has moved. Use require('sys') to bring it back.");
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.debug =
if (!x) throw new Error(msg || "assertion error"); 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) {
if (!x) throw new Error(msg || 'assertion error');
};
var evals = process.binding('evals'); var evals = process.binding('evals');
// lazy loaded. // lazy loaded.
var constants; var constants;
function lazyConstants () { function lazyConstants() {
if (!constants) constants = process.binding("constants"); if (!constants) constants = process.binding('constants');
return constants; return constants;
} }
// nextTick() // nextTick()
var nextTickQueue = []; var nextTickQueue = [];
process._tickCallback = function () { process._tickCallback = function() {
var l = nextTickQueue.length; var l = nextTickQueue.length;
if (l === 0) return; if (l === 0) return;
try { try {
for (var i = 0; i < l; i++) { for (var i = 0; i < l; i++) {
nextTickQueue[i](); nextTickQueue[i]();
}
} }
} catch (e) {
catch(e) { nextTickQueue.splice(0, i + 1);
nextTickQueue.splice(0, i+1); if (i + 1 < l) {
if (i+1 < l) { process._needTickCallback();
process._needTickCallback(); }
throw e; // process.nextTick error, or 'error' event on first tick
} }
throw e; // process.nextTick error, or 'error' event on first tick
}
nextTickQueue.splice(0, l); nextTickQueue.splice(0, l);
};
process.nextTick = function (callback) {
nextTickQueue.push(callback);
process._needTickCallback();
};
var internalModuleCache = {};
// This contains the source code for the files in lib/
// Like, natives.fs is the contents of lib/fs.js
var natives = process.binding('natives');
// Native modules don't need a full require function. So we can bootstrap
// most of the system with this mini-require.
function requireNative (id) {
if (internalModuleCache[id]) return internalModuleCache[id].exports;
if (!natives[id]) throw new Error('No such native module ' + id);
var fn = evals.Script.runInThisContext(
"(function (module, exports, require) {" + natives[id] + "\n})",
id + '.js');
var m = {id: id, exports: {}};
fn(m, m.exports, requireNative);
m.loaded = true;
internalModuleCache[id] = m;
return m.exports;
}
// Module System
var module = (function () {
var exports = {};
// Set the environ variable NODE_MODULE_CONTEXTS=1 to make node load all
// modules in thier own context.
var contextLoad = false;
if (+process.env["NODE_MODULE_CONTEXTS"] > 0) contextLoad = true;
var moduleCache = {};
function Module (id, parent) {
this.id = id;
this.exports = {};
this.parent = parent;
this.filename = null;
this.loaded = false;
this.exited = false;
this.children = [];
}; };
process.nextTick = function(callback) {
nextTickQueue.push(callback);
process._needTickCallback();
};
// Modules var internalModuleCache = {};
var debugLevel = parseInt(process.env["NODE_DEBUG"], 16); // This contains the source code for the files in lib/
function debug (x) { // Like, natives.fs is the contents of lib/fs.js
if (debugLevel & 1) console.error(x); var natives = process.binding('natives');
// Native modules don't need a full require function. So we can bootstrap
// most of the system with this mini-require.
function requireNative(id) {
if (internalModuleCache[id]) return internalModuleCache[id].exports;
if (!natives[id]) throw new Error('No such native module ' + id);
var fn = evals.Script.runInThisContext(
'(function (module, exports, require) {' + natives[id] + '\n})',
id + '.js');
var m = {id: id, exports: {}};
fn(m, m.exports, requireNative);
m.loaded = true;
internalModuleCache[id] = m;
return m.exports;
} }
// Module System
var module = (function() {
var exports = {};
// Set the environ variable NODE_MODULE_CONTEXTS=1 to make node load all
// modules in thier own context.
var contextLoad = false;
if (+process.env['NODE_MODULE_CONTEXTS'] > 0) contextLoad = true;
var moduleCache = {};
function Module(id, parent) {
this.id = id;
this.exports = {};
this.parent = parent;
this.filename = null;
this.loaded = false;
this.exited = false;
this.children = [];
};
var path = requireNative('path');
var modulePaths = [path.join(process.execPath, "..", "..", "lib", "node")];
if (process.env["HOME"]) { // Modules
modulePaths.unshift(path.join(process.env["HOME"], ".node_libraries"));
modulePaths.unshift(path.join(process.env["HOME"], ".node_modules"));
}
if (process.env["NODE_PATH"]) { var debugLevel = parseInt(process.env['NODE_DEBUG'], 16);
modulePaths = process.env["NODE_PATH"].split(":").concat(modulePaths); if (debugLevel & 1) {
} debug = function(x) { console.error(x); };
} else {
debug = function() { };
}
var extensions = {}; var path = requireNative('path');
var registerExtension = removed('require.registerExtension() removed. Use require.extensions instead');
// Which files to traverse while finding id? Returns generator function.
function traverser (id, dirs) {
var head = [], inDir = [], dirs = dirs.slice(),
exts = Object.keys(extensions);
return function next () {
var result = head.shift();
if (result) { return result; }
var gen = inDir.shift();
if (gen) { head = gen(); return next(); }
var dir = dirs.shift();
if (dir !== undefined) {
function direct (ext) { return path.join(dir, id + ext); }
function index (ext) { return path.join(dir, id, 'index' + ext); }
inDir = [
function () { return exts.map(direct); },
function () { return exts.map(index); }
];
head = [path.join(dir, id)];
return next();
}
};
}
function findModulePath (request, paths) { var modulePaths = [path.join(process.execPath, '..', '..', 'lib', 'node')];
var nextLoc = traverser(request, request.charAt(0) === '/' ? [''] : paths);
var fs = requireNative('fs'); if (process.env['HOME']) {
modulePaths.unshift(path.join(process.env['HOME'], '.node_libraries'));
modulePaths.unshift(path.join(process.env['HOME'], '.node_modules'));
}
var location, stats; if (process.env['NODE_PATH']) {
while (location = nextLoc()) { modulePaths = process.env['NODE_PATH'].split(':').concat(modulePaths);
try { stats = fs.statSync(location); } catch(e) { continue; }
if (stats && !stats.isDirectory()) return location;
} }
return false;
}
var extensions = {};
var registerExtension =
removed('require.registerExtension() removed.' +
' Use require.extensions instead');
// Which files to traverse while finding id? Returns generator function.
function traverser(id, dirs) {
var head = [], inDir = [], dirs = dirs.slice(),
exts = Object.keys(extensions);
return function next() {
var result = head.shift();
if (result) { return result; }
var gen = inDir.shift();
if (gen) { head = gen(); return next(); }
var dir = dirs.shift();
if (dir !== undefined) {
function direct(ext) { return path.join(dir, id + ext); }
function index(ext) { return path.join(dir, id, 'index' + ext); }
inDir = [
function() { return exts.map(direct); },
function() { return exts.map(index); }
];
head = [path.join(dir, id)];
return next();
}
};
}
// sync - no i/o performed function findModulePath(request, paths) {
function resolveModuleLookupPaths (request, parent) { var nextLoc =
traverser(request, request.charAt(0) === '/' ? [''] : paths);
if (natives[request]) return [request, []]; var fs = requireNative('fs');
var start = request.substring(0, 2); var location, stats;
if (start !== "./" && start !== "..") { while (location = nextLoc()) {
return [request, modulePaths]; try { stats = fs.statSync(location); } catch (e) { continue; }
if (stats && !stats.isDirectory()) return location;
}
return false;
} }
// with --eval, parent.id is not set and parent.filename is null
if (!parent || !parent.id || !parent.filename) {
// make require('./path/to/foo') work - normally the path is taken
// from realpath(__filename) but with eval there is no filename
return [request, ['.'].concat(modulePaths)];
}
// Is the parent an index module? // sync - no i/o performed
// We can assume the parent has a valid extension, function resolveModuleLookupPaths(request, parent) {
// as it already has been accepted as a module.
var isIndex = /^index\.\w+?$/.test(path.basename(parent.filename)), if (natives[request]) return [request, []];
parentIdPath = isIndex ? parent.id : path.dirname(parent.id),
id = path.join(parentIdPath, request); var start = request.substring(0, 2);
if (start !== './' && start !== '..') {
// make sure require('./path') and require('path') get distinct ids, even return [request, modulePaths];
// when called from the toplevel js file }
if (parentIdPath === '.' && id.indexOf('/') === -1) {
id = './' + id; // with --eval, parent.id is not set and parent.filename is null
if (!parent || !parent.id || !parent.filename) {
// make require('./path/to/foo') work - normally the path is taken
// from realpath(__filename) but with eval there is no filename
return [request, ['.'].concat(modulePaths)];
}
// Is the parent an index module?
// We can assume the parent has a valid extension,
// as it already has been accepted as a module.
var isIndex = /^index\.\w+?$/.test(path.basename(parent.filename)),
parentIdPath = isIndex ? parent.id : path.dirname(parent.id),
id = path.join(parentIdPath, request);
// make sure require('./path') and require('path') get distinct ids, even
// when called from the toplevel js file
if (parentIdPath === '.' && id.indexOf('/') === -1) {
id = './' + id;
}
debug('RELATIVE: requested:' + request +
' set ID to: ' + id + ' from ' + parent.id);
return [id, [path.dirname(parent.filename)]];
} }
debug("RELATIVE: requested:" + request + " set ID to: "+id+" from "+parent.id);
return [id, [path.dirname(parent.filename)]];
}
function loadModule (request, parent) { function loadModule(request, parent) {
debug("loadModule REQUEST " + (request) + " parent: " + parent.id); debug('loadModule REQUEST ' + (request) + ' parent: ' + parent.id);
var resolved = resolveModuleFilename(request, parent); var resolved = resolveModuleFilename(request, parent);
var id = resolved[0]; var id = resolved[0];
var filename = resolved[1]; var filename = resolved[1];
// With natives id === request // With natives id === request
// We deal with these first // We deal with these first
if (natives[id]) { if (natives[id]) {
// REPL is a special case, because it needs the real require. // REPL is a special case, because it needs the real require.
if (id == 'repl') { if (id == 'repl') {
var replModule = new Module("repl"); var replModule = new Module('repl');
replModule._compile(natives.repl, 'repl.js'); replModule._compile(natives.repl, 'repl.js');
internalModuleCache.repl = replModule; internalModuleCache.repl = replModule;
return replModule.exports; return replModule.exports;
}
debug('load native module ' + request);
return requireNative(id);
} }
debug('load native module ' + request); var cachedModule = moduleCache[filename];
return requireNative(id); if (cachedModule) return cachedModule.exports;
}
var cachedModule = moduleCache[filename]; var module = new Module(id, parent);
if (cachedModule) return cachedModule.exports; moduleCache[filename] = module;
module.load(filename);
return module.exports;
};
var module = new Module(id, parent); function resolveModuleFilename(request, parent) {
moduleCache[filename] = module; if (natives[request]) return [request, request];
module.load(filename); var resolvedModule = resolveModuleLookupPaths(request, parent),
return module.exports; id = resolvedModule[0],
}; paths = resolvedModule[1];
function resolveModuleFilename (request, parent) { // look up the filename first, since that's the cache key.
if (natives[request]) return [request, request]; debug('looking for ' + JSON.stringify(id) +
var resolvedModule = resolveModuleLookupPaths(request, parent), ' in ' + JSON.stringify(paths));
id = resolvedModule[0], var filename = findModulePath(request, paths);
paths = resolvedModule[1]; if (!filename) {
throw new Error("Cannot find module '" + request + "'");
// look up the filename first, since that's the cache key. }
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths)); return [id, filename];
var filename = findModulePath(request, paths);
if (!filename) {
throw new Error("Cannot find module '" + request + "'");
} }
return [id, filename];
}
Module.prototype.load = function (filename) { Module.prototype.load = function(filename) {
debug("load " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id)); debug('load ' + JSON.stringify(filename) +
' for module ' + JSON.stringify(this.id));
process.assert(!this.loaded); process.assert(!this.loaded);
this.filename = filename; this.filename = filename;
var extension = path.extname(filename) || '.js'; var extension = path.extname(filename) || '.js';
if (!extensions[extension]) extension = '.js'; if (!extensions[extension]) extension = '.js';
extensions[extension](this, filename); extensions[extension](this, filename);
this.loaded = true; this.loaded = true;
}; };
// Returns exception if any // Returns exception if any
Module.prototype._compile = function (content, filename) { Module.prototype._compile = function(content, filename) {
var self = this; var self = this;
// remove shebang // remove shebang
content = content.replace(/^\#\!.*/, ''); content = content.replace(/^\#\!.*/, '');
function require (path) { function require(path) {
return loadModule(path, self); return loadModule(path, self);
} }
require.resolve = function (request) { require.resolve = function(request) {
return resolveModuleFilename(request, self)[1]; return resolveModuleFilename(request, self)[1];
}
require.paths = modulePaths;
require.main = process.mainModule;
// Enable support to add extra extension types
require.extensions = extensions;
// TODO: Insert depreciation warning
require.registerExtension = registerExtension;
require.cache = moduleCache;
var dirname = path.dirname(filename);
if (contextLoad) {
if (self.id !== ".") {
debug('load submodule');
// not root module
var sandbox = {};
for (var k in global) {
sandbox[k] = global[k];
}
sandbox.require = require;
sandbox.exports = self.exports;
sandbox.__filename = filename;
sandbox.__dirname = dirname;
sandbox.module = self;
sandbox.global = sandbox;
sandbox.root = root;
return evals.Script.runInNewContext(content, sandbox, filename);
} else {
debug('load root module');
// root module
global.require = require;
global.exports = self.exports;
global.__filename = filename;
global.__dirname = dirname;
global.module = self;
return evals.Script.runInThisContext(content, filename);
} }
require.paths = modulePaths;
require.main = process.mainModule;
// Enable support to add extra extension types
require.extensions = extensions;
// TODO: Insert depreciation warning
require.registerExtension = registerExtension;
require.cache = moduleCache;
var dirname = path.dirname(filename);
if (contextLoad) {
if (self.id !== '.') {
debug('load submodule');
// not root module
var sandbox = {};
for (var k in global) {
sandbox[k] = global[k];
}
sandbox.require = require;
sandbox.exports = self.exports;
sandbox.__filename = filename;
sandbox.__dirname = dirname;
sandbox.module = self;
sandbox.global = sandbox;
sandbox.root = root;
return evals.Script.runInNewContext(content, sandbox, filename);
} else {
debug('load root module');
// root module
global.require = require;
global.exports = self.exports;
global.__filename = filename;
global.__dirname = dirname;
global.module = self;
return evals.Script.runInThisContext(content, filename);
}
} else { } else {
// create wrapper function // create wrapper function
var wrapper = "(function (exports, require, module, __filename, __dirname) { " var wrapper =
+ content '(function (exports, require, module, __filename, __dirname) { ' +
+ "\n});"; content +
'\n});';
var compiledWrapper = evals.Script.runInThisContext(wrapper, filename);
if (filename === process.argv[1] && global.v8debug) { var compiledWrapper = evals.Script.runInThisContext(wrapper, filename);
global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0); if (filename === process.argv[1] && global.v8debug) {
global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0);
}
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);
} }
return compiledWrapper.apply(self.exports, [self.exports, require, self, filename, dirname]); };
}
};
// Native extension for .js // Native extension for .js
extensions['.js'] = function (module, filename) { extensions['.js'] = function(module, filename) {
var content = requireNative('fs').readFileSync(filename, 'utf8'); var content = requireNative('fs').readFileSync(filename, 'utf8');
module._compile(content, filename); module._compile(content, filename);
}; };
// Native extension for .node // Native extension for .node
extensions['.node'] = function (module, filename) { extensions['.node'] = function(module, filename) {
process.dlopen(filename, module.exports); process.dlopen(filename, module.exports);
}; };
// bootstrap main module. // bootstrap main module.
exports.runMain = function () { exports.runMain = function() {
// Load the main module--the command line argument. // Load the main module--the command line argument.
process.mainModule = new Module("."); process.mainModule = new Module('.');
try { try {
process.mainModule.load(process.argv[1]); process.mainModule.load(process.argv[1]);
} catch (e) { } catch (e) {
if (e.errno == lazyConstants().ENOENT) { if (e.errno == lazyConstants().ENOENT) {
console.error("Cannot load '%s'", process.argv[1]); console.error("Cannot load '%s'", process.argv[1]);
process.exit(1); process.exit(1);
} else { } else {
throw e; throw e;
}
} }
} };
};
// bootstrap repl
exports.requireRepl = function () { return loadModule("repl", "."); };
// export for --eval // bootstrap repl
exports.Module = Module; exports.requireRepl = function() { return loadModule('repl', '.'); };
return exports; // export for --eval
})(); exports.Module = Module;
return exports;
})();
// Load events module in order to access prototype elements on process like
// process.addListener.
var events = requireNative('events');
// Signal Handlers // Load events module in order to access prototype elements on process like
(function() { // process.addListener.
var signalWatchers = {}; var events = requireNative('events');
var addListener = process.addListener;
var removeListener = process.removeListener;
function isSignal (event) { // Signal Handlers
return event.slice(0, 3) === 'SIG' && lazyConstants()[event]; (function() {
} var signalWatchers = {};
var addListener = process.addListener;
var removeListener = process.removeListener;
// Wrap addListener for the special signal types function isSignal(event) {
process.on = process.addListener = function (type, listener) { return event.slice(0, 3) === 'SIG' && lazyConstants()[event];
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; // 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) { process.removeListener = function(type, listener) {
var ret = removeListener.apply(this, arguments); var ret = removeListener.apply(this, arguments);
if (isSignal(type)) { if (isSignal(type)) {
process.assert(signalWatchers.hasOwnProperty(type)); process.assert(signalWatchers.hasOwnProperty(type));
if (this.listeners(type).length === 0) { if (this.listeners(type).length === 0) {
signalWatchers[type].stop(); signalWatchers[type].stop();
}
} }
}
return ret; return ret;
}; };
})(); })();
global.setTimeout = function () { global.setTimeout = function() {
var t = requireNative('timers'); var t = requireNative('timers');
return t.setTimeout.apply(this, arguments); return t.setTimeout.apply(this, arguments);
}; };
global.setInterval = function () { global.setInterval = function() {
var t = requireNative('timers'); var t = requireNative('timers');
return t.setInterval.apply(this, arguments); return t.setInterval.apply(this, arguments);
}; };
global.clearTimeout = function () { global.clearTimeout = function() {
var t = requireNative('timers'); var t = requireNative('timers');
return t.clearTimeout.apply(this, arguments); return t.clearTimeout.apply(this, arguments);
}; };
global.clearInterval = function () { global.clearInterval = function() {
var t = requireNative('timers'); var t = requireNative('timers');
return t.clearInterval.apply(this, arguments); return t.clearInterval.apply(this, arguments);
}; };
var stdout; var stdout;
process.__defineGetter__('stdout', function () { process.__defineGetter__('stdout', function() {
if (stdout) return stdout; if (stdout) return stdout;
var binding = process.binding('stdio'), var binding = process.binding('stdio'),
net = requireNative('net'), net = requireNative('net'),
fs = requireNative('fs'), fs = requireNative('fs'),
fd = binding.stdoutFD; fd = binding.stdoutFD;
if (binding.isStdoutBlocking()) { if (binding.isStdoutBlocking()) {
stdout = new fs.WriteStream(null, {fd: fd}); stdout = new fs.WriteStream(null, {fd: fd});
} else { } else {
stdout = new net.Stream(fd); stdout = new net.Stream(fd);
// FIXME Should probably have an option in net.Stream to create a stream from // FIXME Should probably have an option in net.Stream to create a
// an existing fd which is writable only. But for now we'll just add // stream from an existing fd which is writable only. But for now
// this hack and set the `readable` member to false. // we'll just add this hack and set the `readable` member to false.
// Test: ./node test/fixtures/echo.js < /etc/passwd // Test: ./node test/fixtures/echo.js < /etc/passwd
stdout.readable = false; stdout.readable = false;
} }
return stdout; return stdout;
}); });
var stdin; var stdin;
process.openStdin = function () { process.openStdin = function() {
if (stdin) return stdin; if (stdin) return stdin;
var binding = process.binding('stdio'), var binding = process.binding('stdio'),
net = requireNative('net'), net = requireNative('net'),
fs = requireNative('fs'), fs = requireNative('fs'),
fd = binding.openStdin(); fd = binding.openStdin();
if (binding.isStdinBlocking()) { if (binding.isStdinBlocking()) {
stdin = new fs.ReadStream(null, {fd: fd}); stdin = new fs.ReadStream(null, {fd: fd});
} else { } else {
stdin = new net.Stream(fd); stdin = new net.Stream(fd);
stdin.readable = true; stdin.readable = true;
} }
stdin.resume(); stdin.resume();
return stdin; return stdin;
}; };
// Lazy load console object // Lazy load console object
global.__defineGetter__('console', function () { global.__defineGetter__('console', function() {
return requireNative('console'); return requireNative('console');
}); });
global.Buffer = requireNative('buffer').Buffer; global.Buffer = requireNative('buffer').Buffer;
process.exit = function (code) { process.exit = function(code) {
process.emit("exit", code || 0); process.emit('exit', code || 0);
process.reallyExit(code || 0); process.reallyExit(code || 0);
}; };
process.kill = function (pid, sig) { process.kill = function(pid, sig) {
sig = sig || 'SIGTERM'; sig = sig || 'SIGTERM';
if (!lazyConstants()[sig]) throw new Error("Unknown signal: " + sig); if (!lazyConstants()[sig]) throw new Error('Unknown signal: ' + sig);
process._kill(pid, lazyConstants()[sig]); process._kill(pid, lazyConstants()[sig]);
}; };
var cwd = process.cwd(); var cwd = process.cwd();
var path = requireNative('path'); var path = requireNative('path');
// Make process.argv[0] and process.argv[1] into full paths. // Make process.argv[0] and process.argv[1] into full paths.
if (process.argv[0].indexOf('/') > 0) { if (process.argv[0].indexOf('/') > 0) {
process.argv[0] = path.join(cwd, process.argv[0]); process.argv[0] = path.join(cwd, process.argv[0]);
} }
if (process.argv[1]) { if (process.argv[1]) {
// Load module // Load module
if (process.argv[1].charAt(0) != "/" && !(/^http:\/\//).exec(process.argv[1])) { if (process.argv[1].charAt(0) != '/' &&
process.argv[1] = path.join(cwd, process.argv[1]); !(/^http:\/\//).exec(process.argv[1])) {
process.argv[1] = path.join(cwd, process.argv[1]);
}
// REMOVEME: nextTick should not be necessary. This hack to get
// test/simple/test-exception-handler2.js working.
process.nextTick(module.runMain);
} else if (process._eval) {
// -e, --eval
var rv = new module.Module()._compile('return eval(process._eval)', 'eval');
console.log(rv);
} else {
// REPL
module.requireRepl().start();
} }
// REMOVEME: nextTick should not be necessary. This hack to get
// test/simple/test-exception-handler2.js working.
process.nextTick(module.runMain);
} else if (process._eval) {
// -e, --eval
var rv = new module.Module()._compile('return eval(process._eval)', 'eval');
console.log(rv);
} else {
// REPL
module.requireRepl().start();
}
}); });

Loading…
Cancel
Save