diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-02-26 16:01:02 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-02-26 16:01:02 -0500 |
commit | 39605a343b566a1a72e0afb61f96d085c2ef8054 (patch) | |
tree | 0522f2968356894775a72c41f7eee4609354f320 | |
parent | a9de04fa62f123413d82b7b7b1e7a77705eb82dd (diff) | |
download | emacs-39605a343b566a1a72e0afb61f96d085c2ef8054.tar.gz |
* lisp/emacs-lisp/cconv.el (cconv-closure-convert-rec): Fix last change for
λ-lift candidates that end up not λ-lifted.
-rw-r--r-- | lisp/ChangeLog | 3 | ||||
-rw-r--r-- | lisp/emacs-lisp/cconv.el | 13 |
2 files changed, 12 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1b5e9400a8c..4a22b148469 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el index 0e4b5d31699..006e2ef904c 100644 --- a/lisp/emacs-lisp/cconv.el +++ b/lisp/emacs-lisp/cconv.el @@ -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 |