From b56e084c77914a7fde558e8fd28a218759a4ddd7 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Thu, 15 Mar 2018 23:22:26 -0400 Subject: [PATCH] Fix eta-conversion edge cases in peval. Fixes . Reported by Stefan Israelsson Tampe . * module/language/tree-il/peval.scm (peval)[lift-applied-lambda]: Before performing eta-conversion, check that the variable(s) passed to the inner 'apply' are not referenced from the inner lambda, and that the number of required arguments would not be reduced by the conversion. --- module/language/tree-il/peval.scm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/language/tree-il/peval.scm b/module/language/tree-il/peval.scm index 993fa0ad6..13b7d9bc4 100644 --- a/module/language/tree-il/peval.scm +++ b/module/language/tree-il/peval.scm @@ -1585,11 +1585,15 @@ top-level bindings from ENV and return the resulting expression." (and (not opt) rest (not kw) (match body (($ _ 'apply - (($ _ _ (and lcase ($ ))) + (($ _ _ (and lcase ($ _ req1))) ($ _ _ sym) ...)) (and (equal? sym gensyms) (not (lambda-case-alternate lcase)) + (<= (length req) (length req1)) + (every (lambda (s) + (= (lexical-refcount s) 1)) + sym) lcase)) (_ #f)))) (let* ((vars (map lookup-var gensyms))