[pypy-svn] r48530 - pypy/dist/pypy/translator/llvm

rxe at codespeak.net rxe at codespeak.net
Sat Nov 10 22:22:08 CET 2007


Author: rxe
Date: Sat Nov 10 22:22:08 2007
New Revision: 48530

Modified:
   pypy/dist/pypy/translator/llvm/modwrapper.py
Log:
why did i think rtuples were homoegeneous?

Modified: pypy/dist/pypy/translator/llvm/modwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/modwrapper.py	(original)
+++ pypy/dist/pypy/translator/llvm/modwrapper.py	Sat Nov 10 22:22:08 2007
@@ -90,10 +90,13 @@
     else:
         return None
 
-def struct_to_tuple(res, size, C_TYPE, action):
+def struct_to_tuple(res, C_TYPE_actions):
     if res:
-        t = ctypes.cast(res, ctypes.POINTER(C_TYPE * size)).contents
-        return {'type':'tuple', 'value':tuple([action(ii) for ii in t])}
+        class S(ctypes.Structure):
+            _fields_ = [("item%%s" %% ii, C_TYPE) for ii, (C_TYPE, _) in enumerate(C_TYPE_actions)]        
+        s = ctypes.cast(res, ctypes.POINTER(S)).contents
+        items = [action(getattr(s, 'item%%s' %% ii)) for ii, (_, action) in enumerate(C_TYPE_actions)]
+        return {'type':'tuple', 'value':tuple(items)}
     else:
         return None
 
@@ -234,10 +237,9 @@
             if fields:
                 F0, name = fields[0]
                 if name.startswith("item"):
-                    _c_type, _action = self.build_lltype_to_ctypes_to_res(F0)
-                    action = self.create_simple_closure('res', 'struct_to_tuple(res, %s, %s, %s)' % (len(fields), 
-                                                                                                     _c_type, 
-                                                                                                     _action))
+                    ctype_actions = "%s" % [self.build_lltype_to_ctypes_to_res(f[0]) for f in fields]
+                    ctype_actions = ctype_actions.replace("'", "")
+                    action = self.create_simple_closure('res', 'struct_to_tuple(res, %s)' % (ctype_actions))
                 elif name == "length" and fields[1][1] == "items":
                     _c_type, _action = self.build_lltype_to_ctypes_to_res(fields[1][0])
                     action = self.create_simple_closure('res', 'list_to_array(res, %s)' % (_action))



More information about the Pypy-commit mailing list