Author: Amaury Forgeot d'Arc <[email protected]>
Branch: more-rposix
Changeset: r74408:9eb5ecbc8570
Date: 2014-11-08 23:44 +0100
http://bitbucket.org/pypy/pypy/changeset/9eb5ecbc8570/
Log: Move os.WIFEXITED and other macros
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -5,6 +5,7 @@
from rpython.rtyper.lltypesystem import lltype, ll2ctypes, rffi
from rpython.rtyper.module.support import StringTraits, UnicodeTraits
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.objectmodel import (
@@ -143,7 +144,7 @@
includes = ['io.h', 'sys/utime.h', 'sys/types.h']
libraries = []
else:
- includes = ['unistd.h', 'sys/types.h',
+ includes = ['unistd.h', 'sys/types.h', 'sys/wait.h',
'utime.h', 'sys/time.h', 'sys/times.h',
'grp.h', 'dirent.h']
libraries = ['util']
@@ -157,6 +158,7 @@
SEEK_SET = rffi_platform.DefinedConstantInteger('SEEK_SET')
SEEK_CUR = rffi_platform.DefinedConstantInteger('SEEK_CUR')
SEEK_END = rffi_platform.DefinedConstantInteger('SEEK_END')
+ OFF_T_SIZE = rffi_platform.SizeOf('off_t')
HAVE_UTIMES = rffi_platform.Has('utimes')
UTIMBUF = rffi_platform.Struct('struct %sutimbuf' % UNDERSCORE_ON_WIN32,
@@ -181,6 +183,11 @@
return rffi.llexternal(name, args, result,
compilation_info=compilation_info, **kwds)
+# For now we require off_t to be the same size as LONGLONG, which is the
+# interface required by callers of functions that thake an argument of type
+# off_t.
+assert OFF_T_SIZE == rffi.sizeof(rffi.LONGLONG)
+
c_dup = external(UNDERSCORE_ON_WIN32 + 'dup', [rffi.INT], rffi.INT)
c_dup2 = external(UNDERSCORE_ON_WIN32 + 'dup2', [rffi.INT, rffi.INT], rffi.INT)
c_open = external(UNDERSCORE_ON_WIN32 + 'open',
@@ -743,43 +750,23 @@
finally:
lltype.free(status_p, flavor='raw')
-if _WIN32:
- CreatePipe = external('CreatePipe', [rwin32.LPHANDLE,
- rwin32.LPHANDLE,
- rffi.VOIDP,
- rwin32.DWORD],
- rwin32.BOOL)
- c_open_osfhandle = external('_open_osfhandle', [rffi.INTPTR_T,
- rffi.INT],
- rffi.INT)
-else:
- INT_ARRAY_P = rffi.CArrayPtr(rffi.INT)
- c_pipe = external('pipe', [INT_ARRAY_P], rffi.INT)
+def _make_waitmacro(name):
+ c_func = external(name, [lltype.Signed], lltype.Signed,
+ macro=True)
+ returning_int = name in ('WEXITSTATUS', 'WSTOPSIG', 'WTERMSIG')
-@replace_os_function('pipe')
-def pipe():
- if _WIN32:
- pread = lltype.malloc(rwin32.LPHANDLE.TO, 1, flavor='raw')
- pwrite = lltype.malloc(rwin32.LPHANDLE.TO, 1, flavor='raw')
- try:
- if not CreatePipe(
- pread, pwrite, lltype.nullptr(rffi.VOIDP.TO), 0):
- raise WindowsError(rwin32.GetLastError(), "CreatePipe failed")
- hread = rffi.cast(rffi.INTPTR_T, pread[0])
- hwrite = rffi.cast(rffi.INTPTR_T, pwrite[0])
- finally:
- lltype.free(pwrite, flavor='raw')
- lltype.free(pread, flavor='raw')
- fdread = _open_osfhandle(hread, 0)
- fdwrite = _open_osfhandle(hwrite, 1)
- return (fdread, fdwrite)
- else:
- filedes = lltype.malloc(INT_ARRAY_P.TO, 2, flavor='raw')
- try:
- handle_posix_error('pipe', c_pipe(filedes))
- return (widen(filedes[0]), widen(filedes[1]))
- finally:
- lltype.free(filedes, flavor='raw')
+ @replace_os_function(name)
+ @func_renamer(name)
+ def _waitmacro(status):
+ if returning_int:
+ return c_func(status)
+ else:
+ return bool(c_func(status))
+
+for name in ['WCOREDUMP', 'WIFCONTINUED', 'WIFSTOPPED',
+ 'WIFSIGNALED', 'WIFEXITED',
+ 'WEXITSTATUS', 'WSTOPSIG', 'WTERMSIG']:
+ _make_waitmacro(name)
#___________________________________________________________________
@@ -932,6 +919,8 @@
if not win32traits.MoveFile(path1, path2):
raise rwin32.lastWindowsError()
+#___________________________________________________________________
+
c_mkfifo = external('mkfifo', [rffi.CCHARP, rffi.MODE_T], rffi.INT)
c_mknod = external('mknod', [rffi.CCHARP, rffi.MODE_T, rffi.INT], rffi.INT,
macro=True)
@@ -947,9 +936,49 @@
def mknod(path, mode, dev):
handle_posix_error('mknod', c_mknod(_as_bytes0(path), mode, dev))
+if _WIN32:
+ CreatePipe = external('CreatePipe', [rwin32.LPHANDLE,
+ rwin32.LPHANDLE,
+ rffi.VOIDP,
+ rwin32.DWORD],
+ rwin32.BOOL)
+ c_open_osfhandle = external('_open_osfhandle', [rffi.INTPTR_T,
+ rffi.INT],
+ rffi.INT)
+else:
+ INT_ARRAY_P = rffi.CArrayPtr(rffi.INT)
+ c_pipe = external('pipe', [INT_ARRAY_P], rffi.INT)
+
+@replace_os_function('pipe')
+def pipe():
+ if _WIN32:
+ pread = lltype.malloc(rwin32.LPHANDLE.TO, 1, flavor='raw')
+ pwrite = lltype.malloc(rwin32.LPHANDLE.TO, 1, flavor='raw')
+ try:
+ if not CreatePipe(
+ pread, pwrite, lltype.nullptr(rffi.VOIDP.TO), 0):
+ raise WindowsError(rwin32.GetLastError(), "CreatePipe failed")
+ hread = rffi.cast(rffi.INTPTR_T, pread[0])
+ hwrite = rffi.cast(rffi.INTPTR_T, pwrite[0])
+ finally:
+ lltype.free(pwrite, flavor='raw')
+ lltype.free(pread, flavor='raw')
+ fdread = _open_osfhandle(hread, 0)
+ fdwrite = _open_osfhandle(hwrite, 1)
+ return (fdread, fdwrite)
+ else:
+ filedes = lltype.malloc(INT_ARRAY_P.TO, 2, flavor='raw')
+ try:
+ handle_posix_error('pipe', c_pipe(filedes))
+ return (widen(filedes[0]), widen(filedes[1]))
+ finally:
+ lltype.free(filedes, flavor='raw')
+
c_link = external('link', [rffi.CCHARP, rffi.CCHARP], rffi.INT)
c_symlink = external('symlink', [rffi.CCHARP, rffi.CCHARP], rffi.INT)
+#___________________________________________________________________
+
@replace_os_function('link')
@specialize.argtype(0, 1)
def link(oldpath, newpath):
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -128,50 +128,16 @@
('tms_cutime', rffi.INT),
('tms_cstime', rffi.INT)])
- # For now we require off_t to be the same size as LONGLONG, which is the
- # interface required by callers of functions that thake an argument of type
- # off_t
- OFF_T_SIZE = platform.SizeOf('off_t')
SEEK_SET = platform.DefinedConstantInteger('SEEK_SET')
SEEK_CUR = platform.DefinedConstantInteger('SEEK_CUR')
SEEK_END = platform.DefinedConstantInteger('SEEK_END')
- UTIMBUF = platform.Struct('struct %sutimbuf' % UNDERSCORE_ON_WIN32,
- [('actime', rffi.INT),
- ('modtime', rffi.INT)])
-
class RegisterOs(BaseLazyRegistering):
def __init__(self):
self.configure(CConfig)
- if not _WIN32:
- assert self.OFF_T_SIZE == rffi.sizeof(rffi.LONGLONG)
-
- # we need an indirection via c functions to get macro calls working on
llvm XXX still?
- if hasattr(os, 'WCOREDUMP'):
- decl_snippet = """
- %(ret_type)s pypy_macro_wrapper_%(name)s (int status);
- """
- def_snippet = """
- %(ret_type)s pypy_macro_wrapper_%(name)s (int status) {
- return %(name)s(status);
- }
- """
- decls = []
- defs = []
- for name in self.w_star:
- if hasattr(os, name):
- data = {'ret_type': 'int', 'name': name}
- decls.append((decl_snippet % data).strip())
- defs.append((def_snippet % data).strip())
-
- self.compilation_info = self.compilation_info.merge(
- ExternalCompilationInfo(
- post_include_bits = decls,
- separate_module_sources = ["\n".join(defs)]
- ))
# --------------------------- os.stat & variants ---------------------------
@@ -204,43 +170,6 @@
# ------------------------------- os.W* ---------------------------------
- w_star = ['WCOREDUMP', 'WIFCONTINUED', 'WIFSTOPPED',
- 'WIFSIGNALED', 'WIFEXITED', 'WEXITSTATUS',
- 'WSTOPSIG', 'WTERMSIG']
- # last 3 are returning int
- w_star_returning_int = dict.fromkeys(w_star[-3:])
-
-
-
- def declare_new_w_star(self, name):
- """ stupid workaround for the python late-binding
- 'feature'
- """
-
- def fake(status):
- return int(getattr(os, name)(status))
- fake.func_name = 'fake_' + name
-
- os_c_func = self.llexternal("pypy_macro_wrapper_" + name,
- [lltype.Signed], lltype.Signed,
- _callable=fake)
-
- if name in self.w_star_returning_int:
- def llimpl(status):
- return os_c_func(status)
- resulttype = int
- else:
- def llimpl(status):
- return bool(os_c_func(status))
- resulttype = bool
- llimpl.func_name = name + '_llimpl'
- return extdef([int], resulttype, "ll_os." + name,
- llimpl=llimpl)
-
- for name in w_star:
- locals()['register_w_' + name] = registering_if(os, name)(
- lambda self, xname=name : self.declare_new_w_star(xname))
-
@registering_if(os, 'ttyname')
def register_os_ttyname(self):
os_ttyname = self.llexternal('ttyname', [lltype.Signed], rffi.CCHARP,
releasegil=False)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit