throw/catch uses CatchNLX object instead of plain object
authorDavid Vázquez <davazp@gmail.com>
Sat, 22 Feb 2014 01:42:11 +0000 (02:42 +0100)
committerDavid Vázquez <davazp@gmail.com>
Sat, 22 Feb 2014 01:42:11 +0000 (02:42 +0100)
src/compiler/compiler.lisp
src/prelude.js

index d5f0b55..c5c69bd 100644 (file)
            "message" ,(concat "Return from unknown block '" (symbol-name name) "'."))))))
 
 (define-compilation catch (id &rest body)
-  `(selfcall
-    (var (id ,(convert id)))
-    (try
-     ,(convert-block body t))
-    (catch (|cf|)
-      (if (and (== (get |cf| "type") "catch")
-               (== (get |cf| "id") id))
-          ,(if *multiple-value-p*
-               `(return (method-call |values| "apply" this (call |forcemv| (get |cf| "values"))))
-               `(return (method-call |pv|     "apply" this (call |forcemv| (get |cf| "values")))))
-          (throw |cf|)))))
+  (let ((values (if *multiple-value-p* '|values| '|pv|)))
+    `(selfcall
+      (var (id ,(convert id)))
+      (try
+       ,(convert-block body t))
+      (catch (cf)
+        (if (and (instanceof cf |CatchNLX|) (== (get cf "id") id))
+            (return (method-call ,values "apply" this (call |forcemv| (get cf "values"))))
+            (throw cf))))))
 
 (define-compilation throw (id value)
   `(selfcall
     (var (|values| |mv|))
-    (throw (object
-            "type" "catch"
-            "id" ,(convert id)
-            "values" ,(convert value t)
-            "message" "Throw uncatched."))))
+    (throw (new (call |CatchNLX| ,(convert id) ,(convert value t))))))
+
 
 (defun go-tag-p (x)
   (or (integerp x) (symbolp x)))
index 8f2c1b2..d9df2da 100644 (file)
@@ -151,3 +151,17 @@ function js_to_lisp (x) {
     });
   } else return x;
 }
+
+
+// Non-local exits
+
+function BlockNLX (id, values, name){
+  this.id = id;
+  this.values = values;
+  this.name = name;
+}
+
+function CatchNLX (id, values){
+  this.id = id;
+  this.values = values;
+}