From 54520981a40b7229fa6f2788c442a9b7d9cead3f Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Sat, 10 Sep 2011 19:18:36 +0700 Subject: [PATCH] [debugger] implemented setBreakpoint, etc Lift prototype methods not only as accessors, but as properties too. this.print() supports javascript objects inspection this.error() implemented, don't throw error at callbacks and commands Fixed list() invokation, when script is not on a breakpoint Removed obsolete process.nextTick from `step` commands --- lib/_debugger.js | 86 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/lib/_debugger.js b/lib/_debugger.js index 9864a2a8d7..4575b17e33 100644 --- a/lib/_debugger.js +++ b/lib/_debugger.js @@ -22,7 +22,8 @@ var net = require('net'), repl = require('repl'), vm = require('vm'), - inherits = require('util').inherits, + util = require('util'), + inherits = util.inherits, spawn = require('child_process').spawn; exports.port = 5858; @@ -419,6 +420,17 @@ Client.prototype.listbreakpoints = function(cb) { }); }; +Client.prototype.setBreakpoint = function(req, cb) { + var req = { + command: 'setbreakpoint', + arguments: req + }; + + this.req(req, function(res) { + if (cb) cb(res); + }); +}; + Client.prototype.reqSource = function(from, to, cb) { var req = { command: 'source', @@ -687,10 +699,15 @@ function Interface() { }; function defineProperty(key, protoKey) { - Object.defineProperty(self.repl.context, key, { - get: proto[protoKey].bind(self), - enumerable: true - }); + // Check arity + if (proto[protoKey].length === 0) { + Object.defineProperty(self.repl.context, key, { + get: proto[protoKey].bind(self), + enumerable: true + }); + } else { + self.repl.context[key] = proto[protoKey].bind(self); + } }; for (var i in proto) { @@ -734,7 +751,8 @@ Interface.prototype.resume = function(silent) { Interface.prototype.print = function(text) { process.stdout.cursorTo(0); process.stdout.clearLine(1); - process.stdout.write(text + '\n'); + process.stdout.write(typeof text === 'string' ? text : util.inspect(text)); + process.stdout.write('\n'); }; Interface.prototype.childPrint = function(text) { @@ -742,9 +760,13 @@ Interface.prototype.childPrint = function(text) { return chunk; }).map(function(chunk) { return '< ' + chunk; - }).join('\n')); + }).join('\n') + '\n'); }; +Interface.prototype.error = function(text) { + this.print(text); + this.resume(); +}; Interface.prototype.handleBreak = function(r) { this.pause(); @@ -760,7 +782,7 @@ Interface.prototype.handleBreak = function(r) { Interface.prototype.requireConnection = function() { - if (!this.client) throw Error('App isn\'t running... Try `run` instead'); + if (!this.client) this.error('App isn\'t running... Try `run` instead'); }; Interface.prototype.controlEval = function(code, context, filename, callback) { @@ -841,7 +863,7 @@ Interface.prototype.help = function() { // Run script Interface.prototype.run = function() { if (this.child) { - throw Error('App is already running... Try `restart` instead'); + this.error('App is already running... Try `restart` instead'); } else { this.trySpawn(); } @@ -850,7 +872,7 @@ Interface.prototype.run = function() { // Restart script Interface.prototype.restart = function() { - if (!this.child) throw Error('App isn\'t running... Try `run` instead'); + if (!this.child) return this.error('App isn\'t running... Try `run` instead'); var self = this; @@ -886,6 +908,8 @@ Interface.prototype.list = function() { self.pause(); client.reqSource(from, to, function(res) { + if (!res.source) return self.error('You can\'t list source code right now'); + var lines = res.source.split('\n'); for (var i = 0; i < lines.length; i++) { var lineno = res.fromLine + i + 1; @@ -982,9 +1006,7 @@ Interface.prototype.cont = function() { var self = this; this.client.reqContinue(function() { - process.nextTick(function() { - self.resume(); - }); + self.resume(); }); }; @@ -997,9 +1019,7 @@ Interface.prototype.next = function() { var self = this; this.client.step('next', 1, function(res) { - process.nextTick(function() { - self.resume(); - }); + self.resume(); }); }; @@ -1012,9 +1032,7 @@ Interface.prototype.step = function() { var self = this; this.client.step('in', 1, function(res) { - process.nextTick(function() { - self.resume(); - }); + self.resume(); }); }; @@ -1027,9 +1045,29 @@ Interface.prototype.out = function() { var self = this; this.client.step('out', 1, function(res) { - process.nextTick(function() { - self.resume(); - }); + self.resume(); + }); +}; + + +// Add breakpoint +Interface.prototype.setBreakpoint = function(script, line, condition) { + var self = this, + req = { + type: 'script', + target: script, + line: line, + condition: condition + }; + + self.pause(); + self.client.setBreakpoint(req, function(res) { + if (res.success) { + self.print('ok'); + } else { + self.print(req.message || 'error!'); + } + self.resume(); }); }; @@ -1042,10 +1080,10 @@ Interface.prototype.breakpoints = function() { this.client.listbreakpoints(function(res) { if (res.success) { self.print(res.body); + self.resume(); } else { - throw Error(res.message || 'Some error happened'); + self.error(res.message || 'Some error happened'); } - self.resume(); }); };