From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Sean Lynch Newsgroups: gmane.lisp.guile.devel Subject: [PATCH 2/4] Implement ecmascript try/catch. Date: Wed, 28 Oct 2020 00:03:31 -0400 Message-ID: <20201028040330.22051-3-sean@seanplynch.com> References: <20201028040330.22051-1-sean@seanplynch.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="5056"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Sean Lynch To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Wed Oct 28 15:27:55 2020 Return-path: Envelope-to: guile-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kXmQd-0001D7-Di for guile-devel@m.gmane-mx.org; Wed, 28 Oct 2020 15:27:55 +0100 Original-Received: from localhost ([::1]:53508 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kXmQc-0002yg-Cq for guile-devel@m.gmane-mx.org; Wed, 28 Oct 2020 10:27:54 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:40430) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kXchq-0006Gk-Jd for guile-devel@gnu.org; Wed, 28 Oct 2020 00:05:02 -0400 Original-Received: from mail-qv1-xf35.google.com ([2607:f8b0:4864:20::f35]:44529) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kXchp-0002EB-0X for guile-devel@gnu.org; Wed, 28 Oct 2020 00:05:02 -0400 Original-Received: by mail-qv1-xf35.google.com with SMTP id s17so1798668qvr.11 for ; Tue, 27 Oct 2020 21:05:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seanplynch-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gYmFf8lsQ7MC98bLNtQcbJ227bwYOYit7Gjm2ZGAs3k=; b=f9fs/yW9q4HyCDOq3QNZ6J/xEN3d7DwPSmr7peQGLmsqz68KlDJAGKU5Iuw6Rbup9d /cAUs3jXmDvm0GN4zqxDs2Hahh2FuBuOMo3IPIJxfvTm1abhfBNC5npkdqHIFB+UlB09 Plq1lPcDJbqohx6Z/61ohh6Q3LdsBiO7a4dZSWS9gMixt7B6HhNtUpPCgzujIKs9WWie wOXc5EyMqhXFdSC2wHitqsHKxlF65m+KmQ0je3fMTduv0mtuwrvePqxm0vBYMxr2aivR 833HsfKpsAIq8Cd0zgEBQnzdnV55g35lE/yc3EC8MYtrv0KWWl4gXZGZjME160k43I/M D7eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gYmFf8lsQ7MC98bLNtQcbJ227bwYOYit7Gjm2ZGAs3k=; b=rkryYY/wpb5xgEx9+2zkpuWiy5DSTyjcme6EB4M161gObWK8yL3Sn6tv/4m7kpFY09 g5pax0isxpfKPZDs0y9UIpZGvHo/suzDzSVvCIjUyLVzqzzuE0twSIutkefEfGH53r9F zf3atrKlWoi3xW7qVsZnzRiLLQfKge/DoGkftFqChxg08jjg8dKz+80Coxw+A2RWDxeO 2jslEMPEQz0KVUYrH9yTJfDr0Rv7NCL/fsV7qsJmrJ/70kobro/3jfa2MgNE1eWqbxvM GgoXy3/iwMQrnCFt8VIvZlzbixX1uBdGkFhqTPojCg1O4JGusD45aWwGE7ounjLAU5k8 bEfg== X-Gm-Message-State: AOAM532v4ToKSidOS+MORDFZeRd8JLqMEibXk5GY6mza57C5NRIS53JJ eoMBq4WEaDfd6uFrRwLx7bQLJm5vTlz5BlCZ X-Google-Smtp-Source: ABdhPJzUcGX18xh1/P4+i9ADuJ8ma5VHyNf9ppQWDqZt+EtKbXh/hyTNS5J2HTAj4a/+6xok9AmpYg== X-Received: by 2002:a0c:9e0e:: with SMTP id p14mr5872829qve.25.1603857899881; Tue, 27 Oct 2020 21:04:59 -0700 (PDT) Original-Received: from guix.stny.rr.com (cpe-74-69-187-15.stny.res.rr.com. [74.69.187.15]) by smtp.googlemail.com with ESMTPSA id 67sm2318916qkd.14.2020.10.27.21.04.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2020 21:04:59 -0700 (PDT) X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201028040330.22051-1-sean@seanplynch.com> Received-SPF: neutral client-ip=2607:f8b0:4864:20::f35; envelope-from=sean@seanplynch.com; helo=mail-qv1-xf35.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NEUTRAL=0.779 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 28 Oct 2020 10:27:17 -0400 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Original-Sender: "guile-devel" Xref: news.gmane.io gmane.lisp.guile.devel:20603 Archived-At: 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 () @@ -87,6 +89,20 @@ (fluid-set! *this* (make )) (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