Author: Amaury Forgeot d'Arc <[email protected]>
Branch: 
Changeset: r58280:075b5c1e232b
Date: 2012-10-20 21:15 +0200
http://bitbucket.org/pypy/pypy/changeset/075b5c1e232b/

Log:    cpyext: add PyErr_Display

diff --git a/pypy/module/cpyext/pyerrors.py b/pypy/module/cpyext/pyerrors.py
--- a/pypy/module/cpyext/pyerrors.py
+++ b/pypy/module/cpyext/pyerrors.py
@@ -284,6 +284,20 @@
     """Alias for PyErr_PrintEx(1)."""
     PyErr_PrintEx(space, 1)
 
+@cpython_api([PyObject, PyObject, PyObject], lltype.Void)
+def PyErr_Display(space, w_type, w_value, tb):
+    if tb:
+        w_tb = from_ref(space, tb)
+    else:
+        w_tb = space.w_None
+    try:
+        space.call_function(space.sys.get("excepthook"),
+                            w_type, w_value, w_tb)
+    except OperationError:
+        # Like CPython: This is wrong, but too many callers rely on
+        # this behavior.
+        pass
+
 @cpython_api([PyObject, PyObject], rffi.INT_real, error=-1)
 def PyTraceBack_Print(space, w_tb, w_file):
     space.call_method(w_file, "write", space.wrap(
diff --git a/pypy/module/cpyext/test/test_pyerrors.py 
b/pypy/module/cpyext/test/test_pyerrors.py
--- a/pypy/module/cpyext/test/test_pyerrors.py
+++ b/pypy/module/cpyext/test/test_pyerrors.py
@@ -219,6 +219,31 @@
             assert e.errno == errno.EBADF
             assert e.strerror == os.strerror(errno.EBADF)
 
+    def test_PyErr_Display(self):
+        module = self.import_extension('foo', [
+            ("display_error", "METH_VARARGS",
+             r'''
+             PyObject *type, *val, *tb;
+             PyErr_GetExcInfo(&type, &val, &tb);
+             PyErr_Display(type, val, tb);
+             Py_XDECREF(type);
+             Py_XDECREF(val);
+             Py_XDECREF(tb);
+             Py_RETURN_NONE;
+             '''),
+            ])
+        import sys, StringIO
+        sys.stderr = StringIO.StringIO()
+        try:
+            1 / 0
+        except ZeroDivisionError:
+            module.display_error()
+        finally:
+            output = sys.stderr.getvalue()
+            sys.stderr = sys.__stderr__
+        assert "in test_PyErr_Display\n" in output
+        assert "ZeroDivisionError" in output
+
     def test_GetSetExcInfo(self):
         import sys
         module = self.import_extension('foo', [
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to