diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-12-09 18:08:18 +0100 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-12-09 18:08:18 +0100 |
commit | 22f18750a53b0f95b27c83c822ee2f44ea5f6495 (patch) | |
tree | ef8b76edcd20627b452421c220f2beb148876892 /Python | |
parent | 0ca246c5e7bc9a8c1886519f313a41334a60e011 (diff) | |
download | cpython-git-22f18750a53b0f95b27c83c822ee2f44ea5f6495.tar.gz |
Issue #20185: Convert _warnings.warn() to Argument Clinic
Fix warn_explicit(): interpret source=None as source=NULL.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/_warnings.c | 37 | ||||
-rw-r--r-- | Python/clinic/_warnings.c.h | 38 |
2 files changed, 59 insertions, 16 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c index 588fabb1f9..67f4c6bbe0 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1,5 +1,6 @@ #include "Python.h" #include "frameobject.h" +#include "clinic/_warnings.c.h" #define MODULE_NAME "_warnings" @@ -485,6 +486,10 @@ warn_explicit(PyObject *category, PyObject *message, if (lineno_obj == NULL) goto cleanup; + if (source == Py_None) { + source = NULL; + } + /* Create key. */ key = PyTuple_Pack(3, text, category, lineno_obj); if (key == NULL) @@ -805,22 +810,26 @@ do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level, return res; } -static PyObject * -warnings_warn(PyObject *self, PyObject *args, PyObject *kwds) -{ - static char *kw_list[] = {"message", "category", "stacklevel", - "source", NULL}; - PyObject *message, *category = NULL, *source = NULL; - Py_ssize_t stack_level = 1; +/*[clinic input] +warn as warnings_warn - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OnO:warn", kw_list, - &message, &category, &stack_level, &source)) - return NULL; + message: object + category: object = None + stacklevel: Py_ssize_t = 1 + source: object = None +Issue a warning, or maybe ignore it or raise an exception. +[clinic start generated code]*/ + +static PyObject * +warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category, + Py_ssize_t stacklevel, PyObject *source) +/*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/ +{ category = get_category(message, category); if (category == NULL) return NULL; - return do_warn(message, category, stack_level, source); + return do_warn(message, category, stacklevel, source); } static PyObject * @@ -1098,15 +1107,11 @@ exit: } -PyDoc_STRVAR(warn_doc, -"Issue a warning, or maybe ignore it or raise an exception."); - PyDoc_STRVAR(warn_explicit_doc, "Low-level inferface to warnings functionality."); static PyMethodDef warnings_functions[] = { - {"warn", (PyCFunction)warnings_warn, METH_VARARGS | METH_KEYWORDS, - warn_doc}, + WARNINGS_WARN_METHODDEF {"warn_explicit", (PyCFunction)warnings_warn_explicit, METH_VARARGS | METH_KEYWORDS, warn_explicit_doc}, {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS, diff --git a/Python/clinic/_warnings.c.h b/Python/clinic/_warnings.c.h new file mode 100644 index 0000000000..db2245cb5b --- /dev/null +++ b/Python/clinic/_warnings.c.h @@ -0,0 +1,38 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(warnings_warn__doc__, +"warn($module, /, message, category=None, stacklevel=1, source=None)\n" +"--\n" +"\n" +"Issue a warning, or maybe ignore it or raise an exception."); + +#define WARNINGS_WARN_METHODDEF \ + {"warn", (PyCFunction)warnings_warn, METH_FASTCALL, warnings_warn__doc__}, + +static PyObject * +warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category, + Py_ssize_t stacklevel, PyObject *source); + +static PyObject * +warnings_warn(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"message", "category", "stacklevel", "source", NULL}; + static _PyArg_Parser _parser = {"O|OnO:warn", _keywords, 0}; + PyObject *message; + PyObject *category = Py_None; + Py_ssize_t stacklevel = 1; + PyObject *source = Py_None; + + if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, + &message, &category, &stacklevel, &source)) { + goto exit; + } + return_value = warnings_warn_impl(module, message, category, stacklevel, source); + +exit: + return return_value; +} +/*[clinic end generated code: output=b3c5297c2c55778c input=a9049054013a1b77]*/ |