[pypy-svn] r45269 - in pypy/dist/pypy/rpython/module: . test

fijal at codespeak.net fijal at codespeak.net
Mon Jul 23 13:52:27 CEST 2007


Author: fijal
Date: Mon Jul 23 13:52:26 2007
New Revision: 45269

Modified:
   pypy/dist/pypy/rpython/module/ll_os.py
   pypy/dist/pypy/rpython/module/test/test_posix.py
Log:
Add os.uname. RPython level. segfaults ll2ctypes in some strange way,
I'm not sure I want to know


Modified: pypy/dist/pypy/rpython/module/ll_os.py
==============================================================================
--- pypy/dist/pypy/rpython/module/ll_os.py	(original)
+++ pypy/dist/pypy/rpython/module/ll_os.py	Mon Jul 23 13:52:26 2007
@@ -110,6 +110,34 @@
     register_external(os.setsid, [], int, export_name="ll_os.ll_os_setsid",
                       llimpl=setsid_lltypeimpl)
 
+# ------------------------------- os.uname ------------------------------
+
+if hasattr(os, 'uname'):
+    UTSNAMEP = rffi.CStruct('utsname', ('sysname', rffi.CCHARP),
+                            ('nodename', rffi.CCHARP),
+                            ('release', rffi.CCHARP),
+                            ('version', rffi.CCHARP),
+                            ('machine', rffi.CCHARP),
+                            ('stuff', rffi.CCHARP))
+    
+    os_uname = rffi.llexternal('uname', [UTSNAMEP], rffi.INT,
+                               includes=['sys/utsname.h'])
+
+    def uname_lltypeimpl():
+        l_utsbuf = lltype.malloc(UTSNAMEP.TO, flavor='raw')
+        result = os_uname(l_utsbuf)
+        if result == -1:
+            raise OSError(rffi.c_errno, "os_uname failed")
+        fields = [l_utsbuf.c_sysname, l_utsbuf.c_nodename,
+                l_utsbuf.c_release, l_utsbuf.c_version, l_utsbuf.c_machine]
+        l = [rffi.charp2str(i) for i in fields]
+        retval = (l[0], l[1], l[2], l[3], l[4])
+        lltype.free(l_utsbuf, flavor='raw')
+        return retval
+
+    register_external(os.uname, [], (str, str, str, str, str),
+                      "ll_os.ll_uname", llimpl=uname_lltypeimpl)
+
 # ------------------------------- os.open -------------------------------
 
 if os.name == 'nt':

Modified: pypy/dist/pypy/rpython/module/test/test_posix.py
==============================================================================
--- pypy/dist/pypy/rpython/module/test/test_posix.py	(original)
+++ pypy/dist/pypy/rpython/module/test/test_posix.py	Mon Jul 23 13:52:26 2007
@@ -2,7 +2,7 @@
 skipimporterror("ctypes")
 
 from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
-from pypy.tool.udir import udir 
+from pypy.tool.udir import udir
 import os
 exec 'import %s as posix' % os.name
 
@@ -105,7 +105,15 @@
     del BaseTestPosix.test_ftruncate
 
 class TestLLtype(BaseTestPosix, LLRtypeMixin):
-    pass
+    # XXX segfaulting while run on top of llinterp
+    if hasattr(os, 'uname'):
+        def test_os_uname(self):
+            from pypy.translator.c.test.test_genc import compile
+            for num in range(5):
+                def fun():
+                    return os.uname()[num]
+                fn = compile(fun, [])
+                assert fn() == os.uname()[num]
 
 class TestOOtype(BaseTestPosix, OORtypeMixin):
     pass



More information about the Pypy-commit mailing list