annotate Python/errors.c @ 68249:4cd9f5e89061 3.0

Close 3.0 branch.
author Georg Brandl <georg@python.org>
date Sat, 05 Mar 2011 15:09:43 +0100
parents c562c8dae49a
children f221fce3d6ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 90
diff changeset
1
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2 /* Error handling */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
4 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 66
diff changeset
5
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
6 #ifndef __STDC__
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
7 #ifndef MS_WINDOWS
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13256
diff changeset
8 extern char *strerror(int);
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
9 #endif
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
10 #endif
59
433f52d1d958 Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents: 37
diff changeset
11
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
12 #ifdef MS_WINDOWS
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
13 #include <windows.h>
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
14 #include <winbase.h>
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
15 #endif
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
16
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
17 #include <ctype.h>
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
18
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
19 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
20 extern "C" {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
21 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
22
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
23
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
25 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
26 {
9671
1d40bc25703a Use PyThreadState_GET() macro.
Guido van Rossum <guido@python.org>
parents: 9365
diff changeset
27 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
28 PyObject *oldtype, *oldvalue, *oldtraceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
29
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
30 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
31 /* XXX Should never happen -- fatal error instead? */
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36701
diff changeset
32 /* Well, it could be None. */
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
33 Py_DECREF(traceback);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
34 traceback = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
35 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
36
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
37 /* Save these in locals to safeguard against recursive
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
38 invocation through Py_XDECREF */
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
39 oldtype = tstate->curexc_type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
40 oldvalue = tstate->curexc_value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
41 oldtraceback = tstate->curexc_traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
42
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
43 tstate->curexc_type = type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
44 tstate->curexc_value = value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
45 tstate->curexc_traceback = traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
46
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
47 Py_XDECREF(oldtype);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
48 Py_XDECREF(oldvalue);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
49 Py_XDECREF(oldtraceback);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
50 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
51
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
52 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
53 PyErr_SetObject(PyObject *exception, PyObject *value)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 {
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
55 PyThreadState *tstate = PyThreadState_GET();
48887
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
56 PyObject *exc_value;
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
57 PyObject *tb = NULL;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
58
37871
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
59 if (exception != NULL &&
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
60 !PyExceptionClass_Check(exception)) {
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
61 PyErr_Format(PyExc_SystemError,
41878
089f449a20cd Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents: 41769
diff changeset
62 "exception %R not a BaseException subclass",
089f449a20cd Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents: 41769
diff changeset
63 exception);
37871
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
64 return;
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
65 }
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
66 Py_XINCREF(value);
48887
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
67 exc_value = tstate->exc_value;
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
68 if (exc_value != NULL && exc_value != Py_None) {
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
69 /* Implicit exception chaining */
48887
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
70 Py_INCREF(exc_value);
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
71 if (value == NULL || !PyExceptionInstance_Check(value)) {
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
72 /* We must normalize the value right now */
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
73 PyObject *args, *fixed_value;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
74 if (value == NULL || value == Py_None)
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
75 args = PyTuple_New(0);
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
76 else if (PyTuple_Check(value)) {
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
77 Py_INCREF(value);
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
78 args = value;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
79 }
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
80 else
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
81 args = PyTuple_Pack(1, value);
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
82 fixed_value = args ?
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
83 PyEval_CallObject(exception, args) : NULL;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
84 Py_XDECREF(args);
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
85 Py_XDECREF(value);
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
86 if (fixed_value == NULL)
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
87 return;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
88 value = fixed_value;
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
89 }
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
90 /* Avoid reference cycles through the context chain.
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
91 This is O(chain length) but context chains are
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
92 usually very short. Sensitive readers may try
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
93 to inline the call to PyException_GetContext. */
48887
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
94 if (exc_value != value) {
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
95 PyObject *o = exc_value, *context;
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
96 while ((context = PyException_GetContext(o))) {
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
97 Py_DECREF(context);
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
98 if (context == value) {
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
99 PyException_SetContext(o, NULL);
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
100 break;
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
101 }
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
102 o = context;
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
103 }
48887
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
104 PyException_SetContext(value, exc_value);
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
105 } else {
c562c8dae49a Issue 3611: in some cases (a __del__ re-raising an exception, when called from inside
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48875
diff changeset
106 Py_DECREF(exc_value);
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
107 }
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
108 }
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
109 if (value != NULL && PyExceptionInstance_Check(value))
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
110 tb = PyException_GetTraceback(value);
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
111 Py_XINCREF(exception);
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
112 PyErr_Restore(exception, value, tb);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
116 PyErr_SetNone(PyObject *exception)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
118 PyErr_SetObject(exception, (PyObject *)NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
122 PyErr_SetString(PyObject *exception, const char *string)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 {
41878
089f449a20cd Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents: 41769
diff changeset
124 PyObject *value = PyUnicode_FromString(string);
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
125 PyErr_SetObject(exception, value);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
126 Py_XDECREF(value);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
129
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
130 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
131 PyErr_Occurred(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 {
18007
6a2e2548e6cf PyErr_Occurred(): Use PyThreadState_GET(), which saves a tiny function call
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
133 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
134
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
135 return tstate->curexc_type;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
138
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
139 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
140 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
141 {
12559
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
142 if (err == NULL || exc == NULL) {
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
143 /* maybe caused by "import exceptions" that failed early on */
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
144 return 0;
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
145 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
146 if (PyTuple_Check(exc)) {
36521
30aef3ce2b26 Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents: 34440
diff changeset
147 Py_ssize_t i, n;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
148 n = PyTuple_Size(exc);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
149 for (i = 0; i < n; i++) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
150 /* Test recursively */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
151 if (PyErr_GivenExceptionMatches(
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
152 err, PyTuple_GET_ITEM(exc, i)))
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
153 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
154 return 1;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
155 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
156 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
157 return 0;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
158 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
159 /* err might be an instance, so check its class. */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
160 if (PyExceptionInstance_Check(err))
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
161 err = PyExceptionInstance_Class(err);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
162
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
163 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
48589
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
164 int res = 0;
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
165 PyObject *exception, *value, *tb;
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
166 PyErr_Fetch(&exception, &value, &tb);
48875
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
167 /* PyObject_IsSubclass() can recurse and therefore is
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
168 not safe (see test_bad_getattr in test.pickletester). */
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
169 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
48589
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
170 /* This function must not fail, so print the error here */
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
171 if (res == -1) {
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
172 PyErr_WriteUnraisable(err);
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
173 res = 0;
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
174 }
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
175 PyErr_Restore(exception, value, tb);
1ec38b707cd6 Merged revisions 65320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48474
diff changeset
176 return res;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
177 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
178
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
179 return err == exc;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
180 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
181
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
182
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
183 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
184 PyErr_ExceptionMatches(PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
185 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
186 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
187 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
188
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
189
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
190 /* Used in many places to normalize a raised exception, including in
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
191 eval_code2(), do_raise(), and PyErr_Print()
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
192
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
193 XXX: should PyErr_NormalizeException() also call
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
194 PyException_SetTraceback() with the resulting value and tb?
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
195 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
196 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
197 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
198 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
199 PyObject *type = *exc;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
200 PyObject *value = *val;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
201 PyObject *inclass = NULL;
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
202 PyObject *initial_tb = NULL;
43292
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
203 PyThreadState *tstate = NULL;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
204
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
205 if (type == NULL) {
28571
5fbdcaef9dda PyErr_NormalizeException(): in the type==NULL test, we should simply
Guido van Rossum <guido@python.org>
parents: 27958
diff changeset
206 /* There was no exception, so nothing to do. */
5fbdcaef9dda PyErr_NormalizeException(): in the type==NULL test, we should simply
Guido van Rossum <guido@python.org>
parents: 27958
diff changeset
207 return;
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
208 }
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
209
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
210 /* If PyErr_SetNone() was used, the value will have been actually
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
211 set to NULL.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
212 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
213 if (!value) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
214 value = Py_None;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
215 Py_INCREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
216 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
217
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
218 if (PyExceptionInstance_Check(value))
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
219 inclass = PyExceptionInstance_Class(value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
220
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
221 /* Normalize the exception so that if the type is a class, the
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
222 value will be an instance.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
223 */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
224 if (PyExceptionClass_Check(type)) {
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
225 /* if the value was not an instance, or is not an instance
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
226 whose class is (or is derived from) type, then use the
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
227 value as an argument to instantiation of the type
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
228 class.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
229 */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
230 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
231 PyObject *args, *res;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
232
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
233 if (value == Py_None)
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 29877
diff changeset
234 args = PyTuple_New(0);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
235 else if (PyTuple_Check(value)) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
236 Py_INCREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
237 args = value;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
238 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
239 else
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 29877
diff changeset
240 args = PyTuple_Pack(1, value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
241
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
242 if (args == NULL)
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
243 goto finally;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
244 res = PyEval_CallObject(type, args);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
245 Py_DECREF(args);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
246 if (res == NULL)
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
247 goto finally;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
248 Py_DECREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
249 value = res;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
250 }
6358
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
251 /* if the class of the instance doesn't exactly match the
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
252 class of the type, believe the instance
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
253 */
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
254 else if (inclass != type) {
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
255 Py_DECREF(type);
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
256 type = inclass;
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
257 Py_INCREF(type);
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
258 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
259 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
260 *exc = type;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
261 *val = value;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
262 return;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
263 finally:
6789
bb440a2975ab Fix subtle bug in cleanup code in PyErr_NormalizeException(), detected
Guido van Rossum <guido@python.org>
parents: 6377
diff changeset
264 Py_DECREF(type);
bb440a2975ab Fix subtle bug in cleanup code in PyErr_NormalizeException(), detected
Guido van Rossum <guido@python.org>
parents: 6377
diff changeset
265 Py_DECREF(value);
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
266 /* If the new exception doesn't set a traceback and the old
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
267 exception had a traceback, use the old traceback for the
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
268 new exception. It's better than nothing.
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
269 */
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
270 initial_tb = *tb;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
271 PyErr_Fetch(exc, val, tb);
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
272 if (initial_tb != NULL) {
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
273 if (*tb == NULL)
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
274 *tb = initial_tb;
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
275 else
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
276 Py_DECREF(initial_tb);
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
277 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
278 /* normalize recursively */
43292
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
279 tstate = PyThreadState_GET();
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
280 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
281 --tstate->recursion_depth;
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
282 PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst);
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
283 return;
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
284 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
285 PyErr_NormalizeException(exc, val, tb);
43292
876b7ef4775d Merged revisions 57778-58052 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43204
diff changeset
286 --tstate->recursion_depth;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
287 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
288
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
289
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
291 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 {
31797
846b3ee7e106 Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents: 30979
diff changeset
293 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
294
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
295 *p_type = tstate->curexc_type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
296 *p_value = tstate->curexc_value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
297 *p_traceback = tstate->curexc_traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
298
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
299 tstate->curexc_type = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
300 tstate->curexc_value = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
301 tstate->curexc_traceback = NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
305 PyErr_Clear(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 {
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
307 PyErr_Restore(NULL, NULL, NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 }
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
309
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
310 /* Convenience functions to set a type error exception and return 0 */
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
311
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
312 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
313 PyErr_BadArgument(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
314 {
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
315 PyErr_SetString(PyExc_TypeError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 15148
diff changeset
316 "bad argument type for built-in operation");
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
317 return 0;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
318 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
319
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
320 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
321 PyErr_NoMemory(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
322 {
14066
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
323 if (PyErr_ExceptionMatches(PyExc_MemoryError))
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
324 /* already current */
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
325 return NULL;
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
326
6190
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
327 /* raise the pre-allocated instance if it still exists */
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
328 if (PyExc_MemoryErrorInst)
48598
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
329 {
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
330 /* Clear the previous traceback, otherwise it will be appended
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
331 * to the current one.
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
332 *
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
333 * The following statement is not likely to raise any error;
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
334 * if it does, we simply discard it.
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
335 */
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
336 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
337
6190
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
338 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
48598
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
339 }
6190
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
340 else
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
341 /* this will probably fail since there's no memory and hee,
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
342 hee, we have to instantiate this class
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
343 */
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
344 PyErr_SetNone(PyExc_MemoryError);
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
345
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
346 return NULL;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
347 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
348
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
349 PyObject *
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
350 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
351 {
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
352 PyObject *message;
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
353 PyObject *v;
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
354 int i = errno;
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
355 #ifdef PLAN9
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
356 char errbuf[ERRMAX];
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
357 #else
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
358 #ifndef MS_WINDOWS
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
359 char *s;
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
360 #else
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
361 WCHAR *s_buf = NULL;
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
362 #endif /* Unix/Windows */
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
363 #endif /* PLAN 9*/
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
364
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
365 #ifdef EINTR
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
366 if (i == EINTR && PyErr_CheckSignals())
390
172aa2c3e734 Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
367 return NULL;
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
368 #endif
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
369
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
370 #ifdef PLAN9
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
371 rerrstr(errbuf, sizeof errbuf);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
372 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
373 #else
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
374 #ifndef MS_WINDOWS
9365
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
375 if (i == 0)
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
376 s = "Error"; /* Sometimes errno didn't get set */
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
377 else
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
378 s = strerror(i);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
379 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
380 #else
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
381 if (i == 0)
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
382 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
383 else
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
384 {
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
385 /* Note that the Win32 errors do not lineup with the
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
386 errno error. So if the error is in the MSVC error
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
387 table, we use it, otherwise we assume it really _is_
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
388 a Win32 error code
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
389 */
11825
4080c7a0f1ed Mark pointed out a buglet in his patch: i < _sys_nerr isn't strong
Guido van Rossum <guido@python.org>
parents: 11801
diff changeset
390 if (i > 0 && i < _sys_nerr) {
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
391 message = PyUnicode_FromString(_sys_errlist[i]);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
392 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
393 else {
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
394 int len = FormatMessageW(
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
395 FORMAT_MESSAGE_ALLOCATE_BUFFER |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
396 FORMAT_MESSAGE_FROM_SYSTEM |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
397 FORMAT_MESSAGE_IGNORE_INSERTS,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
398 NULL, /* no message source */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
399 i,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
400 MAKELANGID(LANG_NEUTRAL,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
401 SUBLANG_DEFAULT),
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
402 /* Default language */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
403 (LPWSTR) &s_buf,
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
404 0, /* size not used */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
405 NULL); /* no args */
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
406 if (len==0) {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
407 /* Only ever seen this in out-of-mem
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
408 situations */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
409 s_buf = NULL;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
410 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
411 } else {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
412 /* remove trailing cr/lf and dots */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
413 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
414 s_buf[--len] = L'\0';
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
415 message = PyUnicode_FromUnicode(s_buf, len);
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
416 }
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
417 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
418 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
419 #endif /* Unix/Windows */
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
420 #endif /* PLAN 9*/
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
421
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
422 if (message == NULL)
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
423 {
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
424 #ifdef MS_WINDOWS
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
425 LocalFree(s_buf);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
426 #endif
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
427 return NULL;
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
428 }
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
429
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
430 if (filenameObject != NULL)
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
431 v = Py_BuildValue("(iOO)", i, message, filenameObject);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
432 else
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
433 v = Py_BuildValue("(iO)", i, message);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
434 Py_DECREF(message);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
435
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
436 if (v != NULL) {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
437 PyErr_SetObject(exc, v);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
438 Py_DECREF(v);
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
439 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
440 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
441 LocalFree(s_buf);
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
442 #endif
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
443 return NULL;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
444 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
445
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
446
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
447 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
448 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
449 {
42793
61fb597917d1 Use unicode for much of errors.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42560
diff changeset
450 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
451 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
452 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
453 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
454 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
455
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
456 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
457 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
458 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
459 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
460 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
461 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
462 NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
463 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
464 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
465 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
466 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
467 #endif /* Py_WIN_WIDE_FILENAMES */
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
468
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
469 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
470 PyErr_SetFromErrno(PyObject *exc)
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
471 {
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
472 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
473 }
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
474
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
475 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
476 /* Windows specific error code handling */
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
477 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
478 PyObject *exc,
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
479 int ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
480 PyObject *filenameObject)
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
481 {
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
482 int len;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
483 WCHAR *s_buf = NULL; /* Free via LocalFree */
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
484 PyObject *message;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
485 PyObject *v;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
486 DWORD err = (DWORD)ierr;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
487 if (err==0) err = GetLastError();
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
488 len = FormatMessageW(
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
489 /* Error API error */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
490 FORMAT_MESSAGE_ALLOCATE_BUFFER |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
491 FORMAT_MESSAGE_FROM_SYSTEM |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
492 FORMAT_MESSAGE_IGNORE_INSERTS,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
493 NULL, /* no message source */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
494 err,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
495 MAKELANGID(LANG_NEUTRAL,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
496 SUBLANG_DEFAULT), /* Default language */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
497 (LPWSTR) &s_buf,
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
498 0, /* size not used */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
499 NULL); /* no args */
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
500 if (len==0) {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
501 /* Only seen this in out of mem situations */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
502 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
503 s_buf = NULL;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
504 } else {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
505 /* remove trailing cr/lf and dots */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
506 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
507 s_buf[--len] = L'\0';
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
508 message = PyUnicode_FromUnicode(s_buf, len);
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
509 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
510
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
511 if (message == NULL)
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
512 {
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
513 LocalFree(s_buf);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
514 return NULL;
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
515 }
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
516
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
517 if (filenameObject != NULL)
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
518 v = Py_BuildValue("(iOO)", err, message, filenameObject);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
519 else
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
520 v = Py_BuildValue("(iO)", err, message);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
521 Py_DECREF(message);
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
522
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
523 if (v != NULL) {
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
524 PyErr_SetObject(exc, v);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
525 Py_DECREF(v);
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
526 }
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
527 LocalFree(s_buf);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
528 return NULL;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
529 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
530
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
531 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
532 PyObject *exc,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
533 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
534 const char *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
535 {
42793
61fb597917d1 Use unicode for much of errors.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42560
diff changeset
536 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
537 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
538 ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
539 name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
540 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
541 return ret;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
542 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
543
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
544 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
545 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
546 PyObject *exc,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
547 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
548 const Py_UNICODE *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
549 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
550 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
551 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
552 NULL;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
553 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
554 ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
555 name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
556 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
557 return ret;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
558 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
559 #endif /* Py_WIN_WIDE_FILENAMES */
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
560
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
561 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
562 {
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
563 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
564 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
565
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
566 PyObject *PyErr_SetFromWindowsErr(int ierr)
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
567 {
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
568 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
569 ierr, NULL);
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
570 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
571 PyObject *PyErr_SetFromWindowsErrWithFilename(
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
572 int ierr,
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
573 const char *filename)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
574 {
42793
61fb597917d1 Use unicode for much of errors.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42560
diff changeset
575 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
576 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
577 PyExc_WindowsError,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
578 ierr, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
579 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
580 return result;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
581 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
582
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
583 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
584 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
585 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
586 const Py_UNICODE *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
587 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
588 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
589 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
590 NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
591 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
592 PyExc_WindowsError,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
593 ierr, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
594 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
595 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
596 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
597 #endif /* Py_WIN_WIDE_FILENAMES */
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
598 #endif /* MS_WINDOWS */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
599
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
600 void
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
601 _PyErr_BadInternalCall(const char *filename, int lineno)
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
602 {
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
603 PyErr_Format(PyExc_SystemError,
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
604 "%s:%d: bad argument to internal function",
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
605 filename, lineno);
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
606 }
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
607
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
608 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
609 export the entry point for existing object code: */
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
610 #undef PyErr_BadInternalCall
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
611 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
612 PyErr_BadInternalCall(void)
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
613 {
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
614 PyErr_Format(PyExc_SystemError,
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
615 "bad argument to internal function");
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
616 }
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
617 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
618
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
619
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
620
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
621 PyObject *
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
622 PyErr_Format(PyObject *exception, const char *format, ...)
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
623 {
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
624 va_list vargs;
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
625 PyObject* string;
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
626
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
627 #ifdef HAVE_STDARG_PROTOTYPES
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
628 va_start(vargs, format);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
629 #else
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
630 va_start(vargs);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
631 #endif
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
632
41878
089f449a20cd Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents: 41769
diff changeset
633 string = PyUnicode_FromFormatV(format, vargs);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
634 PyErr_SetObject(exception, string);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
635 Py_XDECREF(string);
20221
abaf9ea2e560 SF bug [#467265] Compile errors on SuSe Linux on IBM/s390.
Tim Peters <tim.peters@gmail.com>
parents: 20116
diff changeset
636 va_end(vargs);
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
637 return NULL;
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
638 }
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
639
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
640
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
641
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
642 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
643 PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
644 {
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
645 const char *dot;
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
646 PyObject *modulename = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
647 PyObject *classname = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
648 PyObject *mydict = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
649 PyObject *bases = NULL;
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
650 PyObject *result = NULL;
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
651 dot = strrchr(name, '.');
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
652 if (dot == NULL) {
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
653 PyErr_SetString(PyExc_SystemError,
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
654 "PyErr_NewException: name must be module.class");
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
655 return NULL;
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
656 }
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
657 if (base == NULL)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
658 base = PyExc_Exception;
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
659 if (dict == NULL) {
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
660 dict = mydict = PyDict_New();
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
661 if (dict == NULL)
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
662 goto failure;
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
663 }
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
664 if (PyDict_GetItemString(dict, "__module__") == NULL) {
42793
61fb597917d1 Use unicode for much of errors.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42560
diff changeset
665 modulename = PyUnicode_FromStringAndSize(name,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
666 (Py_ssize_t)(dot-name));
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
667 if (modulename == NULL)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
668 goto failure;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
669 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
670 goto failure;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
671 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
672 if (PyTuple_Check(base)) {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
673 bases = base;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
674 /* INCREF as we create a new ref in the else branch */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
675 Py_INCREF(bases);
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
676 } else {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
677 bases = PyTuple_Pack(1, base);
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
678 if (bases == NULL)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
679 goto failure;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
680 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
681 /* Create a real new-style class. */
43755
704e6711e50d Fixes for issue 1752184, ensuring type objects are always created
Guido van Rossum <guido@python.org>
parents: 43524
diff changeset
682 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
683 dot+1, bases, dict);
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
684 failure:
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
685 Py_XDECREF(bases);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
686 Py_XDECREF(mydict);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
687 Py_XDECREF(classname);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
688 Py_XDECREF(modulename);
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
689 return result;
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
690 }
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
691
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
692 /* Call when an exception has occurred but there is no way for Python
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
693 to handle it. Examples: exception in __del__ or during GC. */
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
694 void
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
695 PyErr_WriteUnraisable(PyObject *obj)
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
696 {
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
697 PyObject *f, *t, *v, *tb;
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
698 PyErr_Fetch(&t, &v, &tb);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
699 f = PySys_GetObject("stderr");
43855
ee081609cee8 Added some additional checks for sys.std?? is None, see #1440
Christian Heimes <christian@cheimes.de>
parents: 43755
diff changeset
700 if (f != NULL && f != Py_None) {
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
701 PyFile_WriteString("Exception ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
702 if (t) {
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
703 PyObject* moduleName;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40949
diff changeset
704 char* className;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40949
diff changeset
705 assert(PyExceptionClass_Check(t));
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40949
diff changeset
706 className = PyExceptionClass_Name(t);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
707 if (className != NULL) {
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
708 char *dot = strrchr(className, '.');
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
709 if (dot != NULL)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
710 className = dot+1;
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
711 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
712
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
713 moduleName = PyObject_GetAttrString(t, "__module__");
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
714 if (moduleName == NULL)
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
715 PyFile_WriteString("<unknown>", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
716 else {
48660
85b67fb5672b Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents: 48598
diff changeset
717 char* modstr = _PyUnicode_AsString(moduleName);
40949
e759fd8d95ae Remove the exceptions builtin module, all the exceptions are already builtin.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40582
diff changeset
718 if (modstr &&
44098
0889daf6d0d9 #1535: rename __builtin__ module to builtins.
Georg Brandl <georg@python.org>
parents: 43855
diff changeset
719 strcmp(modstr, "builtins") != 0)
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
720 {
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
721 PyFile_WriteString(modstr, f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
722 PyFile_WriteString(".", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
723 }
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
724 }
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
725 if (className == NULL)
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
726 PyFile_WriteString("<unknown>", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
727 else
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
728 PyFile_WriteString(className, f);
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
729 if (v && v != Py_None) {
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
730 PyFile_WriteString(": ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
731 PyFile_WriteObject(v, f, 0);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
732 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
733 Py_XDECREF(moduleName);
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
734 }
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
735 PyFile_WriteString(" in ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
736 PyFile_WriteObject(obj, f, 0);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
737 PyFile_WriteString(" ignored\n", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
738 PyErr_Clear(); /* Just in case */
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
739 }
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
740 Py_XDECREF(t);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
741 Py_XDECREF(v);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
742 Py_XDECREF(tb);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
743 }
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
744
30781
74747f62f286 Made function declaration a proper C prototype
Armin Rigo <arigo@tunes.org>
parents: 30683
diff changeset
745 extern PyObject *PyModule_GetWarningsModule(void);
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
746
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
747
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
748 /* Set file and line information for the current exception.
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
749 If the exception is not a SyntaxError, also sets additional attributes
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
750 to make printing of exceptions believe it is a syntax error. */
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
751
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
752 void
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
753 PyErr_SyntaxLocation(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
754 {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
755 PyObject *exc, *v, *tb, *tmp;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
756
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
757 /* add attributes for the line number and filename for the error */
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
758 PyErr_Fetch(&exc, &v, &tb);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
759 PyErr_NormalizeException(&exc, &v, &tb);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
760 /* XXX check that it is, indeed, a syntax error. It might not
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
761 * be, though. */
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
762 tmp = PyLong_FromLong(lineno);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
763 if (tmp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
764 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
765 else {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
766 if (PyObject_SetAttrString(v, "lineno", tmp))
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
767 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
768 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
769 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
770 if (filename != NULL) {
42793
61fb597917d1 Use unicode for much of errors.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42560
diff changeset
771 tmp = PyUnicode_FromString(filename);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
772 if (tmp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
773 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
774 else {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
775 if (PyObject_SetAttrString(v, "filename", tmp))
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
776 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
777 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
778 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
779
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
780 tmp = PyErr_ProgramText(filename, lineno);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
781 if (tmp) {
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
782 if (PyObject_SetAttrString(v, "text", tmp))
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
783 PyErr_Clear();
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
784 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
785 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
786 }
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
787 if (PyObject_SetAttrString(v, "offset", Py_None)) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
788 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
789 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
790 if (exc != PyExc_SyntaxError) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
791 if (!PyObject_HasAttrString(v, "msg")) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
792 tmp = PyObject_Str(v);
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
793 if (tmp) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
794 if (PyObject_SetAttrString(v, "msg", tmp))
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
795 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
796 Py_DECREF(tmp);
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
797 } else {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
798 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
799 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
800 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
801 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
802 if (PyObject_SetAttrString(v, "print_file_and_line",
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
803 Py_None))
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
804 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
805 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
806 }
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
807 PyErr_Restore(exc, v, tb);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
808 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
809
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
810 /* Attempt to load the line of text that the exception refers to. If it
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
811 fails, it will return NULL but will not set an exception.
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
812
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
813 XXX The functionality of this function is quite similar to the
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
814 functionality in tb_displayline() in traceback.c. */
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
815
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
816 PyObject *
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
817 PyErr_ProgramText(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
818 {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
819 FILE *fp;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
820 int i;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
821 char linebuf[1000];
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
822
36701
e3248f1fc54d PyErr_ProgramText(): Grrrrrr.
Tim Peters <tim.peters@gmail.com>
parents: 36521
diff changeset
823 if (filename == NULL || *filename == '\0' || lineno <= 0)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
824 return NULL;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22205
diff changeset
825 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
826 if (fp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
827 return NULL;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
828 for (i = 0; i < lineno; i++) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
829 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
830 do {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
831 *pLastChar = '\0';
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
832 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
833 fp, NULL) == NULL)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
834 break;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
835 /* fgets read *something*; if it didn't get as
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
836 far as pLastChar, it must have found a newline
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
837 or hit the end of the file; if pLastChar is \n,
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
838 it obviously found a newline; else we haven't
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
839 yet seen a newline, so must continue */
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
840 } while (*pLastChar != '\0' && *pLastChar != '\n');
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
841 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
842 fclose(fp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
843 if (i == lineno) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
844 char *p = linebuf;
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
845 PyObject *res;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
846 while (*p == ' ' || *p == '\t' || *p == '\014')
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
847 p++;
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
848 res = PyUnicode_FromString(p);
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
849 if (res == NULL)
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
850 PyErr_Clear();
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
851 return res;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
852 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
853 return NULL;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
854 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
855
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
856 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
857 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
858 #endif