break on exception
authorFedor Indutny <fedor.indutny@gmail.com>
Sat, 17 Dec 2011 06:02:51 +0000 (12:02 +0600)
committerRyan Dahl <ry@tinyclouds.org>
Mon, 19 Dec 2011 19:09:40 +0000 (11:09 -0800)
Fixes #2304

lib/_debugger.js

index 7203278..00de2b1 100644 (file)
@@ -236,6 +236,10 @@ Client.prototype._onResponse = function(res) {
     this.emit('break', res.body);
     handled = true;
 
+  } else if (res.body && res.body.event == 'exception') {
+    this.emit('exception', res.body);
+    handled = true;
+
   } else if (res.body && res.body.event == 'afterCompile') {
     this._addHandle(res.body.body.script);
     handled = true;
@@ -409,6 +413,16 @@ Client.prototype.reqBacktrace = function(cb) {
 };
 
 
+// reqSetExceptionBreak(type, cb)
+// TODO: from, to, bottom
+Client.prototype.reqSetExceptionBreak = function(type, cb) {
+  this.req({
+    command: 'setexceptionbreak',
+    arguments: { type: type, enabled: true }
+  }, cb);
+};
+
+
 // Returns an array of objects like this:
 //
 //   { handle: 11,
@@ -495,7 +509,7 @@ Client.prototype.mirrorObject = function(handle, depth, cb) {
 
   var val;
 
-  if (handle.type == 'object') {
+  if (handle.type === 'object') {
     // The handle looks something like this:
     // { handle: 8,
     //   type: 'object',
@@ -695,7 +709,7 @@ function SourceUnderline(sourceText, position, tty) {
 
 
 function SourceInfo(body) {
-  var result = 'break in ';
+  var result = body.exception ? 'exception in ' : 'break in ';
 
   if (body.script) {
     if (body.script.name) {
@@ -715,6 +729,8 @@ function SourceInfo(body) {
   result += ':';
   result += body.sourceLine + 1;
 
+  if (body.exception) result += '\n' + body.exception.text;
+
   return result;
 }
 
@@ -1599,9 +1615,11 @@ Interface.prototype.trySpawn = function(cb) {
       self.setBreakpoint(bp.scriptId, bp.line, bp.condition, true);
     });
 
-    if (cb) cb();
-
-    self.resume();
+    // Break on exceptions
+    client.reqSetExceptionBreak('all', function(err, res) {
+      cb && cb();
+      self.resume();
+    });
 
     client.on('close', function() {
       self.pause();
@@ -1622,6 +1640,10 @@ Interface.prototype.trySpawn = function(cb) {
     self.handleBreak(res.body);
   });
 
+  client.on('exception', function(res) {
+    self.handleBreak(res.body);
+  });
+
   client.on('error', connectError);
   function connectError() {
     // If it's failed to connect 4 times then don't catch the next error