summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/data.c4
-rw-r--r--src/doc.c8
-rw-r--r--src/eval.c9
4 files changed, 17 insertions, 11 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index bbf7f99bb32..00d8e4b8ee3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2011-03-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * eval.c (Ffunction): Use simpler format for closures.
+ (Fcommandp, funcall_lambda):
+ * doc.c (Fdocumentation, store_function_docstring):
+ * data.c (Finteractive_form): Adjust to new closure format.
+
2011-03-11 Stefan Monnier <monnier@iro.umontreal.ca>
* eval.c (Fprog1, Fprog2): Simplify and use XCDR/XCAR.
diff --git a/src/data.c b/src/data.c
index 186e9cb9859..6039743b1d5 100644
--- a/src/data.c
+++ b/src/data.c
@@ -746,8 +746,8 @@ Value, if non-nil, is a list \(interactive SPEC). */)
{
Lisp_Object funcar = XCAR (fun);
if (EQ (funcar, Qclosure))
- fun = Fcdr (XCDR (fun)), funcar = Fcar (fun);
- if (EQ (funcar, Qlambda))
+ return Fassq (Qinteractive, Fcdr (Fcdr (XCDR (fun))));
+ else if (EQ (funcar, Qlambda))
return Fassq (Qinteractive, Fcdr (XCDR (fun)));
else if (EQ (funcar, Qautoload))
{
diff --git a/src/doc.c b/src/doc.c
index de20edb2d98..b56464e7219 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -369,6 +369,7 @@ string is passed through `substitute-command-keys'. */)
else if (EQ (funcar, Qkeymap))
return build_string ("Prefix command (definition is a keymap associating keystrokes with commands).");
else if (EQ (funcar, Qlambda)
+ || (EQ (funcar, Qclosure) && (fun = XCDR (fun), 1))
|| EQ (funcar, Qautoload))
{
Lisp_Object tem1;
@@ -384,8 +385,6 @@ string is passed through `substitute-command-keys'. */)
else
return Qnil;
}
- else if (EQ (funcar, Qclosure))
- return Fdocumentation (Fcdr (XCDR (fun)), raw);
else if (EQ (funcar, Qmacro))
return Fdocumentation (Fcdr (fun), raw);
else
@@ -505,7 +504,8 @@ store_function_docstring (Lisp_Object fun, EMACS_INT offset)
Lisp_Object tem;
tem = XCAR (fun);
- if (EQ (tem, Qlambda) || EQ (tem, Qautoload))
+ if (EQ (tem, Qlambda) || EQ (tem, Qautoload)
+ || (EQ (tem, Qclosure) && (fun = XCDR (fun), 1)))
{
tem = Fcdr (Fcdr (fun));
if (CONSP (tem) && INTEGERP (XCAR (tem)))
@@ -513,8 +513,6 @@ store_function_docstring (Lisp_Object fun, EMACS_INT offset)
}
else if (EQ (tem, Qmacro))
store_function_docstring (XCDR (fun), offset);
- else if (EQ (tem, Qclosure))
- store_function_docstring (Fcdr (XCDR (fun)), offset);
}
/* Bytecode objects sometimes have slots for it. */
diff --git a/src/eval.c b/src/eval.c
index 36c63a5c8a7..2fb89ce404e 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -487,7 +487,8 @@ usage: (function ARG) */)
&& EQ (XCAR (quoted), Qlambda))
/* This is a lambda expression within a lexical environment;
return an interpreted closure instead of a simple lambda. */
- return Fcons (Qclosure, Fcons (Vinternal_interpreter_environment, quoted));
+ return Fcons (Qclosure, Fcons (Vinternal_interpreter_environment,
+ XCDR (quoted)));
else
/* Simply quote the argument. */
return quoted;
@@ -2079,8 +2080,8 @@ then strings and vectors are not accepted. */)
return Qnil;
funcar = XCAR (fun);
if (EQ (funcar, Qclosure))
- fun = Fcdr (XCDR (fun)), funcar = Fcar (fun);
- if (EQ (funcar, Qlambda))
+ return !NILP (Fassq (Qinteractive, Fcdr (Fcdr (XCDR (fun))))) ? Qt : if_prop;
+ else if (EQ (funcar, Qlambda))
return !NILP (Fassq (Qinteractive, Fcdr (XCDR (fun)))) ? Qt : if_prop;
else if (EQ (funcar, Qautoload))
return !NILP (Fcar (Fcdr (Fcdr (XCDR (fun))))) ? Qt : if_prop;
@@ -3121,7 +3122,7 @@ funcall_lambda (Lisp_Object fun, int nargs,
{
fun = XCDR (fun); /* Drop `closure'. */
lexenv = XCAR (fun);
- fun = XCDR (fun); /* Drop the lexical environment. */
+ CHECK_LIST_CONS (fun, fun);
}
else
lexenv = Qnil;