annotate Python/errors.c @ 86980:77bebcf5c4cf

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