annotate Python/errors.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 01c4a0af73cf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 90
diff changeset
1
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2 /* Error handling */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
4 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 66
diff changeset
5
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
6 #ifndef __STDC__
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
7 #ifndef MS_WINDOWS
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13256
diff changeset
8 extern char *strerror(int);
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
9 #endif
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
10 #endif
59
433f52d1d958 Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents: 37
diff changeset
11
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
12 #ifdef MS_WINDOWS
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
13 #include <windows.h>
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
14 #include <winbase.h>
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
15 #endif
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
16
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
17 #include <ctype.h>
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
18
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
19 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
20 extern "C" {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
21 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
22
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86980
diff changeset
23 _Py_IDENTIFIER(builtins);
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86980
diff changeset
24 _Py_IDENTIFIER(stderr);
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86980
diff changeset
25
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
26
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
28 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
29 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
30 PyThreadState *tstate = PyThreadState_GET();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
31 PyObject *oldtype, *oldvalue, *oldtraceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
32
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
33 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
34 /* XXX Should never happen -- fatal error instead? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
35 /* Well, it could be None. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
36 Py_DECREF(traceback);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
37 traceback = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
38 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
39
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
40 /* Save these in locals to safeguard against recursive
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
41 invocation through Py_XDECREF */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
42 oldtype = tstate->curexc_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
43 oldvalue = tstate->curexc_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
44 oldtraceback = tstate->curexc_traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
45
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
46 tstate->curexc_type = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
47 tstate->curexc_value = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
48 tstate->curexc_traceback = traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
49
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
50 Py_XDECREF(oldtype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
51 Py_XDECREF(oldvalue);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
52 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
53 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
54
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
55 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
56 PyErr_SetObject(PyObject *exception, PyObject *value)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
58 PyThreadState *tstate = PyThreadState_GET();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
59 PyObject *exc_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
60 PyObject *tb = NULL;
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
61
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
62 if (exception != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
63 !PyExceptionClass_Check(exception)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
64 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
65 "exception %R not a BaseException subclass",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
66 exception);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
67 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
68 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
69 Py_XINCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
70 exc_value = tstate->exc_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
71 if (exc_value != NULL && exc_value != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
72 /* Implicit exception chaining */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
73 Py_INCREF(exc_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
74 if (value == NULL || !PyExceptionInstance_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
75 /* We must normalize the value right now */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
76 PyObject *args, *fixed_value;
84704
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
77 #ifdef Py_DEBUG
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
78 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
79 error if an exception is set when it is called */
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
80 PyErr_Clear();
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
81 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
82 if (value == NULL || value == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
83 args = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
84 else if (PyTuple_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
85 Py_INCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
86 args = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
87 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
88 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
89 args = PyTuple_Pack(1, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
90 fixed_value = args ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
91 PyEval_CallObject(exception, args) : NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
92 Py_XDECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
93 Py_XDECREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
94 if (fixed_value == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
95 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
96 value = fixed_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
97 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
98 /* Avoid reference cycles through the context chain.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
99 This is O(chain length) but context chains are
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
100 usually very short. Sensitive readers may try
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
101 to inline the call to PyException_GetContext. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
102 if (exc_value != value) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
103 PyObject *o = exc_value, *context;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
104 while ((context = PyException_GetContext(o))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
105 Py_DECREF(context);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
106 if (context == value) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
107 PyException_SetContext(o, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
108 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
109 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
110 o = context;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
111 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
112 PyException_SetContext(value, exc_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
113 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
114 Py_DECREF(exc_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
115 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
116 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
117 if (value != NULL && PyExceptionInstance_Check(value))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
118 tb = PyException_GetTraceback(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
119 Py_XINCREF(exception);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
120 PyErr_Restore(exception, value, tb);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122
85502
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
123 /* Set a key error with the specified argument, wrapping it in a
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
124 * tuple automatically so that tuple keys are not unpacked as the
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
125 * exception arguments. */
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
126 void
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
127 _PyErr_SetKeyError(PyObject *arg)
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
128 {
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
129 PyObject *tup;
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
130 tup = PyTuple_Pack(1, arg);
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
131 if (!tup)
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
132 return; /* caller will expect error to be set anyway */
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
133 PyErr_SetObject(PyExc_KeyError, tup);
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
134 Py_DECREF(tup);
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
135 }
bfaf3a2907bd Factor-out the common code for setting a KeyError.
Raymond Hettinger <python@rcn.com>
parents: 85420
diff changeset
136
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
138 PyErr_SetNone(PyObject *exception)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
140 PyErr_SetObject(exception, (PyObject *)NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
144 PyErr_SetString(PyObject *exception, const char *string)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
146 PyObject *value = PyUnicode_FromString(string);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
147 PyErr_SetObject(exception, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
148 Py_XDECREF(value);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
151
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
152 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
153 PyErr_Occurred(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 {
61555
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
155 /* If there is no thread state, PyThreadState_GET calls
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
156 Py_FatalError, which calls PyErr_Occurred. To avoid the
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
157 resulting infinite loop, we inline PyThreadState_GET here and
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
158 treat no thread as no error. */
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
159 PyThreadState *tstate =
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
160 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
161
61555
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
162 return tstate == NULL ? NULL : tstate->curexc_type;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
165
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
166 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
167 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
168 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
169 if (err == NULL || exc == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
170 /* maybe caused by "import exceptions" that failed early on */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
171 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
172 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
173 if (PyTuple_Check(exc)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
174 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
175 n = PyTuple_Size(exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
176 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
177 /* Test recursively */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
178 if (PyErr_GivenExceptionMatches(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
179 err, PyTuple_GET_ITEM(exc, i)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
180 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
181 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
182 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
183 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
184 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
185 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
186 /* err might be an instance, so check its class. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
187 if (PyExceptionInstance_Check(err))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
188 err = PyExceptionInstance_Class(err);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
189
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
190 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
191 int res = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
192 PyObject *exception, *value, *tb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
193 PyErr_Fetch(&exception, &value, &tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
194 /* PyObject_IsSubclass() can recurse and therefore is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
195 not safe (see test_bad_getattr in test.pickletester). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
196 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
197 /* This function must not fail, so print the error here */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
198 if (res == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
199 PyErr_WriteUnraisable(err);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
200 res = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
201 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
202 PyErr_Restore(exception, value, tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
203 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
204 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
205
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
206 return err == exc;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
207 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
208
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
209
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
210 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
211 PyErr_ExceptionMatches(PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
212 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
213 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
214 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
215
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
216
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
217 /* 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
218 eval_code2(), do_raise(), and PyErr_Print()
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
219
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
220 XXX: should PyErr_NormalizeException() also call
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
221 PyException_SetTraceback() with the resulting value and tb?
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
222 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
223 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
224 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
225 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
226 PyObject *type = *exc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
227 PyObject *value = *val;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
228 PyObject *inclass = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
229 PyObject *initial_tb = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
230 PyThreadState *tstate = NULL;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
231
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
232 if (type == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
233 /* There was no exception, so nothing to do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
234 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
235 }
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
236
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
237 /* If PyErr_SetNone() was used, the value will have been actually
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
238 set to NULL.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
239 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
240 if (!value) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
241 value = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
242 Py_INCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
243 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
244
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
245 if (PyExceptionInstance_Check(value))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
246 inclass = PyExceptionInstance_Class(value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
247
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
248 /* Normalize the exception so that if the type is a class, the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
249 value will be an instance.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
250 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
251 if (PyExceptionClass_Check(type)) {
84680
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
252 int is_subclass;
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
253 if (inclass) {
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
254 is_subclass = PyObject_IsSubclass(inclass, type);
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
255 if (is_subclass < 0)
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
256 goto finally;
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
257 }
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
258 else
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
259 is_subclass = 0;
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
260
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
261 /* if the value was not an instance, or is not an instance
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
262 whose class is (or is derived from) type, then use the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
263 value as an argument to instantiation of the type
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
264 class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
265 */
84680
a685f4c6e0b6 Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84574
diff changeset
266 if (!inclass || !is_subclass) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
267 PyObject *args, *res;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
268
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
269 if (value == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
270 args = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
271 else if (PyTuple_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
272 Py_INCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
273 args = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
274 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
275 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
276 args = PyTuple_Pack(1, value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
277
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
278 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
279 goto finally;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
280 res = PyEval_CallObject(type, args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
281 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
282 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
283 goto finally;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
284 Py_DECREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
285 value = res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
286 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
287 /* if the class of the instance doesn't exactly match the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
288 class of the type, believe the instance
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
289 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
290 else if (inclass != type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
291 Py_DECREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
292 type = inclass;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
293 Py_INCREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
294 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
295 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
296 *exc = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
297 *val = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
298 return;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
299 finally:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
300 Py_DECREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
301 Py_DECREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
302 /* If the new exception doesn't set a traceback and the old
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
303 exception had a traceback, use the old traceback for the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
304 new exception. It's better than nothing.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
305 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
306 initial_tb = *tb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
307 PyErr_Fetch(exc, val, tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
308 if (initial_tb != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
309 if (*tb == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
310 *tb = initial_tb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
311 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
312 Py_DECREF(initial_tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
313 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
314 /* normalize recursively */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
315 tstate = PyThreadState_GET();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
316 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
317 --tstate->recursion_depth;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
318 /* throw away the old exception... */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
319 Py_DECREF(*exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
320 Py_DECREF(*val);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
321 /* ... and use the recursion error instead */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
322 *exc = PyExc_RuntimeError;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
323 *val = PyExc_RecursionErrorInst;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
324 Py_INCREF(*exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
325 Py_INCREF(*val);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
326 /* just keeping the old traceback */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
327 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
328 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
329 PyErr_NormalizeException(exc, val, tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
330 --tstate->recursion_depth;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
331 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
332
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
333
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
335 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
337 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
338
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
339 *p_type = tstate->curexc_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
340 *p_value = tstate->curexc_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
341 *p_traceback = tstate->curexc_traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
342
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
343 tstate->curexc_type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
344 tstate->curexc_value = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
345 tstate->curexc_traceback = NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
349 PyErr_Clear(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
351 PyErr_Restore(NULL, NULL, NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 }
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
353
76418
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
354 void
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
355 PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
356 {
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
357 PyThreadState *tstate = PyThreadState_GET();
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
358
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
359 *p_type = tstate->exc_type;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
360 *p_value = tstate->exc_value;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
361 *p_traceback = tstate->exc_traceback;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
362
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
363 Py_XINCREF(*p_type);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
364 Py_XINCREF(*p_value);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
365 Py_XINCREF(*p_traceback);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
366 }
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
367
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
368 void
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
369 PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
370 {
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
371 PyObject *oldtype, *oldvalue, *oldtraceback;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
372 PyThreadState *tstate = PyThreadState_GET();
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
373
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
374 oldtype = tstate->exc_type;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
375 oldvalue = tstate->exc_value;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
376 oldtraceback = tstate->exc_traceback;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
377
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
378 tstate->exc_type = p_type;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
379 tstate->exc_value = p_value;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
380 tstate->exc_traceback = p_traceback;
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
381
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
382 Py_XDECREF(oldtype);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
383 Py_XDECREF(oldvalue);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
384 Py_XDECREF(oldtraceback);
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
385 }
9fdec1354af4 Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
Martin v. Löwis <martin@v.loewis.de>
parents: 76391
diff changeset
386
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
387 /* 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
388
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
389 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
390 PyErr_BadArgument(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
392 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
393 "bad argument type for built-in operation");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
394 return 0;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
395 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
396
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
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_NoMemory(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
399 {
84794
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
400 if (Py_TYPE(PyExc_MemoryError) == NULL) {
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
401 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
402 initialized by _PyExc_Init() */
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
403 Py_FatalError("Out of memory and PyExc_MemoryError is not "
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
404 "initialized yet");
9b77b3ee6fb8 Issue #18520: PyErr_NoMemory() now fails with a fatal error if it is called
Victor Stinner <victor.stinner@gmail.com>
parents: 84704
diff changeset
405 }
65690
c6d86439aa91 Merged revisions 85896 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
406 PyErr_SetNone(PyExc_MemoryError);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
407 return NULL;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
408 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
409
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
410 PyObject *
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
411 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
412 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
413 PyObject *message;
72893
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
414 PyObject *v, *args;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
415 int i = errno;
74007
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
416 #ifdef MS_WINDOWS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
417 WCHAR *s_buf = NULL;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
418 #endif /* Unix/Windows */
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
419
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
420 #ifdef EINTR
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
421 if (i == EINTR && PyErr_CheckSignals())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
422 return NULL;
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
423 #endif
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
424
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
425 #ifndef MS_WINDOWS
74007
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
426 if (i != 0) {
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
427 char *s = strerror(i);
74009
07802351ccad Issue #13560: Locale codec functions use the classic "errors" parameter,
Victor Stinner <victor.stinner@haypocalc.com>
parents: 74007
diff changeset
428 message = PyUnicode_DecodeLocale(s, "surrogateescape");
74007
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
429 }
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
430 else {
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
431 /* Sometimes errno didn't get set */
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
432 message = PyUnicode_FromString("Error");
51412b4b81ae Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73949
diff changeset
433 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
434 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
435 if (i == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
436 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
437 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
438 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
439 /* Note that the Win32 errors do not lineup with the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
440 errno error. So if the error is in the MSVC error
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
441 table, we use it, otherwise we assume it really _is_
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
442 a Win32 error code
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
443 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
444 if (i > 0 && i < _sys_nerr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
445 message = PyUnicode_FromString(_sys_errlist[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
446 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
447 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
448 int len = FormatMessageW(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
449 FORMAT_MESSAGE_ALLOCATE_BUFFER |
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
450 FORMAT_MESSAGE_FROM_SYSTEM |
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
451 FORMAT_MESSAGE_IGNORE_INSERTS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
452 NULL, /* no message source */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
453 i,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
454 MAKELANGID(LANG_NEUTRAL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
455 SUBLANG_DEFAULT),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
456 /* Default language */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
457 (LPWSTR) &s_buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
458 0, /* size not used */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
459 NULL); /* no args */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
460 if (len==0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
461 /* Only ever seen this in out-of-mem
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
462 situations */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
463 s_buf = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
464 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
465 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
466 /* remove trailing cr/lf and dots */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
467 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
468 s_buf[--len] = L'\0';
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68257
diff changeset
469 message = PyUnicode_FromWideChar(s_buf, len);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
470 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
471 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
472 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
473 #endif /* Unix/Windows */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
474
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
475 if (message == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
476 {
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
477 #ifdef MS_WINDOWS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
478 LocalFree(s_buf);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
479 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
480 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
481 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
482
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
483 if (filenameObject != NULL)
72893
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
484 args = Py_BuildValue("(iOO)", i, message, filenameObject);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
485 else
72893
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
486 args = Py_BuildValue("(iO)", i, message);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
487 Py_DECREF(message);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
488
72893
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
489 if (args != NULL) {
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
490 v = PyObject_Call(exc, args, NULL);
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
491 Py_DECREF(args);
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
492 if (v != NULL) {
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
493 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
494 Py_DECREF(v);
793c75177d28 Instantiate the OS-related exception as soon as we raise it, so that
Antoine Pitrou <solipsis@pitrou.net>
parents: 72879
diff changeset
495 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
496 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
497 #ifdef MS_WINDOWS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
498 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
499 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
500 return NULL;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
501 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
502
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
503
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
504 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
505 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
506 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
507 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
508 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
509 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
510 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
511 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
512
54129
77cfef596d33 Merged revisions 72698-72699 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 53079
diff changeset
513 #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
514 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
515 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
516 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
517 PyObject *name = filename ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
518 PyUnicode_FromUnicode(filename, wcslen(filename)) :
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
519 NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
520 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
521 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
522 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
523 }
54129
77cfef596d33 Merged revisions 72698-72699 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 53079
diff changeset
524 #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
525
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
526 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
527 PyErr_SetFromErrno(PyObject *exc)
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
528 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
529 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
530 }
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
531
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
532 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
533 /* 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
534 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
535 PyObject *exc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
536 int ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
537 PyObject *filenameObject)
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
538 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
539 int len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
540 WCHAR *s_buf = NULL; /* Free via LocalFree */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
541 PyObject *message;
72965
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
542 PyObject *args, *v;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
543 DWORD err = (DWORD)ierr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
544 if (err==0) err = GetLastError();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
545 len = FormatMessageW(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
546 /* Error API error */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
547 FORMAT_MESSAGE_ALLOCATE_BUFFER |
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
548 FORMAT_MESSAGE_FROM_SYSTEM |
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
549 FORMAT_MESSAGE_IGNORE_INSERTS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
550 NULL, /* no message source */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
551 err,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
552 MAKELANGID(LANG_NEUTRAL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
553 SUBLANG_DEFAULT), /* Default language */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
554 (LPWSTR) &s_buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
555 0, /* size not used */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
556 NULL); /* no args */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
557 if (len==0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
558 /* Only seen this in out of mem situations */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
559 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
560 s_buf = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
561 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
562 /* remove trailing cr/lf and dots */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
563 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
564 s_buf[--len] = L'\0';
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68257
diff changeset
565 message = PyUnicode_FromWideChar(s_buf, len);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
566 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
567
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
568 if (message == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
569 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
570 LocalFree(s_buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
571 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
572 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
573
72879
41a1de81ef2b PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72848
diff changeset
574 if (filenameObject == NULL)
41a1de81ef2b PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72848
diff changeset
575 filenameObject = Py_None;
41a1de81ef2b PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72848
diff changeset
576 /* This is the constructor signature for passing a Windows error code.
41a1de81ef2b PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72848
diff changeset
577 The POSIX translation will be figured out by the constructor. */
72965
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
578 args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
579 Py_DECREF(message);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
580
72965
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
581 if (args != NULL) {
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
582 v = PyObject_Call(exc, args, NULL);
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
583 Py_DECREF(args);
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
584 if (v != NULL) {
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
585 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
586 Py_DECREF(v);
84aed9ef7aaf Instantiate the OS-related exception as soon as we raise it, so that "except"
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72926
diff changeset
587 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
588 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
589 LocalFree(s_buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
590 return NULL;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
591 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
592
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
593 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
594 PyObject *exc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
595 int ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
596 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
597 {
67163
5605f6920b63 Issue #10780: PyErr_SetFromWindowsErrWithFilename() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65688
diff changeset
598 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
599 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
600 ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
601 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
602 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
603 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
604 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
605
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
606 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
607 PyObject *exc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
608 int ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
609 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
610 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
611 PyObject *name = filename ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
612 PyUnicode_FromUnicode(filename, wcslen(filename)) :
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
613 NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
614 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
615 ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
616 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
617 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
618 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
619 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
620
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
621 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
622 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
623 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
624 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
625
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
626 PyObject *PyErr_SetFromWindowsErr(int ierr)
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
627 {
80944
bb94f6222fef Issue #16719: Get rid of WindowsError. Use OSError instead
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80189
diff changeset
628 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
629 ierr, NULL);
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
630 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
631 PyObject *PyErr_SetFromWindowsErrWithFilename(
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
632 int ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
633 const char *filename)
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
634 {
67163
5605f6920b63 Issue #10780: PyErr_SetFromWindowsErrWithFilename() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65688
diff changeset
635 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
636 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
80944
bb94f6222fef Issue #16719: Get rid of WindowsError. Use OSError instead
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80189
diff changeset
637 PyExc_OSError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
638 ierr, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
639 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
640 return result;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
641 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
642
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
643 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
644 int ierr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
645 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
646 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
647 PyObject *name = filename ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
648 PyUnicode_FromUnicode(filename, wcslen(filename)) :
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
649 NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
650 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
80944
bb94f6222fef Issue #16719: Get rid of WindowsError. Use OSError instead
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80189
diff changeset
651 PyExc_OSError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
652 ierr, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
653 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
654 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
655 }
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
656 #endif /* MS_WINDOWS */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
657
76272
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
658 PyObject *
84444
e3ec8b176a80 Issue #15767: Revert 3a50025f1900 for ModuleNotFoundError
Brett Cannon <brett@python.org>
parents: 84109
diff changeset
659 PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
76272
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
660 {
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
661 PyObject *args, *kwargs, *error;
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
662
84444
e3ec8b176a80 Issue #15767: Revert 3a50025f1900 for ModuleNotFoundError
Brett Cannon <brett@python.org>
parents: 84109
diff changeset
663 if (msg == NULL)
76388
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
664 return NULL;
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
665
76391
cb6811eb20ef Fix it for good :-)
Antoine Pitrou <solipsis@pitrou.net>
parents: 76389
diff changeset
666 args = PyTuple_New(1);
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
667 if (args == NULL)
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
668 return NULL;
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
669
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
670 kwargs = PyDict_New();
76389
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
671 if (kwargs == NULL) {
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
672 Py_DECREF(args);
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
673 return NULL;
76389
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
674 }
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
675
76388
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
676 if (name == NULL) {
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
677 name = Py_None;
76388
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
678 }
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
679
76388
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
680 if (path == NULL) {
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
681 path = Py_None;
76388
bf23a6c215f6 Fix email post-commit review comments.
Brian Curtin <brian@python.org>
parents: 76379
diff changeset
682 }
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
683
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
684 Py_INCREF(msg);
76389
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
685 PyTuple_SET_ITEM(args, 0, msg);
84694
573f7d485ce8 Issue #18408: Fix PyErr_SetImportError(), handle PyDict_SetItemString() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84680
diff changeset
686
573f7d485ce8 Issue #18408: Fix PyErr_SetImportError(), handle PyDict_SetItemString() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84680
diff changeset
687 if (PyDict_SetItemString(kwargs, "name", name) < 0)
573f7d485ce8 Issue #18408: Fix PyErr_SetImportError(), handle PyDict_SetItemString() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84680
diff changeset
688 return NULL;
573f7d485ce8 Issue #18408: Fix PyErr_SetImportError(), handle PyDict_SetItemString() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84680
diff changeset
689 if (PyDict_SetItemString(kwargs, "path", path) < 0)
573f7d485ce8 Issue #18408: Fix PyErr_SetImportError(), handle PyDict_SetItemString() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84680
diff changeset
690 return NULL;
76272
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
691
84444
e3ec8b176a80 Issue #15767: Revert 3a50025f1900 for ModuleNotFoundError
Brett Cannon <brett@python.org>
parents: 84109
diff changeset
692 error = PyObject_Call(PyExc_ImportError, args, kwargs);
76389
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
693 if (error != NULL) {
e8c87226bcb3 fix refcnt/style/debuging oversights
Benjamin Peterson <benjamin@python.org>
parents: 76388
diff changeset
694 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
695 Py_DECREF(error);
76272
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
696 }
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
697
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
698 Py_DECREF(args);
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
699 Py_DECREF(kwargs);
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
700
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76272
diff changeset
701 return NULL;
76272
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
702 }
6825fd9b00ed Issue #1559549: Add 'name' and 'path' attributes to ImportError.
Brett Cannon <brett@python.org>
parents: 74009
diff changeset
703
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
704 void
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
705 _PyErr_BadInternalCall(const char *filename, int lineno)
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
706 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
707 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
708 "%s:%d: bad argument to internal function",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
709 filename, lineno);
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
710 }
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
711
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
712 /* 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
713 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
714 #undef PyErr_BadInternalCall
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
715 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
716 PyErr_BadInternalCall(void)
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
717 {
84574
2f7c4df5cc46 Issue #18408: errors.c: in debug mode, calling PyErr_BadInternalCall() now
Victor Stinner <victor.stinner@gmail.com>
parents: 84444
diff changeset
718 assert(0 && "bad argument to internal function");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
719 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
720 "bad argument to internal function");
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
721 }
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
722 #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
723
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
724
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
725
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
726 PyObject *
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
727 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
728 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
729 va_list vargs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
730 PyObject* string;
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
731
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
732 #ifdef HAVE_STDARG_PROTOTYPES
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
733 va_start(vargs, format);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
734 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
735 va_start(vargs);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
736 #endif
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
737
84704
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
738 #ifdef Py_DEBUG
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
739 /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
740 if an exception is set when it is called */
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
741 PyErr_Clear();
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
742 #endif
48a869a39e2d Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
Victor Stinner <victor.stinner@gmail.com>
parents: 84694
diff changeset
743
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
744 string = PyUnicode_FromFormatV(format, vargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
745 PyErr_SetObject(exception, string);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
746 Py_XDECREF(string);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
747 va_end(vargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
748 return NULL;
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
749 }
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
750
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
751
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
752
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
753 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
754 PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
755 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
756 const char *dot;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
757 PyObject *modulename = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
758 PyObject *classname = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
759 PyObject *mydict = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
760 PyObject *bases = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
761 PyObject *result = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
762 dot = strrchr(name, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
763 if (dot == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
764 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
765 "PyErr_NewException: name must be module.class");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
766 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
767 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
768 if (base == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
769 base = PyExc_Exception;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
770 if (dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
771 dict = mydict = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
772 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
773 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
774 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
775 if (PyDict_GetItemString(dict, "__module__") == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
776 modulename = PyUnicode_FromStringAndSize(name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
777 (Py_ssize_t)(dot-name));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
778 if (modulename == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
779 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
780 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
781 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
782 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
783 if (PyTuple_Check(base)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
784 bases = base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
785 /* INCREF as we create a new ref in the else branch */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
786 Py_INCREF(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
787 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
788 bases = PyTuple_Pack(1, base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
789 if (bases == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
790 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
791 }
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 72965
diff changeset
792 /* Create a real class. */
62155
600c23127207 Issue #8848: U / U# formats of Py_BuildValue() are just alias to s / s#
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61555
diff changeset
793 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
794 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
795 failure:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
796 Py_XDECREF(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
797 Py_XDECREF(mydict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
798 Py_XDECREF(classname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
799 Py_XDECREF(modulename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
800 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
801 }
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
802
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
803
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
804 /* Create an exception with docstring */
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
805 PyObject *
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
806 PyErr_NewExceptionWithDoc(const char *name, const char *doc,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
807 PyObject *base, PyObject *dict)
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
808 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
809 int result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
810 PyObject *ret = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
811 PyObject *mydict = NULL; /* points to the dict only if we create it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
812 PyObject *docobj;
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
813
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
814 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
815 dict = mydict = PyDict_New();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
816 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
817 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
818 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
819 }
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
820
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
821 if (doc != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
822 docobj = PyUnicode_FromString(doc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
823 if (docobj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
824 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
825 result = PyDict_SetItemString(dict, "__doc__", docobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
826 Py_DECREF(docobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
827 if (result < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
828 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
829 }
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
830
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
831 ret = PyErr_NewException(name, base, dict);
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
832 failure:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
833 Py_XDECREF(mydict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
834 return ret;
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
835 }
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
836
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
837
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
838 /* 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
839 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
840 void
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
841 PyErr_WriteUnraisable(PyObject *obj)
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
842 {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72893
diff changeset
843 _Py_IDENTIFIER(__module__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
844 PyObject *f, *t, *v, *tb;
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
845 PyObject *moduleName = NULL;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
846 char* className;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
847
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
848 PyErr_Fetch(&t, &v, &tb);
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
849
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86980
diff changeset
850 f = _PySys_GetObjectId(&PyId_stderr);
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
851 if (f == NULL || f == Py_None)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
852 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
853
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
854 if (obj) {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
855 if (PyFile_WriteString("Exception ignored in: ", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
856 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
857 if (PyFile_WriteObject(obj, f, 0) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
858 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
859 if (PyFile_WriteString("\n", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
860 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
861 }
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
862
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
863 if (PyTraceBack_Print(tb, f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
864 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
865
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
866 if (!t)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
867 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
868
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
869 assert(PyExceptionClass_Check(t));
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
870 className = PyExceptionClass_Name(t);
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
871 if (className != NULL) {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
872 char *dot = strrchr(className, '.');
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
873 if (dot != NULL)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
874 className = dot+1;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
875 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
876
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
877 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
878 if (moduleName == NULL) {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
879 PyErr_Clear();
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
880 if (PyFile_WriteString("<unknown>", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
881 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
882 }
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
883 else {
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86980
diff changeset
884 if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) {
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
885 if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
886 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
887 if (PyFile_WriteString(".", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
888 goto done;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
889 }
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
890 }
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
891 if (className == NULL) {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
892 if (PyFile_WriteString("<unknown>", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
893 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
894 }
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
895 else {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
896 if (PyFile_WriteString(className, f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
897 goto done;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
898 }
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
899
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
900 if (v && v != Py_None) {
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
901 if (PyFile_WriteString(": ", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
902 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
903 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
904 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
905 }
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
906 if (PyFile_WriteString("\n", f) < 0)
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
907 goto done;
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
908
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
909 done:
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
910 Py_XDECREF(moduleName);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
911 Py_XDECREF(t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
912 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
913 Py_XDECREF(tb);
85415
e63f19d0a651 Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
Victor Stinner <vstinner@wyplay.com>
parents: 84794
diff changeset
914 PyErr_Clear(); /* Just in case */
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
915 }
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
916
30781
74747f62f286 Made function declaration a proper C prototype
Armin Rigo <arigo@tunes.org>
parents: 30683
diff changeset
917 extern PyObject *PyModule_GetWarningsModule(void);
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
918
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
919
64859
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
920 void
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
921 PyErr_SyntaxLocation(const char *filename, int lineno)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
922 {
64859
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
923 PyErr_SyntaxLocationEx(filename, lineno, -1);
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
924 }
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
925
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
926
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
927 /* 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
928 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
929 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
930
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
931 void
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
932 PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
933 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
934 PyObject *exc, *v, *tb, *tmp;
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
935 _Py_IDENTIFIER(filename);
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
936 _Py_IDENTIFIER(lineno);
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
937 _Py_IDENTIFIER(msg);
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
938 _Py_IDENTIFIER(offset);
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
939 _Py_IDENTIFIER(print_file_and_line);
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
940 _Py_IDENTIFIER(text);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
941
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
942 /* add attributes for the line number and filename for the error */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
943 PyErr_Fetch(&exc, &v, &tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
944 PyErr_NormalizeException(&exc, &v, &tb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
945 /* XXX check that it is, indeed, a syntax error. It might not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
946 * be, though. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
947 tmp = PyLong_FromLong(lineno);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
948 if (tmp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
949 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
950 else {
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
951 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
952 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
953 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
954 }
64859
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
955 if (col_offset >= 0) {
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
956 tmp = PyLong_FromLong(col_offset);
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
957 if (tmp == NULL)
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
958 PyErr_Clear();
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
959 else {
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
960 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
64859
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
961 PyErr_Clear();
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
962 Py_DECREF(tmp);
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
963 }
00e4ce31d404 add PyErr_SyntaxLocationEx, to support adding a column offset
Benjamin Peterson <benjamin@python.org>
parents: 62155
diff changeset
964 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
965 if (filename != NULL) {
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
966 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
967 PyErr_Clear();
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
968
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
969 tmp = PyErr_ProgramTextObject(filename, lineno);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
970 if (tmp) {
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
971 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
972 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
973 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
974 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
975 }
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
976 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
977 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
978 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
979 if (exc != PyExc_SyntaxError) {
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
980 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
981 tmp = PyObject_Str(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
982 if (tmp) {
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
983 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
984 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
985 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
986 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
987 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
988 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
989 }
72926
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
990 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
991 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
db4aa878cea2 Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents: 72925
diff changeset
992 Py_None))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
993 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
994 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
995 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
996 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
997 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
998
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
999 void
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1000 PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1001 {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1002 PyObject *fileobj;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1003 if (filename != NULL) {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1004 fileobj = PyUnicode_DecodeFSDefault(filename);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1005 if (fileobj == NULL)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1006 PyErr_Clear();
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1007 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1008 else
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1009 fileobj = NULL;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1010 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1011 Py_XDECREF(fileobj);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1012 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1013
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
1014 /* Attempt to load the line of text that the exception refers to. If it
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
1015 fails, it will return NULL but will not set an exception.
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
1016
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
1017 XXX The functionality of this function is quite similar to the
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
1018 functionality in tb_displayline() in traceback.c. */
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
1019
86257
eeec58c57964 Don't export internal symbols ("make smelly")
Antoine Pitrou <solipsis@pitrou.net>
parents: 85502
diff changeset
1020 static PyObject *
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1021 err_programtext(FILE *fp, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
1022 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1023 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1024 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
1025
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1026 if (fp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1027 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1028 for (i = 0; i < lineno; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1029 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1030 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1031 *pLastChar = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1032 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1033 fp, NULL) == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1034 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1035 /* fgets read *something*; if it didn't get as
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1036 far as pLastChar, it must have found a newline
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1037 or hit the end of the file; if pLastChar is \n,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1038 it obviously found a newline; else we haven't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1039 yet seen a newline, so must continue */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1040 } while (*pLastChar != '\0' && *pLastChar != '\n');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1041 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1042 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1043 if (i == lineno) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1044 char *p = linebuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1045 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1046 while (*p == ' ' || *p == '\t' || *p == '\014')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1047 p++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1048 res = PyUnicode_FromString(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1049 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1050 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1051 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1052 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54129
diff changeset
1053 return NULL;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
1054 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
1055
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1056 PyObject *
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1057 PyErr_ProgramText(const char *filename, int lineno)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1058 {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1059 FILE *fp;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1060 if (filename == NULL || *filename == '\0' || lineno <= 0)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1061 return NULL;
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85417
diff changeset
1062 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1063 return err_programtext(fp, lineno);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1064 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1065
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1066 PyObject *
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1067 PyErr_ProgramTextObject(PyObject *filename, int lineno)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1068 {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1069 FILE *fp;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1070 if (filename == NULL || lineno <= 0)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1071 return NULL;
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85417
diff changeset
1072 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1073 return err_programtext(fp, lineno);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1074 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 85415
diff changeset
1075
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
1076 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
1077 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
1078 #endif