[前][次][番号順一覧][スレッド一覧]

ruby-changes:37885

From: nobu <ko1@a...>
Date: Sat, 14 Mar 2015 12:24:16 +0900 (JST)
Subject: [ruby-changes:37885] nobu:r49966 (trunk): dir.h: direct::d_type

nobu	2015-03-14 12:23:56 +0900 (Sat, 14 Mar 2015)

  New Revision: 49966

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49966

  Log:
    dir.h: direct::d_type
    
    * dir.c (glob_helper): use d_type to reduce lstat system calls.
    * win32/dir.h (struct direct): add d_type instead of d_isdir and
      d_isrep.  SYMLINKD is unreliable, since the target can be
      replaced after a link was created.
    * win32/win32.c (readdir_internal): set d_type.

  Modified files:
    trunk/ChangeLog
    trunk/dir.c
    trunk/win32/dir.h
    trunk/win32/win32.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 49965)
+++ ChangeLog	(revision 49966)
@@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Mar 14 12:23:53 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* dir.c (glob_helper): use d_type to reduce lstat system calls.
+
+	* win32/dir.h (struct direct): add d_type instead of d_isdir and
+	  d_isrep.  SYMLINKD is unreliable, since the target can be
+	  replaced after a link was created.
+
+	* win32/win32.c (readdir_internal): set d_type.
+
 Sat Mar 14 02:14:50 2015  Nobuyoshi Nakada  <nobu@r...>
 
 	* parse.y (primary): empty parentheses at cmdarg can be null.
Index: dir.c
===================================================================
--- dir.c	(revision 49965)
+++ dir.c	(revision 49966)
@@ -1731,13 +1731,13 @@ glob_helper( https://github.com/ruby/ruby/blob/trunk/dir.c#L1731
 	    name = buf + pathlen + (dirsep != 0);
 	    if (recursive && dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1)) {
 		/* RECURSIVE never match dot files unless FNM_DOTMATCH is set */
-#ifndef _WIN32
+#ifndef DT_DIR
 		if (do_lstat(buf, &st, flags, enc) == 0)
 		    new_isdir = S_ISDIR(st.st_mode) ? YES : S_ISLNK(st.st_mode) ? UNKNOWN : NO;
 		else
 		    new_isdir = NO;
 #else
-		new_isdir = dp->d_isdir ? (!dp->d_isrep ? YES : UNKNOWN) : NO;
+		new_isdir = dp->d_type == DT_DIR ? YES : dp->d_type == DT_LNK ? UNKNOWN : NO;
 #endif
 	    }
 
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 49965)
+++ win32/win32.c	(revision 49966)
@@ -2139,8 +2139,13 @@ readdir_internal(DIR *dirp, BOOL (*conv) https://github.com/ruby/ruby/blob/trunk/win32/win32.c#L2139
 	//
 	// Attributes
 	//
-	dirp->dirstr.d_isdir = GetBit(dirp->bits, BitOfIsDir(dirp->loc));
-	dirp->dirstr.d_isrep = GetBit(dirp->bits, BitOfIsRep(dirp->loc));
+	/* ignore FILE_ATTRIBUTE_DIRECTORY as unreliable for reparse points */
+	if (GetBit(dirp->bits, BitOfIsRep(dirp->loc)))
+	    dirp->dirstr.d_type = DT_LNK;
+	else if (GetBit(dirp->bits, BitOfIsDir(dirp->loc)))
+	    dirp->dirstr.d_type = DT_DIR;
+	else
+	    dirp->dirstr.d_type = DT_REG;
 
 	//
 	// Now set up for the next call to readdir
Index: win32/dir.h
===================================================================
--- win32/dir.h	(revision 49965)
+++ win32/dir.h	(revision 49966)
@@ -8,6 +8,11 @@ https://github.com/ruby/ruby/blob/trunk/win32/dir.h#L8
 #  endif
 #endif
 
+#define DT_UNKNOWN 0
+#define DT_DIR (S_IFDIR>>12)
+#define DT_REG (S_IFREG>>12)
+#define DT_LNK 10
+
 struct direct
 {
     long d_namlen;
@@ -15,8 +20,7 @@ struct direct https://github.com/ruby/ruby/blob/trunk/win32/dir.h#L20
     char *d_name;
     char *d_altname; /* short name */
     short d_altlen;
-    char d_isdir; /* directory */
-    char d_isrep; /* reparse point */
+    uint8_t d_type;
 };
 typedef struct {
     WCHAR *start;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]