From e1f29348711cb668969139126b59a2a3b8881987 Mon Sep 17 00:00:00 2001 From: Barry O'Reilly Date: Sat, 25 Aug 2012 23:30:56 -0400 Subject: [PATCH] * src/lisp.h (functionp): New function (extracted from Ffunctionp). (FUNCTIONP): Use it. * src/eval.c (Ffunctionp): Use it. --- src/ChangeLog | 10 ++++++++-- src/eval.c | 28 ++-------------------------- src/lisp.h | 38 +++++++++++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 5654a191ec..54fff9356f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2012-08-26 Barry OReilly (tiny change) + + * lisp.h (functionp): New function (extracted from Ffunctionp). + (FUNCTIONP): Use it. + * eval.c (Ffunctionp): Use it. + 2012-08-25 Paul Eggert * xgselect.c (xg_select): Use auto storage for the GPollFD buffer @@ -160,8 +166,8 @@ * w32uniscribe.c (uniscribe_shape): Fix producing gstring components for RTL text (Bug#11860). Adjust X-OFFSET of each non-base glyph for the width of the base character, according to - what x_draw_composite_glyph_string_foreground expects. Generate - WADJUST value according to composition_gstring_width's + what x_draw_composite_glyph_string_foreground expects. + Generate WADJUST value according to composition_gstring_width's expectations, to produce correct width of the composed character. Reverse the sign of the DU offset produced by ScriptPlace. diff --git a/src/eval.c b/src/eval.c index c41e3f54d4..df44c87dc2 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2722,33 +2722,9 @@ DEFUN ("functionp", Ffunctionp, Sfunctionp, 1, 1, 0, doc: /* Non-nil if OBJECT is a function. */) (Lisp_Object object) { - if (SYMBOLP (object) && !NILP (Ffboundp (object))) - { - object = Findirect_function (object, Qt); - - if (CONSP (object) && EQ (XCAR (object), Qautoload)) - { - /* Autoloaded symbols are functions, except if they load - macros or keymaps. */ - int i; - for (i = 0; i < 4 && CONSP (object); i++) - object = XCDR (object); - - return (CONSP (object) && !NILP (XCAR (object))) ? Qnil : Qt; - } - } - - if (SUBRP (object)) - return (XSUBR (object)->max_args != UNEVALLED) ? Qt : Qnil; - else if (COMPILEDP (object)) + if (FUNCTIONP (object)) return Qt; - else if (CONSP (object)) - { - Lisp_Object car = XCAR (object); - return (EQ (car, Qlambda) || EQ (car, Qclosure)) ? Qt : Qnil; - } - else - return Qnil; + return Qnil; } DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0, diff --git a/src/lisp.h b/src/lisp.h index ef167ba56c..c44ba7be34 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1906,11 +1906,7 @@ typedef struct { Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object) /* Non-zero if OBJ is a Lisp function. */ -#define FUNCTIONP(OBJ) \ - ((CONSP (OBJ) && EQ (XCAR (OBJ), Qlambda)) \ - || (SYMBOLP (OBJ) && !NILP (Ffboundp (OBJ))) \ - || COMPILEDP (OBJ) \ - || SUBRP (OBJ)) +#define FUNCTIONP(OBJ) functionp(OBJ) /* defsubr (Sname); is how we define the symbol for function `name' at start-up time. */ @@ -3656,6 +3652,38 @@ maybe_gc (void) Fgarbage_collect (); } +LISP_INLINE int +functionp (Lisp_Object object) +{ + if (SYMBOLP (object) && !NILP (Ffboundp (object))) + { + object = Findirect_function (object, Qt); + + if (CONSP (object) && EQ (XCAR (object), Qautoload)) + { + /* Autoloaded symbols are functions, except if they load + macros or keymaps. */ + int i; + for (i = 0; i < 4 && CONSP (object); i++) + object = XCDR (object); + + return ! (CONSP (object) && !NILP (XCAR (object))); + } + } + + if (SUBRP (object)) + return XSUBR (object)->max_args != UNEVALLED; + else if (COMPILEDP (object)) + return 1; + else if (CONSP (object)) + { + Lisp_Object car = XCAR (object); + return EQ (car, Qlambda) || EQ (car, Qclosure); + } + else + return 0; +} + INLINE_HEADER_END #endif /* EMACS_LISP_H */ -- 2.20.1