fix syntax error handling for 'throw ...', fix return value assertion
authorFedor Indutny <fedor.indutny@gmail.com>
Sun, 11 Sep 2011 07:05:00 +0000 (14:05 +0700)
committerRyan Dahl <ry@tinyclouds.org>
Sun, 11 Sep 2011 09:19:42 +0000 (02:19 -0700)
lib/repl.js

index 597acbc..cc9b227 100644 (file)
@@ -163,9 +163,9 @@ function REPLServer(prompt, stream, eval) {
                 self.context,
                 'repl',
                 function(e, ret) {
-        if (e) return finish(e);
+        if (e && !isSyntaxError(e)) return finish(e);
 
-        if (ret === 'function' || e) {
+        if (typeof ret === 'function' || e) {
           // Now as statement without parens.
           self.eval(self.bufferedCommand, self.context, 'repl', finish);
         } else {
@@ -177,14 +177,18 @@ function REPLServer(prompt, stream, eval) {
       finish(null);
     }
 
-    function finish(e, ret) {
+    function isSyntaxError(e) {
       // Convert error to string
       e = e && (e.stack || e.toString());
+      return e && e.match(/^SyntaxError/) &&
+             !(e.match(/^SyntaxError: Unexpected token .*\n/) &&
+             e.match(/\n    at Object.parse \(native\)\n/));
+    }
+
+    function finish(e, ret) {
 
       // If error was SyntaxError and not JSON.parse error
-      if (e && e.match(/^SyntaxError/) &&
-          !(e.match(/^SyntaxError: Unexpected token .*\n/) &&
-            e.match(/\n    at Object.parse \(native\)\n/))) {
+      if (isSyntaxError(e)) {
         // Start buffering data like that:
         // {
         // ...  x: 1
@@ -192,7 +196,7 @@ function REPLServer(prompt, stream, eval) {
         self.displayPrompt();
         return;
       } else if (e) {
-        self.outputStream.write(e + '\n');
+        self.outputStream.write((e.stack || e) + '\n');
       }
 
       // Clear buffer if no SyntaxErrors