diff src/bytecode.c @ 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 71ee43b8a74d
children 9f738305f80f 308d34e9f07d
line wrap: on
line diff
--- 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;
+        }
+    }
 }