diff --git a/src/node.js b/src/node.js index 64280e9451..4ed4ba4bce 100644 --- a/src/node.js +++ b/src/node.js @@ -153,9 +153,12 @@ }; startup.globalConsole = function() { - global.console = NativeModule.require('console'); + global.__defineGetter__('console', function() { + return NativeModule.require('console'); + }); }; + startup._lazyConstants = null; startup.lazyConstants = function() { @@ -205,32 +208,35 @@ }; startup.processStdio = function() { - var binding = process.binding('stdio'), - // FIXME Remove conditional when net is supported again on windows. - net = (process.platform !== "win32") - ? NativeModule.require('net_legacy') // fixme! - : undefined, - fs = NativeModule.require('fs'), - tty = NativeModule.require('tty'); - - // process.stdout - - var fd = binding.stdoutFD; - - if (binding.isatty(fd)) { - process.stdout = new tty.WriteStream(fd); - } else if (binding.isStdoutBlocking()) { - process.stdout = new fs.WriteStream(null, {fd: fd}); - } else { - process.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 - process.stdout.readable = false; - } + var stdout, stdin; + + process.__defineGetter__('stdout', function() { + if (stdout) return stdout; + + var binding = process.binding('stdio'), + // FIXME Remove conditional when net is supported again on windows. + net = (process.platform !== "win32") + ? NativeModule.require('net_legacy') // fixme! + : undefined, + 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; + } - // process.stderr + return stdout; + }); var stderr = process.stderr = new EventEmitter(); stderr.writable = true; @@ -238,18 +244,26 @@ stderr.write = process.binding('stdio').writeError; stderr.end = stderr.destroy = stderr.destroySoon = function() { }; - // process.stdin + process.__defineGetter__('stdin', function() { + if (stdin) return stdin; - var fd = binding.openStdin(); + var binding = process.binding('stdio'), + net = NativeModule.require('net'), + fs = NativeModule.require('fs'), + tty = NativeModule.require('tty'), + fd = binding.openStdin(); - if (binding.isatty(fd)) { - process.stdin = new tty.ReadStream(fd); - } else if (binding.isStdinBlocking()) { - process.stdin = new fs.ReadStream(null, {fd: fd}); - } else { - process.stdin = new net.Stream(fd); - process.stdin.readable = true; - } + 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();