Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k-osxfix Changeset: r84679:a14a659b4d58 Date: 2016-05-24 22:51 -0700 http://bitbucket.org/pypy/pypy/changeset/a14a659b4d58/
Log: merge py3k diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py --- a/pypy/config/pypyoption.py +++ b/pypy/config/pypyoption.py @@ -18,6 +18,8 @@ "exceptions", "_io", "sys", "builtins", "posix", "_warnings", "itertools", "_frozen_importlib", ]) +if sys.platform == "win32": + essential_modules.add("_winreg") default_modules = essential_modules.copy() default_modules.update([ @@ -60,7 +62,6 @@ # XXX this should move somewhere else, maybe to platform ("is this posixish" # check or something) if sys.platform == "win32": - working_modules.add("_winreg") # unix only modules for name in ["crypt", "fcntl", "pwd", "termios", "_minimal_curses", "_posixsubprocess"]: diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -593,9 +593,6 @@ # lives in pypy/module/exceptions, we rename it below for # sys.builtin_module_names bootstrap_modules = set(('sys', 'imp', 'builtins', 'exceptions')) - if sys.platform.startswith("win"): - self.setbuiltinmodule('_winreg') - bootstrap_modules.add('_winreg') installed_builtin_modules = list(bootstrap_modules) exception_types_w = self.export_builtin_exceptions() diff --git a/pypy/module/cpyext/src/unicodeobject.c b/pypy/module/cpyext/src/unicodeobject.c --- a/pypy/module/cpyext/src/unicodeobject.c +++ b/pypy/module/cpyext/src/unicodeobject.c @@ -6,9 +6,6 @@ #define Py_ISDIGIT isdigit #define Py_ISALPHA isalpha -#define PyObject_Malloc malloc -#define PyObject_Free free - static void makefmt(char *fmt, int longflag, int longlongflag, int size_tflag, int zeropad, int width, int precision, char c) diff --git a/pypy/module/cpyext/test/test_version.py b/pypy/module/cpyext/test/test_version.py --- a/pypy/module/cpyext/test/test_version.py +++ b/pypy/module/cpyext/test/test_version.py @@ -33,6 +33,7 @@ PyModule_AddIntConstant(m, "py_micro_version", PY_MICRO_VERSION); return m; } + Py_RETURN_NONE; """ module = self.import_module(name='foo', init=init) assert module.py_version == '%d.%d.%d' % sys.version_info[:3] @@ -49,6 +50,7 @@ PyModule_AddStringConstant(m, "pypy_version", PYPY_VERSION); PyModule_AddIntConstant(m, "pypy_version_num", PYPY_VERSION_NUM); } + Py_RETURN_NONE; """ module = self.import_module(name='foo', init=init) v = sys.pypy_version_info diff --git a/pypy/module/cpyext/unicodeobject.py b/pypy/module/cpyext/unicodeobject.py --- a/pypy/module/cpyext/unicodeobject.py +++ b/pypy/module/cpyext/unicodeobject.py @@ -215,7 +215,7 @@ # PyPy is always ready. return space.w_True -@cpython_api([PyObject], rffi.CWCHARP, error=CANNOT_FAIL) +@cpython_api([rffi.VOIDP], rffi.CWCHARP, error=CANNOT_FAIL) def PyUnicode_AS_UNICODE(space, ref): """Return a pointer to the internal Py_UNICODE buffer of the object. ref has to be a PyUnicodeObject (not checked).""" diff --git a/pypy/module/imp/test/support.py b/pypy/module/imp/test/support.py --- a/pypy/module/imp/test/support.py +++ b/pypy/module/imp/test/support.py @@ -4,8 +4,10 @@ def setup_class(cls): space = cls.space - cls.w_testfn_unencodable = space.wrap(get_unencodable()) - cls.w_special_char = space.wrap(get_special_char()) + cls.testfn_unencodable = get_unencodable() + cls.w_testfn_unencodable = space.wrap(cls.testfn_unencodable) + cls.special_char = get_special_char() + cls.w_special_char = space.wrap(cls.special_char) def get_unencodable(): """Copy of the stdlib's support.TESTFN_UNENCODABLE: diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py @@ -133,10 +133,9 @@ line2 = "# encoding: iso-8859-1\n", bad = "# encoding: uft-8\n") - w_special_char = getattr(cls, 'w_special_char', None) - if not space.is_none(w_special_char): - special_char = space.unicode_w(w_special_char).encode( - sys.getfilesystemencoding()) + special_char = getattr(cls, 'special_char', None) + if special_char is not None: + special_char = special_char.encode(sys.getfilesystemencoding()) p.join(special_char + '.py').write('pass') # create a .pyw file 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 @@ -166,7 +166,8 @@ def path_or_fd(allow_fd=True): return _PathOrFd if allow_fd else _JustPath -DEFAULT_DIR_FD = getattr(rposix, 'AT_FDCWD', -100) +_HAVE_AT_FDCWD = getattr(rposix, 'AT_FDCWD', None) is not None +DEFAULT_DIR_FD = rposix.AT_FDCWD if _HAVE_AT_FDCWD else -100 DIR_FD_AVAILABLE = False @specialize.arg(2) @@ -196,7 +197,7 @@ class _DirFD_Unavailable(Unwrapper): def unwrap(self, space, w_value): - dir_fd = unwrap_fd(space, w_value) + dir_fd = _unwrap_dirfd(space, w_value) if dir_fd == DEFAULT_DIR_FD: return dir_fd raise oefmt(space.w_NotImplementedError, @@ -222,11 +223,11 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: - fd = dispatch_filename(rposix.open)(space, w_path, flags, mode) - else: + if rposix.HAVE_OPENAT and dir_fd != DEFAULT_DIR_FD: path = space.fsencode_w(w_path) fd = rposix.openat(path, flags, mode, dir_fd) + else: + fd = dispatch_filename(rposix.open)(space, w_path, flags, mode) except OSError as e: raise wrap_oserror2(space, e, w_path) return space.wrap(fd) @@ -555,7 +556,7 @@ dir_fd=DirFD(rposix.HAVE_FACCESSAT), effective_ids=kwonly(bool), follow_symlinks=kwonly(bool)) def access(space, w_path, mode, - dir_fd=DEFAULT_DIR_FD, effective_ids=True, follow_symlinks=True): + dir_fd=DEFAULT_DIR_FD, effective_ids=False, follow_symlinks=True): """\ access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True) @@ -585,12 +586,14 @@ raise argument_unavailable(space, "access", "effective_ids") try: - if dir_fd == DEFAULT_DIR_FD and follow_symlinks and not effective_ids: - ok = dispatch_filename(rposix.access)(space, w_path, mode) - else: + if (rposix.HAVE_FACCESSAT and + (dir_fd != DEFAULT_DIR_FD or not follow_symlinks or + effective_ids)): path = space.fsencode_w(w_path) ok = rposix.faccessat(path, mode, dir_fd, effective_ids, follow_symlinks) + else: + ok = dispatch_filename(rposix.access)(space, w_path, mode) except OSError as e: raise wrap_oserror2(space, e, w_path) else: @@ -635,11 +638,11 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: - dispatch_filename(rposix.unlink)(space, w_path) - else: + if rposix.HAVE_UNLINKAT and dir_fd != DEFAULT_DIR_FD: path = space.fsencode_w(w_path) rposix.unlinkat(path, dir_fd, removedir=False) + else: + dispatch_filename(rposix.unlink)(space, w_path) except OSError as e: raise wrap_oserror2(space, e, w_path) @@ -654,11 +657,11 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: - dispatch_filename(rposix.unlink)(space, w_path) - else: + if rposix.HAVE_UNLINKAT and dir_fd != DEFAULT_DIR_FD: path = space.fsencode_w(w_path) rposix.unlinkat(path, dir_fd, removedir=False) + else: + dispatch_filename(rposix.unlink)(space, w_path) except OSError as e: raise wrap_oserror2(space, e, w_path) @@ -721,11 +724,11 @@ The mode argument is ignored on Windows.""" try: - if dir_fd == DEFAULT_DIR_FD: - dispatch_filename(rposix.mkdir)(space, w_path, mode) - else: + if rposix.HAVE_MKDIRAT and dir_fd != DEFAULT_DIR_FD: path = space.fsencode_w(w_path) rposix.mkdirat(path, mode, dir_fd) + else: + dispatch_filename(rposix.mkdir)(space, w_path, mode) except OSError as e: raise wrap_oserror2(space, e, w_path) @@ -740,11 +743,11 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: - dispatch_filename(rposix.rmdir)(space, w_path) - else: + if rposix.HAVE_UNLINKAT and dir_fd != DEFAULT_DIR_FD: path = space.fsencode_w(w_path) rposix.unlinkat(path, dir_fd, removedir=True) + else: + dispatch_filename(rposix.rmdir)(space, w_path) except OSError as e: raise wrap_oserror2(space, e, w_path) @@ -976,7 +979,8 @@ src_dir_fd and dst_dir_fd, may not be implemented on your platform. If they are unavailable, using them will raise a NotImplementedError.""" try: - if (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD): + if (rposix.HAVE_RENAMEAT and + (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD)): src = space.fsencode_w(w_src) dst = space.fsencode_w(w_dst) rposix.renameat(src, dst, src_dir_fd, dst_dir_fd) @@ -999,7 +1003,8 @@ src_dir_fd and dst_dir_fd, may not be implemented on your platform. If they are unavailable, using them will raise a NotImplementedError.""" try: - if (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD): + if (rposix.HAVE_RENAMEAT and + (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD)): src = space.fsencode_w(w_src) dst = space.fsencode_w(w_dst) rposix.renameat(src, dst, src_dir_fd, dst_dir_fd) @@ -1110,8 +1115,9 @@ platform. If they are unavailable, using them will raise a NotImplementedError.""" try: - if (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD - or not follow_symlinks): + if (rposix.HAVE_LINKAT and + (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD + or not follow_symlinks)): rposix.linkat(src, dst, src_dir_fd, dst_dir_fd, follow_symlinks) else: rposix.link(src, dst) @@ -1136,12 +1142,12 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: - dispatch_filename_2(rposix.symlink)(space, w_src, w_dst) - else: + if rposix.HAVE_SYMLINKAT and dir_fd != DEFAULT_DIR_FD: src = space.fsencode_w(w_src) dst = space.fsencode_w(w_dst) rposix.symlinkat(src, dst, dir_fd) + else: + dispatch_filename_2(rposix.symlink)(space, w_src, w_dst) except OSError as e: raise wrap_oserror(space, e) @@ -1159,10 +1165,10 @@ dir_fd may not be implemented on your platform. If it is unavailable, using it will raise a NotImplementedError.""" try: - if dir_fd == DEFAULT_DIR_FD: + if rposix.HAVE_READLINKAT and dir_fd != DEFAULT_DIR_FD: + result = call_rposix(rposix.readlinkat, path, dir_fd) + else: result = call_rposix(rposix.readlink, path) - else: - result = call_rposix(rposix.readlinkat, path, dir_fd) except OSError as e: raise wrap_oserror2(space, e, path.w_path) w_result = space.wrapbytes(result) @@ -1442,31 +1448,39 @@ # see comment above raise wrap_oserror(space, e) + if now: + # satisfy the translator + atime = mtime = 0.0 + else: + # convert back to utimes style floats. loses precision of + # nanoseconds but utimes only support microseconds anyway + atime = atime_s + (atime_ns / 1e9) + mtime = mtime_s + (mtime_ns / 1e9) + + if (rposix.HAVE_LUTIMES and + (dir_fd == DEFAULT_DIR_FD and not follow_symlinks)): + path_b = path.as_bytes + if path_b is None: + raise oefmt(space.w_NotImplementedError, + "utime: unsupported value for 'path'") + try: + if now: + rposix.lutimes(path_b, None) + else: + rposix.lutimes(path_b, (atime, mtime)) + return + except OSError as e: + # see comment above + raise wrap_oserror(space, e) + if not follow_symlinks: raise argument_unavailable(space, "utime", "follow_symlinks") - if not space.is_w(w_ns, space.w_None): - raise oefmt(space.w_NotImplementedError, - "utime: 'ns' unsupported on this platform on PyPy") - if now: - try: + try: + if now: call_rposix(utime_now, path, None) - except OSError as e: - # see comment above - raise wrap_oserror(space, e) - try: - msg = "utime() arg 2 must be a tuple (atime, mtime) or None" - args_w = space.fixedview(w_times) - if len(args_w) != 2: - raise oefmt(space.w_TypeError, msg) - actime = space.float_w(args_w[0], allow_conversion=False) - modtime = space.float_w(args_w[1], allow_conversion=False) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - raise oefmt(space.w_TypeError, msg) - try: - call_rposix(rposix.utime, path, (actime, modtime)) + else: + call_rposix(rposix.utime, path, (atime, mtime)) except OSError as e: # see comment above raise wrap_oserror(space, e) diff --git a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py --- a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py +++ b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py @@ -1,4 +1,4 @@ -import os, random, struct +import sys, os, random, struct import py from rpython.jit.backend.x86 import rx86 from rpython.rlib.rarithmetic import intmask @@ -257,6 +257,9 @@ g.close() error = [line for line in got.splitlines() if 'error' in line.lower()] if error: + if (sys.maxint <= 2**32 and + 'no compiled in support for x86_64' in error[0]): + py.test.skip(error) raise Exception("Assembler got an error: %r" % error[0]) error = [line for line in got.splitlines() if 'warning' in line.lower()] diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -1219,21 +1219,14 @@ if times is None: error = c_utime(path, lltype.nullptr(UTIMBUFP.TO)) else: - actime, modtime = times if HAVE_UTIMES: - import math - l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw') - fracpart, intpart = math.modf(actime) - rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart)) - rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1e6)) - fracpart, intpart = math.modf(modtime) - rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart)) - rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1e6)) - error = c_utimes(path, l_times) - lltype.free(l_times, flavor='raw') + with lltype.scoped_alloc(TIMEVAL2P.TO, 2) as l_timeval2p: + times_to_timeval2p(times, l_timeval2p) + error = c_utimes(path, l_timeval2p) else: # we only have utime(), which does not allow # sub-second resolution + actime, modtime = times l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw') l_utimbuf.c_actime = rffi.r_time_t(actime) l_utimbuf.c_modtime = rffi.r_time_t(modtime) @@ -1276,6 +1269,17 @@ lltype.free(atime, flavor='raw') lltype.free(mtime, flavor='raw') +def times_to_timeval2p(times, l_timeval2p): + actime, modtime = times + _time_to_timeval(actime, l_timeval2p[0]) + _time_to_timeval(modtime, l_timeval2p[1]) + +def _time_to_timeval(t, l_timeval): + import math + fracpart, intpart = math.modf(t) + rffi.setintfield(l_timeval, 'c_tv_sec', int(intpart)) + rffi.setintfield(l_timeval, 'c_tv_usec', int(fracpart * 1e6)) + if not _WIN32: TMSP = lltype.Ptr(TMS) c_times = external('times', [TMSP], CLOCK_T, @@ -1763,6 +1767,7 @@ class CConfig: _compilation_info_ = ExternalCompilationInfo( includes=['sys/stat.h', + 'sys/time.h', 'unistd.h', 'fcntl.h'], ) @@ -1918,6 +1923,21 @@ lltype.free(l_times, flavor='raw') handle_posix_error('utimensat', error) +if HAVE_LUTIMES: + c_lutimes = external('lutimes', + [rffi.CCHARP, TIMEVAL2P], rffi.INT, + save_err=rffi.RFFI_SAVE_ERRNO) + + @specialize.argtype(1) + def lutimes(pathname, times): + if times is None: + error = c_lutimes(pathname, lltype.nullptr(TIMEVAL2P.TO)) + else: + with lltype.scoped_alloc(TIMEVAL2P.TO, 2) as l_timeval2p: + times_to_timeval2p(times, l_timeval2p) + error = c_lutimes(pathname, l_timeval2p) + handle_posix_error('lutimes', error) + if HAVE_MKDIRAT: c_mkdirat = external('mkdirat', [rffi.INT, rffi.CCHARP, rffi.INT], rffi.INT, _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit