Mercurial > hg > xemacs-beta
changeset 5206:39d74978fd32
Keep around file info for dumped functions and variables without docstrings.
src/ChangeLog addition:
2010-04-17 Aidan Kehoe <kehoea@parhasard.net>
* doc.c (Fdocumentation):
If we have a zero length doc string in DOC, as may happen for
undocumented compiled function objects which nonetheless have file
information stored, return nil.
(Fsnarf_documentation):
DOC info existing for compiled functions without docstrings is
perfectly legitimate, now the file is also used to store file names.
* bytecode.c (set_compiled_function_documentation):
Allow this function to set the documentation successfully for
compiled function objects that don't currently have documentation;
most relevant for functions without docstrings which have file
information stored in DOC.
lib-src/ChangeLog addition:
2010-04-17 Aidan Kehoe <kehoea@parhasard.net>
* make-docfile.c (scan_lisp_file):
Even if a function doesn't have a doc string, store its file name
in DOC.
lisp/ChangeLog addition:
2010-04-17 Aidan Kehoe <kehoea@parhasard.net>
* loadup.el (load-history): Be a bit more discriminate in the
entries we remove from load-history, only removing those where the
information is entirely available from DOC.
Fixes problems finding the files that dumped undocumented
variables were loaded from, reported by Didier Verna.
* loadhist.el (symbol-file): Correct a regexp here, I had
forgotten to double a backslash.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 17 Apr 2010 10:40:03 +0100 |
parents | fcdb86afcb91 |
children | 1096ef427b56 |
files | lib-src/ChangeLog lib-src/make-docfile.c lisp/ChangeLog lisp/loadhist.el lisp/loadup.el src/ChangeLog src/bytecode.c src/doc.c |
diffstat | 8 files changed, 115 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/ChangeLog Thu Apr 15 20:14:08 2010 -0500 +++ b/lib-src/ChangeLog Sat Apr 17 10:40:03 2010 +0100 @@ -1,3 +1,9 @@ +2010-04-17 Aidan Kehoe <kehoea@parhasard.net> + + * make-docfile.c (scan_lisp_file): + Even if a function doesn't have a doc string, store its file name + in DOC. + 2010-03-02 Ben Wing <ben@xemacs.org> * digest-doc.c:
--- a/lib-src/make-docfile.c Thu Apr 15 20:14:08 2010 -0500 +++ b/lib-src/make-docfile.c Sat Apr 17 10:40:03 2010 +0100 @@ -1084,6 +1084,7 @@ { char buffer[BUFSIZ]; char type; + int no_docstring = 0; /* If not at end of line, skip till we get to one. */ if (c != '\n') @@ -1187,7 +1188,7 @@ fprintf (stderr, "## non-docstring in %s (%s)\n", buffer, filename); #endif - continue; + no_docstring = 1; } } @@ -1217,7 +1218,7 @@ fprintf (stderr, "## non-docstring in %s (%s)\n", buffer, filename); #endif - continue; + no_docstring = 1; } } } @@ -1276,7 +1277,7 @@ fprintf (stderr, "## non-docstring in %s (%s)\n", buffer, filename); #endif - continue; + no_docstring = 1; } } } @@ -1333,7 +1334,7 @@ fprintf (stderr, "## non-docstring in %s (%s)\n", buffer, filename); #endif - continue; + no_docstring = 1; } } } @@ -1391,7 +1392,7 @@ fprintf (stderr, "## non-docstring in %s (%s)\n", buffer, filename); #endif - continue; + no_docstring = 1; } } } @@ -1422,15 +1423,18 @@ putc (037, outfile); putc (type, outfile); fprintf (outfile, "%s\n", buffer); - if (saved_string) - { - fputs (saved_string, outfile); - /* Don't use one dynamic doc string twice. */ - free (saved_string); - saved_string = 0; - } - else - read_c_string (infile, 1, 0); + if (!no_docstring) + { + if (saved_string) + { + fputs (saved_string, outfile); + /* Don't use one dynamic doc string twice. */ + free (saved_string); + saved_string = 0; + } + else + read_c_string (infile, 1, 0); + } } fclose (infile); return 0;
--- a/lisp/ChangeLog Thu Apr 15 20:14:08 2010 -0500 +++ b/lisp/ChangeLog Sat Apr 17 10:40:03 2010 +0100 @@ -1,3 +1,13 @@ +2010-04-17 Aidan Kehoe <kehoea@parhasard.net> + + * loadup.el (load-history): Be a bit more discriminate in the + entries we remove from load-history, only removing those where the + information is entirely available from DOC. + Fixes problems finding the files that dumped undocumented + variables were loaded from, reported by Didier Verna. + * loadhist.el (symbol-file): Correct a regexp here, I had + forgotten to double a backslash. + 2010-04-15 Aidan Kehoe <kehoea@parhasard.net> * files.el (hack-local-variables-prop-line)
--- a/lisp/loadhist.el Thu Apr 15 20:14:08 2010 -0500 +++ b/lisp/loadhist.el Sat Apr 17 10:40:03 2010 +0100 @@ -89,7 +89,7 @@ built-in-file ;; This is a bit heuristic, but shouldn't realistically be a ;; problem: - (if (string-match "\.elc?$" built-in-file) + (if (string-match #r"\.elc?$" built-in-file) (concat (if (file-readable-p source-lisp) source-lisp lisp-directory)
--- a/lisp/loadup.el Thu Apr 15 20:14:08 2010 -0500 +++ b/lisp/loadup.el Sat Apr 17 10:40:03 2010 +0100 @@ -220,10 +220,22 @@ (load "site-init" t)) ;; Add information from this file to the load history. Delete information -;; for those files in preloaded-file-list; the symbol file information can -;; be taken from DOC, and #'unload-feature makes very little sense for -;; dumped functionality. -(setq load-history (cons (nreverse current-load-list) (last load-history)) +;; that is available from DOC for those files in preloaded-file-list; in +;; practice, this boils down to #'provide and #'require calls, and variables +;; without documentation. Yes, this is a bit ugly. +(setq load-history (cons (nreverse current-load-list) + (delete* + nil + (mapc #'(lambda (element) + (remassq 'defun element) + (delete-if + #'(lambda (elt) + (and + (symbolp elt) + (get elt 'variable-documentation))) + element)) + load-history) + :key #'cdr)) ;; Clear current-load-list; this (and adding information to ;; load-history) is normally done in lread.c after reading the ;; entirety of a file, something which never happens for loadup.el.
--- a/src/ChangeLog Thu Apr 15 20:14:08 2010 -0500 +++ b/src/ChangeLog Sat Apr 17 10:40:03 2010 +0100 @@ -1,3 +1,18 @@ +2010-04-17 Aidan Kehoe <kehoea@parhasard.net> + + * doc.c (Fdocumentation): + If we have a zero length doc string in DOC, as may happen for + undocumented compiled function objects which nonetheless have file + information stored, return nil. + (Fsnarf_documentation): + DOC info existing for compiled functions without docstrings is + perfectly legitimate, now the file is also used to store file names. + * bytecode.c (set_compiled_function_documentation): + Allow this function to set the documentation successfully for + compiled function objects that don't currently have documentation; + most relevant for functions without docstrings which have file + information stored in DOC. + 2010-04-15 Ben Wing <ben@xemacs.org> * device-x.c (x_init_device):
--- a/src/bytecode.c Thu Apr 15 20:14:08 2010 -0500 +++ b/src/bytecode.c Sat Apr 17 10:40:03 2010 +0100 @@ -2562,22 +2562,36 @@ #endif -/* used only by Snarf-documentation; there must be doc already. */ +/* used only by Snarf-documentation. */ void set_compiled_function_documentation (Lisp_Compiled_Function *f, Lisp_Object new_doc) { - assert (f->flags.documentationp); assert (INTP (new_doc) || STRINGP (new_doc)); - if (f->flags.interactivep && f->flags.domainp) - XCAR (f->doc_and_interactive) = new_doc; - else if (f->flags.interactivep) - XCAR (f->doc_and_interactive) = new_doc; - else if (f->flags.domainp) - XCAR (f->doc_and_interactive) = new_doc; + if (f->flags.documentationp) + { + if (f->flags.interactivep && f->flags.domainp) + XCAR (f->doc_and_interactive) = new_doc; + else if (f->flags.interactivep) + XCAR (f->doc_and_interactive) = new_doc; + else if (f->flags.domainp) + XCAR (f->doc_and_interactive) = new_doc; + else + f->doc_and_interactive = new_doc; + } else - f->doc_and_interactive = new_doc; + { + f->flags.documentationp = 1; + if (f->flags.interactivep || f->flags.domainp) + { + f->doc_and_interactive = Fcons (new_doc, f->doc_and_interactive); + } + else + { + f->doc_and_interactive = new_doc; + } + } }
--- a/src/doc.c Thu Apr 15 20:14:08 2010 -0500 +++ b/src/doc.c Sat Apr 17 10:40:03 2010 +0100 @@ -613,7 +613,15 @@ if (STRINGP (tem)) doc = tem; else if (NATNUMP (tem) || CONSP (tem)) - doc = get_doc_string (tem); + { + doc = get_doc_string (tem); + /* We may have zero length strings in the docfile for file + information. */ + if (STRINGP (doc) && 0 == XSTRING_LENGTH (doc)) + { + return Qnil; + } + } else return Qnil; } @@ -903,33 +911,24 @@ slots for it. */ Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (fun); - /* This compiled-function object must have a - slot for the docstring, since we've found a - docstring for it. Unless there were multiple - definitions of it, and the latter one didn't - have any doc, which is a legal if slightly - bogus situation, so don't blow up. */ + /* If there were multiple definitions for this function, + and the latter one didn't + have any doc, warn and don't blow up. */ + Lisp_Object old = + compiled_function_documentation (f); + if (!ZEROP (old) && !NILP (old)) + { + weird_doc (sym, "duplicate", "bytecode", pos); + /* In the case of duplicate doc file entries, + always take the later one. But if the doc is + not an int (a string, say) leave it alone. */ + if (!INTP (old)) + goto weird; + } - if (! (f->flags.documentationp)) - { - weird_doc (sym, "no doc slot", "bytecode", pos); - goto weird; - } - else - { - Lisp_Object old = - compiled_function_documentation (f); - if (!ZEROP (old)) - { - weird_doc (sym, "duplicate", "bytecode", pos); - /* In the case of duplicate doc file entries, - always take the later one. But if the doc is - not an int (a string, say) leave it alone. */ - if (!INTP (old)) - goto weird; - } - set_compiled_function_documentation (f, offset); - } + /* This may be a function or variable where we want + to make the file name available. */ + set_compiled_function_documentation (f, offset); } else {