annotate Python/errors.c @ 40582:67287ca4e1e8

Merged revisions 53005-53303 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r53012 | walter.doerwald | 2006-12-12 22:55:31 +0100 (Tue, 12 Dec 2006) | 2 lines Fix typo. ........ r53023 | brett.cannon | 2006-12-13 23:31:37 +0100 (Wed, 13 Dec 2006) | 2 lines Remove an unneeded import of 'warnings'. ........ r53025 | brett.cannon | 2006-12-14 00:02:38 +0100 (Thu, 14 Dec 2006) | 2 lines Remove unneeded imports of 'warnings'. ........ r53026 | brett.cannon | 2006-12-14 00:09:53 +0100 (Thu, 14 Dec 2006) | 4 lines Add test.test_support.guard_warnings_filter . This function returns a context manager that protects warnings.filter from being modified once the context is exited. ........ r53029 | george.yoshida | 2006-12-14 03:22:44 +0100 (Thu, 14 Dec 2006) | 2 lines Note that guard_warnings_filter was added in 2.6 ........ r53031 | vinay.sajip | 2006-12-14 09:53:55 +0100 (Thu, 14 Dec 2006) | 1 line Added news on recent changes to logging ........ r53032 | andrew.kuchling | 2006-12-14 19:57:53 +0100 (Thu, 14 Dec 2006) | 1 line [Patch #1599256 from David Watson] check that os.fsync is available before using it ........ r53042 | kurt.kaiser | 2006-12-15 06:13:11 +0100 (Fri, 15 Dec 2006) | 6 lines 1. Avoid hang when encountering a duplicate in a completion list. Bug 1571112. 2. Duplicate some old entries from Python's NEWS to IDLE's NEWS.txt M AutoCompleteWindow.py M NEWS.txt ........ r53048 | andrew.kuchling | 2006-12-18 18:12:31 +0100 (Mon, 18 Dec 2006) | 1 line [Bug #1618083] Add missing word; make a few grammar fixes ........ r53050 | andrew.kuchling | 2006-12-18 18:16:05 +0100 (Mon, 18 Dec 2006) | 1 line Bump version ........ r53051 | andrew.kuchling | 2006-12-18 18:22:07 +0100 (Mon, 18 Dec 2006) | 1 line [Bug #1616726] Fix description of generator.close(); if you raise some random exception, the exception is raised and doesn't trigger a RuntimeError ........ r53052 | andrew.kuchling | 2006-12-18 18:38:14 +0100 (Mon, 18 Dec 2006) | 1 line Describe new methods in Queue module ........ r53053 | andrew.kuchling | 2006-12-18 20:22:24 +0100 (Mon, 18 Dec 2006) | 1 line [Patch #1615868 by Lars Gustaebel] Use Py_off_t to fix BZ2File.seek() for offsets > 2Gb ........ r53057 | andrew.kuchling | 2006-12-18 22:29:07 +0100 (Mon, 18 Dec 2006) | 1 line Fix markup ........ r53063 | thomas.wouters | 2006-12-19 09:17:50 +0100 (Tue, 19 Dec 2006) | 5 lines Make sre's SubPattern objects accept slice objects like it already accepts simple slices. ........ r53065 | andrew.kuchling | 2006-12-19 15:13:05 +0100 (Tue, 19 Dec 2006) | 6 lines [Patch #1618455 by Ben Maurer] Improve speed of HMAC by using str.translate() instead of a more general XOR that has to construct a list. Slightly modified from Maurer's patch: the _strxor() function is no longer necessary at all. ........ r53066 | andrew.kuchling | 2006-12-19 15:28:23 +0100 (Tue, 19 Dec 2006) | 9 lines [Bug #1613651] Document socket.recv_into, socket.recvfrom_into Also, the text for recvfrom told you to read recv() for an explanation of the 'flags' argument, but recv() just pointed you at the man page. Copied the man-page text to recvfrom(), recvfrom_into, recv_into to avoid the pointless redirection. I don't have LaTeX on this machine; hope my markup is OK. ........ r53067 | andrew.kuchling | 2006-12-19 15:29:04 +0100 (Tue, 19 Dec 2006) | 1 line Comment typo ........ r53068 | andrew.kuchling | 2006-12-19 16:11:41 +0100 (Tue, 19 Dec 2006) | 1 line [Patch #1617413 from Dug Song] Fix HTTP Basic authentication via HTTPS ........ r53071 | andrew.kuchling | 2006-12-19 16:18:12 +0100 (Tue, 19 Dec 2006) | 1 line [Patch #1600491 from Jim Jewett] Describe how to build help files on Windows ........ r53073 | andrew.kuchling | 2006-12-19 16:43:10 +0100 (Tue, 19 Dec 2006) | 6 lines [Patch #1587139 by kxroberto] Protect lock acquisition/release with try...finally to ensure the lock is always released. This could use the 'with' statement, but the patch uses 'finally'. 2.5 backport candidate. ........ r53074 | vinay.sajip | 2006-12-19 19:29:11 +0100 (Tue, 19 Dec 2006) | 1 line Updated documentation for findCaller() to indicate that a 3-tuple is now returned, rather than a 2-tuple. ........ r53090 | georg.brandl | 2006-12-19 23:06:46 +0100 (Tue, 19 Dec 2006) | 3 lines Patch #1484695: The tarfile module now raises a HeaderError exception if a buffer given to frombuf() is invalid. ........ r53099 | raymond.hettinger | 2006-12-20 07:42:06 +0100 (Wed, 20 Dec 2006) | 5 lines Bug #1590891: random.randrange don't return correct value for big number Needs to be backported. ........ r53106 | georg.brandl | 2006-12-20 12:55:16 +0100 (Wed, 20 Dec 2006) | 3 lines Testcase for patch #1484695. ........ r53110 | andrew.kuchling | 2006-12-20 20:48:20 +0100 (Wed, 20 Dec 2006) | 17 lines [Apply length-checking.diff from bug #1599254] Add length checking to single-file mailbox formats: before doing a flush() on a mailbox, seek to the end and verify its length is unchanged, raising ExternalClashError if the file's length has changed. This fix avoids potential data loss if some other process appends to the mailbox file after the table of contents has been generated; instead of overwriting the modified file, you'll get the exception. I also noticed that the self._lookup() call in self.flush() wasn't necessary (everything that sets self._pending to True also calls self.lookup()), and replaced it by an assertion. 2.5 backport candidate. ........ r53112 | andrew.kuchling | 2006-12-20 20:57:10 +0100 (Wed, 20 Dec 2006) | 1 line [Bug #1619674] Make sum() use the term iterable, not sequence ........ r53113 | andrew.kuchling | 2006-12-20 20:58:11 +0100 (Wed, 20 Dec 2006) | 1 line Two grammar fixes ........ r53115 | andrew.kuchling | 2006-12-20 21:11:12 +0100 (Wed, 20 Dec 2006) | 5 lines Some other built-in functions are described with 'sequence' arguments that should really be 'iterable'; this commit changes them. Did I miss any? Did I introduce any errors? ........ r53117 | andrew.kuchling | 2006-12-20 21:20:42 +0100 (Wed, 20 Dec 2006) | 1 line [Bug #1619680] in_dll() arguments are documented in the wrong order ........ r53120 | neal.norwitz | 2006-12-21 05:38:00 +0100 (Thu, 21 Dec 2006) | 1 line Lars asked for permission on on python-dev for work on tarfile.py ........ r53125 | andrew.kuchling | 2006-12-21 14:40:29 +0100 (Thu, 21 Dec 2006) | 1 line Mention the os.SEEK_* constants ........ r53129 | walter.doerwald | 2006-12-21 19:06:30 +0100 (Thu, 21 Dec 2006) | 2 lines Fix typo. ........ r53131 | thomas.heller | 2006-12-21 19:30:56 +0100 (Thu, 21 Dec 2006) | 3 lines Fix wrong markup of an argument in a method signature. Will backport. ........ r53137 | andrew.kuchling | 2006-12-22 01:50:56 +0100 (Fri, 22 Dec 2006) | 1 line Typo fix ........ r53139 | andrew.kuchling | 2006-12-22 14:25:02 +0100 (Fri, 22 Dec 2006) | 1 line [Bug #737202; fix from Titus Brown] Make CGIHTTPServer work for scripts in sub-directories ........ r53141 | andrew.kuchling | 2006-12-22 16:04:45 +0100 (Fri, 22 Dec 2006) | 6 lines [Bug #802128] Make the mode argument of dumbdbm actually work the way it's described, and add a test for it. 2.5 bugfix candidate, maybe; arguably this patch changes the API of dumbdbm and shouldn't be added in a point-release. ........ r53142 | andrew.kuchling | 2006-12-22 16:16:58 +0100 (Fri, 22 Dec 2006) | 6 lines [Bug #802128 continued] Modify mode depending on the process umask. Is there really no other way to read the umask than to set it? Hope this works on Windows... ........ r53145 | andrew.kuchling | 2006-12-22 17:43:26 +0100 (Fri, 22 Dec 2006) | 1 line [Bug #776202] Apply Walter Doerwald's patch to use text mode for encoded files ........ r53146 | andrew.kuchling | 2006-12-22 19:41:42 +0100 (Fri, 22 Dec 2006) | 9 lines [Patch #783050 from Patrick Lynch] The emulation of forkpty() is incorrect; the master should close the slave fd. Added a test to test_pty.py that reads from the master_fd after doing a pty.fork(); without the fix it hangs forever instead of raising an exception. (<crossing fingers for the buildbots>) 2.5 backport candidate. ........ r53147 | andrew.kuchling | 2006-12-22 20:06:16 +0100 (Fri, 22 Dec 2006) | 1 line [Patch #827559 from Chris Gonnerman] Make SimpleHTTPServer redirect when a directory URL is missing the trailing slash; this lets relative links work. ........ r53149 | andrew.kuchling | 2006-12-22 20:21:27 +0100 (Fri, 22 Dec 2006) | 1 line Darn; this test works when you run test_pty.py directly, but fails when regrtest runs it (the os.read() raises os.error). I can't figure out the cause, so am commenting out the test. ........ r53150 | andrew.kuchling | 2006-12-22 22:48:19 +0100 (Fri, 22 Dec 2006) | 1 line Frak; this test also fails ........ r53153 | lars.gustaebel | 2006-12-23 17:40:13 +0100 (Sat, 23 Dec 2006) | 5 lines Patch #1230446: tarfile.py: fix ExFileObject so that read() and tell() work correctly together with readline(). Will backport to 2.5. ........ r53155 | lars.gustaebel | 2006-12-23 18:57:23 +0100 (Sat, 23 Dec 2006) | 5 lines Patch #1262036: Prevent TarFiles from being added to themselves under certain conditions. Will backport to 2.5. ........ r53159 | andrew.kuchling | 2006-12-27 04:25:31 +0100 (Wed, 27 Dec 2006) | 4 lines [Part of patch #1182394] Move the HMAC blocksize to be a class-level constant; this allows changing it in a subclass. To accommodate this, copy() now uses __class__. Also add some text to a comment. ........ r53160 | andrew.kuchling | 2006-12-27 04:31:24 +0100 (Wed, 27 Dec 2006) | 1 line [Rest of patch #1182394] Add ._current() method so that we can use the written-in-C .hexdigest() method ........ r53161 | lars.gustaebel | 2006-12-27 11:30:46 +0100 (Wed, 27 Dec 2006) | 4 lines Patch #1504073: Fix tarfile.open() for mode "r" with a fileobj argument. Will backport to 2.5. ........ r53165 | neal.norwitz | 2006-12-28 05:39:20 +0100 (Thu, 28 Dec 2006) | 1 line Remove a stray (old) macro name left around (I guess) ........ r53188 | neal.norwitz | 2006-12-29 04:01:53 +0100 (Fri, 29 Dec 2006) | 1 line SF bug #1623890, fix argument name in docstring ........ r53200 | raymond.hettinger | 2006-12-30 05:01:17 +0100 (Sat, 30 Dec 2006) | 1 line For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing. ........ r53232 | brett.cannon | 2007-01-04 01:23:49 +0100 (Thu, 04 Jan 2007) | 3 lines Add EnvironmentVarGuard to test.test_support. Provides a context manager to temporarily set or unset environment variables. ........ r53235 | neal.norwitz | 2007-01-04 07:25:31 +0100 (Thu, 04 Jan 2007) | 1 line SF #1627373, fix typo in CarbonEvt. ........ r53244 | raymond.hettinger | 2007-01-04 18:53:34 +0100 (Thu, 04 Jan 2007) | 1 line Fix stability of heapq's nlargest() and nsmallest(). ........ r53249 | martin.v.loewis | 2007-01-04 22:06:12 +0100 (Thu, 04 Jan 2007) | 3 lines Bug #1566280: Explicitly invoke threading._shutdown from Py_Main, to avoid relying on atexit. Will backport to 2.5. ........ r53252 | gregory.p.smith | 2007-01-05 02:59:42 +0100 (Fri, 05 Jan 2007) | 3 lines Support linking of the bsddb module against BerkeleyDB 4.5.x (will backport to 2.5) ........ r53253 | gregory.p.smith | 2007-01-05 03:06:17 +0100 (Fri, 05 Jan 2007) | 2 lines bump module version to match supported berkeleydb version ........ r53255 | neal.norwitz | 2007-01-05 06:25:22 +0100 (Fri, 05 Jan 2007) | 6 lines Prevent crash on shutdown which can occur if we are finalizing and the module dict has been cleared already and some object raises a warning (like in a __del__). Will backport. ........ r53258 | gregory.p.smith | 2007-01-05 08:21:35 +0100 (Fri, 05 Jan 2007) | 2 lines typo fix ........ r53260 | neal.norwitz | 2007-01-05 09:06:43 +0100 (Fri, 05 Jan 2007) | 1 line Add Collin Winter for access to update PEP 3107 ........ r53262 | andrew.kuchling | 2007-01-05 15:22:17 +0100 (Fri, 05 Jan 2007) | 1 line [Bug #1622533] Make docstrings raw strings because they contain control characters (\0, \1) ........ r53264 | andrew.kuchling | 2007-01-05 16:51:24 +0100 (Fri, 05 Jan 2007) | 1 line [Patch #1520904] Fix bsddb tests to write to the temp directory instead of the Lib/bsddb/test directory ........ r53279 | brett.cannon | 2007-01-05 22:45:09 +0100 (Fri, 05 Jan 2007) | 3 lines Silence a warning from gcc 4.0.1 by specifying a function's parameter list is 'void' instead of just a set of empty parentheses. ........ r53285 | raymond.hettinger | 2007-01-06 02:14:41 +0100 (Sat, 06 Jan 2007) | 2 lines SF# 1409443: Expand comment to cover the interaction between f->f_lasti and the PREDICT macros. ........ r53286 | anthony.baxter | 2007-01-06 05:45:54 +0100 (Sat, 06 Jan 2007) | 1 line update to (c) years to include 2007 ........ r53291 | neal.norwitz | 2007-01-06 22:24:35 +0100 (Sat, 06 Jan 2007) | 1 line Add Josiah to SF for maintaining asyncore/asynchat ........ r53293 | peter.astrand | 2007-01-07 09:53:46 +0100 (Sun, 07 Jan 2007) | 1 line Re-implemented fix for #1531862 once again, in a way that works with Python 2.2. Fixes bug #1603424. ........ r53295 | peter.astrand | 2007-01-07 15:34:16 +0100 (Sun, 07 Jan 2007) | 1 line Avoid O(N**2) bottleneck in _communicate_(). Fixes #1598181. ........ r53300 | raymond.hettinger | 2007-01-08 19:09:20 +0100 (Mon, 08 Jan 2007) | 1 line Fix zero-length corner case for iterating over a mutating deque. ........ r53301 | vinay.sajip | 2007-01-08 19:50:32 +0100 (Mon, 08 Jan 2007) | 4 lines Bare except clause removed from SMTPHandler.emit(). Now, only ImportError is trapped. Bare except clause removed from SocketHandler.createSocket(). Now, only socket.error is trapped. (SF #411881) ........ r53302 | vinay.sajip | 2007-01-08 19:51:46 +0100 (Mon, 08 Jan 2007) | 2 lines Bare except clause removed from LogRecord.__init__. Now, only ValueError, TypeError and AttributeError are trapped. (SF #411881) ........ r53303 | vinay.sajip | 2007-01-08 19:52:36 +0100 (Mon, 08 Jan 2007) | 1 line Added entries about removal of some bare except clauses from logging. ........
author Thomas Wouters <thomas@python.org>
date Tue, 09 Jan 2007 23:18:33 +0000
parents cc992d75d5b3
children e759fd8d95ae
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
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
13 #include "windows.h"
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
14 #include "winbase.h"
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
15 #endif
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
16
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
17 #include <ctype.h>
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
18
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
19 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
20 extern "C" {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
21 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
22
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
23
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
25 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
26 {
9671
1d40bc25703a Use PyThreadState_GET() macro.
Guido van Rossum <guido@python.org>
parents: 9365
diff changeset
27 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
28 PyObject *oldtype, *oldvalue, *oldtraceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
29
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
30 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
31 /* XXX Should never happen -- fatal error instead? */
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36701
diff changeset
32 /* Well, it could be None. */
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
33 Py_DECREF(traceback);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
34 traceback = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
35 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
36
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
37 /* Save these in locals to safeguard against recursive
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
38 invocation through Py_XDECREF */
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
39 oldtype = tstate->curexc_type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
40 oldvalue = tstate->curexc_value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
41 oldtraceback = tstate->curexc_traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
42
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
43 tstate->curexc_type = type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
44 tstate->curexc_value = value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
45 tstate->curexc_traceback = traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
46
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
47 Py_XDECREF(oldtype);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
48 Py_XDECREF(oldvalue);
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
49 Py_XDECREF(oldtraceback);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
50 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
51
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
52 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
53 PyErr_SetObject(PyObject *exception, PyObject *value)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 {
37871
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
55 if (exception != NULL &&
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
56 !PyExceptionClass_Check(exception)) {
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
57 PyObject *excstr = PyObject_Repr(exception);
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
58 PyErr_Format(PyExc_SystemError,
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
59 "exception %s not a BaseException subclass",
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
60 PyString_AS_STRING(excstr));
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
61 Py_DECREF(excstr);
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
62 return;
a47117fa3ca8 Fix (and add test for) missing check for BaseException subclasses in the C
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
63 }
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
64 Py_XINCREF(exception);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
65 Py_XINCREF(value);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
66 PyErr_Restore(exception, value, (PyObject *)NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
70 PyErr_SetNone(PyObject *exception)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
72 PyErr_SetObject(exception, (PyObject *)NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
76 PyErr_SetString(PyObject *exception, const char *string)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
78 PyObject *value = PyString_FromString(string);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
79 PyErr_SetObject(exception, value);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
80 Py_XDECREF(value);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
83
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
84 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
85 PyErr_Occurred(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 {
18007
6a2e2548e6cf PyErr_Occurred(): Use PyThreadState_GET(), which saves a tiny function call
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
87 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
88
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
89 return tstate->curexc_type;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
92
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
93 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
94 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
95 {
12559
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
96 if (err == NULL || exc == NULL) {
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
97 /* maybe caused by "import exceptions" that failed early on */
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
98 return 0;
3b8d9e63e4e1 PyErr_GivenExceptionMatches(): Check for err==NULL and exc==NULL and
Barry Warsaw <barry@python.org>
parents: 11899
diff changeset
99 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
100 if (PyTuple_Check(exc)) {
36521
30aef3ce2b26 Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents: 34440
diff changeset
101 Py_ssize_t i, n;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
102 n = PyTuple_Size(exc);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
103 for (i = 0; i < n; i++) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
104 /* Test recursively */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
105 if (PyErr_GivenExceptionMatches(
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
106 err, PyTuple_GET_ITEM(exc, i)))
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
107 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
108 return 1;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
109 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
110 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
111 return 0;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
112 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
113 /* err might be an instance, so check its class. */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
114 if (PyExceptionInstance_Check(err))
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
115 err = PyExceptionInstance_Class(err);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
116
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
117 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
118 /* problems here!? not sure PyObject_IsSubclass expects to
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
119 be called with an exception pending... */
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
120 return PyObject_IsSubclass(err, exc);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
121 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
122
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
123 return err == exc;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
124 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
125
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
126
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
127 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
128 PyErr_ExceptionMatches(PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
129 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
130 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
131 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
132
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
133
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
134 /* 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
135 eval_code2(), do_raise(), and PyErr_Print()
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
136 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
137 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
138 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
139 {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
140 PyObject *type = *exc;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
141 PyObject *value = *val;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
142 PyObject *inclass = NULL;
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
143 PyObject *initial_tb = NULL;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
144
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
145 if (type == NULL) {
28571
5fbdcaef9dda PyErr_NormalizeException(): in the type==NULL test, we should simply
Guido van Rossum <guido@python.org>
parents: 27958
diff changeset
146 /* There was no exception, so nothing to do. */
5fbdcaef9dda PyErr_NormalizeException(): in the type==NULL test, we should simply
Guido van Rossum <guido@python.org>
parents: 27958
diff changeset
147 return;
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
148 }
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
149
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
150 /* If PyErr_SetNone() was used, the value will have been actually
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
151 set to NULL.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
152 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
153 if (!value) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
154 value = Py_None;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
155 Py_INCREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
156 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
157
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
158 if (PyExceptionInstance_Check(value))
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
159 inclass = PyExceptionInstance_Class(value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
160
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
161 /* Normalize the exception so that if the type is a class, the
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
162 value will be an instance.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
163 */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
164 if (PyExceptionClass_Check(type)) {
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
165 /* if the value was not an instance, or is not an instance
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
166 whose class is (or is derived from) type, then use the
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
167 value as an argument to instantiation of the type
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
168 class.
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
169 */
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
170 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
171 PyObject *args, *res;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
172
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
173 if (value == Py_None)
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 29877
diff changeset
174 args = PyTuple_New(0);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
175 else if (PyTuple_Check(value)) {
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
176 Py_INCREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
177 args = value;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
178 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
179 else
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 29877
diff changeset
180 args = PyTuple_Pack(1, value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
181
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
182 if (args == NULL)
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
183 goto finally;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
184 res = PyEval_CallObject(type, args);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
185 Py_DECREF(args);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
186 if (res == NULL)
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
187 goto finally;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
188 Py_DECREF(value);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
189 value = res;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
190 }
6358
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
191 /* if the class of the instance doesn't exactly match the
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
192 class of the type, believe the instance
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
193 */
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
194 else if (inclass != type) {
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
195 Py_DECREF(type);
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
196 type = inclass;
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
197 Py_INCREF(type);
9e82dd76288e PyErr_NormalizeException(): If the exception's type is a class and the
Barry Warsaw <barry@python.org>
parents: 6319
diff changeset
198 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
199 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
200 *exc = type;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
201 *val = value;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
202 return;
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
203 finally:
6789
bb440a2975ab Fix subtle bug in cleanup code in PyErr_NormalizeException(), detected
Guido van Rossum <guido@python.org>
parents: 6377
diff changeset
204 Py_DECREF(type);
bb440a2975ab Fix subtle bug in cleanup code in PyErr_NormalizeException(), detected
Guido van Rossum <guido@python.org>
parents: 6377
diff changeset
205 Py_DECREF(value);
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
206 /* If the new exception doesn't set a traceback and the old
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
207 exception had a traceback, use the old traceback for the
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
208 new exception. It's better than nothing.
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
209 */
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
210 initial_tb = *tb;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
211 PyErr_Fetch(exc, val, tb);
20116
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
212 if (initial_tb != NULL) {
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
213 if (*tb == NULL)
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
214 *tb = initial_tb;
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
215 else
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
216 Py_DECREF(initial_tb);
55874d8e0dfb PyErr_NormalizeException()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19477
diff changeset
217 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
218 /* normalize recursively */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
219 PyErr_NormalizeException(exc, val, tb);
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
220 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
221
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
222
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
224 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 {
31797
846b3ee7e106 Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents: 30979
diff changeset
226 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
227
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
228 *p_type = tstate->curexc_type;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
229 *p_value = tstate->curexc_value;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
230 *p_traceback = tstate->curexc_traceback;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
231
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
232 tstate->curexc_type = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
233 tstate->curexc_value = NULL;
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
234 tstate->curexc_traceback = NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
238 PyErr_Clear(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 {
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
240 PyErr_Restore(NULL, NULL, NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 }
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
242
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
243 /* 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
244
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
245 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
246 PyErr_BadArgument(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
247 {
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
248 PyErr_SetString(PyExc_TypeError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 15148
diff changeset
249 "bad argument type for built-in operation");
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
250 return 0;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
251 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
252
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
253 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
254 PyErr_NoMemory(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
255 {
14066
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
256 if (PyErr_ExceptionMatches(PyExc_MemoryError))
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
257 /* already current */
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
258 return NULL;
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
259
6190
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
260 /* raise the pre-allocated instance if it still exists */
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
261 if (PyExc_MemoryErrorInst)
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
262 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
263 else
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
264 /* this will probably fail since there's no memory and hee,
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
265 hee, we have to instantiate this class
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
266 */
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
267 PyErr_SetNone(PyExc_MemoryError);
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
268
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
269 return NULL;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
270 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
271
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
272 PyObject *
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
273 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
274 {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
275 PyObject *v;
9365
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
276 char *s;
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
277 int i = errno;
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
278 #ifdef PLAN9
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
279 char errbuf[ERRMAX];
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
280 #endif
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
281 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
282 char *s_buf = NULL;
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
283 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
284 #endif
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
285 #ifdef EINTR
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
286 if (i == EINTR && PyErr_CheckSignals())
390
172aa2c3e734 Check for EINTR and turn it into KeyboardInterrupt
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
287 return NULL;
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
288 #endif
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
289 #ifdef PLAN9
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
290 rerrstr(errbuf, sizeof errbuf);
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
291 s = errbuf;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
292 #else
9365
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
293 if (i == 0)
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
294 s = "Error"; /* Sometimes errno didn't get set */
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
295 else
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
296 #ifndef MS_WINDOWS
9365
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
297 s = strerror(i);
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
298 #else
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
299 {
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
300 /* Note that the Win32 errors do not lineup with the
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
301 errno error. So if the error is in the MSVC error
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
302 table, we use it, otherwise we assume it really _is_
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
303 a Win32 error code
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
304 */
11825
4080c7a0f1ed Mark pointed out a buglet in his patch: i < _sys_nerr isn't strong
Guido van Rossum <guido@python.org>
parents: 11801
diff changeset
305 if (i > 0 && i < _sys_nerr) {
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
306 s = _sys_errlist[i];
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
307 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
308 else {
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
309 int len = FormatMessage(
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
310 FORMAT_MESSAGE_ALLOCATE_BUFFER |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
311 FORMAT_MESSAGE_FROM_SYSTEM |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
312 FORMAT_MESSAGE_IGNORE_INSERTS,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
313 NULL, /* no message source */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
314 i,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
315 MAKELANGID(LANG_NEUTRAL,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
316 SUBLANG_DEFAULT),
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
317 /* Default language */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
318 (LPTSTR) &s_buf,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
319 0, /* size not used */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
320 NULL); /* no args */
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
321 if (len==0) {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
322 /* Only ever seen this in out-of-mem
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
323 situations */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
324 sprintf(s_small_buf, "Windows Error 0x%X", i);
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
325 s = s_small_buf;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
326 s_buf = NULL;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
327 } else {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
328 s = s_buf;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
329 /* remove trailing cr/lf and dots */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
330 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
331 s[--len] = '\0';
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
332 }
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
333 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
334 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
335 #endif /* Unix/Windows */
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
336 #endif /* PLAN 9*/
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
337 if (filenameObject != NULL)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
338 v = Py_BuildValue("(isO)", i, s, filenameObject);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
339 else
9365
c80321c328b5 When errno is zero, avoid calling strerror() and use "Error" for the
Guido van Rossum <guido@python.org>
parents: 8706
diff changeset
340 v = Py_BuildValue("(is)", i, s);
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
341 if (v != NULL) {
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
342 PyErr_SetObject(exc, v);
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
343 Py_DECREF(v);
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
344 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
345 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
346 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
347 #endif
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
348 return NULL;
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
349 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
350
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
351
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
352 PyObject *
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
353 PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
354 {
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
355 PyObject *name = filename ? PyString_FromString(filename) : NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
356 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
357 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
358 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
359 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
360
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
361 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
362 PyObject *
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
363 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
364 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
365 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
366 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
367 NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
368 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
369 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
370 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
371 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
372 #endif /* Py_WIN_WIDE_FILENAMES */
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
373
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
374 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
375 PyErr_SetFromErrno(PyObject *exc)
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
376 {
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
377 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
378 }
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
379
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
380 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
381 /* 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
382 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
383 PyObject *exc,
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
384 int ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
385 PyObject *filenameObject)
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
386 {
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
387 int len;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
388 char *s;
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
389 char *s_buf = NULL; /* Free via LocalFree */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
390 char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
391 PyObject *v;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
392 DWORD err = (DWORD)ierr;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
393 if (err==0) err = GetLastError();
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
394 len = FormatMessage(
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
395 /* Error API error */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
396 FORMAT_MESSAGE_ALLOCATE_BUFFER |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
397 FORMAT_MESSAGE_FROM_SYSTEM |
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
398 FORMAT_MESSAGE_IGNORE_INSERTS,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
399 NULL, /* no message source */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
400 err,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
401 MAKELANGID(LANG_NEUTRAL,
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
402 SUBLANG_DEFAULT), /* Default language */
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
403 (LPTSTR) &s_buf,
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
404 0, /* size not used */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
405 NULL); /* no args */
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
406 if (len==0) {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
407 /* Only seen this in out of mem situations */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
408 sprintf(s_small_buf, "Windows Error 0x%X", err);
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
409 s = s_small_buf;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
410 s_buf = NULL;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
411 } else {
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
412 s = s_buf;
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
413 /* remove trailing cr/lf and dots */
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
414 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
415 s[--len] = '\0';
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
416 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
417 if (filenameObject != NULL)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
418 v = Py_BuildValue("(isO)", err, s, filenameObject);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
419 else
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
420 v = Py_BuildValue("(is)", err, s);
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
421 if (v != NULL) {
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
422 PyErr_SetObject(exc, v);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
423 Py_DECREF(v);
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
424 }
25544
2fa559fb6ec5 Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Mark Hammond <mhammond@skippinet.com.au>
parents: 25543
diff changeset
425 LocalFree(s_buf);
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
426 return NULL;
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
427 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
428
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
429 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
430 PyObject *exc,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
431 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
432 const char *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
433 {
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
434 PyObject *name = filename ? PyString_FromString(filename) : NULL;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
435 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
436 ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
437 name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
438 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
439 return ret;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
440 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
441
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
442 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
443 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
444 PyObject *exc,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
445 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
446 const Py_UNICODE *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
447 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
448 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
449 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
450 NULL;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
451 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
452 ierr,
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
453 name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
454 Py_XDECREF(name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
455 return ret;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
456 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
457 #endif /* Py_WIN_WIDE_FILENAMES */
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
458
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
459 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
460 {
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
461 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
462 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
463
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
464 PyObject *PyErr_SetFromWindowsErr(int ierr)
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
465 {
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
466 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
467 ierr, NULL);
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
468 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
469 PyObject *PyErr_SetFromWindowsErrWithFilename(
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
470 int ierr,
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
471 const char *filename)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
472 {
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
473 PyObject *name = filename ? PyString_FromString(filename) : NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
474 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
475 PyExc_WindowsError,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
476 ierr, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
477 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
478 return result;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
479 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
480
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
481 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
482 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
483 int ierr,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
484 const Py_UNICODE *filename)
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
485 {
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
486 PyObject *name = filename ?
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
487 PyUnicode_FromUnicode(filename, wcslen(filename)) :
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
488 NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
489 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
490 PyExc_WindowsError,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
491 ierr, name);
25543
dfeec3b34fae Fix errors to pep277 checkin identified by Neal Norwitz.
Mark Hammond <mhammond@skippinet.com.au>
parents: 25535
diff changeset
492 Py_XDECREF(name);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
493 return result;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
494 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
495 #endif /* Py_WIN_WIDE_FILENAMES */
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
496 #endif /* MS_WINDOWS */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
497
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
498 void
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
499 _PyErr_BadInternalCall(char *filename, int lineno)
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
500 {
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
501 PyErr_Format(PyExc_SystemError,
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
502 "%s:%d: bad argument to internal function",
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
503 filename, lineno);
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
504 }
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
505
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
506 /* 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
507 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
508 #undef PyErr_BadInternalCall
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
509 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
510 PyErr_BadInternalCall(void)
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
511 {
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
512 PyErr_Format(PyExc_SystemError,
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
513 "bad argument to internal function");
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
514 }
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
515 #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
516
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
517
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
518
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
519 PyObject *
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
520 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
521 {
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
522 va_list vargs;
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
523 PyObject* string;
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
524
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
525 #ifdef HAVE_STDARG_PROTOTYPES
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
526 va_start(vargs, format);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
527 #else
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
528 va_start(vargs);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
529 #endif
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
530
19477
e1c91ac55cca PyErr_Format(): Factor out most of this code into
Barry Warsaw <barry@python.org>
parents: 18007
diff changeset
531 string = PyString_FromFormatV(format, vargs);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
532 PyErr_SetObject(exception, string);
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
533 Py_XDECREF(string);
20221
abaf9ea2e560 SF bug [#467265] Compile errors on SuSe Linux on IBM/s390.
Tim Peters <tim.peters@gmail.com>
parents: 20116
diff changeset
534 va_end(vargs);
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
535 return NULL;
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
536 }
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
537
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
538
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
539
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
540 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
541 PyErr_NewException(char *name, PyObject *base, PyObject *dict)
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
542 {
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
543 char *dot;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
544 PyObject *modulename = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
545 PyObject *classname = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
546 PyObject *mydict = NULL;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
547 PyObject *bases = NULL;
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
548 PyObject *result = NULL;
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
549 dot = strrchr(name, '.');
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
550 if (dot == NULL) {
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
551 PyErr_SetString(PyExc_SystemError,
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
552 "PyErr_NewException: name must be module.class");
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
553 return NULL;
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
554 }
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
555 if (base == NULL)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
556 base = PyExc_Exception;
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
557 if (dict == NULL) {
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
558 dict = mydict = PyDict_New();
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
559 if (dict == NULL)
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
560 goto failure;
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
561 }
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
562 if (PyDict_GetItemString(dict, "__module__") == NULL) {
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
563 modulename = PyString_FromStringAndSize(name,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
564 (Py_ssize_t)(dot-name));
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
565 if (modulename == NULL)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
566 goto failure;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
567 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
568 goto failure;
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
569 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
570 if (PyTuple_Check(base)) {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
571 bases = base;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
572 /* INCREF as we create a new ref in the else branch */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
573 Py_INCREF(bases);
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
574 } else {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
575 bases = PyTuple_Pack(1, base);
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
576 if (bases == NULL)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
577 goto failure;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
578 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
579 /* Create a real new-style class. */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
580 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
581 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
582 failure:
6377
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
583 Py_XDECREF(bases);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
584 Py_XDECREF(mydict);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
585 Py_XDECREF(classname);
4cb223f29337 New version of PyErr_NewException() that is compatible with -X option.
Guido van Rossum <guido@python.org>
parents: 6358
diff changeset
586 Py_XDECREF(modulename);
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
587 return result;
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
588 }
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
589
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
590 /* 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
591 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
592 void
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
593 PyErr_WriteUnraisable(PyObject *obj)
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
594 {
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
595 PyObject *f, *t, *v, *tb;
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
596 PyErr_Fetch(&t, &v, &tb);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
597 f = PySys_GetObject("stderr");
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
598 if (f != NULL) {
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
599 PyFile_WriteString("Exception ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
600 if (t) {
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
601 PyObject* moduleName;
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
602 char* className = PyExceptionClass_Name(t);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
603
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
604 if (className != NULL) {
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
605 char *dot = strrchr(className, '.');
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
606 if (dot != NULL)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
607 className = dot+1;
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
608 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
609
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
610 moduleName = PyObject_GetAttrString(t, "__module__");
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
611 if (moduleName == NULL)
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
612 PyFile_WriteString("<unknown>", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
613 else {
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
614 char* modstr = PyString_AsString(moduleName);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
615 if (modstr)
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
616 {
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
617 PyFile_WriteString(modstr, f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
618 PyFile_WriteString(".", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
619 }
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
620 }
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
621 if (className == NULL)
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
622 PyFile_WriteString("<unknown>", f);
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
623 else
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
624 PyFile_WriteString(className, f);
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
625 if (v && v != Py_None) {
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
626 PyFile_WriteString(": ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
627 PyFile_WriteObject(v, f, 0);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
628 }
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
629 Py_XDECREF(moduleName);
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
630 }
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
631 PyFile_WriteString(" in ", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
632 PyFile_WriteObject(obj, f, 0);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
633 PyFile_WriteString(" ignored\n", f);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
634 PyErr_Clear(); /* Just in case */
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
635 }
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
636 Py_XDECREF(t);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
637 Py_XDECREF(v);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
638 Py_XDECREF(tb);
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
639 }
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
640
30781
74747f62f286 Made function declaration a proper C prototype
Armin Rigo <arigo@tunes.org>
parents: 30683
diff changeset
641 extern PyObject *PyModule_GetWarningsModule(void);
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
642
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
643 /* Function to issue a warning message; may raise an exception. */
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
644 int
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
645 PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
646 {
27958
e07b21ea3c45 Fix bug 683658 - PyErr_Warn may cause import deadlock.
Mark Hammond <mhammond@skippinet.com.au>
parents: 26601
diff changeset
647 PyObject *dict, *func = NULL;
29877
72cbc41ccc2f Fix [ 771097 ] frozen programs fail due to implicit import of "warnings".
Mark Hammond <mhammond@skippinet.com.au>
parents: 28571
diff changeset
648 PyObject *warnings_module = PyModule_GetWarningsModule();
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
649
29877
72cbc41ccc2f Fix [ 771097 ] frozen programs fail due to implicit import of "warnings".
Mark Hammond <mhammond@skippinet.com.au>
parents: 28571
diff changeset
650 if (warnings_module != NULL) {
72cbc41ccc2f Fix [ 771097 ] frozen programs fail due to implicit import of "warnings".
Mark Hammond <mhammond@skippinet.com.au>
parents: 28571
diff changeset
651 dict = PyModule_GetDict(warnings_module);
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
652 if (dict != NULL)
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
653 func = PyDict_GetItemString(dict, "warn");
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
654 }
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
655 if (func == NULL) {
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
656 PySys_WriteStderr("warning: %s\n", message);
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
657 return 0;
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
658 }
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
659 else {
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
660 PyObject *res;
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
661
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
662 if (category == NULL)
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
663 category = PyExc_RuntimeWarning;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
664 res = PyObject_CallFunction(func, "sOn",
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
665 message, category, stack_level);
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
666 if (res == NULL)
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
667 return -1;
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
668 Py_DECREF(res);
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
669 return 0;
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
670 }
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
671 }
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
672
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
673 /* PyErr_Warn is only for backwards compatability and will be removed.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
674 Use PyErr_WarnEx instead. */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
675
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
676 #undef PyErr_Warn
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
677
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
678 PyAPI_FUNC(int)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
679 PyErr_Warn(PyObject *category, char *message)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
680 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
681 return PyErr_WarnEx(category, message, 1);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
682 }
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
683
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
684 /* Warning with explicit origin */
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
685 int
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
686 PyErr_WarnExplicit(PyObject *category, const char *message,
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
687 const char *filename, int lineno,
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
688 const char *module, PyObject *registry)
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
689 {
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
690 PyObject *mod, *dict, *func = NULL;
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
691
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
692 mod = PyImport_ImportModule("warnings");
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
693 if (mod != NULL) {
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
694 dict = PyModule_GetDict(mod);
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
695 func = PyDict_GetItemString(dict, "warn_explicit");
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
696 Py_DECREF(mod);
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
697 }
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
698 if (func == NULL) {
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
699 PySys_WriteStderr("warning: %s\n", message);
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
700 return 0;
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
701 }
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
702 else {
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
703 PyObject *res;
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
704
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
705 if (category == NULL)
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
706 category = PyExc_RuntimeWarning;
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
707 if (registry == NULL)
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
708 registry = Py_None;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
709 res = PyObject_CallFunction(func, "sOsizO", message, category,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
710 filename, lineno, module, registry);
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
711 if (res == NULL)
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
712 return -1;
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
713 Py_DECREF(res);
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
714 return 0;
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
715 }
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
716 }
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
717
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
718
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
719 /* 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
720 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
721 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
722
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
723 void
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
724 PyErr_SyntaxLocation(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
725 {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
726 PyObject *exc, *v, *tb, *tmp;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
727
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
728 /* add attributes for the line number and filename for the error */
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
729 PyErr_Fetch(&exc, &v, &tb);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
730 PyErr_NormalizeException(&exc, &v, &tb);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
731 /* XXX check that it is, indeed, a syntax error. It might not
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
732 * be, though. */
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
733 tmp = PyInt_FromLong(lineno);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
734 if (tmp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
735 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
736 else {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
737 if (PyObject_SetAttrString(v, "lineno", tmp))
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
738 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
739 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
740 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
741 if (filename != NULL) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
742 tmp = PyString_FromString(filename);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
743 if (tmp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
744 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
745 else {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
746 if (PyObject_SetAttrString(v, "filename", tmp))
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
747 PyErr_Clear();
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
748 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
749 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
750
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
751 tmp = PyErr_ProgramText(filename, lineno);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
752 if (tmp) {
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
753 if (PyObject_SetAttrString(v, "text", tmp))
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
754 PyErr_Clear();
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
755 Py_DECREF(tmp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
756 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
757 }
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
758 if (PyObject_SetAttrString(v, "offset", Py_None)) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
759 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
760 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
761 if (exc != PyExc_SyntaxError) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
762 if (!PyObject_HasAttrString(v, "msg")) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
763 tmp = PyObject_Str(v);
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
764 if (tmp) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
765 if (PyObject_SetAttrString(v, "msg", tmp))
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
766 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
767 Py_DECREF(tmp);
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
768 } else {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
769 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
770 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
771 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
772 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
773 if (PyObject_SetAttrString(v, "print_file_and_line",
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
774 Py_None))
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
775 PyErr_Clear();
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
776 }
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
777 }
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
778 PyErr_Restore(exc, v, tb);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
779 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
780
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
781 /* com_fetch_program_text will attempt to load the line of text that
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
782 the exception refers to. If it fails, it will return NULL but will
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
783 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
784
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
785 XXX The functionality of this function is quite similar to the
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
786 functionality in tb_displayline() in traceback.c.
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
787 */
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
788
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
789 PyObject *
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
790 PyErr_ProgramText(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
791 {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
792 FILE *fp;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
793 int i;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
794 char linebuf[1000];
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
795
36701
e3248f1fc54d PyErr_ProgramText(): Grrrrrr.
Tim Peters <tim.peters@gmail.com>
parents: 36521
diff changeset
796 if (filename == NULL || *filename == '\0' || lineno <= 0)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
797 return NULL;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22205
diff changeset
798 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
799 if (fp == NULL)
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
800 return NULL;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
801 for (i = 0; i < lineno; i++) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
802 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
803 do {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
804 *pLastChar = '\0';
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22205
diff changeset
805 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
806 break;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
807 /* fgets read *something*; if it didn't get as
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
808 far as pLastChar, it must have found a newline
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
809 or hit the end of the file; if pLastChar is \n,
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
810 it obviously found a newline; else we haven't
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
811 yet seen a newline, so must continue */
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
812 } while (*pLastChar != '\0' && *pLastChar != '\n');
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
813 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
814 fclose(fp);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
815 if (i == lineno) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
816 char *p = linebuf;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
817 while (*p == ' ' || *p == '\t' || *p == '\014')
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
818 p++;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
819 return PyString_FromString(p);
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
820 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
821 return NULL;
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
822 }
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
823
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
824 #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
825 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
826 #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
827