[pypy-commit] pypy py3.3: Start to define posix._have_functions

amauryfa noreply at buildbot.pypy.org
Sun Dec 14 19:42:25 CET 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.3
Changeset: r74925:e563bf673157
Date: 2014-11-01 12:01 +0100
http://bitbucket.org/pypy/pypy/changeset/e563bf673157/

Log:	Start to define posix._have_functions

diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -188,7 +188,8 @@
 
     # os.py uses this list to build os.supports_dir_fd() and os.supports_fd().
     # Fill with e.g. HAVE_FCHDIR, when os.chdir() supports file descriptors.
-    interpleveldefs['_have_functions'] = 'space.newlist([])'
+    interpleveldefs['_have_functions'] = (
+        'space.newlist([space.wrap(x) for x in interp_posix.have_functions])')
 
     def startup(self, space):
         from pypy.module.posix import interp_posix
diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -1436,3 +1436,8 @@
         except OSError as e:
             raise wrap_oserror2(space, e, w_path)
         return space.wrap(result)
+
+have_functions = []
+for name in """FSTAT FCHDIR OPENAT""".split():
+    if getattr(rposix, "HAVE_%s" % name):
+        have_functions.append("HAVE_%s" % name)
diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -1248,3 +1248,16 @@
         f.write(source)
         child = self.spawn([str(f)])
         child.expect('ok!')
+
+
+class AppTestFdVariants:
+    # Tests variant functions which also accept file descriptors,
+    # dir_fd and follow_symlinks.
+    def test_have_functions(self):
+        import os
+        assert os.stat in os.supports_fd  # fstat() is supported everywhere
+        if os.name != 'nt':
+            assert os.chdir in os.supports_fd  # fchdir()
+        if os.name == 'posix':
+            assert os.open in os.supports_dir_fd  # openat()
+
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1,5 +1,6 @@
 import os
 from rpython.rtyper.lltypesystem.rffi import CConstant, CExternVariable, INT
+from rpython.rtyper.tool import rffi_platform
 from rpython.rtyper.lltypesystem import ll2ctypes, rffi
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 from rpython.rlib.rarithmetic import intmask
@@ -8,6 +9,19 @@
 from rpython.translator.platform import platform
 
 
+class CConfig:
+    _compilation_info_ = ExternalCompilationInfo(
+        includes=['sys/stat.h', 
+                  'unistd.h',
+                  'fcntl.h'],
+    )
+    HAVE_FSTAT = rffi_platform.Has('fstat')
+    HAVE_FCHDIR = rffi_platform.Has('fchdir')
+    HAVE_OPENAT = rffi_platform.Has('openat')
+cConfig = rffi_platform.configure(CConfig)
+globals().update(cConfig)
+
+
 class CConstantErrno(CConstant):
     # these accessors are used when calling get_errno() or set_errno()
     # on top of CPython


More information about the pypy-commit mailing list