[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/02: Avoid swallowing errors for (values) operands of
From: |
Andy Wingo |
Subject: |
[Guile-commits] 01/02: Avoid swallowing errors for (values) operands of elided primcalls |
Date: |
Mon, 27 Nov 2023 08:33:20 -0500 (EST) |
wingo pushed a commit to branch main
in repository guile.
commit 38e9bd7a2f9d84442bc26ec4b2d91f515aedfeb1
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Mon Nov 27 14:02:03 2023 +0100
Avoid swallowing errors for (values) operands of elided primcalls
* module/language/tree-il/peval.scm (peval): When visiting (values) in
anything other than an effect or values context,
residualize (values (values)), which will cause a run-time error.
* test-suite/tests/peval.test ("values"): Add test.
---
module/language/tree-il/peval.scm | 21 ++++++++++++---------
test-suite/tests/peval.test | 7 +++++++
2 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/module/language/tree-il/peval.scm
b/module/language/tree-il/peval.scm
index c39069f69..937a797f0 100644
--- a/module/language/tree-il/peval.scm
+++ b/module/language/tree-il/peval.scm
@@ -1306,12 +1306,16 @@ top-level bindings from ENV and return the resulting
expression."
'()))))))))
(($ <primcall> src 'values exps)
- (cond
- ((null? exps)
- (if (eq? ctx 'effect)
- (make-void #f)
- exp))
- (else
+ (match exps
+ (()
+ (case ctx
+ ((effect) (make-void #f))
+ ((values) exp)
+ ;; Zero values returned to continuation expecting a value:
+ ;; ensure that we raise an error.
+ (else (make-primcall src 'values (list exp)))))
+ ((($ <primcall> _ 'values ())) exp)
+ (_
(let ((vals (map for-value exps)))
(if (and (case ctx
((value test effect) #t)
@@ -1357,12 +1361,11 @@ top-level bindings from ENV and return the resulting
expression."
('make-prompt-tag ($ <const> _ (? string?))))
#t)
(_ #f)))
- ;; Some expressions can be folded without visiting the
- ;; arguments for value.
(let ((res (if (eq? ctx 'effect)
(make-void #f)
(make-const #f #t))))
- (for-tail (list->seq src (append args (list res))))))
+ (for-tail (list->seq src (append (map for-value args)
+ (list res))))))
(else
(match (cons name (map for-value args))
(('cons x ($ <const> _ (? (cut eq? <> '()))))
diff --git a/test-suite/tests/peval.test b/test-suite/tests/peval.test
index 4b03c9ea0..bed2e2dc4 100644
--- a/test-suite/tests/peval.test
+++ b/test-suite/tests/peval.test
@@ -1583,3 +1583,10 @@
(pass-if-peval (equal? x '(a . b))
(primcall equal? (toplevel x) (const (a . b)))))
+
+(with-test-prefix "values"
+ (pass-if-peval (begin (cons 1 (values)) #f)
+ (seq (primcall values (primcall values))
+ (const #f)))
+ (pass-if-peval (begin 1 (values) #f)
+ (const #f)))