[pypy-svn] r65149 - pypy/branch/pyjitpl5/pypy/rpython/lltypesystem

arigo at codespeak.net arigo at codespeak.net
Thu May 7 22:22:41 CEST 2009


Author: arigo
Date: Thu May  7 22:22:37 2009
New Revision: 65149

Modified:
   pypy/branch/pyjitpl5/pypy/rpython/lltypesystem/ll2ctypes.py
Log:
Try to preserve the exception across a ctypes call.
Currently only works for calls done via invoke_via_ctypes().


Modified: pypy/branch/pyjitpl5/pypy/rpython/lltypesystem/ll2ctypes.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/rpython/lltypesystem/ll2ctypes.py	(original)
+++ pypy/branch/pyjitpl5/pypy/rpython/lltypesystem/ll2ctypes.py	Thu May  7 22:22:37 2009
@@ -484,6 +484,7 @@
 _all_callbacks = {}
 _all_callbacks_results = []
 _callback2obj = {}
+_callback_exc_info = None
 
 # this is just another hack that passes around references to applevel types
 # disguised as base_ptr_lltype
@@ -548,7 +549,7 @@
             v1voidlist = [(i, getattr(container, '_void' + str(i), None))
                              for i in range(len(T.TO.ARGS))
                                  if T.TO.ARGS[i] is lltype.Void]
-            def callback(*cargs):
+            def callback_internal(*cargs):
                 cargs = list(cargs)
                 for v1 in v1voidlist:
                     cargs.insert(v1[0], v1[1])
@@ -568,9 +569,9 @@
                     except LLException, lle:
                         llinterp._store_exception(lle)
                         return 0
-                    except:
-                        import pdb
-                        pdb.set_trace()
+                    #except:
+                    #    import pdb
+                    #    pdb.set_trace()
                 else:
                     try:
                         llres = container._callable(*llargs)
@@ -589,14 +590,16 @@
                         return 0
                 return res
 
-            if conftest.option.usepdb:
-                callback_original = callback
-                def callback(*cargs):
-                    try:
-                        return callback_original(*cargs)
-                    except:
-                        import pdb, sys; pdb.post_mortem(sys.exc_traceback)
-                        raise
+            def callback(*cargs):
+                try:
+                    return callback_internal(*cargs)
+                except:
+                    import sys
+                    #if conftest.option.usepdb:
+                    #    import pdb; pdb.post_mortem(sys.exc_traceback)
+                    global _callback_exc_info
+                    _callback_exc_info = sys.exc_info()
+                    raise
 
             if isinstance(T.TO.RESULT, lltype.Ptr):
                 TMod = lltype.Ptr(lltype.FuncType(T.TO.ARGS,
@@ -911,6 +914,7 @@
         if FUNCTYPE.ARGS[i] is lltype.Void:
             void_arguments.append(i)
     def invoke_via_ctypes(*argvalues):
+        global _callback_exc_info
         cargs = []
         for i in range(len(FUNCTYPE.ARGS)):
             if i not in void_arguments:
@@ -918,9 +922,14 @@
                 if i in container_arguments:
                     cvalue = cvalue.contents
                 cargs.append(cvalue)
+        _callback_exc_info = None
         _restore_c_errno()
         cres = cfunc(*cargs)
         _save_c_errno()
+        if _callback_exc_info:
+            etype, evalue, etb = _callback_exc_info
+            _callback_exc_info = None
+            raise etype, evalue, etb
         return ctypes2lltype(RESULT, cres)
     return invoke_via_ctypes
 



More information about the Pypy-commit mailing list