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
                     {