diff options
| author | Stefan Monnier | 2010-12-13 22:37:44 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2010-12-13 22:37:44 -0500 |
| commit | defb141157dfa37c33cdcbfa4b29c702a8fc9edf (patch) | |
| tree | e0d40af60254aa9f680ce46f26c77bc47655b07f /lisp | |
| parent | 7a600d54c026061eee6db4e499802f524e7ebe00 (diff) | |
| download | emacs-defb141157dfa37c33cdcbfa4b29c702a8fc9edf.tar.gz emacs-defb141157dfa37c33cdcbfa4b29c702a8fc9edf.zip | |
Try and be more careful about propagation of lexical environment.
* src/eval.c (apply_lambda, funcall_lambda): Remove lexenv arg.
(Feval): Always eval in the empty environment.
(eval_sub): New function. Use it for all calls to Feval that should
evaluate in the lexical environment of the caller.
Pass `closure's as is to apply_lambda.
(Ffuncall): Pass `closure's as is to funcall_lambda.
(funcall_lambda): Extract lexenv for `closure's, when applicable.
Also use lexical scoping for the &rest argument, if applicable.
* src/lisp.h (eval_sub): Declare.
* src/lread.c (readevalloop): Remove `evalfun' argument.
* src/print.c (Fwith_output_to_temp_buffer):
* src/data.c (Fsetq_default): Use eval_sub.
* lisp/emacs-lisp/bytecomp.el (byte-compile-condition-case): Use push.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/ChangeLog | 4 | ||||
| -rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 16 |
2 files changed, 12 insertions, 8 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5a5b7ef44dc..053eb95329c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2010-12-14 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * emacs-lisp/bytecomp.el (byte-compile-condition-case): Use push. | ||
| 4 | |||
| 1 | 2010-12-13 Stefan Monnier <monnier@iro.umontreal.ca> | 5 | 2010-12-13 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 6 | ||
| 3 | * subr.el (with-lexical-binding): Remove. | 7 | * subr.el (with-lexical-binding): Remove. |
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 90fcf7fb8a6..0f7018b9b64 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el | |||
| @@ -2979,6 +2979,7 @@ If FORM is a lambda or a macro, byte-compile it as a function." | |||
| 2979 | 2979 | ||
| 2980 | ;; Given BYTECOMP-BODY, compile it and return a new body. | 2980 | ;; Given BYTECOMP-BODY, compile it and return a new body. |
| 2981 | (defun byte-compile-top-level-body (bytecomp-body &optional for-effect) | 2981 | (defun byte-compile-top-level-body (bytecomp-body &optional for-effect) |
| 2982 | ;; FIXME: lexbind. Check all callers! | ||
| 2982 | (setq bytecomp-body | 2983 | (setq bytecomp-body |
| 2983 | (byte-compile-top-level (cons 'progn bytecomp-body) for-effect t)) | 2984 | (byte-compile-top-level (cons 'progn bytecomp-body) for-effect t)) |
| 2984 | (cond ((eq (car-safe bytecomp-body) 'progn) | 2985 | (cond ((eq (car-safe bytecomp-body) 'progn) |
| @@ -4083,8 +4084,8 @@ if LFORMINFO is nil (meaning all bindings are dynamic)." | |||
| 4083 | 4084 | ||
| 4084 | (defun byte-compile-track-mouse (form) | 4085 | (defun byte-compile-track-mouse (form) |
| 4085 | (byte-compile-form | 4086 | (byte-compile-form |
| 4086 | `(funcall '(lambda nil | 4087 | `(funcall #'(lambda nil |
| 4087 | (track-mouse ,@(byte-compile-top-level-body (cdr form))))))) | 4088 | (track-mouse ,@(byte-compile-top-level-body (cdr form))))))) |
| 4088 | 4089 | ||
| 4089 | (defun byte-compile-condition-case (form) | 4090 | (defun byte-compile-condition-case (form) |
| 4090 | (let* ((var (nth 1 form)) | 4091 | (let* ((var (nth 1 form)) |
| @@ -4121,11 +4122,10 @@ if LFORMINFO is nil (meaning all bindings are dynamic)." | |||
| 4121 | ;; "`%s' is not a known condition name (in condition-case)" | 4122 | ;; "`%s' is not a known condition name (in condition-case)" |
| 4122 | ;; condition)) | 4123 | ;; condition)) |
| 4123 | ) | 4124 | ) |
| 4124 | (setq compiled-clauses | 4125 | (push (cons condition |
| 4125 | (cons (cons condition | 4126 | (byte-compile-top-level-body |
| 4126 | (byte-compile-top-level-body | 4127 | (cdr clause) for-effect)) |
| 4127 | (cdr clause) for-effect)) | 4128 | compiled-clauses)) |
| 4128 | compiled-clauses))) | ||
| 4129 | (setq clauses (cdr clauses))) | 4129 | (setq clauses (cdr clauses))) |
| 4130 | (byte-compile-push-constant (nreverse compiled-clauses))) | 4130 | (byte-compile-push-constant (nreverse compiled-clauses))) |
| 4131 | (byte-compile-out 'byte-condition-case 0))) | 4131 | (byte-compile-out 'byte-condition-case 0))) |
| @@ -4244,7 +4244,7 @@ if LFORMINFO is nil (meaning all bindings are dynamic)." | |||
| 4244 | `(if (not (default-boundp ',var)) (setq-default ,var ,value)))) | 4244 | `(if (not (default-boundp ',var)) (setq-default ,var ,value)))) |
| 4245 | (when (eq fun 'defconst) | 4245 | (when (eq fun 'defconst) |
| 4246 | ;; This will signal an appropriate error at runtime. | 4246 | ;; This will signal an appropriate error at runtime. |
| 4247 | `(eval ',form))) | 4247 | `(eval ',form))) ;FIXME: lexbind |
| 4248 | `',var)))) | 4248 | `',var)))) |
| 4249 | 4249 | ||
| 4250 | (defun byte-compile-autoload (form) | 4250 | (defun byte-compile-autoload (form) |