Mercurial > cpython-lru_cache-weakref
annotate Python/errors.c @ 78855:5a2ef447b80d 2.7
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
sporadic crashes in multi-thread programs when several long deallocator
chains ran concurrently and involved subclasses of built-in container
types.
Because of this change, a couple extension modules compiled for 2.7.4
(those which use the trashcan mechanism, despite it being undocumented)
will not be loadable by 2.7.3 and earlier. However, extension modules
compiled for 2.7.3 and earlier will be loadable by 2.7.4.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 06 Sep 2012 00:59:49 +0200 |
| parents | 57de1ad15c54 |
| children |
| rev | line source |
|---|---|
| 145 | 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 | 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 | 5 |
| 2502 | 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 | 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 |
|
10638
df8a1c281ad7
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
13 #include "windows.h" |
|
df8a1c281ad7
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
14 #include "winbase.h" |
|
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 |
|
37655
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
19 #ifdef __cplusplus |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
20 extern "C" { |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
21 #endif |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
22 |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
23 |
| 6 | 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 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
27 PyThreadState *tstate = PyThreadState_GET(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
28 PyObject *oldtype, *oldvalue, *oldtraceback; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
29 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
30 if (traceback != NULL && !PyTraceBack_Check(traceback)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
31 /* XXX Should never happen -- fatal error instead? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
32 /* Well, it could be None. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
33 Py_DECREF(traceback); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
34 traceback = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
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 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
37 /* Save these in locals to safeguard against recursive |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
38 invocation through Py_XDECREF */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
39 oldtype = tstate->curexc_type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
40 oldvalue = tstate->curexc_value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
41 oldtraceback = tstate->curexc_traceback; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
42 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
43 tstate->curexc_type = type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
44 tstate->curexc_value = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
45 tstate->curexc_traceback = traceback; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
46 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
47 Py_XDECREF(oldtype); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
48 Py_XDECREF(oldvalue); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
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 | 54 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
55 Py_XINCREF(exception); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
56 Py_XINCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
57 PyErr_Restore(exception, value, (PyObject *)NULL); |
| 6 | 58 } |
| 59 | |
| 60 void | |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
61 PyErr_SetNone(PyObject *exception) |
| 6 | 62 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
63 PyErr_SetObject(exception, (PyObject *)NULL); |
| 6 | 64 } |
| 65 | |
| 66 void | |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
67 PyErr_SetString(PyObject *exception, const char *string) |
| 6 | 68 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
69 PyObject *value = PyString_FromString(string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
70 PyErr_SetObject(exception, value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
71 Py_XDECREF(value); |
| 6 | 72 } |
| 73 | |
|
1832
79e420805c67
err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
74 |
|
5370
1ea1f019268d
Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents:
5318
diff
changeset
|
75 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
76 PyErr_Occurred(void) |
| 6 | 77 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
78 PyThreadState *tstate = PyThreadState_GET(); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
79 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
80 return tstate->curexc_type; |
| 6 | 81 } |
| 82 | |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
83 |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
84 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
85 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
86 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
87 if (err == NULL || exc == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
88 /* maybe caused by "import exceptions" that failed early on */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
89 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
90 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
91 if (PyTuple_Check(exc)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
92 Py_ssize_t i, n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
93 n = PyTuple_Size(exc); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
94 for (i = 0; i < n; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
95 /* Test recursively */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
96 if (PyErr_GivenExceptionMatches( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
97 err, PyTuple_GET_ITEM(exc, i))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
98 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
99 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
100 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
101 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
102 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
103 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
104 /* err might be an instance, so check its class. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
105 if (PyExceptionInstance_Check(err)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
106 err = PyExceptionInstance_Class(err); |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
107 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
108 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
109 int res = 0, reclimit; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
110 PyObject *exception, *value, *tb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
111 PyErr_Fetch(&exception, &value, &tb); |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
112 /* Temporarily bump the recursion limit, so that in the most |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
113 common case PyObject_IsSubclass will not raise a recursion |
|
73880
57de1ad15c54
Issue #13546: Fixed an overflow issue that could crash the intepreter when
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
68256
diff
changeset
|
114 error we have to ignore anyway. Don't do it when the limit |
|
57de1ad15c54
Issue #13546: Fixed an overflow issue that could crash the intepreter when
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
68256
diff
changeset
|
115 is already insanely high, to avoid overflow */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
116 reclimit = Py_GetRecursionLimit(); |
|
73880
57de1ad15c54
Issue #13546: Fixed an overflow issue that could crash the intepreter when
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
68256
diff
changeset
|
117 if (reclimit < (1 << 30)) |
|
57de1ad15c54
Issue #13546: Fixed an overflow issue that could crash the intepreter when
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
68256
diff
changeset
|
118 Py_SetRecursionLimit(reclimit + 5); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
119 res = PyObject_IsSubclass(err, exc); |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
120 Py_SetRecursionLimit(reclimit); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
121 /* This function must not fail, so print the error here */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
122 if (res == -1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
123 PyErr_WriteUnraisable(err); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
124 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
125 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
126 PyErr_Restore(exception, value, tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
127 return res; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
128 } |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
129 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
130 return err == exc; |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
131 } |
|
10638
df8a1c281ad7
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
132 |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
133 |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
134 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
135 PyErr_ExceptionMatches(PyObject *exc) |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
136 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
137 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc); |
|
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 |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
140 |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
141 /* 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
|
142 eval_code2(), do_raise(), and PyErr_Print() |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
143 */ |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
144 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
145 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
146 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
147 PyObject *type = *exc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
148 PyObject *value = *val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
149 PyObject *inclass = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
150 PyObject *initial_tb = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
151 PyThreadState *tstate = NULL; |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
152 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
153 if (type == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
154 /* There was no exception, so nothing to do. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
155 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
156 } |
|
13883
15ad4088a700
Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents:
13658
diff
changeset
|
157 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
158 /* If PyErr_SetNone() was used, the value will have been actually |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
159 set to NULL. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
160 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
161 if (!value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
162 value = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
163 Py_INCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
164 } |
|
13883
15ad4088a700
Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents:
13658
diff
changeset
|
165 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
166 if (PyExceptionInstance_Check(value)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
167 inclass = PyExceptionInstance_Class(value); |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
168 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
169 /* Normalize the exception so that if the type is a class, the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
170 value will be an instance. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
171 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
172 if (PyExceptionClass_Check(type)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
173 /* if the value was not an instance, or is not an instance |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
174 whose class is (or is derived from) type, then use the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
175 value as an argument to instantiation of the type |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
176 class. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
177 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
178 if (!inclass || !PyObject_IsSubclass(inclass, type)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
179 PyObject *args, *res; |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
180 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
181 if (value == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
182 args = PyTuple_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
183 else if (PyTuple_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
184 Py_INCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
185 args = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
186 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
187 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
188 args = PyTuple_Pack(1, value); |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
189 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
190 if (args == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
191 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
192 res = PyEval_CallObject(type, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
193 Py_DECREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
194 if (res == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
195 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
196 Py_DECREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
197 value = res; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
198 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
199 /* if the class of the instance doesn't exactly match the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
200 class of the type, believe the instance |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
201 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
202 else if (inclass != type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
203 Py_DECREF(type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
204 type = inclass; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
205 Py_INCREF(type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
206 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
207 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
208 *exc = type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
209 *val = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
210 return; |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
211 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
212 Py_DECREF(type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
213 Py_DECREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
214 /* If the new exception doesn't set a traceback and the old |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
215 exception had a traceback, use the old traceback for the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
216 new exception. It's better than nothing. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
217 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
218 initial_tb = *tb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
219 PyErr_Fetch(exc, val, tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
220 if (initial_tb != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
221 if (*tb == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
222 *tb = initial_tb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
223 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
224 Py_DECREF(initial_tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
225 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
226 /* normalize recursively */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
227 tstate = PyThreadState_GET(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
228 if (++tstate->recursion_depth > Py_GetRecursionLimit()) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
229 --tstate->recursion_depth; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
230 /* throw away the old exception... */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
231 Py_DECREF(*exc); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
232 Py_DECREF(*val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
233 /* ... and use the recursion error instead */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
234 *exc = PyExc_RuntimeError; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
235 *val = PyExc_RecursionErrorInst; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
236 Py_INCREF(*exc); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
237 Py_INCREF(*val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
238 /* just keeping the old traceback */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
239 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
240 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
241 PyErr_NormalizeException(exc, val, tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
242 --tstate->recursion_depth; |
|
6146
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
243 } |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
244 |
|
a2a1df0ca808
Three new C API functions:
Barry Warsaw <barry@python.org>
parents:
5979
diff
changeset
|
245 |
| 6 | 246 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
247 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) |
| 6 | 248 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
249 PyThreadState *tstate = PyThreadState_GET(); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
250 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
251 *p_type = tstate->curexc_type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
252 *p_value = tstate->curexc_value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
253 *p_traceback = tstate->curexc_traceback; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5370
diff
changeset
|
254 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
255 tstate->curexc_type = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
256 tstate->curexc_value = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
257 tstate->curexc_traceback = NULL; |
| 6 | 258 } |
| 259 | |
| 260 void | |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
261 PyErr_Clear(void) |
| 6 | 262 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
263 PyErr_Restore(NULL, NULL, NULL); |
| 6 | 264 } |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
265 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
266 /* 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
|
267 |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
268 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
269 PyErr_BadArgument(void) |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
270 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
271 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
272 "bad argument type for built-in operation"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
273 return 0; |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
274 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
275 |
|
5370
1ea1f019268d
Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents:
5318
diff
changeset
|
276 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
277 PyErr_NoMemory(void) |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
278 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
279 if (PyErr_ExceptionMatches(PyExc_MemoryError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
280 /* already current */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
281 return NULL; |
|
14066
25eea88047e9
Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
13883
diff
changeset
|
282 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
283 /* raise the pre-allocated instance if it still exists */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
284 if (PyExc_MemoryErrorInst) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
285 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
286 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
287 /* this will probably fail since there's no memory and hee, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
288 hee, we have to instantiate this class |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
289 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
290 PyErr_SetNone(PyExc_MemoryError); |
|
6190
b5757e87eb32
PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents:
6146
diff
changeset
|
291 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
292 return NULL; |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
293 } |
|
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
294 |
|
5370
1ea1f019268d
Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents:
5318
diff
changeset
|
295 PyObject * |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
296 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
297 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
298 PyObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
299 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
300 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
|
301 #ifdef PLAN9 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
302 char errbuf[ERRMAX]; |
|
22205
f4487350c537
Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents:
22121
diff
changeset
|
303 #endif |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23029
diff
changeset
|
304 #ifdef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
305 char *s_buf = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
306 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */ |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
307 #endif |
|
2376
c31eaed7798b
rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents:
2190
diff
changeset
|
308 #ifdef EINTR |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
309 if (i == EINTR && PyErr_CheckSignals()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
310 return NULL; |
|
2376
c31eaed7798b
rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents:
2190
diff
changeset
|
311 #endif |
|
22205
f4487350c537
Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents:
22121
diff
changeset
|
312 #ifdef PLAN9 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
313 rerrstr(errbuf, sizeof errbuf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
314 s = errbuf; |
|
22205
f4487350c537
Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents:
22121
diff
changeset
|
315 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
316 if (i == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
317 s = "Error"; /* Sometimes errno didn't get set */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
318 else |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23029
diff
changeset
|
319 #ifndef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
320 s = strerror(i); |
|
10638
df8a1c281ad7
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
321 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
322 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
323 /* Note that the Win32 errors do not lineup with the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
324 errno error. So if the error is in the MSVC error |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
325 table, we use it, otherwise we assume it really _is_ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
326 a Win32 error code |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
327 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
328 if (i > 0 && i < _sys_nerr) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
329 s = _sys_errlist[i]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
330 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
331 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
332 int len = FormatMessage( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
333 FORMAT_MESSAGE_ALLOCATE_BUFFER | |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
334 FORMAT_MESSAGE_FROM_SYSTEM | |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
335 FORMAT_MESSAGE_IGNORE_INSERTS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
336 NULL, /* no message source */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
337 i, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
338 MAKELANGID(LANG_NEUTRAL, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
339 SUBLANG_DEFAULT), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
340 /* Default language */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
341 (LPTSTR) &s_buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
342 0, /* size not used */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
343 NULL); /* no args */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
344 if (len==0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
345 /* Only ever seen this in out-of-mem |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
346 situations */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
347 sprintf(s_small_buf, "Windows Error 0x%X", i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
348 s = s_small_buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
349 s_buf = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
350 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
351 s = s_buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
352 /* remove trailing cr/lf and dots */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
353 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
354 s[--len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
355 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
356 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
357 } |
|
22205
f4487350c537
Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents:
22121
diff
changeset
|
358 #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
|
359 #endif /* PLAN 9*/ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
360 if (filenameObject != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
361 v = Py_BuildValue("(isO)", i, s, filenameObject); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
362 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
363 v = Py_BuildValue("(is)", i, s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
364 if (v != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
365 PyErr_SetObject(exc, v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
366 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
367 } |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23029
diff
changeset
|
368 #ifdef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
369 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
|
370 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
371 return NULL; |
|
9
33701db4ea55
Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
372 } |
|
10638
df8a1c281ad7
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
373 |
|
8706
ca1c669bb041
PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents:
6789
diff
changeset
|
374 |
|
ca1c669bb041
PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents:
6789
diff
changeset
|
375 PyObject * |
|
54721
921e569d1215
Add const qualifier to PyErr_SetFromErrnoWithFilename and to
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
54126
diff
changeset
|
376 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
|
377 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
378 PyObject *name = filename ? PyString_FromString(filename) : NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
379 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
380 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
381 return result; |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
382 } |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
383 |
|
54126
d64d47ee54a1
Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
52738
diff
changeset
|
384 #ifdef MS_WINDOWS |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
385 PyObject * |
|
54721
921e569d1215
Add const qualifier to PyErr_SetFromErrnoWithFilename and to
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
54126
diff
changeset
|
386 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
|
387 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
388 PyObject *name = filename ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
389 PyUnicode_FromUnicode(filename, wcslen(filename)) : |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
390 NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
391 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
392 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
393 return result; |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
394 } |
|
54126
d64d47ee54a1
Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
52738
diff
changeset
|
395 #endif /* MS_WINDOWS */ |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
396 |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
397 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
398 PyErr_SetFromErrno(PyObject *exc) |
|
8706
ca1c669bb041
PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents:
6789
diff
changeset
|
399 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
400 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL); |
|
8706
ca1c669bb041
PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents:
6789
diff
changeset
|
401 } |
| 22 | 402 |
|
36751
8e04de2480e4
PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents:
36737
diff
changeset
|
403 #ifdef MS_WINDOWS |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
404 /* 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
|
405 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
406 PyObject *exc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
407 int ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
408 PyObject *filenameObject) |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
409 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
410 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
411 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
412 char *s_buf = NULL; /* Free via LocalFree */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
413 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
414 PyObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
415 DWORD err = (DWORD)ierr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
416 if (err==0) err = GetLastError(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
417 len = FormatMessage( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
418 /* Error API error */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
419 FORMAT_MESSAGE_ALLOCATE_BUFFER | |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
420 FORMAT_MESSAGE_FROM_SYSTEM | |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
421 FORMAT_MESSAGE_IGNORE_INSERTS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
422 NULL, /* no message source */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
423 err, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
424 MAKELANGID(LANG_NEUTRAL, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
425 SUBLANG_DEFAULT), /* Default language */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
426 (LPTSTR) &s_buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
427 0, /* size not used */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
428 NULL); /* no args */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
429 if (len==0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
430 /* Only seen this in out of mem situations */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
431 sprintf(s_small_buf, "Windows Error 0x%X", err); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
432 s = s_small_buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
433 s_buf = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
434 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
435 s = s_buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
436 /* remove trailing cr/lf and dots */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
437 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
438 s[--len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
439 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
440 if (filenameObject != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
441 v = Py_BuildValue("(isO)", err, s, filenameObject); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
442 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
443 v = Py_BuildValue("(is)", err, s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
444 if (v != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
445 PyErr_SetObject(exc, v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
446 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
447 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
448 LocalFree(s_buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
449 return NULL; |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
450 } |
|
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
451 |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
452 PyObject *PyErr_SetExcFromWindowsErrWithFilename( |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
453 PyObject *exc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
454 int ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
455 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
|
456 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
457 PyObject *name = filename ? PyString_FromString(filename) : NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
458 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
459 ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
460 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
461 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
462 return ret; |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
463 } |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
464 |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
465 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename( |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
466 PyObject *exc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
467 int ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
468 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
|
469 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
470 PyObject *name = filename ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
471 PyUnicode_FromUnicode(filename, wcslen(filename)) : |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
472 NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
473 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
474 ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
475 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
476 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
477 return ret; |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
478 } |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
479 |
|
24423
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
480 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) |
|
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
481 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
482 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); |
|
24423
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
483 } |
|
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
484 |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
485 PyObject *PyErr_SetFromWindowsErr(int ierr) |
|
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
486 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
487 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
488 ierr, NULL); |
|
24423
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
489 } |
|
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
490 PyObject *PyErr_SetFromWindowsErrWithFilename( |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
491 int ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
492 const char *filename) |
|
24423
3db261a93a5b
New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents:
24071
diff
changeset
|
493 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
494 PyObject *name = filename ? PyString_FromString(filename) : NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
495 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
496 PyExc_WindowsError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
497 ierr, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
498 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
499 return result; |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
500 } |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
501 |
|
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
502 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
503 int ierr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
504 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
|
505 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
506 PyObject *name = filename ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
507 PyUnicode_FromUnicode(filename, wcslen(filename)) : |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
508 NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
509 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
510 PyExc_WindowsError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
511 ierr, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
512 Py_XDECREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
513 return result; |
|
25535
861065256487
Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24423
diff
changeset
|
514 } |
|
11801
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
515 #endif /* MS_WINDOWS */ |
|
fe960ad3db65
Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents:
10638
diff
changeset
|
516 |
| 22 | 517 void |
|
14170
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
518 _PyErr_BadInternalCall(char *filename, int lineno) |
|
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
519 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
520 PyErr_Format(PyExc_SystemError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
521 "%s:%d: bad argument to internal function", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
522 filename, lineno); |
|
14170
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
523 } |
|
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
524 |
|
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
525 /* 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
|
526 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
|
527 #undef PyErr_BadInternalCall |
|
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
528 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
529 PyErr_BadInternalCall(void) |
| 22 | 530 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
531 PyErr_Format(PyExc_SystemError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
532 "bad argument to internal function"); |
| 22 | 533 } |
|
14170
019265b3a856
Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents:
14066
diff
changeset
|
534 #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
|
535 |
|
5105
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
536 |
|
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
537 |
|
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
538 PyObject * |
|
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
539 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
|
540 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
541 va_list vargs; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
542 PyObject* string; |
|
14335
951eb3af3494
code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14330
diff
changeset
|
543 |
|
951eb3af3494
code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14330
diff
changeset
|
544 #ifdef HAVE_STDARG_PROTOTYPES |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
545 va_start(vargs, format); |
|
14335
951eb3af3494
code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14330
diff
changeset
|
546 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
547 va_start(vargs); |
|
14335
951eb3af3494
code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14330
diff
changeset
|
548 #endif |
|
5105
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
549 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
550 string = PyString_FromFormatV(format, vargs); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
551 PyErr_SetObject(exception, string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
552 Py_XDECREF(string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
553 va_end(vargs); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
554 return NULL; |
|
5105
00fd6857f76b
Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents:
4654
diff
changeset
|
555 } |
|
6319
b7f0b98f5325
New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents:
6190
diff
changeset
|
556 |
|
b7f0b98f5325
New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents:
6190
diff
changeset
|
557 |
|
38246
ee2139935a1d
PyErr_NewException now accepts a tuple of base classes as its
Georg Brandl <georg@python.org>
parents:
37779
diff
changeset
|
558 |
|
6319
b7f0b98f5325
New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents:
6190
diff
changeset
|
559 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13578
diff
changeset
|
560 PyErr_NewException(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
|
561 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
562 char *dot; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
563 PyObject *modulename = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
564 PyObject *classname = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
565 PyObject *mydict = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
566 PyObject *bases = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
567 PyObject *result = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
568 dot = strrchr(name, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
569 if (dot == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
570 PyErr_SetString(PyExc_SystemError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
571 "PyErr_NewException: name must be module.class"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
572 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
573 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
574 if (base == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
575 base = PyExc_Exception; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
576 if (dict == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
577 dict = mydict = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
578 if (dict == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
579 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
580 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
581 if (PyDict_GetItemString(dict, "__module__") == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
582 modulename = PyString_FromStringAndSize(name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
583 (Py_ssize_t)(dot-name)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
584 if (modulename == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
585 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
586 if (PyDict_SetItemString(dict, "__module__", modulename) != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
587 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
588 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
589 if (PyTuple_Check(base)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
590 bases = base; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
591 /* INCREF as we create a new ref in the else branch */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
592 Py_INCREF(bases); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
593 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
594 bases = PyTuple_Pack(1, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
595 if (bases == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
596 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
597 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
598 /* Create a real new-style class. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
599 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
600 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
|
601 failure: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
602 Py_XDECREF(bases); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
603 Py_XDECREF(mydict); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
604 Py_XDECREF(classname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
605 Py_XDECREF(modulename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
606 return result; |
|
6319
b7f0b98f5325
New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents:
6190
diff
changeset
|
607 } |
|
14330
6dee1985c681
refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14170
diff
changeset
|
608 |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
609 |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
610 /* Create an exception with docstring */ |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
611 PyObject * |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
612 PyErr_NewExceptionWithDoc(char *name, char *doc, PyObject *base, PyObject *dict) |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
613 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
614 int result; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
615 PyObject *ret = NULL; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
616 PyObject *mydict = NULL; /* points to the dict only if we create it */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
617 PyObject *docobj; |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
618 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
619 if (dict == NULL) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
620 dict = mydict = PyDict_New(); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
621 if (dict == NULL) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
622 return NULL; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
623 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
624 } |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
625 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
626 if (doc != NULL) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
627 docobj = PyString_FromString(doc); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
628 if (docobj == NULL) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
629 goto failure; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
630 result = PyDict_SetItemString(dict, "__doc__", docobj); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
631 Py_DECREF(docobj); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
632 if (result < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
633 goto failure; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
634 } |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
635 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
636 ret = PyErr_NewException(name, base, dict); |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
637 failure: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
638 Py_XDECREF(mydict); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57961
diff
changeset
|
639 return ret; |
|
57961
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
640 } |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
641 |
|
cf39c5e462f9
#7033: add new API function PyErr_NewExceptionWithDoc, for easily giving new exceptions a docstring.
Georg Brandl <georg@python.org>
parents:
54721
diff
changeset
|
642 |
|
14330
6dee1985c681
refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14170
diff
changeset
|
643 /* 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
|
644 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
|
645 void |
|
6dee1985c681
refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14170
diff
changeset
|
646 PyErr_WriteUnraisable(PyObject *obj) |
|
6dee1985c681
refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14170
diff
changeset
|
647 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
648 PyObject *f, *t, *v, *tb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
649 PyErr_Fetch(&t, &v, &tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
650 f = PySys_GetObject("stderr"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
651 if (f != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
652 PyFile_WriteString("Exception ", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
653 if (t) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
654 PyObject* moduleName; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
655 char* className; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
656 assert(PyExceptionClass_Check(t)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
657 className = PyExceptionClass_Name(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
658 if (className != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
659 char *dot = strrchr(className, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
660 if (dot != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
661 className = dot+1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
662 } |
|
38455
1a23706139ca
PyErr_Display(), PyErr_WriteUnraisable(): Coverity found a cut-and-paste
Tim Peters <tim.peters@gmail.com>
parents:
38431
diff
changeset
|
663 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
664 moduleName = PyObject_GetAttrString(t, "__module__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
665 if (moduleName == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
666 PyFile_WriteString("<unknown>", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
667 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
668 char* modstr = PyString_AsString(moduleName); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
669 if (modstr && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
670 strcmp(modstr, "exceptions") != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
671 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
672 PyFile_WriteString(modstr, f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
673 PyFile_WriteString(".", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
674 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
675 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
676 if (className == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
677 PyFile_WriteString("<unknown>", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
678 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
679 PyFile_WriteString(className, f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
680 if (v && v != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
681 PyFile_WriteString(": ", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
682 PyFile_WriteObject(v, f, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
683 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
684 Py_XDECREF(moduleName); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
685 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
686 PyFile_WriteString(" in ", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
687 PyFile_WriteObject(obj, f, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
688 PyFile_WriteString(" ignored\n", f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
689 PyErr_Clear(); /* Just in case */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
690 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
691 Py_XDECREF(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
692 Py_XDECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
693 Py_XDECREF(tb); |
|
14330
6dee1985c681
refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14170
diff
changeset
|
694 } |
| 15591 | 695 |
|
30781
74747f62f286
Made function declaration a proper C prototype
Armin Rigo <arigo@tunes.org>
parents:
30683
diff
changeset
|
696 extern PyObject *PyModule_GetWarningsModule(void); |
| 15591 | 697 |
|
16850
2d4da6cfee61
Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents:
16838
diff
changeset
|
698 |
|
22121
d4406fbfcb4e
Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents:
20221
diff
changeset
|
699 /* 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
|
700 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
|
701 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
|
702 |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
703 void |
|
26601
cc05c2c8660e
Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents:
25544
diff
changeset
|
704 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
|
705 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
706 PyObject *exc, *v, *tb, *tmp; |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
707 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
708 /* add attributes for the line number and filename for the error */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
709 PyErr_Fetch(&exc, &v, &tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
710 PyErr_NormalizeException(&exc, &v, &tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
711 /* XXX check that it is, indeed, a syntax error. It might not |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
712 * be, though. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
713 tmp = PyInt_FromLong(lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
714 if (tmp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
715 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
716 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
717 if (PyObject_SetAttrString(v, "lineno", tmp)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
718 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
719 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
720 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
721 if (filename != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
722 tmp = PyString_FromString(filename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
723 if (tmp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
724 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
725 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
726 if (PyObject_SetAttrString(v, "filename", tmp)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
727 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
728 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
729 } |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
730 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
731 tmp = PyErr_ProgramText(filename, lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
732 if (tmp) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
733 if (PyObject_SetAttrString(v, "text", tmp)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
734 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
735 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
736 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
737 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
738 if (PyObject_SetAttrString(v, "offset", Py_None)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
739 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
740 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
741 if (exc != PyExc_SyntaxError) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
742 if (!PyObject_HasAttrString(v, "msg")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
743 tmp = PyObject_Str(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
744 if (tmp) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
745 if (PyObject_SetAttrString(v, "msg", tmp)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
746 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
747 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
748 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
749 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
750 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
751 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
752 if (!PyObject_HasAttrString(v, "print_file_and_line")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
753 if (PyObject_SetAttrString(v, "print_file_and_line", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
754 Py_None)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
755 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
756 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
757 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
758 PyErr_Restore(exc, v, tb); |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
759 } |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
760 |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
761 /* com_fetch_program_text will attempt to load the line of text that |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
762 the exception refers to. If it fails, it will return NULL but will |
|
36751
8e04de2480e4
PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents:
36737
diff
changeset
|
763 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
|
764 |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
765 XXX The functionality of this function is quite similar to the |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
766 functionality in tb_displayline() in traceback.c. |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
767 */ |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
768 |
|
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
769 PyObject * |
|
26601
cc05c2c8660e
Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents:
25544
diff
changeset
|
770 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
|
771 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
772 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
773 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
774 char linebuf[1000]; |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
775 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
776 if (filename == NULL || *filename == '\0' || lineno <= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
777 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
778 fp = fopen(filename, "r" PY_STDIOTEXTMODE); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
779 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
780 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
781 for (i = 0; i < lineno; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
782 char *pLastChar = &linebuf[sizeof(linebuf) - 2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
783 do { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
784 *pLastChar = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
785 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
786 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
787 /* fgets read *something*; if it didn't get as |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
788 far as pLastChar, it must have found a newline |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
789 or hit the end of the file; if pLastChar is \n, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
790 it obviously found a newline; else we haven't |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
791 yet seen a newline, so must continue */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
792 } while (*pLastChar != '\0' && *pLastChar != '\n'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
793 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
794 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
795 if (i == lineno) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
796 char *p = linebuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
797 while (*p == ' ' || *p == '\t' || *p == '\014') |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
798 p++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
799 return PyString_FromString(p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
800 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52903
diff
changeset
|
801 return NULL; |
|
16838
09f6c1372056
Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15591
diff
changeset
|
802 } |
|
37655
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
803 |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
804 #ifdef __cplusplus |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
805 } |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
806 #endif |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36751
diff
changeset
|
807 |
