Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
diff --git a/Include/Python-ast.h b/Include/Python-ast.h
index 174a841..51e5298 100644
--- a/Include/Python-ast.h
+++ b/Include/Python-ast.h
@@ -134,9 +134,8 @@
} With;
struct {
- expr_ty type;
- expr_ty inst;
- expr_ty tback;
+ expr_ty exc;
+ expr_ty cause;
} Raise;
struct {
@@ -418,9 +417,9 @@
#define With(a0, a1, a2, a3, a4, a5) _Py_With(a0, a1, a2, a3, a4, a5)
stmt_ty _Py_With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body,
int lineno, int col_offset, PyArena *arena);
-#define Raise(a0, a1, a2, a3, a4, a5) _Py_Raise(a0, a1, a2, a3, a4, a5)
-stmt_ty _Py_Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int
- col_offset, PyArena *arena);
+#define Raise(a0, a1, a2, a3, a4) _Py_Raise(a0, a1, a2, a3, a4)
+stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset,
+ PyArena *arena);
#define TryExcept(a0, a1, a2, a3, a4, a5) _Py_TryExcept(a0, a1, a2, a3, a4, a5)
stmt_ty _Py_TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse,
int lineno, int col_offset, PyArena *arena);
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
index ca187e4..8d676d9 100644
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -6,16 +6,17 @@
/* Error objects */
+/* PyException_HEAD defines the initial segment of every exception class. */
+#define PyException_HEAD PyObject_HEAD; PyObject *dict;\
+ PyObject *args; PyObject *traceback;\
+ PyObject *context; PyObject *cause;
+
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
} PyBaseExceptionObject;
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
PyObject *msg;
PyObject *filename;
PyObject *lineno;
@@ -25,9 +26,7 @@
} PySyntaxErrorObject;
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
PyObject *encoding;
PyObject *object;
Py_ssize_t start;
@@ -36,16 +35,12 @@
} PyUnicodeErrorObject;
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
PyObject *code;
} PySystemExitObject;
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
PyObject *myerrno;
PyObject *strerror;
PyObject *filename;
@@ -53,9 +48,7 @@
#ifdef MS_WINDOWS
typedef struct {
- PyObject_HEAD
- PyObject *dict;
- PyObject *args;
+ PyException_HEAD
PyObject *myerrno;
PyObject *strerror;
PyObject *filename;
@@ -84,6 +77,19 @@
PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *);
PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**);
+/* Traceback manipulation (PEP 3134) */
+PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *);
+PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *);
+
+/* Cause manipulation (PEP 3134) */
+PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *);
+PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *);
+
+/* Context manipulation (PEP 3134) */
+PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *);
+PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *);
+
+
/* */
#define PyExceptionClass_Check(x) \
@@ -98,7 +104,7 @@
#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type))
-
+
/* Predefined exceptions */
PyAPI_DATA(PyObject *) PyExc_BaseException;
@@ -212,7 +218,7 @@
PyAPI_FUNC(int) PyErr_WarnEx(PyObject *category, const char *msg,
Py_ssize_t stack_level);
PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *,
- const char *, int,
+ const char *, int,
const char *, PyObject *);
/* In sigcheck.c or signalmodule.c */