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