[pypy-svn] r78769 - in pypy/branch/fast-forward: lib_pypy/_ctypes pypy/module/_rawffi

afa at codespeak.net afa at codespeak.net
Fri Nov 5 22:06:10 CET 2010


Author: afa
Date: Fri Nov  5 22:06:08 2010
New Revision: 78769

Modified:
   pypy/branch/fast-forward/lib_pypy/_ctypes/builtin.py
   pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py
   pypy/branch/fast-forward/pypy/module/_rawffi/__init__.py
   pypy/branch/fast-forward/pypy/module/_rawffi/interp_rawffi.py
Log:
implement _rawffi.wcharp2rawunicode() and use it in _ctypes


Modified: pypy/branch/fast-forward/lib_pypy/_ctypes/builtin.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/_ctypes/builtin.py	(original)
+++ pypy/branch/fast-forward/lib_pypy/_ctypes/builtin.py	Fri Nov  5 22:06:08 2010
@@ -23,13 +23,4 @@
 def _wstring_at_addr(addr, lgt):
     import ctypes
     arg = ctypes.c_void_p._CData_value(addr)
-    # XXX purely applevel
-    if lgt == -1:
-        lgt = sys.maxint
-    a = _rawffi.Array('u').fromaddress(arg, lgt)
-    res = []
-    for i in xrange(lgt):
-        if lgt == sys.maxint and a[i] == '\x00':
-            break
-        res.append(a[i])
-    return u''.join(res)
+    return _rawffi.wcharp2rawunicode(arg, lgt)

Modified: pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py	(original)
+++ pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py	Fri Nov  5 22:06:08 2010
@@ -142,13 +142,12 @@
             result.value = property(_getvalue, _setvalue)
         elif tp == 'Z':
             # c_wchar_p
-            from _ctypes import _wstring_at_addr
             def _getvalue(self):
                 addr = self._buffer[0]
                 if addr == 0:
                     return None
                 else:
-                    return _wstring_at_addr(addr, -1)
+                    return _rawffi.wcharp2unicode(addr)
 
             def _setvalue(self, value):
                 if isinstance(value, basestring):
@@ -217,14 +216,13 @@
             SysAllocStringLen = windll.oleaut32.SysAllocStringLen
             SysStringLen = windll.oleaut32.SysStringLen
             SysFreeString = windll.oleaut32.SysFreeString
-            from _ctypes import _wstring_at_addr
             def _getvalue(self):
                 addr = self._buffer[0]
                 if addr == 0:
                     return None
                 else:
                     size = SysStringLen(addr)
-                    return _wstring_at_addr(addr, size)
+                    return _rawffi.wcharp2rawunicode(addr, size)
 
             def _setvalue(self, value):
                 if isinstance(value, basestring):

Modified: pypy/branch/fast-forward/pypy/module/_rawffi/__init__.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_rawffi/__init__.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_rawffi/__init__.py	Fri Nov  5 22:06:08 2010
@@ -24,6 +24,7 @@
         'charp2string'       : 'interp_rawffi.charp2string',
         'wcharp2unicode'     : 'interp_rawffi.wcharp2unicode',
         'charp2rawstring'    : 'interp_rawffi.charp2rawstring',
+        'wcharp2rawunicode'  : 'interp_rawffi.wcharp2rawunicode',
         'CallbackPtr'        : 'callback.W_CallbackPtr',
         '_num_of_allocated_objects' : 'tracker.num_of_allocated_objects',
         'get_libc'           : 'interp_rawffi.get_libc',

Modified: pypy/branch/fast-forward/pypy/module/_rawffi/interp_rawffi.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_rawffi/interp_rawffi.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_rawffi/interp_rawffi.py	Fri Nov  5 22:06:08 2010
@@ -501,6 +501,13 @@
     return space.wrap(s)
 charp2rawstring.unwrap_spec = [ObjSpace, r_uint, int]
 
+def wcharp2rawunicode(space, address, maxlength=-1):
+    if maxlength == -1:
+        return wcharp2unicode(space, address)
+    s = rffi.wcharpsize2unicode(rffi.cast(rffi.CCHARP, address), maxlength)
+    return space.wrap(s)
+charp2rawstring.unwrap_spec = [ObjSpace, r_uint, int]
+
 if _MS_WINDOWS:
     def FormatError(space, code):
         return space.wrap(rwin32.FormatError(code))



More information about the Pypy-commit mailing list