diff options
| author | Stefan Monnier | 2011-02-17 16:19:13 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2011-02-17 16:19:13 -0500 |
| commit | b38b1ec071ee9752da53f2485902165fe728e8fa (patch) | |
| tree | 318ca7399de648f910626f666a1d6e62d71e081c /src/eval.c | |
| parent | ce5b520a3758e22c6516e0d864d8c1a3512bf457 (diff) | |
| download | emacs-b38b1ec071ee9752da53f2485902165fe728e8fa.tar.gz emacs-b38b1ec071ee9752da53f2485902165fe728e8fa.zip | |
Various compiler bug-fixes. MPC seems to run correctly now.
* lisp/files.el (lexical-binding): Add a safe-local-variable property.
* lisp/emacs-lisp/byte-opt.el (byte-inline-lapcode): Check how many elements
are added to the stack.
(byte-compile-splice-in-already-compiled-code): Don't touch lexical nor
byte-compile-depth now that byte-inline-lapcode does it for us.
(byte-compile-inline-expand): Don't inline dynbind byte code into
lexbind code, since it has to be done differently.
* lisp/emacs-lisp/bytecomp.el (byte-compile-arglist-warn):
Correctly extract arglist from `closure's.
(byte-compile-cl-warn): Compiler-macros are run earlier now.
(byte-compile-top-level): Bind byte-compile-lexical-environment to nil,
except for lambdas.
(byte-compile-form): Don't run the compiler-macro expander here.
(byte-compile-let): Merge with byte-compile-let*.
Don't preserve-body-value if the body's value was discarded.
* lisp/emacs-lisp/cconv.el (cconv--set-diff, cconv--set-diff-map)
(cconv--map-diff, cconv--map-diff-elem, cconv--map-diff-set): New funs.
(cconv--env-var): New constant.
(cconv-closure-convert-rec): Use it and use them. Fix a typo that
ended up forgetting to remove entries from lmenvs in `let'.
For `lambda' use the outer `fvrs' when building the closure and don't
forget to remove `vars' from the `emvrs' and `lmenvs' of the body.
* lisp/emacs-lisp/cl-macs.el (cl-byte-compile-block): Disable optimization
in lexbind, because it needs a different implementation.
* src/bytecode.c (exec_byte_code): Fix handling of &rest.
* src/eval.c (Vinternal_interpreter_environment): Remove.
(syms_of_eval): Do declare Vinternal_interpreter_environment as
a global lisp var, but unintern it to hide it.
(Fcommandp):
* src/data.c (Finteractive_form): Understand `closure's.
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/src/eval.c b/src/eval.c index 9adfc983ced..63484d40e1b 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -78,16 +78,6 @@ Lisp_Object Vrun_hooks; | |||
| 78 | 78 | ||
| 79 | Lisp_Object Vautoload_queue; | 79 | Lisp_Object Vautoload_queue; |
| 80 | 80 | ||
| 81 | /* When lexical binding is being used, this is non-nil, and contains an | ||
| 82 | alist of lexically-bound variable, or (t), indicating an empty | ||
| 83 | environment. The lisp name of this variable is | ||
| 84 | `internal-interpreter-environment'. Every element of this list | ||
| 85 | can be either a cons (VAR . VAL) specifying a lexical binding, | ||
| 86 | or a single symbol VAR indicating that this variable should use | ||
| 87 | dynamic scoping. */ | ||
| 88 | |||
| 89 | Lisp_Object Vinternal_interpreter_environment; | ||
| 90 | |||
| 91 | /* Current number of specbindings allocated in specpdl. */ | 81 | /* Current number of specbindings allocated in specpdl. */ |
| 92 | 82 | ||
| 93 | EMACS_INT specpdl_size; | 83 | EMACS_INT specpdl_size; |
| @@ -2092,9 +2082,11 @@ then strings and vectors are not accepted. */) | |||
| 2092 | if (!CONSP (fun)) | 2082 | if (!CONSP (fun)) |
| 2093 | return Qnil; | 2083 | return Qnil; |
| 2094 | funcar = XCAR (fun); | 2084 | funcar = XCAR (fun); |
| 2085 | if (EQ (funcar, Qclosure)) | ||
| 2086 | fun = Fcdr (XCDR (fun)), funcar = Fcar (fun); | ||
| 2095 | if (EQ (funcar, Qlambda)) | 2087 | if (EQ (funcar, Qlambda)) |
| 2096 | return !NILP (Fassq (Qinteractive, Fcdr (XCDR (fun)))) ? Qt : if_prop; | 2088 | return !NILP (Fassq (Qinteractive, Fcdr (XCDR (fun)))) ? Qt : if_prop; |
| 2097 | if (EQ (funcar, Qautoload)) | 2089 | else if (EQ (funcar, Qautoload)) |
| 2098 | return !NILP (Fcar (Fcdr (Fcdr (XCDR (fun))))) ? Qt : if_prop; | 2090 | return !NILP (Fcar (Fcdr (Fcdr (XCDR (fun))))) ? Qt : if_prop; |
| 2099 | else | 2091 | else |
| 2100 | return Qnil; | 2092 | return Qnil; |
| @@ -3695,6 +3687,8 @@ mark_backtrace (void) | |||
| 3695 | } | 3687 | } |
| 3696 | } | 3688 | } |
| 3697 | 3689 | ||
| 3690 | EXFUN (Funintern, 2); | ||
| 3691 | |||
| 3698 | void | 3692 | void |
| 3699 | syms_of_eval (void) | 3693 | syms_of_eval (void) |
| 3700 | { | 3694 | { |
| @@ -3840,19 +3834,27 @@ DECL is a list `(declare ...)' containing the declarations. | |||
| 3840 | The value the function returns is not used. */); | 3834 | The value the function returns is not used. */); |
| 3841 | Vmacro_declaration_function = Qnil; | 3835 | Vmacro_declaration_function = Qnil; |
| 3842 | 3836 | ||
| 3837 | /* When lexical binding is being used, | ||
| 3838 | vinternal_interpreter_environment is non-nil, and contains an alist | ||
| 3839 | of lexically-bound variable, or (t), indicating an empty | ||
| 3840 | environment. The lisp name of this variable would be | ||
| 3841 | `internal-interpreter-environment' if it weren't hidden. | ||
| 3842 | Every element of this list can be either a cons (VAR . VAL) | ||
| 3843 | specifying a lexical binding, or a single symbol VAR indicating | ||
| 3844 | that this variable should use dynamic scoping. */ | ||
| 3843 | Qinternal_interpreter_environment | 3845 | Qinternal_interpreter_environment |
| 3844 | = intern_c_string ("internal-interpreter-environment"); | 3846 | = intern_c_string ("internal-interpreter-environment"); |
| 3845 | staticpro (&Qinternal_interpreter_environment); | 3847 | staticpro (&Qinternal_interpreter_environment); |
| 3846 | #if 0 /* Don't export this variable to Elisp, so noone can mess with it | 3848 | DEFVAR_LISP ("internal-interpreter-environment", |
| 3847 | (Just imagine if someone makes it buffer-local). */ | 3849 | Vinternal_interpreter_environment, |
| 3848 | DEFVAR__LISP ("internal-interpreter-environment", | ||
| 3849 | Vinternal_interpreter_environment, | ||
| 3850 | doc: /* If non-nil, the current lexical environment of the lisp interpreter. | 3850 | doc: /* If non-nil, the current lexical environment of the lisp interpreter. |
| 3851 | When lexical binding is not being used, this variable is nil. | 3851 | When lexical binding is not being used, this variable is nil. |
| 3852 | A value of `(t)' indicates an empty environment, otherwise it is an | 3852 | A value of `(t)' indicates an empty environment, otherwise it is an |
| 3853 | alist of active lexical bindings. */); | 3853 | alist of active lexical bindings. */); |
| 3854 | #endif | ||
| 3855 | Vinternal_interpreter_environment = Qnil; | 3854 | Vinternal_interpreter_environment = Qnil; |
| 3855 | /* Don't export this variable to Elisp, so noone can mess with it | ||
| 3856 | (Just imagine if someone makes it buffer-local). */ | ||
| 3857 | Funintern (Qinternal_interpreter_environment, Qnil); | ||
| 3856 | 3858 | ||
| 3857 | Vrun_hooks = intern_c_string ("run-hooks"); | 3859 | Vrun_hooks = intern_c_string ("run-hooks"); |
| 3858 | staticpro (&Vrun_hooks); | 3860 | staticpro (&Vrun_hooks); |