From f484cbf4c7bbbc8549de55984c072cf2f1132c7a Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 30 Dec 2010 10:02:42 -0800 Subject: [PATCH] Debugger: better maintance of script list --- lib/_debugger.js | 75 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/lib/_debugger.js b/lib/_debugger.js index c401066..a364910 100644 --- a/lib/_debugger.js +++ b/lib/_debugger.js @@ -190,6 +190,8 @@ function Client() { this.currentFrame = 0; this.currentSourceLine = -1; this.currentSource = null; + this.handles = {}; + this.scripts = {}; // Note that 'Protocol' requires strings instead of Buffers. socket.setEncoding('utf8'); @@ -203,22 +205,53 @@ inherits(Client, net.Stream); exports.Client = Client; +Client.prototype._addHandle = function(desc) { + if (typeof desc != 'object' || !desc.handle) throw new Error("bad type"); + this.handles[desc.id] = desc; + + if (desc.type == 'script') { + this._addScript(desc); + } +}; + + +Client.prototype._addScript = function(desc) { + this.scripts[desc.id] = desc; +}; + + +Client.prototype._removeScript = function(desc) { + this.scripts[desc.id] = undefined; +}; + + Client.prototype._onResponse = function(res) { for (var i = 0; i < this._reqCallbacks.length; i++) { var cb = this._reqCallbacks[i]; if (this._reqCallbacks[i].request_seq == cb.request_seq) break; } + var self = this; + if (res.headers.Type == 'connect') { - // do nothing - this.emit('ready'); + // Request a list of scripts for our own storage. + self.reqScripts(); + self.emit('ready'); + } else if (res.body && res.body.event == 'break') { this.emit('break', res.body); + } else if (res.body && res.body.event == 'afterCompile') { - this.emit('afterCompile', res.body); + this._addHandle(res.body.body.script); + + } else if (res.body && res.body.event == 'scriptCollected') { + // ??? + this._removeScript(res.body.body.script); + } else if (cb) { this._reqCallbacks.splice(i, 1); cb(res.body); + } else { this.emit('unhandledResponse', res.body); } @@ -283,8 +316,12 @@ Client.prototype.reqBacktrace = function(cb) { // text: 'node.js (lines: 562)' } // Client.prototype.reqScripts = function(cb) { + var self = this; this.req({ command: 'scripts' } , function (res) { - if (cb) cb(res.body); + for (var i = 0; i < res.body.length; i++) { + self._addHandle(res.body[i]); + } + if (cb) cb(); }); }; @@ -376,6 +413,18 @@ function restartQuestion (cb) { }); } +function printScripts () { + var text = ''; + for (var id in c.scripts) { + var script = c.scripts[id]; + if (typeof script == 'object' && script.name) { + text += script.name == c.currentScript ? '* ' : ' '; + text += script.name + '\n'; + } + } + process.stdout.write(text); +} + function startInterface() { @@ -397,7 +446,7 @@ function startInterface() { if (quitTried) return; quitTried = true; term.close(); - console.log("debug done\n"); + console.log("\ndebug done\n"); if (c.writable) { c.reqContinue(function (res) { process.exit(0); @@ -470,20 +519,8 @@ function startInterface() { }); } else if (cmd == 'scripts' || cmd == 'scripts full') { - c.reqScripts(function (res) { - if (/full/.test(cmd)) { - console.log(res); - } else { - var text = ''; - for (var i = 0; i < res.length; i++) { - text += res[i].name == c.currentScript ? '* ' : ' '; - text += res[i].name + '\n'; - } - process.stdout.write(text); - } - term.prompt(); - }); - + printScripts(); + term.prompt(); } else if (/^continue/.test(cmd) || /^c/.test(cmd)) { c.reqContinue(function (res) { -- 2.7.4