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. 147
      lib/util.js
  3. 104
      src/node.js

5
Makefile

@ -130,11 +130,8 @@ bench-idle:
sleep 1
./node benchmark/idle_clients.js &
GJSLINT = PYTHONPATH=tools/closure_linter/ \
python tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc
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:
@python tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c)

147
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
* 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)
* properties of objects.
* @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) {
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
var styles = { 'bold' : [1, 22]
, 'italic' : [3, 23]
, 'underline' : [4, 24]
, 'inverse' : [7, 27]
, 'white' : [37, 39]
, 'grey' : [90, 39]
, 'black' : [30, 39]
, 'blue' : [34, 39]
, 'cyan' : [36, 39]
, 'green' : [32, 39]
, 'magenta' : [35, 39]
, 'red' : [31, 39]
, 'yellow' : [33, 39]
};
var style = { 'special': 'grey'
, 'number': 'blue'
, 'boolean': 'blue'
, 'undefined': 'red'
, 'null': 'red'
, 'string': 'green'
, 'date': 'magenta'
//, "name": intentionally not styling
, 'regexp': 'cyan'
}[styleType];
var styles =
{ 'bold' : [1, 22],
'italic' : [3, 23],
'underline' : [4, 24],
'inverse' : [7, 27],
'white' : [37, 39],
'grey' : [90, 39],
'black' : [30, 39],
'blue' : [34, 39],
'cyan' : [36, 39],
'green' : [32, 39],
'magenta' : [35, 39],
'red' : [31, 39],
'yellow' : [33, 39] };
var style =
{ 'special': 'grey',
'number': 'blue',
'boolean': 'blue',
'undefined': 'red',
'null': 'red',
'string': 'green',
'date': 'magenta',
// "name": intentionally not styling
'regexp': 'cyan' }[styleType];
if (style) {
return '\033[' + styles[style][0] + 'm' + str +
'\033[' + styles[style][1] + 'm';
@ -91,14 +93,20 @@ exports.inspect = function(obj, showHidden, depth, colors) {
// Primitive types cannot have properties
switch (typeof value) {
case 'undefined': return stylize('undefined', 'undefined');
case 'string': return stylize(
JSON.stringify(value).replace(/'/g, "\\'")
case 'undefined':
return stylize('undefined', 'undefined');
case 'string':
var simple = JSON.stringify(value).replace(/'/g, "\\'")
.replace(/\\"/g, '"')
.replace(/(^"|"$)/g, "'"),
'string');
case 'number': return stylize('' + value, 'number');
case 'boolean': return stylize('' + value, 'boolean');
.replace(/(^"|"$)/g, "'");
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.
if (value === null) {
@ -114,7 +122,8 @@ exports.inspect = function(obj, showHidden, depth, colors) {
if (isRegExp(value)) {
return stylize('' + value, 'regexp');
} else {
return stylize('[Function' + (value.name ? ': ' + value.name : '') + ']', 'special');
var name = value.name ? ': ' + value.name : '';
return stylize('[Function' + name + ']', 'special');
}
}
@ -135,7 +144,8 @@ exports.inspect = function(obj, showHidden, depth, colors) {
// Make functions say that they are functions
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 {
base = '';
}
@ -223,19 +233,17 @@ exports.inspect = function(obj, showHidden, depth, colors) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf('\n') >= 0) {
numLinesEst++;
}
if (cur.indexOf('\n') >= 0) numLinesEst++;
return prev + cur.length + 1;
}, 0);
if (length > (require('readline').columns || 50)) {
output = braces[0]
+ (base === '' ? '' : base + '\n ')
+ ' '
+ output.join(',\n ')
+ ' '
+ braces[1];
output = braces[0] +
(base === '' ? '' : base + '\n ') +
' ' +
output.join(',\n ') +
' ' +
braces[1];
} else {
output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
@ -248,21 +256,22 @@ exports.inspect = function(obj, showHidden, depth, colors) {
function isArray(ar) {
return ar instanceof Array
|| Array.isArray(ar)
|| (ar && ar !== Object.prototype && isArray(ar.__proto__));
return ar instanceof Array ||
Array.isArray(ar) ||
(ar && ar !== Object.prototype && isArray(ar.__proto__));
}
function isRegExp(re) {
var s = '' + re;
return re instanceof RegExp // easy case
|| typeof(re) === 'function' // duck-type for context-switching evalcx case
&& re.constructor.name === 'RegExp'
&& re.compile
&& re.test
&& re.exec
&& s.match(/^\/.*\/[gim]{0,3}$/);
return re instanceof RegExp || // easy case
// duck-type for context-switching evalcx case
typeof(re) === 'function' &&
re.constructor.name === 'RegExp' &&
re.compile &&
re.test &&
re.exec &&
s.match(/^\/.*\/[gim]{0,3}$/);
}
@ -279,7 +288,8 @@ var pWarning;
exports.p = function() {
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);
}
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
function timestamp() {
var d = new Date();
return [d.getDate()
, months[d.getMonth()]
, [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':')
].join(' ');
var time = [pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return [d.getDate(), months[d.getMonth()], time].join(' ');
}
@ -313,7 +324,8 @@ exports.log = function(msg) {
var execWarning;
exports.exec = function() {
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);
}
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.resume) readStream.resume = function() {readStream.emit('resume');};
if (!readStream.pause) {
readStream.pause = function() {readStream.emit('pause');};
}
if (!readStream.resume) {
readStream.resume = function() {readStream.emit('resume');};
}
readStream.addListener('data', function(chunk) {
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.
*
@ -384,9 +402,6 @@ exports.pump = function(readStream, writeStream, callback) {
exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false
}
constructor: { value: ctor, enumerable: false }
});
};

104
src/node.js

@ -14,17 +14,25 @@ function removed (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.debug =
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");
if (!x) throw new Error(msg || 'assertion error');
};
var evals = process.binding('evals');
@ -32,7 +40,7 @@ var evals = process.binding('evals');
// lazy loaded.
var constants;
function lazyConstants() {
if (!constants) constants = process.binding("constants");
if (!constants) constants = process.binding('constants');
return constants;
}
@ -79,7 +87,7 @@ function requireNative (id) {
if (!natives[id]) throw new Error('No such native module ' + id);
var fn = evals.Script.runInThisContext(
"(function (module, exports, require) {" + natives[id] + "\n})",
'(function (module, exports, require) {' + natives[id] + '\n})',
id + '.js');
var m = {id: id, exports: {}};
fn(m, m.exports, requireNative);
@ -94,7 +102,7 @@ var module = (function () {
// 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;
if (+process.env['NODE_MODULE_CONTEXTS'] > 0) contextLoad = true;
var moduleCache = {};
@ -112,27 +120,30 @@ var module = (function () {
// Modules
var debugLevel = parseInt(process.env["NODE_DEBUG"], 16);
function debug (x) {
if (debugLevel & 1) console.error(x);
var debugLevel = parseInt(process.env['NODE_DEBUG'], 16);
if (debugLevel & 1) {
debug = function(x) { console.error(x); };
} else {
debug = function() { };
}
var path = requireNative('path');
var modulePaths = [path.join(process.execPath, "..", "..", "lib", "node")];
var modulePaths = [path.join(process.execPath, '..', '..', 'lib', 'node')];
if (process.env["HOME"]) {
modulePaths.unshift(path.join(process.env["HOME"], ".node_libraries"));
modulePaths.unshift(path.join(process.env["HOME"], ".node_modules"));
if (process.env['HOME']) {
modulePaths.unshift(path.join(process.env['HOME'], '.node_libraries'));
modulePaths.unshift(path.join(process.env['HOME'], '.node_modules'));
}
if (process.env["NODE_PATH"]) {
modulePaths = process.env["NODE_PATH"].split(":").concat(modulePaths);
if (process.env['NODE_PATH']) {
modulePaths = process.env['NODE_PATH'].split(':').concat(modulePaths);
}
var extensions = {};
var registerExtension = removed('require.registerExtension() removed. Use require.extensions instead');
var registerExtension =
removed('require.registerExtension() removed.' +
' Use require.extensions instead');
// Which files to traverse while finding id? Returns generator function.
function traverser(id, dirs) {
@ -160,7 +171,8 @@ var module = (function () {
}
function findModulePath(request, paths) {
var nextLoc = traverser(request, request.charAt(0) === '/' ? [''] : paths);
var nextLoc =
traverser(request, request.charAt(0) === '/' ? [''] : paths);
var fs = requireNative('fs');
@ -179,7 +191,7 @@ var module = (function () {
if (natives[request]) return [request, []];
var start = request.substring(0, 2);
if (start !== "./" && start !== "..") {
if (start !== './' && start !== '..') {
return [request, modulePaths];
}
@ -202,13 +214,14 @@ var module = (function () {
if (parentIdPath === '.' && id.indexOf('/') === -1) {
id = './' + id;
}
debug("RELATIVE: requested:" + request + " set ID to: "+id+" from "+parent.id);
debug('RELATIVE: requested:' + request +
' set ID to: ' + id + ' from ' + parent.id);
return [id, [path.dirname(parent.filename)]];
}
function loadModule(request, parent) {
debug("loadModule REQUEST " + (request) + " parent: " + parent.id);
debug('loadModule REQUEST ' + (request) + ' parent: ' + parent.id);
var resolved = resolveModuleFilename(request, parent);
var id = resolved[0];
@ -219,7 +232,7 @@ var module = (function () {
if (natives[id]) {
// REPL is a special case, because it needs the real require.
if (id == 'repl') {
var replModule = new Module("repl");
var replModule = new Module('repl');
replModule._compile(natives.repl, 'repl.js');
internalModuleCache.repl = replModule;
return replModule.exports;
@ -245,7 +258,8 @@ var module = (function () {
paths = resolvedModule[1];
// look up the filename first, since that's the cache key.
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
debug('looking for ' + JSON.stringify(id) +
' in ' + JSON.stringify(paths));
var filename = findModulePath(request, paths);
if (!filename) {
throw new Error("Cannot find module '" + request + "'");
@ -255,7 +269,8 @@ var module = (function () {
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);
this.filename = filename;
@ -291,7 +306,7 @@ var module = (function () {
var dirname = path.dirname(filename);
if (contextLoad) {
if (self.id !== ".") {
if (self.id !== '.') {
debug('load submodule');
// not root module
var sandbox = {};
@ -321,15 +336,17 @@ var module = (function () {
} else {
// create wrapper function
var wrapper = "(function (exports, require, module, __filename, __dirname) { "
+ content
+ "\n});";
var wrapper =
'(function (exports, require, module, __filename, __dirname) { ' +
content +
'\n});';
var compiledWrapper = evals.Script.runInThisContext(wrapper, filename);
if (filename === process.argv[1] && global.v8debug) {
global.v8debug.Debug.setBreakPoint(compiledWrapper, 0, 0);
}
return compiledWrapper.apply(self.exports, [self.exports, require, self, filename, dirname]);
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);
}
};
@ -350,7 +367,7 @@ var module = (function () {
// bootstrap main module.
exports.runMain = function() {
// Load the main module--the command line argument.
process.mainModule = new Module(".");
process.mainModule = new Module('.');
try {
process.mainModule.load(process.argv[1]);
} catch (e) {
@ -364,7 +381,7 @@ var module = (function () {
};
// bootstrap repl
exports.requireRepl = function () { return loadModule("repl", "."); };
exports.requireRepl = function() { return loadModule('repl', '.'); };
// export for --eval
exports.Module = Module;
@ -455,9 +472,9 @@ process.__defineGetter__('stdout', function () {
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.
// 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;
}
@ -496,13 +513,13 @@ global.__defineGetter__('console', function () {
global.Buffer = requireNative('buffer').Buffer;
process.exit = function(code) {
process.emit("exit", code || 0);
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);
if (!lazyConstants()[sig]) throw new Error('Unknown signal: ' + sig);
process._kill(pid, lazyConstants()[sig]);
};
@ -517,7 +534,8 @@ if (process.argv[0].indexOf('/') > 0) {
if (process.argv[1]) {
// Load module
if (process.argv[1].charAt(0) != "/" && !(/^http:\/\//).exec(process.argv[1])) {
if (process.argv[1].charAt(0) != '/' &&
!(/^http:\/\//).exec(process.argv[1])) {
process.argv[1] = path.join(cwd, process.argv[1]);
}
// REMOVEME: nextTick should not be necessary. This hack to get

Loading…
Cancel
Save