diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-11-08 23:10:16 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-11-08 23:10:16 -0500 |
commit | 57618ecf3358e49ab3c380330e82ca8d2078cc63 (patch) | |
tree | cb031b879ebeb162179f5718c015f70a5e31c755 /src/doc.c | |
parent | 67dd8ad119474d5c403e3410b4465baef2647609 (diff) | |
download | emacs-57618ecf3358e49ab3c380330e82ca8d2078cc63.tar.gz |
New property dynamic-docstring-function for docstrings.
* src/doc.c (Fdocumentation): Handle new property
dynamic-docstring-function to replace the old ad-advice-info.
* lisp/emacs-lisp/advice.el: Use new dynamic docstrings.
(ad-make-advised-definition-docstring, ad-advised-definition-p):
Use dynamic-docstring-function instead of ad-advice-info.
(ad--make-advised-docstring): New function extracted from
ad-make-advised-docstring.
(ad-make-advised-docstring): Use it.
* lisp/progmodes/sql.el (sql--make-help-docstring): New function, extracted
from sql-help.
(sql-help): Use it with dynamic-docstring-function.
Diffstat (limited to 'src/doc.c')
-rw-r--r-- | src/doc.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/src/doc.c b/src/doc.c index 9ead1addfba..1d3d1e64442 100644 --- a/src/doc.c +++ b/src/doc.c @@ -21,7 +21,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <sys/types.h> -#include <sys/file.h> /* Must be after sys/types.h for USG*/ +#include <sys/file.h> /* Must be after sys/types.h for USG. */ #include <fcntl.h> #include <unistd.h> @@ -42,7 +42,7 @@ static ptrdiff_t get_doc_string_buffer_size; static unsigned char *read_bytecode_pointer; -/* readchar in lread.c calls back here to fetch the next byte. +/* `readchar' in lread.c calls back here to fetch the next byte. If UNREADFLAG is 1, we unread a byte. */ int @@ -338,15 +338,9 @@ string is passed through `substitute-command-keys'. */) doc = Qnil; - if (SYMBOLP (function)) - { - Lisp_Object tem = Fget (function, Qfunction_documentation); - if (!NILP (tem)) - return Fdocumentation_property (function, Qfunction_documentation, - raw); - } - fun = Findirect_function (function, Qnil); + if (CONSP (fun) && EQ (XCAR (fun), Qmacro)) + fun = XCDR (fun); if (SUBRP (fun)) { if (XSUBR (fun)->doc == 0) @@ -400,8 +394,6 @@ string is passed through `substitute-command-keys'. */) else return Qnil; } - else if (EQ (funcar, Qmacro)) - return Fdocumentation (Fcdr (fun), raw); else goto oops; } @@ -411,16 +403,19 @@ string is passed through `substitute-command-keys'. */) xsignal1 (Qinvalid_function, fun); } - /* Check for an advised function. Its doc string - has an `ad-advice-info' text property. */ + /* Check for a dynamic docstring. These come with + a dynamic-docstring-function text property. */ if (STRINGP (doc)) { - Lisp_Object innerfunc; - innerfunc = Fget_text_property (make_number (0), - intern ("ad-advice-info"), + Lisp_Object func + = Fget_text_property (make_number (0), + intern ("dynamic-docstring-function"), doc); - if (! NILP (innerfunc)) - doc = call1 (intern ("ad-make-advised-docstring"), innerfunc); + if (!NILP (func)) + /* Pass both `doc' and `function' since `function' can be needed, and + finding `doc' can be annoying: calling `documentation' is not an + option because it would infloop. */ + doc = call2 (func, doc, function); } /* If DOC is 0, it's typically because of a dumped file missing @@ -528,6 +523,8 @@ store_function_docstring (Lisp_Object obj, ptrdiff_t offset) { tem = Fcdr (Fcdr (fun)); if (CONSP (tem) && INTEGERP (XCAR (tem))) + /* FIXME: This modifies typically pure hash-cons'd data, so its + correctness is quite delicate. */ XSETCAR (tem, make_number (offset)); } else if (EQ (tem, Qmacro)) |