Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5-scandir
Changeset: r86705:e69a949f6bcb
Date: 2016-08-29 17:17 +0200
http://bitbucket.org/pypy/pypy/changeset/e69a949f6bcb/

Log:    inode()

diff --git a/pypy/module/posix/interp_scandir.py 
b/pypy/module/posix/interp_scandir.py
--- a/pypy/module/posix/interp_scandir.py
+++ b/pypy/module/posix/interp_scandir.py
@@ -94,9 +94,10 @@
                     break
             #
             known_type = rposix_scandir.get_known_type(entry)
+            inode = rposix_scandir.get_inode(entry)
         finally:
             self._in_next = False
-        direntry = W_DirEntry(self, name, known_type)
+        direntry = W_DirEntry(self, name, known_type, inode)
         return space.wrap(direntry)
 
 
@@ -122,10 +123,11 @@
 class W_DirEntry(W_Root):
     w_path = None
 
-    def __init__(self, scandir_iterator, name, known_type):
+    def __init__(self, scandir_iterator, name, known_type, inode):
         self.space = scandir_iterator.space
         self.scandir_iterator = scandir_iterator
         self.name = name     # always bytes on Posix
+        self.inode = inode
         self.flags = known_type
         assert known_type == (known_type & 255)
         #
@@ -281,6 +283,9 @@
         st = self.get_stat_or_lstat(follow_symlinks)
         return build_stat_result(self.space, st)
 
+    def descr_inode(self, space):
+        return space.wrap(self.inode)
+
 
 W_DirEntry.typedef = TypeDef(
     'posix.DirEntry',
@@ -294,5 +299,6 @@
     is_file = interp2app(W_DirEntry.descr_is_file),
     is_symlink = interp2app(W_DirEntry.descr_is_symlink),
     stat = interp2app(W_DirEntry.descr_stat),
+    inode = interp2app(W_DirEntry.descr_inode),
 )
 W_DirEntry.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/posix/test/test_scandir.py 
b/pypy/module/posix/test/test_scandir.py
--- a/pypy/module/posix/test/test_scandir.py
+++ b/pypy/module/posix/test/test_scandir.py
@@ -157,3 +157,10 @@
     def test_fdopendir_unsupported(self):
         posix = self.posix
         raises(TypeError, posix.scandir, 1234)
+
+    def test_inode(self):
+        posix = self.posix
+        d = next(posix.scandir(self.dir1))
+        assert d.name == 'file1'
+        ino = d.inode()
+        assert ino == d.stat().st_ino
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -623,7 +623,8 @@
     class CConfig:
         _compilation_info_ = eci
         DIRENT = rffi_platform.Struct('struct dirent',
-            [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1))]
+            [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1)),
+             ('d_ino', lltype.Signed)]
             + [('d_type', rffi.INT)] if HAVE_D_TYPE else [])
         if HAVE_D_TYPE:
             DT_UNKNOWN = rffi_platform.ConstantInteger('DT_UNKNOWN')
diff --git a/rpython/rlib/rposix_scandir.py b/rpython/rlib/rposix_scandir.py
--- a/rpython/rlib/rposix_scandir.py
+++ b/rpython/rlib/rposix_scandir.py
@@ -50,3 +50,6 @@
     if rposix.HAVE_D_TYPE:
         return rffi.getintfield(direntp, 'c_d_type')
     return DT_UNKNOWN
+
+def get_inode(direntp):
+    return rffi.getintfield(direntp, 'c_d_ino')
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to