[Python-checkins] gh-91102: Port 8-argument _warnings.warn_explicit to Argument Clinic (#92891)

erlend-aasland webhook-mailer at python.org
Wed Jul 20 16:25:02 EDT 2022


https://github.com/python/cpython/commit/41e0585ffabfcd227718a247a02285ea590ed51e
commit: 41e0585ffabfcd227718a247a02285ea590ed51e
branch: main
author: Oleg Iarygin <oleg at arhadthedev.net>
committer: erlend-aasland <erlend.aasland at protonmail.com>
date: 2022-07-20T22:24:51+02:00
summary:

gh-91102: Port 8-argument _warnings.warn_explicit to Argument Clinic (#92891)

Co-authored-by: Erlend E. Aasland <erlend.aasland at protonmail.com>

files:
A Misc/NEWS.d/next/Core and Builtins/2022-05-11-09-16-54.gh-issue-91102.lenv9h.rst
M Python/_warnings.c
M Python/clinic/_warnings.c.h

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 0000000000000..b2bdf9d5322f3
--- /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 601dae8fb4655..1b9e107ea30b1 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 aa85c2a0d4d92..926fb32e7c261 100644
--- a/Python/clinic/_warnings.c.h
+++ b/Python/clinic/_warnings.c.h
@@ -66,4 +66,85 @@ warnings_warn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec
 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]*/



More information about the Python-checkins mailing list