guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/4] Implement ecmascript try/catch.


From: Sean Lynch
Subject: [PATCH 2/4] Implement ecmascript try/catch.
Date: Wed, 28 Oct 2020 00:03:31 -0400

Implement ecmascript try/catch using
with-exception-handler/rais-exception respectively so that it is
straight-forward to interact with ecmascript exceptions from scheme.

* module/language/ecmascript/compile-tree-il.scm: Compile try/catch
* module/language/ecmascript/impl.scm: Provide js-try and js-catch
  procedures
---
 .../language/ecmascript/compile-tree-il.scm   | 25 +++++++++++++++++++
 module/language/ecmascript/impl.scm           | 18 ++++++++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/module/language/ecmascript/compile-tree-il.scm 
b/module/language/ecmascript/compile-tree-il.scm
index 074674142..6f6af5210 100644
--- a/module/language/ecmascript/compile-tree-il.scm
+++ b/module/language/ecmascript/compile-tree-il.scm
@@ -355,6 +355,31 @@
               ,(with-return-prompt
                 (lambda ()
                   (comp-body e body formals syms))))))))
+      ((try (block . ,body)
+            (catch ,err (block . ,catch))
+            ,finally)
+       (let ((err-sym (gensym (symbol->string err))))
+        `(call ,(@implv js-try)
+               (lambda ()
+                 (lambda-case
+                   ((() #f #f #f () ())
+                    (begin ,@(map (lambda (x) (comp x e)) body)))))
+               (lambda ((,err . ,err-sym))
+                 (lambda-case
+                   (((,err) #f #f #f () (,err-sym))
+                    ,(let ((e (econs err err-sym e)))
+                       `(begin ,@(map (lambda (x) (comp x e)) catch))))))
+               (lambda ()
+                 (lambda-case
+                   ((() #f #f #f () ())
+                    ,(pmatch/source finally
+                       ((finally (block . ,finally))
+                        `(begin ,@(map (lambda (x) (comp x e)) finally)))
+                       (#f '(void))
+                       (else (error "syntax error: invalid try statement: " 
x)))))))))
+      ((throw ,expr)
+       `(call ,(@implv js-throw)
+              ,(comp expr e)))
       ((call/this ,obj ,prop . ,args)
        (@impl call/this*
               obj
diff --git a/module/language/ecmascript/impl.scm 
b/module/language/ecmascript/impl.scm
index 27c077aed..b1be63403 100644
--- a/module/language/ecmascript/impl.scm
+++ b/module/language/ecmascript/impl.scm
@@ -33,7 +33,9 @@
             shift
             mod
             band bxor bior
-            make-enumerator))
+            make-enumerator
+            js-throw
+            js-try))
 
 
 (define-class <js-module-object> (<js-object>)
@@ -87,6 +89,20 @@
          (fluid-set! *this* (make <js-global-object>))
          (init-js-bindings! (current-module)))))
 
+(define (js-throw obj)
+  (raise-exception obj #:continuable? #t))
+
+(define (js-try body-thunk catch-handler finally-thunk)
+  (with-exception-handler (lambda (e) 
+                            (catch-handler e)
+                            (finally-thunk)
+                            *undefined*)
+                          (lambda ()
+                            (body-thunk)
+                            (finally-thunk)
+                            *undefined*)
+                          #:unwind? #t))
+
 (define (get-this)
   (fluid-ref *this*))
 
-- 
2.29.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]