changeset 45551:811d06e337cb

(Fread_file_name_internal): Added brute-force speed up for using predicate file-directory-p.
author Kim F. Storm <storm@cua.dk>
date Tue, 28 May 2002 09:03:22 +0000
parents acd09cfa0ecd
children 0c2a22313f16
files src/fileio.c
diffstat 1 files changed, 30 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Tue May 28 01:32:36 2002 +0000
+++ b/src/fileio.c	Tue May 28 09:03:22 2002 +0000
@@ -5911,15 +5911,36 @@
       if (NILP (Vread_file_name_predicate)
 	  || EQ (Vread_file_name_predicate, Qfile_exists_p))
 	return all;
-      GCPRO3 (all, comp, specdir);
-      count = specpdl_ptr - specpdl;
-      record_unwind_protect (read_file_name_cleanup, current_buffer->directory);
-      current_buffer->directory = realdir;
-      for (comp = Qnil; CONSP (all); all = XCDR (all))
-	if (!NILP (call1 (Vread_file_name_predicate, XCAR (all))))
-	  comp = Fcons (XCAR (all), comp);
-      unbind_to (count, Qnil);
-      UNGCPRO;
+
+#ifndef VMS
+      if (EQ (Vread_file_name_predicate, Qfile_directory_p))
+	{
+	  /* Brute-force speed up for directory checking: 
+	     Discard strings which don't end in a slash.  */
+	  for (comp = Qnil; CONSP (all); all = XCDR (all))
+	    {
+	      Lisp_Object tem = XCAR (all);
+	      int len;
+	      if (STRINGP (tem) &&
+		  (len = XSTRING (tem)->size, len > 0) &&
+		  IS_DIRECTORY_SEP (XSTRING (tem)->data[len-1]))
+		comp = Fcons (tem, comp);
+	    }
+	}
+      else
+#endif
+	{
+	  /* Must do it the hard (and slow) way.  */
+	  GCPRO3 (all, comp, specdir);
+	  count = specpdl_ptr - specpdl;
+	  record_unwind_protect (read_file_name_cleanup, current_buffer->directory);
+	  current_buffer->directory = realdir;
+	  for (comp = Qnil; CONSP (all); all = XCDR (all))
+	    if (!NILP (call1 (Vread_file_name_predicate, XCAR (all))))
+	      comp = Fcons (XCAR (all), comp);
+	  unbind_to (count, Qnil);
+	  UNGCPRO;
+	}
       return Fnreverse (comp);
     }