Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r86376:384bd70a1123 Date: 2016-08-21 18:59 +0200 http://bitbucket.org/pypy/pypy/changeset/384bd70a1123/
Log: hg merge py3k diff --git a/pypy/module/_cffi_backend/test/test_re_python.py b/pypy/module/_cffi_backend/test/test_re_python.py --- a/pypy/module/_cffi_backend/test/test_re_python.py +++ b/pypy/module/_cffi_backend/test/test_re_python.py @@ -69,21 +69,13 @@ sub_ffi.set_source('re_py_subsrc', None) sub_ffi.emit_python_code(str(tmpdir.join('re_py_subsrc.py'))) # - cls.w_ffi = space.appexec([space.wrap(str(tmpdir))], """(path): - import _cffi_backend # force it to be initialized - import sys - sys.path.insert(0, path) - from re_python_pysrc import ffi - del sys.path[0] - return ffi - """) - cls.w_sub_ffi = space.appexec([space.wrap(str(tmpdir))], """(path): - import _cffi_backend # force it to be initialized - import sys - sys.path.insert(0, path) - from re_py_subsrc import ffi - del sys.path[0] - return ffi + cls.w_fix_path = space.appexec([space.wrap(str(tmpdir))], """(path): + def fix_path(ignored=None): + import _cffi_backend # force it to be initialized + import sys + if path not in sys.path: + sys.path.insert(0, path) + return fix_path """) def teardown_method(self, meth): @@ -97,25 +89,29 @@ def test_constant_1(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi assert ffi.integer_const('FOOBAR') == -42 assert ffi.integer_const('FOOBAZ') == -43 def test_large_constant(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi assert ffi.integer_const('BIGPOS') == 420000000000 assert ffi.integer_const('BIGNEG') == -420000000000 def test_function(self): import _cffi_backend - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) assert lib.add42(-10) == 32 assert type(lib.add42) is _cffi_backend.FFI.CData def test_dlclose(self): import _cffi_backend - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) ffi.dlclose(lib) e = raises(ffi.error, ffi.dlclose, lib) @@ -126,18 +122,21 @@ "library '%s' has been closed" % (self.extmod,)) def test_constant_via_lib(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) assert lib.FOOBAR == -42 assert lib.FOOBAZ == -43 def test_opaque_struct(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi ffi.cast("struct foo_s *", 0) raises(TypeError, ffi.new, "struct foo_s *") def test_nonopaque_struct(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi for p in [ffi.new("struct bar_s *", [5, b"foobar"]), ffi.new("bar_t *", [5, b"foobar"])]: assert p.x == 5 @@ -145,13 +144,15 @@ assert p.a[5] == ord('r') def test_enum(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi assert ffi.integer_const("BB") == 1 e = ffi.cast("enum foo_e", 2) assert ffi.string(e) == "CC" def test_include_1(self): - ffi = self.sub_ffi + self.fix_path() + from re_py_subsrc import ffi assert ffi.integer_const('FOOBAR') == -42 assert ffi.integer_const('FOOBAZ') == -43 assert ffi.integer_const('k2') == 121212 @@ -164,7 +165,8 @@ assert p.a[4] == ord('a') def test_global_var(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) assert lib.globalvar42 == 1234 p = ffi.addressof(lib, 'globalvar42') @@ -174,25 +176,29 @@ assert lib.globalvar42 == 1238 def test_global_const_int(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) assert lib.globalconst42 == 4321 raises(AttributeError, ffi.addressof, lib, 'globalconst42') def test_global_const_nonint(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) assert ffi.string(lib.globalconsthello, 8) == b"hello" raises(AttributeError, ffi.addressof, lib, 'globalconsthello') def test_rtld_constants(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi ffi.RTLD_NOW # check that we have the attributes ffi.RTLD_LAZY ffi.RTLD_GLOBAL def test_no_such_function_or_global_var(self): - ffi = self.ffi + self.fix_path() + from re_python_pysrc import ffi lib = ffi.dlopen(self.extmod) e = raises(ffi.error, getattr, lib, 'no_such_function') assert str(e.value).startswith( 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 @@ -593,6 +593,7 @@ assert os.geteuid() == self.geteuid if hasattr(os, 'setuid'): + @py.test.mark.skipif("sys.version_info < (2, 7, 4)") def test_os_setuid_error(self): os = self.posix raises(OverflowError, os.setuid, -2) @@ -640,6 +641,7 @@ raises(OSError, os.getpgid, 1234567) if hasattr(os, 'setgid'): + @py.test.mark.skipif("sys.version_info < (2, 7, 4)") def test_os_setgid_error(self): os = self.posix raises(OverflowError, os.setgid, -2) diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -250,6 +250,7 @@ OFF_T_SIZE = rffi_platform.SizeOf('off_t') HAVE_UTIMES = rffi_platform.Has('utimes') + HAVE_D_TYPE = rffi_platform.Has('DT_UNKNOWN') UTIMBUF = rffi_platform.Struct('struct %sutimbuf' % UNDERSCORE_ON_WIN32, [('actime', rffi.INT), ('modtime', rffi.INT)]) @@ -603,11 +604,17 @@ 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_type', rffi.INT)] if HAVE_D_TYPE else []) + if HAVE_D_TYPE: + DT_UNKNOWN = rffi_platform.ConstantInteger('DT_UNKNOWN') + DT_REG = rffi_platform.ConstantInteger('DT_REG') + DT_DIR = rffi_platform.ConstantInteger('DT_DIR') + DT_LNK = rffi_platform.ConstantInteger('DT_LNK') DIRP = rffi.COpaquePtr('DIR') - config = rffi_platform.configure(CConfig) - DIRENT = config['DIRENT'] + dirent_config = rffi_platform.configure(CConfig) + DIRENT = dirent_config['DIRENT'] DIRENTP = lltype.Ptr(DIRENT) c_opendir = external('opendir', [rffi.CCHARP], DIRP, save_err=rffi.RFFI_SAVE_ERRNO) @@ -617,7 +624,9 @@ # dirent struct (which depends on defines) c_readdir = external('readdir', [DIRP], DIRENTP, macro=True, save_err=rffi.RFFI_FULL_ERRNO_ZERO) - c_closedir = external('closedir', [DIRP], rffi.INT) + c_closedir = external('closedir', [DIRP], rffi.INT, releasegil=False) +else: + dirent_config = {} def _listdir(dirp): result = [] diff --git a/rpython/rlib/rposix_scandir.py b/rpython/rlib/rposix_scandir.py new file mode 100644 --- /dev/null +++ b/rpython/rlib/rposix_scandir.py @@ -0,0 +1,59 @@ +from rpython.rlib import rposix +from rpython.rlib.objectmodel import specialize +from rpython.rtyper.lltypesystem import rffi + + +@specialize.argtype(0) +def opendir(path): + path = rposix._as_bytes0(path) + return opendir_bytes(path) + +def opendir_bytes(path): + dirp = rposix.c_opendir(path) + if not dirp: + raise OSError(rposix.get_saved_errno(), "opendir failed") + return dirp + +def closedir(dirp): + rposix.c_closedir(dirp) + +def nextentry(dirp): + """Read the next entry and returns an opaque object. + Use the methods has_xxx() and get_xxx() to read from that + opaque object. The opaque object is valid until the next + time nextentry() or closedir() is called. This may raise + StopIteration, or OSError. Note that this doesn't filter + out the "." and ".." entries. + """ + direntp = rposix.c_readdir(dirp) + if direntp: + return direntp + error = rposix.get_saved_errno() + if error: + raise OSError(error, "readdir failed") + raise StopIteration + +def has_name_bytes(direntp): + return True + +def get_name_bytes(direntp): + namep = rffi.cast(rffi.CCHARP, direntp.c_d_name) + return rffi.charp2str(namep) + +DT_UNKNOWN = rposix.dirent_config.get('DT_UNKNOWN', None) +DT_REG = rposix.dirent_config.get('DT_REG', None) +DT_DIR = rposix.dirent_config.get('DT_DIR', None) +DT_LNK = rposix.dirent_config.get('DT_LNK', None) + +def has_type(direntp): + return (DT_UNKNOWN is not None and + rffi.getintfield(direntp, 'c_d_type') != DT_UNKNOWN) + +def type_is_regular(direntp): + return rffi.getintfield(direntp, 'c_d_type') == DT_REG + +def type_is_dir(direntp): + return rffi.getintfield(direntp, 'c_d_type') == DT_DIR + +def type_is_link(direntp): + return rffi.getintfield(direntp, 'c_d_type') == DT_LNK diff --git a/rpython/rlib/test/test_rposix_scandir.py b/rpython/rlib/test/test_rposix_scandir.py new file mode 100644 --- /dev/null +++ b/rpython/rlib/test/test_rposix_scandir.py @@ -0,0 +1,22 @@ +import sys, os +import py +from rpython.rlib import rposix_scandir + + +class TestScanDir(object): + + @py.test.mark.skipif("sys.platform == 'win32'") # XXX + def test_name_bytes(self): + scan = rposix_scandir.opendir('/') + found = [] + while True: + try: + p = rposix_scandir.nextentry(scan) + except StopIteration: + break + assert rposix_scandir.has_name_bytes(p) + found.append(rposix_scandir.get_name_bytes(p)) + rposix_scandir.closedir(scan) + found.remove('.') + found.remove('..') + assert sorted(found) == sorted(os.listdir('/')) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit