Skip to content

Commit

Permalink
src: fix deferred events not working with -e
Browse files Browse the repository at this point in the history
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: nodejs/node#1600
PR-URL: nodejs/node#1793
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
  • Loading branch information
bnoordhuis authored and andrewdeandrade committed Jun 3, 2015
1 parent f23adbd commit eb129c2
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 34 deletions.
9 changes: 7 additions & 2 deletions src/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
16 changes: 8 additions & 8 deletions test/message/eval_messages.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ SyntaxError: Strict mode code may not include a with statement
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([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
Expand All @@ -19,9 +19,9 @@ Error: hello
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([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")
^
Expand All @@ -30,9 +30,9 @@ Error: hello
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([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;
Expand All @@ -42,9 +42,9 @@ ReferenceError: y is not defined
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([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
^
Expand Down
35 changes: 11 additions & 24 deletions test/message/stdin_messages.out
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,8 @@ SyntaxError: Strict mode code may not include a with statement
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at evalScript (node.js:*:*)
at Socket.<anonymous> (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
Expand All @@ -25,12 +21,9 @@ Error: hello
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at evalScript (node.js:*:*)
at Socket.<anonymous> (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")
Expand All @@ -40,12 +33,9 @@ Error: hello
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at evalScript (node.js:*:*)
at Socket.<anonymous> (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
Expand All @@ -56,12 +46,9 @@ ReferenceError: y is not defined
at Object.exports.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at evalScript (node.js:*:*)
at Socket.<anonymous> (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
Expand Down
15 changes: 15 additions & 0 deletions test/parallel/test-cli-eval-event.js
Original file line number Diff line number Diff line change
@@ -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);
}));

0 comments on commit eb129c2

Please sign in to comment.