Mercurial > cpython-lru_cache-weakref
annotate Python/_warnings.c @ 58707:76cf60e2d005 legacy-trunk
normalize exceptions passed to the __exit__ method #7853
In Python 2.x, exceptions in finally blocks are not normalized. Since with
statements are implemented using finally blocks, ceval.c had to be tweaked to
distinguish between with finally blocks and normal ones.
A test for the finalization of generators containing with statements was also
added.
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Fri, 05 Feb 2010 02:12:14 +0000 |
| parents | 1f84ddafb6a3 |
| children | 8c7179125803 |
| rev | line source |
|---|---|
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1 #include "Python.h" |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
2 #include "frameobject.h" |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
3 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
4 #define MODULE_NAME "_warnings" |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
5 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
6 PyDoc_STRVAR(warnings__doc__, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
7 MODULE_NAME " provides basic warning filtering support.\n" |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
8 "It is a helper module to speed up interpreter start-up."); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
9 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
10 /* Both 'filters' and 'onceregistry' can be set in warnings.py; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
11 get_warnings_attr() will reset these variables accordingly. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
12 static PyObject *_filters; /* List */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
13 static PyObject *_once_registry; /* Dict */ |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
14 static PyObject *_default_action; /* String */ |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
15 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
16 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
17 static int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
18 check_matched(PyObject *obj, PyObject *arg) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
19 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
20 PyObject *result; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
21 int rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
22 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
23 if (obj == Py_None) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
24 return 1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
25 result = PyObject_CallMethod(obj, "match", "O", arg); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
26 if (result == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
27 return -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
28 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
29 rc = PyObject_IsTrue(result); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
30 Py_DECREF(result); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
31 return rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
32 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
33 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
34 /* |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
35 Returns a new reference. |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
36 A NULL return value can mean false or an error. |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
37 */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
38 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
39 get_warnings_attr(const char *attr) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
40 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
41 static PyObject *warnings_str = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
42 PyObject *all_modules; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
43 PyObject *warnings_module; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
44 int result; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
45 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
46 if (warnings_str == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
47 warnings_str = PyString_InternFromString("warnings"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
48 if (warnings_str == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
49 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
50 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
51 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
52 all_modules = PyImport_GetModuleDict(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
53 result = PyDict_Contains(all_modules, warnings_str); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
54 if (result == -1 || result == 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
55 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
56 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
57 warnings_module = PyDict_GetItem(all_modules, warnings_str); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
58 if (!PyObject_HasAttrString(warnings_module, attr)) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
59 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
60 return PyObject_GetAttrString(warnings_module, attr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
61 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
62 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
63 |
|
46445
6e4ca9f72bba
Correct a refleak found by "regrtest.py -R:: test_structmembers"
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
46428
diff
changeset
|
64 static PyObject * |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
65 get_once_registry(void) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
66 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
67 PyObject *registry; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
68 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
69 registry = get_warnings_attr("onceregistry"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
70 if (registry == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
71 if (PyErr_Occurred()) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
72 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
73 return _once_registry; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
74 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
75 Py_DECREF(_once_registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
76 _once_registry = registry; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
77 return registry; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
78 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
79 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
80 |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
81 static PyObject * |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
82 get_default_action(void) |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
83 { |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
84 PyObject *default_action; |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
85 |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
86 default_action = get_warnings_attr("defaultaction"); |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
87 if (default_action == NULL) { |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
88 if (PyErr_Occurred()) { |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
89 return NULL; |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
90 } |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
91 return _default_action; |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
92 } |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
93 |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
94 Py_DECREF(_default_action); |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
95 _default_action = default_action; |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
96 return default_action; |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
97 } |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
98 |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
99 |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
100 /* The item is a borrowed reference. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
101 static const char * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
102 get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
103 PyObject *module, PyObject **item) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
104 { |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
105 PyObject *action; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
106 Py_ssize_t i; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
107 PyObject *warnings_filters; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
108 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
109 warnings_filters = get_warnings_attr("filters"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
110 if (warnings_filters == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
111 if (PyErr_Occurred()) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
112 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
113 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
114 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
115 Py_DECREF(_filters); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
116 _filters = warnings_filters; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
117 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
118 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
119 if (!PyList_Check(_filters)) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
120 PyErr_SetString(PyExc_ValueError, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
121 MODULE_NAME ".filters must be a list"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
122 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
123 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
124 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
125 /* _filters could change while we are iterating over it. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
126 for (i = 0; i < PyList_GET_SIZE(_filters); i++) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
127 PyObject *tmp_item, *action, *msg, *cat, *mod, *ln_obj; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
128 Py_ssize_t ln; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
129 int is_subclass, good_msg, good_mod; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
130 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
131 tmp_item = *item = PyList_GET_ITEM(_filters, i); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
132 if (PyTuple_Size(tmp_item) != 5) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
133 PyErr_Format(PyExc_ValueError, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
134 MODULE_NAME ".filters item %zd isn't a 5-tuple", i); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
135 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
136 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
137 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
138 /* Python code: action, msg, cat, mod, ln = item */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
139 action = PyTuple_GET_ITEM(tmp_item, 0); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
140 msg = PyTuple_GET_ITEM(tmp_item, 1); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
141 cat = PyTuple_GET_ITEM(tmp_item, 2); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
142 mod = PyTuple_GET_ITEM(tmp_item, 3); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
143 ln_obj = PyTuple_GET_ITEM(tmp_item, 4); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
144 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
145 good_msg = check_matched(msg, text); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
146 good_mod = check_matched(mod, module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
147 is_subclass = PyObject_IsSubclass(category, cat); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
148 ln = PyInt_AsSsize_t(ln_obj); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
149 if (good_msg == -1 || good_mod == -1 || is_subclass == -1 || |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
150 (ln == -1 && PyErr_Occurred())) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
151 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
152 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
153 if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln)) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
154 return PyString_AsString(action); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
155 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
156 |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
157 action = get_default_action(); |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
158 if (action != NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
159 return PyString_AsString(action); |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
160 } |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
161 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
162 PyErr_SetString(PyExc_ValueError, |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
163 MODULE_NAME ".defaultaction not found"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
164 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
165 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
166 |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
167 |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
168 static int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
169 already_warned(PyObject *registry, PyObject *key, int should_set) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
170 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
171 PyObject *already_warned; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
172 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
173 if (key == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
174 return -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
175 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
176 already_warned = PyDict_GetItem(registry, key); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
177 if (already_warned != NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
178 int rc = PyObject_IsTrue(already_warned); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
179 if (rc != 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
180 return rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
181 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
182 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
183 /* This warning wasn't found in the registry, set it. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
184 if (should_set) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
185 return PyDict_SetItem(registry, key, Py_True); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
186 return 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
187 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
188 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
189 /* New reference. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
190 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
191 normalize_module(PyObject *filename) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
192 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
193 PyObject *module; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
194 const char *mod_str; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
195 Py_ssize_t len; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
196 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
197 int rc = PyObject_IsTrue(filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
198 if (rc == -1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
199 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
200 else if (rc == 0) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
201 return PyString_FromString("<unknown>"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
202 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
203 mod_str = PyString_AsString(filename); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
204 if (mod_str == NULL) |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
205 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
206 len = PyString_Size(filename); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
207 if (len < 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
208 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
209 if (len >= 3 && |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
210 strncmp(mod_str + (len - 3), ".py", 3) == 0) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
211 module = PyString_FromStringAndSize(mod_str, len-3); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
212 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
213 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
214 module = filename; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
215 Py_INCREF(module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
216 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
217 return module; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
218 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
219 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
220 static int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
221 update_registry(PyObject *registry, PyObject *text, PyObject *category, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
222 int add_zero) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
223 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
224 PyObject *altkey, *zero = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
225 int rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
226 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
227 if (add_zero) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
228 zero = PyInt_FromLong(0); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
229 if (zero == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
230 return -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
231 altkey = PyTuple_Pack(3, text, category, zero); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
232 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
233 else |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
234 altkey = PyTuple_Pack(2, text, category); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
235 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
236 rc = already_warned(registry, altkey, 1); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
237 Py_XDECREF(zero); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
238 Py_XDECREF(altkey); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
239 return rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
240 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
241 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
242 static void |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
243 show_warning(PyObject *filename, int lineno, PyObject *text, PyObject |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
244 *category, PyObject *sourceline) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
245 { |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
246 PyObject *f_stderr; |
|
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
247 PyObject *name; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
248 char lineno_str[128]; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
249 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
250 PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
251 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
252 name = PyObject_GetAttrString(category, "__name__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
253 if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
254 return; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
255 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
256 f_stderr = PySys_GetObject("stderr"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
257 if (f_stderr == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
258 fprintf(stderr, "lost sys.stderr\n"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
259 Py_DECREF(name); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
260 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
261 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
262 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
263 /* Print "filename:lineno: category: text\n" */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
264 PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
265 PyFile_WriteString(lineno_str, f_stderr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
266 PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
267 PyFile_WriteString(": ", f_stderr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
268 PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
269 PyFile_WriteString("\n", f_stderr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
270 Py_XDECREF(name); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
271 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
272 /* Print " source_line\n" */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
273 if (sourceline) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
274 char *source_line_str = PyString_AS_STRING(sourceline); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
275 while (*source_line_str == ' ' || *source_line_str == '\t' || |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
276 *source_line_str == '\014') |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
277 source_line_str++; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
278 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
279 PyFile_WriteString(source_line_str, f_stderr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
280 PyFile_WriteString("\n", f_stderr); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
281 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
282 else |
|
47933
4f804ee772eb
#3342: In tracebacks, printed source lines were not indented since r62555.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47835
diff
changeset
|
283 _Py_DisplaySourceLine(f_stderr, PyString_AS_STRING(filename), |
|
4f804ee772eb
#3342: In tracebacks, printed source lines were not indented since r62555.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47835
diff
changeset
|
284 lineno, 2); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
285 PyErr_Clear(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
286 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
287 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
288 static PyObject * |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
289 warn_explicit(PyObject *category, PyObject *message, |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
290 PyObject *filename, int lineno, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
291 PyObject *module, PyObject *registry, PyObject *sourceline) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
292 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
293 PyObject *key = NULL, *text = NULL, *result = NULL, *lineno_obj = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
294 PyObject *item = Py_None; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
295 const char *action; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
296 int rc; |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
297 |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
298 if (registry && !PyDict_Check(registry) && (registry != Py_None)) { |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
299 PyErr_SetString(PyExc_TypeError, "'registry' must be a dict"); |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
300 return NULL; |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
301 } |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
302 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
303 /* Normalize module. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
304 if (module == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
305 module = normalize_module(filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
306 if (module == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
307 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
308 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
309 else |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
310 Py_INCREF(module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
311 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
312 /* Normalize message. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
313 Py_INCREF(message); /* DECREF'ed in cleanup. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
314 rc = PyObject_IsInstance(message, PyExc_Warning); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
315 if (rc == -1) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
316 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
317 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
318 if (rc == 1) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
319 text = PyObject_Str(message); |
|
55286
2dab8d63eb55
Issue #6415: Fixed warnings.warn sagfault on bad formatted string.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
53931
diff
changeset
|
320 if (text == NULL) |
|
2dab8d63eb55
Issue #6415: Fixed warnings.warn sagfault on bad formatted string.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
53931
diff
changeset
|
321 goto cleanup; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
322 category = (PyObject*)message->ob_type; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
323 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
324 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
325 text = message; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
326 message = PyObject_CallFunction(category, "O", message); |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
327 if (message == NULL) |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
328 goto cleanup; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
329 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
330 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
331 lineno_obj = PyInt_FromLong(lineno); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
332 if (lineno_obj == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
333 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
334 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
335 /* Create key. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
336 key = PyTuple_Pack(3, text, category, lineno_obj); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
337 if (key == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
338 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
339 |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
340 if ((registry != NULL) && (registry != Py_None)) { |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
341 rc = already_warned(registry, key, 0); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
342 if (rc == -1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
343 goto cleanup; |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
344 else if (rc == 1) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
345 goto return_none; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
346 /* Else this warning hasn't been generated before. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
347 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
348 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
349 action = get_filter(category, text, lineno, module, &item); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
350 if (action == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
351 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
352 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
353 if (strcmp(action, "error") == 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
354 PyErr_SetObject(category, message); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
355 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
356 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
357 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
358 /* Store in the registry that we've been here, *except* when the action |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
359 is "always". */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
360 rc = 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
361 if (strcmp(action, "always") != 0) { |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
362 if (registry != NULL && registry != Py_None && |
|
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
363 PyDict_SetItem(registry, key, Py_True) < 0) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
364 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
365 else if (strcmp(action, "ignore") == 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
366 goto return_none; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
367 else if (strcmp(action, "once") == 0) { |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
368 if (registry == NULL || registry == Py_None) { |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
369 registry = get_once_registry(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
370 if (registry == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
371 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
372 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
373 /* _once_registry[(text, category)] = 1 */ |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
374 rc = update_registry(registry, text, category, 0); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
375 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
376 else if (strcmp(action, "module") == 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
377 /* registry[(text, category, 0)] = 1 */ |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
378 if (registry != NULL && registry != Py_None) |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
379 rc = update_registry(registry, text, category, 0); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
380 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
381 else if (strcmp(action, "default") != 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
382 PyObject *to_str = PyObject_Str(item); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
383 const char *err_str = "???"; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
384 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
385 if (to_str != NULL) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
386 err_str = PyString_AS_STRING(to_str); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
387 PyErr_Format(PyExc_RuntimeError, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
388 "Unrecognized action (%s) in warnings.filters:\n %s", |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
389 action, err_str); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
390 Py_XDECREF(to_str); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
391 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
392 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
393 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
394 |
|
49386
642f20b22577
Merged revisions 66748 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
48948
diff
changeset
|
395 if (rc == 1) /* Already warned for this module. */ |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
396 goto return_none; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
397 if (rc == 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
398 PyObject *show_fxn = get_warnings_attr("showwarning"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
399 if (show_fxn == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
400 if (PyErr_Occurred()) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
401 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
402 show_warning(filename, lineno, text, category, sourceline); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
403 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
404 else { |
|
52125
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
405 PyObject *res; |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
406 |
|
52125
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
407 if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) { |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
408 PyErr_SetString(PyExc_TypeError, |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
409 "warnings.showwarning() must be set to a " |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
410 "function or method"); |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
411 Py_DECREF(show_fxn); |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
412 goto cleanup; |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
413 } |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
414 |
|
52125
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
415 res = PyObject_CallFunctionObjArgs(show_fxn, message, category, |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
416 filename, lineno_obj, |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
417 NULL); |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
418 Py_DECREF(show_fxn); |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
419 Py_XDECREF(res); |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
420 if (res == NULL) |
|
a60facc9f7cf
Require implementations for warnings.showwarning() support the 'line' argument.
Brett Cannon <bcannon@gmail.com>
parents:
49386
diff
changeset
|
421 goto cleanup; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
422 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
423 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
424 else /* if (rc == -1) */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
425 goto cleanup; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
426 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
427 return_none: |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
428 result = Py_None; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
429 Py_INCREF(result); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
430 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
431 cleanup: |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
432 Py_XDECREF(key); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
433 Py_XDECREF(text); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
434 Py_XDECREF(lineno_obj); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
435 Py_DECREF(module); |
|
47835
dc42efd728ee
warnings.warn_explicit() did not have the proper TypeErrors in place to prevent
Brett Cannon <bcannon@gmail.com>
parents:
47527
diff
changeset
|
436 Py_XDECREF(message); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
437 return result; /* Py_None or NULL. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
438 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
439 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
440 /* filename, module, and registry are new refs, globals is borrowed */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
441 /* Returns 0 on error (no new refs), 1 on success */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
442 static int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
443 setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
444 PyObject **module, PyObject **registry) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
445 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
446 PyObject *globals; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
447 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
448 /* Setup globals and lineno. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
449 PyFrameObject *f = PyThreadState_GET()->frame; |
|
46686
2f351fa53a6b
Fix a bug in the handling of the stacklevel argument in warnings.warn() where
Brett Cannon <bcannon@gmail.com>
parents:
46667
diff
changeset
|
450 while (--stack_level > 0 && f != NULL) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
451 f = f->f_back; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
452 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
453 if (f == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
454 globals = PyThreadState_Get()->interp->sysdict; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
455 *lineno = 1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
456 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
457 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
458 globals = f->f_globals; |
|
53931
9ef683d41c9b
Issue 5954, PyFrame_GetLineNumber:
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
52658
diff
changeset
|
459 *lineno = PyFrame_GetLineNumber(f); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
460 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
461 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
462 *module = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
463 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
464 /* Setup registry. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
465 assert(globals != NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
466 assert(PyDict_Check(globals)); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
467 *registry = PyDict_GetItemString(globals, "__warningregistry__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
468 if (*registry == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
469 int rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
470 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
471 *registry = PyDict_New(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
472 if (*registry == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
473 return 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
474 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
475 rc = PyDict_SetItemString(globals, "__warningregistry__", *registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
476 if (rc < 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
477 goto handle_error; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
478 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
479 else |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
480 Py_INCREF(*registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
481 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
482 /* Setup module. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
483 *module = PyDict_GetItemString(globals, "__name__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
484 if (*module == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
485 *module = PyString_FromString("<string>"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
486 if (*module == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
487 goto handle_error; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
488 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
489 else |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
490 Py_INCREF(*module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
491 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
492 /* Setup filename. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
493 *filename = PyDict_GetItemString(globals, "__file__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
494 if (*filename != NULL) { |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
495 Py_ssize_t len = PyString_Size(*filename); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
496 const char *file_str = PyString_AsString(*filename); |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
497 if (file_str == NULL || (len < 0 && PyErr_Occurred())) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
498 goto handle_error; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
499 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
500 /* if filename.lower().endswith((".pyc", ".pyo")): */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
501 if (len >= 4 && |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
502 file_str[len-4] == '.' && |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
503 tolower(file_str[len-3]) == 'p' && |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
504 tolower(file_str[len-2]) == 'y' && |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
505 (tolower(file_str[len-1]) == 'c' || |
|
46634
cc66029d2efe
Fix some indentation errors.
Brett Cannon <bcannon@gmail.com>
parents:
46622
diff
changeset
|
506 tolower(file_str[len-1]) == 'o')) |
|
cc66029d2efe
Fix some indentation errors.
Brett Cannon <bcannon@gmail.com>
parents:
46622
diff
changeset
|
507 { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
508 *filename = PyString_FromStringAndSize(file_str, len-1); |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
509 if (*filename == NULL) |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
510 goto handle_error; |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
511 } |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
512 else |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
513 Py_INCREF(*filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
514 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
515 else { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
516 const char *module_str = PyString_AsString(*module); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
517 if (module_str && strcmp(module_str, "__main__") == 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
518 PyObject *argv = PySys_GetObject("argv"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
519 if (argv != NULL && PyList_Size(argv) > 0) { |
|
46637
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
520 int is_true; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
521 *filename = PyList_GetItem(argv, 0); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
522 Py_INCREF(*filename); |
|
46637
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
523 /* If sys.argv[0] is false, then use '__main__'. */ |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
524 is_true = PyObject_IsTrue(*filename); |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
525 if (is_true < 0) { |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
526 Py_DECREF(*filename); |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
527 goto handle_error; |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
528 } |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
529 else if (!is_true) { |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
530 Py_DECREF(*filename); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
531 *filename = PyString_FromString("__main__"); |
|
46637
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
532 if (*filename == NULL) |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
533 goto handle_error; |
|
a859f835ef53
Fix the C implementation of 'warnings' to infer the filename of the module that
Brett Cannon <bcannon@gmail.com>
parents:
46634
diff
changeset
|
534 } |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
535 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
536 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
537 /* embedded interpreters don't have sys.argv, see bug #839151 */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
538 *filename = PyString_FromString("__main__"); |
|
58231
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
539 if (*filename == NULL) |
|
1f177818f1d0
DeprecationWarning is now silent by default.
Brett Cannon <bcannon@gmail.com>
parents:
55286
diff
changeset
|
540 goto handle_error; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
541 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
542 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
543 if (*filename == NULL) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
544 *filename = *module; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
545 Py_INCREF(*filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
546 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
547 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
548 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
549 return 1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
550 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
551 handle_error: |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
552 /* filename not XDECREF'ed here as there is no way to jump here with a |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
553 dangling reference. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
554 Py_XDECREF(*registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
555 Py_XDECREF(*module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
556 return 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
557 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
558 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
559 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
560 get_category(PyObject *message, PyObject *category) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
561 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
562 int rc; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
563 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
564 /* Get category. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
565 rc = PyObject_IsInstance(message, PyExc_Warning); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
566 if (rc == -1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
567 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
568 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
569 if (rc == 1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
570 category = (PyObject*)message->ob_type; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
571 else if (category == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
572 category = PyExc_UserWarning; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
573 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
574 /* Validate category. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
575 rc = PyObject_IsSubclass(category, PyExc_Warning); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
576 if (rc == -1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
577 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
578 if (rc == 0) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
579 PyErr_SetString(PyExc_ValueError, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
580 "category is not a subclass of Warning"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
581 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
582 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
583 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
584 return category; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
585 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
586 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
587 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
588 do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
589 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
590 PyObject *filename, *module, *registry, *res; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
591 int lineno; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
592 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
593 if (!setup_context(stack_level, &filename, &lineno, &module, ®istry)) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
594 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
595 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
596 res = warn_explicit(category, message, filename, lineno, module, registry, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
597 NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
598 Py_DECREF(filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
599 Py_DECREF(registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
600 Py_DECREF(module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
601 return res; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
602 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
603 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
604 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
605 warnings_warn(PyObject *self, PyObject *args, PyObject *kwds) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
606 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
607 static char *kw_list[] = { "message", "category", "stacklevel", 0 }; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
608 PyObject *message, *category = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
609 Py_ssize_t stack_level = 1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
610 |
|
46667
d9071fa8244a
Add a DeprecationWarning for when warnings.showwarning() is set to a function
Brett Cannon <bcannon@gmail.com>
parents:
46637
diff
changeset
|
611 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|On:warn", kw_list, |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
612 &message, &category, &stack_level)) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
613 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
614 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
615 category = get_category(message, category); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
616 if (category == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
617 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
618 return do_warn(message, category, stack_level); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
619 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
620 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
621 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
622 warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
623 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
624 static char *kwd_list[] = {"message", "category", "filename", "lineno", |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
625 "module", "registry", "module_globals", 0}; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
626 PyObject *message; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
627 PyObject *category; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
628 PyObject *filename; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
629 int lineno; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
630 PyObject *module = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
631 PyObject *registry = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
632 PyObject *module_globals = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
633 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
634 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOi|OOO:warn_explicit", |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
635 kwd_list, &message, &category, &filename, &lineno, &module, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
636 ®istry, &module_globals)) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
637 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
638 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
639 if (module_globals) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
640 static PyObject *get_source_name = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
641 static PyObject *splitlines_name = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
642 PyObject *loader; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
643 PyObject *module_name; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
644 PyObject *source; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
645 PyObject *source_list; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
646 PyObject *source_line; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
647 PyObject *returned; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
648 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
649 if (get_source_name == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
650 get_source_name = PyString_InternFromString("get_source"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
651 if (!get_source_name) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
652 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
653 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
654 if (splitlines_name == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
655 splitlines_name = PyString_InternFromString("splitlines"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
656 if (!splitlines_name) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
657 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
658 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
659 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
660 /* Check/get the requisite pieces needed for the loader. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
661 loader = PyDict_GetItemString(module_globals, "__loader__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
662 module_name = PyDict_GetItemString(module_globals, "__name__"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
663 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
664 if (loader == NULL || module_name == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
665 goto standard_call; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
666 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
667 /* Make sure the loader implements the optional get_source() method. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
668 if (!PyObject_HasAttrString(loader, "get_source")) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
669 goto standard_call; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
670 /* Call get_source() to get the source code. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
671 source = PyObject_CallMethodObjArgs(loader, get_source_name, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
672 module_name, NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
673 if (!source) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
674 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
675 else if (source == Py_None) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
676 Py_DECREF(Py_None); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
677 goto standard_call; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
678 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
679 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
680 /* Split the source into lines. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
681 source_list = PyObject_CallMethodObjArgs(source, splitlines_name, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
682 NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
683 Py_DECREF(source); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
684 if (!source_list) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
685 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
686 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
687 /* Get the source line. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
688 source_line = PyList_GetItem(source_list, lineno-1); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
689 if (!source_line) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
690 Py_DECREF(source_list); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
691 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
692 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
693 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
694 /* Handle the warning. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
695 returned = warn_explicit(category, message, filename, lineno, module, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
696 registry, source_line); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
697 Py_DECREF(source_list); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
698 return returned; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
699 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
700 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
701 standard_call: |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
702 return warn_explicit(category, message, filename, lineno, module, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
703 registry, NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
704 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
705 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
706 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
707 /* Function to issue a warning message; may raise an exception. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
708 int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
709 PyErr_WarnEx(PyObject *category, const char *text, Py_ssize_t stack_level) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
710 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
711 PyObject *res; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
712 PyObject *message = PyString_FromString(text); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
713 if (message == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
714 return -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
715 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
716 if (category == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
717 category = PyExc_RuntimeWarning; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
718 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
719 res = do_warn(message, category, stack_level); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
720 Py_DECREF(message); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
721 if (res == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
722 return -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
723 Py_DECREF(res); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
724 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
725 return 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
726 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
727 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
728 /* PyErr_Warn is only for backwards compatability and will be removed. |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
729 Use PyErr_WarnEx instead. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
730 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
731 #undef PyErr_Warn |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
732 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
733 PyAPI_FUNC(int) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
734 PyErr_Warn(PyObject *category, char *text) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
735 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
736 return PyErr_WarnEx(category, text, 1); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
737 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
738 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
739 /* Warning with explicit origin */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
740 int |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
741 PyErr_WarnExplicit(PyObject *category, const char *text, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
742 const char *filename_str, int lineno, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
743 const char *module_str, PyObject *registry) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
744 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
745 PyObject *res; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
746 PyObject *message = PyString_FromString(text); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
747 PyObject *filename = PyString_FromString(filename_str); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
748 PyObject *module = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
749 int ret = -1; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
750 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
751 if (message == NULL || filename == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
752 goto exit; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
753 if (module_str != NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
754 module = PyString_FromString(module_str); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
755 if (module == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
756 goto exit; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
757 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
758 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
759 if (category == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
760 category = PyExc_RuntimeWarning; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
761 res = warn_explicit(category, message, filename, lineno, module, registry, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
762 NULL); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
763 if (res == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
764 goto exit; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
765 Py_DECREF(res); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
766 ret = 0; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
767 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
768 exit: |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
769 Py_XDECREF(message); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
770 Py_XDECREF(module); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
771 Py_XDECREF(filename); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
772 return ret; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
773 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
774 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
775 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
776 PyDoc_STRVAR(warn_doc, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
777 "Issue a warning, or maybe ignore it or raise an exception."); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
778 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
779 PyDoc_STRVAR(warn_explicit_doc, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
780 "Low-level inferface to warnings functionality."); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
781 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
782 static PyMethodDef warnings_functions[] = { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
783 {"warn", (PyCFunction)warnings_warn, METH_VARARGS | METH_KEYWORDS, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
784 warn_doc}, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
785 {"warn_explicit", (PyCFunction)warnings_warn_explicit, |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
786 METH_VARARGS | METH_KEYWORDS, warn_explicit_doc}, |
|
49386
642f20b22577
Merged revisions 66748 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
48948
diff
changeset
|
787 /* XXX(brett.cannon): add showwarning? */ |
|
642f20b22577
Merged revisions 66748 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
48948
diff
changeset
|
788 /* XXX(brett.cannon): Reasonable to add formatwarning? */ |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
789 {NULL, NULL} /* sentinel */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
790 }; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
791 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
792 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
793 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
794 create_filter(PyObject *category, const char *action) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
795 { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
796 static PyObject *ignore_str = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
797 static PyObject *error_str = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
798 static PyObject *default_str = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
799 PyObject *action_obj = NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
800 PyObject *lineno, *result; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
801 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
802 if (!strcmp(action, "ignore")) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
803 if (ignore_str == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
804 ignore_str = PyString_InternFromString("ignore"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
805 if (ignore_str == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
806 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
807 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
808 action_obj = ignore_str; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
809 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
810 else if (!strcmp(action, "error")) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
811 if (error_str == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
812 error_str = PyString_InternFromString("error"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
813 if (error_str == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
814 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
815 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
816 action_obj = error_str; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
817 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
818 else if (!strcmp(action, "default")) { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
819 if (default_str == NULL) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47321
diff
changeset
|
820 default_str = PyString_InternFromString("default"); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
821 if (default_str == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
822 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
823 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
824 action_obj = default_str; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
825 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
826 else { |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
827 Py_FatalError("unknown action"); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
828 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
829 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
830 /* This assumes the line number is zero for now. */ |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
831 lineno = PyInt_FromLong(0); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
832 if (lineno == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
833 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
834 result = PyTuple_Pack(5, action_obj, Py_None, category, Py_None, lineno); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
835 Py_DECREF(lineno); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
836 return result; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
837 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
838 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
839 static PyObject * |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
840 init_filters(void) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
841 { |
|
58336
1f84ddafb6a3
Remove C++/C99-style comments.
Brett Cannon <bcannon@gmail.com>
parents:
58331
diff
changeset
|
842 /* Don't silence DeprecationWarning if -3 was used. */ |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
843 PyObject *filters = PyList_New(Py_Py3kWarningFlag ? 3 : 4); |
|
58336
1f84ddafb6a3
Remove C++/C99-style comments.
Brett Cannon <bcannon@gmail.com>
parents:
58331
diff
changeset
|
844 unsigned int pos = 0; /* Post-incremented in each use. */ |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
845 unsigned int x; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
846 const char *bytes_action; |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
847 |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
848 if (filters == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
849 return NULL; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
850 |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
851 if (!Py_Py3kWarningFlag) { |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
852 PyList_SET_ITEM(filters, pos++, |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
853 create_filter(PyExc_DeprecationWarning, "ignore")); |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
854 } |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
855 PyList_SET_ITEM(filters, pos++, |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
856 create_filter(PyExc_PendingDeprecationWarning, "ignore")); |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
857 PyList_SET_ITEM(filters, pos++, |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
858 create_filter(PyExc_ImportWarning, "ignore")); |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
859 if (Py_BytesWarningFlag > 1) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
860 bytes_action = "error"; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
861 else if (Py_BytesWarningFlag) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
862 bytes_action = "default"; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
863 else |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
864 bytes_action = "ignore"; |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
865 PyList_SET_ITEM(filters, pos++, create_filter(PyExc_BytesWarning, |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
866 bytes_action)); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
867 |
|
58331
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
868 for (x = 0; x < pos; x += 1) { |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
869 if (PyList_GET_ITEM(filters, x) == NULL) { |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
870 Py_DECREF(filters); |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
871 return NULL; |
|
d3bea1669f2d
The silencing of DeprecationWarning was not taking -3 into consideration. Since
Brett Cannon <bcannon@gmail.com>
parents:
58231
diff
changeset
|
872 } |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
873 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
874 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
875 return filters; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
876 } |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
877 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
878 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
879 PyMODINIT_FUNC |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
880 _PyWarnings_Init(void) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
881 { |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
882 PyObject *m; |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
883 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
884 m = Py_InitModule3(MODULE_NAME, warnings_functions, warnings__doc__); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
885 if (m == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
886 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
887 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
888 _filters = init_filters(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
889 if (_filters == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
890 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
891 Py_INCREF(_filters); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
892 if (PyModule_AddObject(m, "filters", _filters) < 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
893 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
894 |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
895 _once_registry = PyDict_New(); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
896 if (_once_registry == NULL) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
897 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
898 Py_INCREF(_once_registry); |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
899 if (PyModule_AddObject(m, "once_registry", _once_registry) < 0) |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
900 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
901 |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
902 _default_action = PyString_FromString("default"); |
|
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
903 if (_default_action == NULL) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
904 return; |
|
52658
b5d23fa9b8a4
_warnings was importing itself to get an attribute. That's bad if warnings gets
Brett Cannon <bcannon@gmail.com>
parents:
52125
diff
changeset
|
905 if (PyModule_AddObject(m, "default_action", _default_action) < 0) |
|
46414
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
906 return; |
|
840064802952
Re-implement the 'warnings' module in C. This allows for usage of the
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
907 } |
