[pypy-svn] r48821 - pypy/dist/pypy/lib/ctypes

fijal at codespeak.net fijal at codespeak.net
Tue Nov 20 13:25:53 CET 2007


Author: fijal
Date: Tue Nov 20 13:25:52 2007
New Revision: 48821

Added:
   pypy/dist/pypy/lib/ctypes/_basics.py   (contents, props changed)
   pypy/dist/pypy/lib/ctypes/_pointers.py   (contents, props changed)
Modified:
   pypy/dist/pypy/lib/ctypes/__init__.py
Log:
Shuffle stuff around


Modified: pypy/dist/pypy/lib/ctypes/__init__.py
==============================================================================
--- pypy/dist/pypy/lib/ctypes/__init__.py	(original)
+++ pypy/dist/pypy/lib/ctypes/__init__.py	Tue Nov 20 13:25:52 2007
@@ -28,69 +28,8 @@
         self._handle = self.lib._handle.ptr(self.name, llargs,
                                            self.restype._type_)
 
-class _SimpleCData(object):
-    def __init__(self, value):
-        self.value = value
-
-class c_ushort(_SimpleCData):
-    _type_ = 'H'
-
-class c_double(_SimpleCData):
-    _type_ = 'd'
-
-class c_ubyte(_SimpleCData):
-    _type_ = 'B'
-
-class c_float(_SimpleCData):
-    _type_ = 'f'
-
-class c_ulong(_SimpleCData):
-    _type_ = 'L'
-
-class c_short(_SimpleCData):
-    _type_ = 'h'
-
-class c_ubyte(_SimpleCData):
-    _type_ = 'b'
-
-class c_byte(_SimpleCData):
-    _type_ = 'B'
-
-class c_char(_SimpleCData):
-    _type_ = 'c'
-
-class c_long(_SimpleCData):
-    _type_ = 'l'
-
-class c_ulonglong(_SimpleCData):
-    _type_ = 'Q'
-
-class c_longlong(_SimpleCData):
-    _type_ = 'q'
-
-class c_int(_SimpleCData):
-    _type_ = 'i'
-
-class c_uint(_SimpleCData):
-    _type_ = 'I'
-
-class c_double(_SimpleCData):
-    _type_ = 'd'
-
-class c_float(_SimpleCData):
-    _type_ = 'f'
-
-c_size_t = c_ulong # XXX
-
-class POINTER(object):
-    def __init__(self, cls):
-        self.cls = cls
-
-class c_void_p(_SimpleCData):
-    _type_ = 'P'
-
-class c_char_p(_SimpleCData):
-    _type_ = 's'
+from ctypes._basics import *
+from ctypes._pointers import POINTER
 
 class CDLL(object):
     """An instance of this class represents a loaded dll/shared

Added: pypy/dist/pypy/lib/ctypes/_basics.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/ctypes/_basics.py	Tue Nov 20 13:25:52 2007
@@ -0,0 +1,60 @@
+
+class _SimpleCData(object):
+    def __init__(self, value):
+        self.value = value
+
+class c_ushort(_SimpleCData):
+    _type_ = 'H'
+
+class c_double(_SimpleCData):
+    _type_ = 'd'
+
+class c_ubyte(_SimpleCData):
+    _type_ = 'B'
+
+class c_float(_SimpleCData):
+    _type_ = 'f'
+
+class c_ulong(_SimpleCData):
+    _type_ = 'L'
+
+class c_short(_SimpleCData):
+    _type_ = 'h'
+
+class c_ubyte(_SimpleCData):
+    _type_ = 'b'
+
+class c_byte(_SimpleCData):
+    _type_ = 'B'
+
+class c_char(_SimpleCData):
+    _type_ = 'c'
+
+class c_long(_SimpleCData):
+    _type_ = 'l'
+
+class c_ulonglong(_SimpleCData):
+    _type_ = 'Q'
+
+class c_longlong(_SimpleCData):
+    _type_ = 'q'
+
+class c_int(_SimpleCData):
+    _type_ = 'i'
+
+class c_uint(_SimpleCData):
+    _type_ = 'I'
+
+class c_double(_SimpleCData):
+    _type_ = 'd'
+
+class c_float(_SimpleCData):
+    _type_ = 'f'
+
+c_size_t = c_ulong # XXX
+
+class c_void_p(_SimpleCData):
+    _type_ = 'P'
+
+class c_char_p(_SimpleCData):
+    _type_ = 's'

Added: pypy/dist/pypy/lib/ctypes/_pointers.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/ctypes/_pointers.py	Tue Nov 20 13:25:52 2007
@@ -0,0 +1,31 @@
+
+# This cache maps types to pointers to them.
+_pointer_type_cache = {}
+
+class PointerMetaclass(type):
+    def __new__(self, name, superclass, attrs):
+        res = super(PointerMetaclass, self).__new__(self, name, superclass,
+                                                    attrs)
+        return res
+
+class _Pointer(object):
+    __metaclass__ = PointerMetaclass
+
+def POINTER(cls):
+    try:
+        return _pointer_type_cache[cls]
+    except KeyError:
+        pass
+    if type(cls) is str:
+        klass = type(_Pointer)("LP_%s" % cls,
+                               (_Pointer,),
+                               {})
+        _pointer_type_cache[id(klass)] = klass
+        return klass
+    else:
+        name = "LP_%s" % cls.__name__
+        klass = type(_Pointer)(name,
+                               (_Pointer,),
+                               {'_type_': cls})
+        _pointer_type_cache[cls] = klass
+    return klass



More information about the Pypy-commit mailing list