Author: Manuel Jacob <m...@manueljacob.de> Branch: Changeset: r82431:0116c45060a7 Date: 2016-02-23 12:50 +0100 http://bitbucket.org/pypy/pypy/changeset/0116c45060a7/
Log: Try to fix an import cycle on Windows. diff --git a/rpython/rlib/_os_support.py b/rpython/rlib/_os_support.py new file mode 100644 --- /dev/null +++ b/rpython/rlib/_os_support.py @@ -0,0 +1,109 @@ +import sys + +from rpython.annotator.model import s_Str0, s_Unicode0 +from rpython.rlib import rstring +from rpython.rlib.objectmodel import specialize +from rpython.rtyper.lltypesystem import rffi + + +_CYGWIN = sys.platform == 'cygwin' +_WIN32 = sys.platform.startswith('win') +UNDERSCORE_ON_WIN32 = '_' if _WIN32 else '' +_MACRO_ON_POSIX = True if not _WIN32 else None + + +class StringTraits(object): + str = str + str0 = s_Str0 + CHAR = rffi.CHAR + CCHARP = rffi.CCHARP + charp2str = staticmethod(rffi.charp2str) + charpsize2str = staticmethod(rffi.charpsize2str) + scoped_str2charp = staticmethod(rffi.scoped_str2charp) + str2charp = staticmethod(rffi.str2charp) + free_charp = staticmethod(rffi.free_charp) + scoped_alloc_buffer = staticmethod(rffi.scoped_alloc_buffer) + + @staticmethod + @specialize.argtype(0) + def as_str(path): + assert path is not None + if isinstance(path, str): + return path + elif isinstance(path, unicode): + # This never happens in PyPy's Python interpreter! + # Only in raw RPython code that uses unicode strings. + # We implement python2 behavior: silently convert to ascii. + return path.encode('ascii') + else: + return path.as_bytes() + + @staticmethod + @specialize.argtype(0) + def as_str0(path): + res = StringTraits.as_str(path) + rstring.check_str0(res) + return res + + +class UnicodeTraits(object): + str = unicode + str0 = s_Unicode0 + CHAR = rffi.WCHAR_T + CCHARP = rffi.CWCHARP + charp2str = staticmethod(rffi.wcharp2unicode) + charpsize2str = staticmethod(rffi.wcharpsize2unicode) + str2charp = staticmethod(rffi.unicode2wcharp) + scoped_str2charp = staticmethod(rffi.scoped_unicode2wcharp) + free_charp = staticmethod(rffi.free_wcharp) + scoped_alloc_buffer = staticmethod(rffi.scoped_alloc_unicodebuffer) + + @staticmethod + @specialize.argtype(0) + def as_str(path): + assert path is not None + if isinstance(path, unicode): + return path + else: + return path.as_unicode() + + @staticmethod + @specialize.argtype(0) + def as_str0(path): + res = UnicodeTraits.as_str(path) + rstring.check_str0(res) + return res + + +string_traits = StringTraits() +unicode_traits = UnicodeTraits() + + +# Returns True when the unicode function should be called: +# - on Windows +# - if the path is Unicode. +if _WIN32: + @specialize.argtype(0) + def _prefer_unicode(path): + assert path is not None + if isinstance(path, str): + return False + elif isinstance(path, unicode): + return True + else: + return path.is_unicode + + @specialize.argtype(0) + def _preferred_traits(path): + if _prefer_unicode(path): + return unicode_traits + else: + return string_traits +else: + @specialize.argtype(0) + def _prefer_unicode(path): + return False + + @specialize.argtype(0) + def _preferred_traits(path): + return string_traits diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -1,26 +1,22 @@ import os import sys import errno +from rpython.annotator.model import s_Str0 from rpython.rtyper.lltypesystem.rffi import CConstant, CExternVariable, INT from rpython.rtyper.lltypesystem import lltype, ll2ctypes, rffi from rpython.rtyper.tool import rffi_platform -from rpython.tool.sourcetools import func_renamer -from rpython.translator.tool.cbuild import ExternalCompilationInfo -from rpython.rlib.rarithmetic import intmask, widen +from rpython.rlib import debug, jit, rstring, rthread, types +from rpython.rlib._os_support import ( + _CYGWIN, _MACRO_ON_POSIX, UNDERSCORE_ON_WIN32, _WIN32, + _prefer_unicode, _preferred_traits) from rpython.rlib.objectmodel import ( specialize, enforceargs, register_replacement_for, NOT_CONSTANT) +from rpython.rlib.rarithmetic import intmask, widen from rpython.rlib.signature import signature -from rpython.rlib import types -from rpython.annotator.model import s_Str0, s_Unicode0 -from rpython.rlib import jit +from rpython.tool.sourcetools import func_renamer from rpython.translator.platform import platform -from rpython.rlib import rstring -from rpython.rlib import debug, rthread +from rpython.translator.tool.cbuild import ExternalCompilationInfo -_WIN32 = sys.platform.startswith('win') -_CYGWIN = sys.platform == 'cygwin' -UNDERSCORE_ON_WIN32 = '_' if _WIN32 else '' -_MACRO_ON_POSIX = True if not _WIN32 else None if _WIN32: from rpython.rlib import rwin32 @@ -118,7 +114,6 @@ with the flag llexternal(..., save_err=rffi.RFFI_SAVE_ERRNO). Functions without that flag don't change the saved errno. """ - from rpython.rlib import rthread return intmask(rthread.tlfield_rpy_errno.getraw()) def set_saved_errno(errno): @@ -129,7 +124,6 @@ zero; for that case, use llexternal(..., save_err=RFFI_ZERO_ERRNO_BEFORE) and then you don't need set_saved_errno(0). """ - from rpython.rlib import rthread rthread.tlfield_rpy_errno.setraw(rffi.cast(INT, errno)) def get_saved_alterrno(): @@ -138,7 +132,6 @@ with the flag llexternal(..., save_err=rffi.RFFI_SAVE_ERRNO | rffl.RFFI_ALT_ERRNO). Functions without that flag don't change the saved errno. """ - from rpython.rlib import rthread return intmask(rthread.tlfield_alt_errno.getraw()) def set_saved_alterrno(errno): @@ -149,7 +142,6 @@ zero; for that case, use llexternal(..., save_err=RFFI_ZERO_ERRNO_BEFORE) and then you don't need set_saved_errno(0). """ - from rpython.rlib import rthread rthread.tlfield_alt_errno.setraw(rffi.cast(INT, errno)) @@ -157,7 +149,6 @@ @specialize.call_location() def _errno_before(save_err): if save_err & rffi.RFFI_READSAVED_ERRNO: - from rpython.rlib import rthread if save_err & rffi.RFFI_ALT_ERRNO: _set_errno(rthread.tlfield_alt_errno.getraw()) else: @@ -165,7 +156,6 @@ elif save_err & rffi.RFFI_ZERO_ERRNO_BEFORE: _set_errno(rffi.cast(rffi.INT, 0)) if _WIN32 and (save_err & rffi.RFFI_READSAVED_LASTERROR): - from rpython.rlib import rthread, rwin32 if save_err & rffi.RFFI_ALT_ERRNO: err = rthread.tlfield_alt_lasterror.getraw() else: @@ -179,7 +169,6 @@ def _errno_after(save_err): if _WIN32: if save_err & rffi.RFFI_SAVE_LASTERROR: - from rpython.rlib import rthread, rwin32 err = rwin32._GetLastError() # careful, setraw() overwrites GetLastError. # We must read it first, before the errno handling. @@ -188,14 +177,13 @@ else: rthread.tlfield_rpy_lasterror.setraw(err) elif save_err & rffi.RFFI_SAVE_WSALASTERROR: - from rpython.rlib import rthread, _rsocket_rffi + from rpython.rlib import _rsocket_rffi err = _rsocket_rffi._WSAGetLastError() if save_err & rffi.RFFI_ALT_ERRNO: rthread.tlfield_alt_lasterror.setraw(err) else: rthread.tlfield_rpy_lasterror.setraw(err) if save_err & rffi.RFFI_SAVE_ERRNO: - from rpython.rlib import rthread if save_err & rffi.RFFI_ALT_ERRNO: rthread.tlfield_alt_errno.setraw(_get_errno()) else: @@ -341,101 +329,6 @@ rstring.check_str0(res) return res - -class StringTraits: - str = str - str0 = s_Str0 - CHAR = rffi.CHAR - CCHARP = rffi.CCHARP - charp2str = staticmethod(rffi.charp2str) - charpsize2str = staticmethod(rffi.charpsize2str) - scoped_str2charp = staticmethod(rffi.scoped_str2charp) - str2charp = staticmethod(rffi.str2charp) - free_charp = staticmethod(rffi.free_charp) - scoped_alloc_buffer = staticmethod(rffi.scoped_alloc_buffer) - - @staticmethod - @specialize.argtype(0) - def as_str(path): - assert path is not None - if isinstance(path, str): - return path - elif isinstance(path, unicode): - # This never happens in PyPy's Python interpreter! - # Only in raw RPython code that uses unicode strings. - # We implement python2 behavior: silently convert to ascii. - return path.encode('ascii') - else: - return path.as_bytes() - - @staticmethod - @specialize.argtype(0) - def as_str0(path): - res = StringTraits.as_str(path) - rstring.check_str0(res) - return res - - -class UnicodeTraits: - str = unicode - str0 = s_Unicode0 - CHAR = rffi.WCHAR_T - CCHARP = rffi.CWCHARP - charp2str = staticmethod(rffi.wcharp2unicode) - charpsize2str = staticmethod(rffi.wcharpsize2unicode) - str2charp = staticmethod(rffi.unicode2wcharp) - scoped_str2charp = staticmethod(rffi.scoped_unicode2wcharp) - free_charp = staticmethod(rffi.free_wcharp) - scoped_alloc_buffer = staticmethod(rffi.scoped_alloc_unicodebuffer) - - @staticmethod - @specialize.argtype(0) - def as_str(path): - assert path is not None - if isinstance(path, unicode): - return path - else: - return path.as_unicode() - - @staticmethod - @specialize.argtype(0) - def as_str0(path): - res = UnicodeTraits.as_str(path) - rstring.check_str0(res) - return res - - -# Returns True when the unicode function should be called: -# - on Windows -# - if the path is Unicode. -unicode_traits = UnicodeTraits() -string_traits = StringTraits() -if _WIN32: - @specialize.argtype(0) - def _prefer_unicode(path): - assert path is not None - if isinstance(path, str): - return False - elif isinstance(path, unicode): - return True - else: - return path.is_unicode - - @specialize.argtype(0) - def _preferred_traits(path): - if _prefer_unicode(path): - return unicode_traits - else: - return string_traits -else: - @specialize.argtype(0) - def _prefer_unicode(path): - return False - - @specialize.argtype(0) - def _preferred_traits(path): - return string_traits - @specialize.argtype(0, 1) def putenv(name, value): os.environ[_as_bytes(name)] = _as_bytes(value) diff --git a/rpython/rlib/rposix_environ.py b/rpython/rlib/rposix_environ.py --- a/rpython/rlib/rposix_environ.py +++ b/rpython/rlib/rposix_environ.py @@ -1,8 +1,9 @@ import os import sys from rpython.annotator import model as annmodel +from rpython.rlib._os_support import _WIN32, StringTraits, UnicodeTraits from rpython.rlib.objectmodel import enforceargs -from rpython.rlib.rposix import _WIN32, StringTraits, UnicodeTraits +# importing rposix here creates a cycle on Windows from rpython.rtyper.controllerentry import Controller from rpython.rtyper.extfunc import register_external from rpython.rtyper.lltypesystem import rffi, lltype diff --git a/rpython/rlib/rposix_stat.py b/rpython/rlib/rposix_stat.py --- a/rpython/rlib/rposix_stat.py +++ b/rpython/rlib/rposix_stat.py @@ -16,13 +16,13 @@ from rpython.rtyper.rint import IntegerRepr from rpython.rtyper.error import TyperError +from rpython.rlib._os_support import _preferred_traits, string_traits from rpython.rlib.objectmodel import specialize from rpython.rtyper.lltypesystem import lltype, rffi from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.rlib.rarithmetic import intmask from rpython.rlib.rposix import ( - replace_os_function, handle_posix_error, _as_bytes0, - _preferred_traits, string_traits) + replace_os_function, handle_posix_error, _as_bytes0) _WIN32 = sys.platform.startswith('win') _LINUX = sys.platform.startswith('linux') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit