]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/cconv.el (cconv-closure-convert-rec): Fix last change for
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 26 Feb 2011 21:01:02 +0000 (16:01 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 26 Feb 2011 21:01:02 +0000 (16:01 -0500)
λ-lift candidates that end up not λ-lifted.

lisp/ChangeLog
lisp/emacs-lisp/cconv.el

index 1b5e9400a8ca763d2a91e4ad897a9facba5ca105..4a22b148469ddcba15847cd81a14e8c120adea9a 100644 (file)
@@ -1,5 +1,8 @@
 2011-02-26  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * emacs-lisp/cconv.el (cconv-closure-convert-rec): Fix last change for
+       λ-lift candidates that end up not λ-lifted.
+
        * emacs-lisp/cconv.el: Compute freevars in cconv-analyse.
        (cconv-mutated, cconv-captured): Remove.
        (cconv-captured+mutated, cconv-lambda-candidates): Don't give them
index 0e4b5d3169927b4848800ddb96af201384776536..006e2ef904c83702c54d640c02fd795060af4106 100644 (file)
@@ -1,4 +1,4 @@
-;;; cconv.el --- Closure conversion for statically scoped Emacs lisp. -*- lexical-binding: t -*-
+;;; cconv.el --- Closure conversion for statically scoped Emacs lisp. -*- lexical-binding: t; coding: utf-8 -*-
 
 ;; Copyright (C) 2011  Free Software Foundation, Inc.
 
@@ -261,7 +261,8 @@ Returns a form where all lambdas don't have any free variables."
                                 (eq (car (cadr value)) 'lambda)))
                    (assert (equal (cddr (cadr value))
                                   (caar cconv-freevars-alist)))
-                   (let* ((fv (cdr (pop cconv-freevars-alist)))
+                  ;; Peek at the freevars to decide whether to λ-lift.
+                   (let* ((fv (cdr (car cconv-freevars-alist)))
                           (funargs (cadr (cadr value)))
                           (funcvars (append fv funargs))
                           (funcbodies (cddadr value)) ; function bodies
@@ -269,10 +270,14 @@ Returns a form where all lambdas don't have any free variables."
                                        ; lambda lifting condition
                      (if (or (not fv) (< cconv-liftwhen (length funcvars)))
                                        ; do not lift
-                         (cconv-closure-convert-rec
-                          value emvrs fvrs envs lmenvs)
+                        (cconv-closure-convert-rec
+                         value emvrs fvrs envs lmenvs)
                                        ; lift
                        (progn
+                        (setq cconv-freevars-alist
+                              ;; Now that we know we'll λ-lift, consume the
+                              ;; freevar data.
+                              (cdr cconv-freevars-alist))
                          (dolist (elm2 funcbodies)
                            (push        ; convert function bodies
                             (cconv-closure-convert-rec