Skip to content

Commit

Permalink
debugger: run last command on presssing enter
Browse files Browse the repository at this point in the history
PR-URL: nodejs#6090
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Claudio Rodriguez <cjrodr@yahoo.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Fixes: nodejs#2895
  • Loading branch information
Trott committed Apr 14, 2016
1 parent b68827b commit 1df84f4
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 23 deletions.
3 changes: 3 additions & 0 deletions doc/api/debugger.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ The `repl` command allows code to be evaluated remotely. The `next` command
steps over to the next line. Type `help` to see what other commands are
available.

Pressing `enter` without typing a command will repeat the previous debugger
command.

## Watchers

It is possible to watch expression and variable values while debugging. On
Expand Down
11 changes: 7 additions & 4 deletions lib/_debugger.js
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,9 @@ var helpMessage = 'Commands: ' + commands.map(function(group) {
return group.join(', ');
}).join(',\n');

// Previous command received. Initialize to empty command.
var lastCommand = '\n';


function SourceUnderline(sourceText, position, repl) {
if (!sourceText) return '';
Expand Down Expand Up @@ -945,10 +948,10 @@ Interface.prototype.requireConnection = function() {
Interface.prototype.controlEval = function(code, context, filename, callback) {
try {
// Repeat last command if empty line are going to be evaluated
if (this.repl.rli.history && this.repl.rli.history.length > 0) {
if (code === '\n') {
code = this.repl.rli.history[0] + '\n';
}
if (code === '\n') {
code = lastCommand;
} else {
lastCommand = code;
}

// exec process.title => exec("process.title");
Expand Down
38 changes: 19 additions & 19 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,10 @@ function REPLServer(prompt,
function defaultEval(code, context, file, cb) {
var err, result, retry = false, input = code, wrappedErr;
// first, create the Script object to check the syntax

if (code === '\n')
return cb(null);

while (true) {
try {
if (!/^\s*$/.test(code) &&
Expand Down Expand Up @@ -421,28 +425,24 @@ function REPLServer(prompt,
}
}

if (cmd || self.bufferedCommand) {
var evalCmd = self.bufferedCommand + cmd;
if (/^\s*\{/.test(evalCmd) && /\}\s*$/.test(evalCmd)) {
// It's confusing for `{ a : 1 }` to be interpreted as a block
// statement rather than an object literal. So, we first try
// to wrap it in parentheses, so that it will be interpreted as
// an expression.
evalCmd = '(' + evalCmd + ')\n';
self.wrappedCmd = true;
} else {
// otherwise we just append a \n so that it will be either
// terminated, or continued onto the next expression if it's an
// unexpected end of input.
evalCmd = evalCmd + '\n';
}

debug('eval %j', evalCmd);
self.eval(evalCmd, self.context, 'repl', finish);
var evalCmd = self.bufferedCommand + cmd;
if (/^\s*\{/.test(evalCmd) && /\}\s*$/.test(evalCmd)) {
// It's confusing for `{ a : 1 }` to be interpreted as a block
// statement rather than an object literal. So, we first try
// to wrap it in parentheses, so that it will be interpreted as
// an expression.
evalCmd = '(' + evalCmd + ')\n';
self.wrappedCmd = true;
} else {
finish(null);
// otherwise we just append a \n so that it will be either
// terminated, or continued onto the next expression if it's an
// unexpected end of input.
evalCmd = evalCmd + '\n';
}

debug('eval %j', evalCmd);
self.eval(evalCmd, self.context, 'repl', finish);

function finish(e, ret) {
debug('finish', e, ret);
self.memory(cmd);
Expand Down
7 changes: 7 additions & 0 deletions test/fixtures/debugger-repeat-last.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
var a = 1;

var b = 2;

var c = 3;

b = c;
46 changes: 46 additions & 0 deletions test/parallel/test-debugger-repeat-last.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
'use strict';
const path = require('path');
const spawn = require('child_process').spawn;
const assert = require('assert');

const common = require('../common');

const fixture = path.join(
common.fixturesDir,
'debugger-repeat-last.js'
);

const args = [
'debug',
fixture
];

const proc = spawn(process.execPath, args, { stdio: 'pipe' });
proc.stdout.setEncoding('utf8');

var stdout = '';

var sentCommand = false;
var sentEmpty = false;
var sentExit = false;

proc.stdout.on('data', (data) => {
stdout += data;
if (!sentCommand && stdout.includes('> 1')) {
setImmediate(() => {proc.stdin.write('n\n');});
return sentCommand = true;
}
if (!sentEmpty && stdout.includes('> 3')) {
setImmediate(() => {proc.stdin.write('\n');});
return sentEmpty = true;
}
if (!sentExit && sentCommand && sentEmpty) {
setTimeout(() => {proc.stdin.write('\n\n\n.exit\n\n\n');}, 1);
return sentExit = true;
}
});

process.on('exit', (exitCode) => {
assert.strictEqual(exitCode, 0);
console.log(stdout);
});

0 comments on commit 1df84f4

Please sign in to comment.