From 93a44d5228b2e1a885f6279f06c4175c174246be Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 25 May 2015 16:37:49 +0200 Subject: [PATCH] src: fix deferred events not working with -e Defer evaluation of the script for a tick. This is a workaround for events not firing when evaluating scripts on the command line with -e. Fixes: https://github.com/nodejs/io.js/issues/1600 PR-URL: https://github.com/nodejs/io.js/pull/1793 Reviewed-By: Trevor Norris --- src/node.js | 9 +++++++-- test/message/eval_messages.out | 16 ++++++++-------- test/message/stdin_messages.out | 35 +++++++++++------------------------ test/parallel/test-cli-eval-event.js | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 test/parallel/test-cli-eval-event.js diff --git a/src/node.js b/src/node.js index cb50341..065c337 100644 --- a/src/node.js +++ b/src/node.js @@ -558,8 +558,13 @@ 'return require("vm").runInThisContext(' + JSON.stringify(body) + ', { filename: ' + JSON.stringify(name) + ' });\n'; - var result = module._compile(script, name + '-wrapper'); - if (process._print_eval) console.log(result); + // Defer evaluation for a tick. This is a workaround for deferred + // events not firing when evaluating scripts from the command line, + // see https://github.com/nodejs/io.js/issues/1600. + process.nextTick(function() { + var result = module._compile(script, name + '-wrapper'); + if (process._print_eval) console.log(result); + }); } function createWritableStdioStream(fd) { diff --git a/test/message/eval_messages.out b/test/message/eval_messages.out index 809e788..be2120c 100644 --- a/test/message/eval_messages.out +++ b/test/message/eval_messages.out @@ -6,9 +6,9 @@ SyntaxError: Strict mode code may not include a with statement at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at startup (node.js:*:*) at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) 42 42 [eval]:1 @@ -19,9 +19,9 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at startup (node.js:*:*) at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) [eval]:1 throw new Error("hello") ^ @@ -30,9 +30,9 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at startup (node.js:*:*) at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) 100 [eval]:1 var x = 100; y = x; @@ -42,9 +42,9 @@ ReferenceError: y is not defined at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at startup (node.js:*:*) at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) [eval]:1 var ______________________________________________; throw 10 ^ diff --git a/test/message/stdin_messages.out b/test/message/stdin_messages.out index 92d09a0..9dc6451 100644 --- a/test/message/stdin_messages.out +++ b/test/message/stdin_messages.out @@ -7,12 +7,8 @@ SyntaxError: Strict mode code may not include a with statement at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at Socket. (node.js:*:*) - at emitNone (events.js:*:*) - at Socket.emit (events.js:*:*) - at endReadableNT (_stream_readable.js:*:*) - at doNTCallback2 (node.js:*:*) + at node.js:*:* + at doNTCallback0 (node.js:*:*) at process._tickCallback (node.js:*:*) 42 42 @@ -25,12 +21,9 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at Socket. (node.js:*:*) - at emitNone (events.js:*:*) - at Socket.emit (events.js:*:*) - at endReadableNT (_stream_readable.js:*:*) - at doNTCallback2 (node.js:*:*) + at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) [stdin]:1 throw new Error("hello") @@ -40,12 +33,9 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at Socket. (node.js:*:*) - at emitNone (events.js:*:*) - at Socket.emit (events.js:*:*) - at endReadableNT (_stream_readable.js:*:*) - at doNTCallback2 (node.js:*:*) + at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) 100 [stdin]:1 @@ -56,12 +46,9 @@ ReferenceError: y is not defined at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at evalScript (node.js:*:*) - at Socket. (node.js:*:*) - at emitNone (events.js:*:*) - at Socket.emit (events.js:*:*) - at endReadableNT (_stream_readable.js:*:*) - at doNTCallback2 (node.js:*:*) + at node.js:*:* + at doNTCallback0 (node.js:*:*) + at process._tickCallback (node.js:*:*) [stdin]:1 var ______________________________________________; throw 10 diff --git a/test/parallel/test-cli-eval-event.js b/test/parallel/test-cli-eval-event.js new file mode 100644 index 0000000..b19bdd3 --- /dev/null +++ b/test/parallel/test-cli-eval-event.js @@ -0,0 +1,15 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const spawn = require('child_process').spawn; + +const child = spawn(process.execPath, ['-e', ` + const server = require('net').createServer().listen(0); + server.once('listening', server.close); +`]); + +child.once('exit', common.mustCall(function(exitCode, signalCode) { + assert.equal(exitCode, 0); + assert.equal(signalCode, null); +})); -- 2.7.4