[pypy-svn] r74574 - in pypy/trunk/pypy: module/sys module/sys/test rlib

afa at codespeak.net afa at codespeak.net
Wed May 19 15:45:14 CEST 2010


Author: afa
Date: Wed May 19 15:45:13 2010
New Revision: 74574

Modified:
   pypy/trunk/pypy/module/sys/__init__.py
   pypy/trunk/pypy/module/sys/test/test_sysmodule.py
   pypy/trunk/pypy/module/sys/version.py
   pypy/trunk/pypy/module/sys/vm.py
   pypy/trunk/pypy/rlib/rwin32.py
Log:
Add sys.winver: version of the python DLL, and sys.getwindowsversion(): OS version info.


Modified: pypy/trunk/pypy/module/sys/__init__.py
==============================================================================
--- pypy/trunk/pypy/module/sys/__init__.py	(original)
+++ pypy/trunk/pypy/module/sys/__init__.py	Wed May 19 15:45:13 2010
@@ -1,5 +1,6 @@
 from pypy.interpreter.mixedmodule import MixedModule
 from pypy.interpreter.error import OperationError
+import sys
 
 class Module(MixedModule):
     """Sys Builtin Module. """
@@ -71,6 +72,10 @@
         'setdefaultencoding'    : 'interp_encoding.setdefaultencoding',
         'getfilesystemencoding' : 'interp_encoding.getfilesystemencoding',
         }
+
+    if sys.platform == 'win32':
+        interpleveldefs['winver'] = 'version.get_winver(space)'
+        interpleveldefs['getwindowsversion'] = 'vm.getwindowsversion'
     
     appleveldefs = {
         'excepthook'            : 'app.excepthook', 

Modified: pypy/trunk/pypy/module/sys/test/test_sysmodule.py
==============================================================================
--- pypy/trunk/pypy/module/sys/test/test_sysmodule.py	(original)
+++ pypy/trunk/pypy/module/sys/test/test_sysmodule.py	Wed May 19 15:45:13 2010
@@ -331,6 +331,10 @@
             assert isinstance(v[3], int)
             assert isinstance(v[4], str)
 
+    def test_winver(self):
+        if hasattr(sys, "winver"):
+            assert sys.winver == sys.version[:3]
+
     def test_dlopenflags(self):
         if hasattr(sys, "setdlopenflags"):
             assert hasattr(sys, "getdlopenflags")

Modified: pypy/trunk/pypy/module/sys/version.py
==============================================================================
--- pypy/trunk/pypy/module/sys/version.py	(original)
+++ pypy/trunk/pypy/module/sys/version.py	Wed May 19 15:45:13 2010
@@ -58,6 +58,11 @@
         PYPY_VERSION[1],
         PYPY_VERSION[2]))
 
+def get_winver(space):
+    return space.wrap("%d.%d" % (
+        CPYTHON_VERSION[0],
+        CPYTHON_VERSION[1]))
+
 def get_hexversion(space):
     return space.wrap(tuple2hex(CPYTHON_VERSION))
 

Modified: pypy/trunk/pypy/module/sys/vm.py
==============================================================================
--- pypy/trunk/pypy/module/sys/vm.py	(original)
+++ pypy/trunk/pypy/module/sys/vm.py	Wed May 19 15:45:13 2010
@@ -117,3 +117,12 @@
 saved, and restored afterwards.  This is intended to be called from
 a debugger from a checkpoint, to recursively debug some other code."""
     return space.getexecutioncontext().call_tracing(w_func, w_args)
+
+def getwindowsversion(space):
+    from pypy.rlib import rwin32
+    info = rwin32.GetVersionEx()
+    return space.newtuple([space.wrap(info[0]),
+                           space.wrap(info[1]),
+                           space.wrap(info[2]),
+                           space.wrap(info[3]),
+                           space.wrap(info[4])])

Modified: pypy/trunk/pypy/rlib/rwin32.py
==============================================================================
--- pypy/trunk/pypy/rlib/rwin32.py	(original)
+++ pypy/trunk/pypy/rlib/rwin32.py	Wed May 19 15:45:13 2010
@@ -50,6 +50,15 @@
         SYSTEMTIME = rffi_platform.Struct('SYSTEMTIME',
                                           [])
 
+        OSVERSIONINFO = rffi_platform.Struct(
+            'OSVERSIONINFO',
+            [('dwOSVersionInfoSize', rffi.UINT),
+             ('dwMajorVersion', rffi.UINT),
+             ('dwMinorVersion', rffi.UINT),
+             ('dwBuildNumber',  rffi.UINT),
+             ('dwPlatformId',  rffi.UINT),
+             ('szCSDVersion', rffi.CFixedArray(lltype.Char, 1))])
+
         LPSECURITY_ATTRIBUTES = rffi_platform.SimpleType(
             "LPSECURITY_ATTRIBUTES", rffi.CCHARP)
 
@@ -184,3 +193,22 @@
                 return ''.join([buf[i] for i in range(res)])
         finally:
             lltype.free(buf, flavor='raw')
+
+    _GetVersionEx = winexternal('GetVersionExA',
+                                [lltype.Ptr(OSVERSIONINFO)],
+                                DWORD)
+
+    def GetVersionEx():
+        info = lltype.malloc(OSVERSIONINFO, flavor='raw')
+        rffi.setintfield(info, 'c_dwOSVersionInfoSize',
+                         rffi.sizeof(OSVERSIONINFO))
+        try:
+            if not _GetVersionEx(info):
+                raise lastWindowsError()
+            return (rffi.cast(lltype.Signed, info.c_dwMajorVersion),
+                    rffi.cast(lltype.Signed, info.c_dwMinorVersion),
+                    rffi.cast(lltype.Signed, info.c_dwBuildNumber),
+                    rffi.cast(lltype.Signed, info.c_dwPlatformId),
+                    rffi.charp2str(info.c_szCSDVersion))
+        finally:
+            lltype.free(info, flavor='raw')



More information about the Pypy-commit mailing list