summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-06-24 17:35:55 +0200
committerAndy Wingo <wingo@pobox.com>2016-06-24 17:37:51 +0200
commit229d062f83d7c79fa08729330406d25755b25080 (patch)
tree16c6218e563768a215c81b1be119ce40ff888ad4
parentff5cafc77d34420b12a134ef2c1d5bd7ca4794cb (diff)
downloadguile-229d062f83d7c79fa08729330406d25755b25080.tar.gz
Constant-folding eq? and eqv? uses deduplication
* test-suite/tests/peval.test ("partial evaluation"): Add tests. * module/language/tree-il/peval.scm (peval): Constant-fold eq? and eqv? using equal?, anticipating deduplication.
-rw-r--r--module/language/tree-il/peval.scm10
-rw-r--r--test-suite/tests/peval.test8
2 files changed, 17 insertions, 1 deletions
diff --git a/module/language/tree-il/peval.scm b/module/language/tree-il/peval.scm
index 8e1069d38..7d1945873 100644
--- a/module/language/tree-il/peval.scm
+++ b/module/language/tree-il/peval.scm
@@ -511,7 +511,15 @@ top-level bindings from ENV and return the resulting expression."
(lambda ()
(call-with-values
(lambda ()
- (apply (module-ref the-scm-module name) args))
+ (case name
+ ((eq? eqv?)
+ ;; Constants will be deduplicated later, but eq?
+ ;; folding can happen now. Anticipate the
+ ;; deduplication by using equal? instead of eq?.
+ ;; Same for eqv?.
+ (apply equal? args))
+ (else
+ (apply (module-ref the-scm-module name) args))))
(lambda results
(values #t results))))
(lambda _
diff --git a/test-suite/tests/peval.test b/test-suite/tests/peval.test
index 340780873..4e2ccf9c6 100644
--- a/test-suite/tests/peval.test
+++ b/test-suite/tests/peval.test
@@ -1360,6 +1360,14 @@
(call (toplevel bar) (lexical x _))))))
(pass-if-peval
+ (eq? '(a b) '(a b))
+ (const #t))
+
+ (pass-if-peval
+ (eqv? '(a b) '(a b))
+ (const #t))
+
+ (pass-if-peval
((lambda (foo)
(define* (bar a #:optional (b (1+ a)))
(list a b))