summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-05-11-09-16-54.gh-issue-91102.lenv9h.rst1
-rw-r--r--Python/_warnings.c47
-rw-r--r--Python/clinic/_warnings.c.h83
3 files changed, 106 insertions, 25 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-11-09-16-54.gh-issue-91102.lenv9h.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-11-09-16-54.gh-issue-91102.lenv9h.rst
new file mode 100644
index 0000000..b2bdf9d
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-11-09-16-54.gh-issue-91102.lenv9h.rst
@@ -0,0 +1 @@
+:meth:`_warnings.warn_explicit` is ported to Argument Clinic.
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 601dae8..1b9e107 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -1030,28 +1030,31 @@ get_source_line(PyInterpreterState *interp, PyObject *module_globals, int lineno
return source_line;
}
+/*[clinic input]
+warn_explicit as warnings_warn_explicit
+
+ message: object
+ category: object
+ filename: unicode
+ lineno: int
+ module as mod: object = NULL
+ registry: object = None
+ module_globals: object = None
+ source as sourceobj: object = None
+
+Issue a warning, or maybe ignore it or raise an exception.
+[clinic start generated code]*/
+
static PyObject *
-warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
+warnings_warn_explicit_impl(PyObject *module, PyObject *message,
+ PyObject *category, PyObject *filename,
+ int lineno, PyObject *mod, PyObject *registry,
+ PyObject *module_globals, PyObject *sourceobj)
+/*[clinic end generated code: output=c49c62b15a49a186 input=df6eeb8b45e712f1]*/
{
- static char *kwd_list[] = {"message", "category", "filename", "lineno",
- "module", "registry", "module_globals",
- "source", 0};
- PyObject *message;
- PyObject *category;
- PyObject *filename;
- int lineno;
- PyObject *module = NULL;
- PyObject *registry = NULL;
- PyObject *module_globals = NULL;
- PyObject *sourceobj = NULL;
PyObject *source_line = NULL;
PyObject *returned;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOUi|OOOO:warn_explicit",
- kwd_list, &message, &category, &filename, &lineno, &module,
- &registry, &module_globals, &sourceobj))
- return NULL;
-
PyThreadState *tstate = get_current_tstate();
if (tstate == NULL) {
return NULL;
@@ -1070,8 +1073,8 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
return NULL;
}
}
- returned = warn_explicit(tstate, category, message, filename, lineno, module,
- registry, source_line, sourceobj);
+ returned = warn_explicit(tstate, category, message, filename, lineno,
+ mod, registry, source_line, sourceobj);
Py_XDECREF(source_line);
return returned;
}
@@ -1331,13 +1334,9 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro)
}
}
-PyDoc_STRVAR(warn_explicit_doc,
-"Low-level interface to warnings functionality.");
-
static PyMethodDef warnings_functions[] = {
WARNINGS_WARN_METHODDEF
- {"warn_explicit", _PyCFunction_CAST(warnings_warn_explicit),
- METH_VARARGS | METH_KEYWORDS, warn_explicit_doc},
+ WARNINGS_WARN_EXPLICIT_METHODDEF
{"_filters_mutated", _PyCFunction_CAST(warnings_filters_mutated), METH_NOARGS,
NULL},
/* XXX(brett.cannon): add showwarning? */
diff --git a/Python/clinic/_warnings.c.h b/Python/clinic/_warnings.c.h
index aa85c2a..926fb32 100644
--- a/Python/clinic/_warnings.c.h
+++ b/Python/clinic/_warnings.c.h
@@ -66,4 +66,85 @@ skip_optional_pos:
exit:
return return_value;
}
-/*[clinic end generated code: output=0435c68611fa2fe9 input=a9049054013a1b77]*/
+
+PyDoc_STRVAR(warnings_warn_explicit__doc__,
+"warn_explicit($module, /, message, category, filename, lineno,\n"
+" module=<unrepresentable>, registry=None,\n"
+" module_globals=None, source=None)\n"
+"--\n"
+"\n"
+"Issue a warning, or maybe ignore it or raise an exception.");
+
+#define WARNINGS_WARN_EXPLICIT_METHODDEF \
+ {"warn_explicit", _PyCFunction_CAST(warnings_warn_explicit), METH_FASTCALL|METH_KEYWORDS, warnings_warn_explicit__doc__},
+
+static PyObject *
+warnings_warn_explicit_impl(PyObject *module, PyObject *message,
+ PyObject *category, PyObject *filename,
+ int lineno, PyObject *mod, PyObject *registry,
+ PyObject *module_globals, PyObject *sourceobj);
+
+static PyObject *
+warnings_warn_explicit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ static const char * const _keywords[] = {"message", "category", "filename", "lineno", "module", "registry", "module_globals", "source", NULL};
+ static _PyArg_Parser _parser = {NULL, _keywords, "warn_explicit", 0};
+ PyObject *argsbuf[8];
+ Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4;
+ PyObject *message;
+ PyObject *category;
+ PyObject *filename;
+ int lineno;
+ PyObject *mod = NULL;
+ PyObject *registry = Py_None;
+ PyObject *module_globals = Py_None;
+ PyObject *sourceobj = Py_None;
+
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 8, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ message = args[0];
+ category = args[1];
+ if (!PyUnicode_Check(args[2])) {
+ _PyArg_BadArgument("warn_explicit", "argument 'filename'", "str", args[2]);
+ goto exit;
+ }
+ if (PyUnicode_READY(args[2]) == -1) {
+ goto exit;
+ }
+ filename = args[2];
+ lineno = _PyLong_AsInt(args[3]);
+ if (lineno == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ if (!noptargs) {
+ goto skip_optional_pos;
+ }
+ if (args[4]) {
+ mod = args[4];
+ if (!--noptargs) {
+ goto skip_optional_pos;
+ }
+ }
+ if (args[5]) {
+ registry = args[5];
+ if (!--noptargs) {
+ goto skip_optional_pos;
+ }
+ }
+ if (args[6]) {
+ module_globals = args[6];
+ if (!--noptargs) {
+ goto skip_optional_pos;
+ }
+ }
+ sourceobj = args[7];
+skip_optional_pos:
+ return_value = warnings_warn_explicit_impl(module, message, category, filename, lineno, mod, registry, module_globals, sourceobj);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=596b370838b95386 input=a9049054013a1b77]*/