[Python-checkins] bpo-27535: Cleanup create_filter() (#4516)

Victor Stinner webhook-mailer at python.org
Thu Nov 23 11:13:47 EST 2017


https://github.com/python/cpython/commit/b98f1715a35d2cbd1e9e45e1e7ae51a39e00dc4a
commit: b98f1715a35d2cbd1e9e45e1e7ae51a39e00dc4a
branch: master
author: Victor Stinner <victor.stinner at gmail.com>
committer: GitHub <noreply at github.com>
date: 2017-11-23T17:13:44+01:00
summary:

bpo-27535: Cleanup create_filter() (#4516)

create_filter() now expects the action as a _Py_Identifier which
avoids string comparison, and more important, to avoid handling the
"unknown action" annoying case.

files:
M Python/_warnings.c

diff --git a/Python/_warnings.c b/Python/_warnings.c
index 36d649fda10..086a70d7e68 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -11,6 +11,10 @@ MODULE_NAME " provides basic warning filtering support.\n"
 
 _Py_IDENTIFIER(argv);
 _Py_IDENTIFIER(stderr);
+_Py_IDENTIFIER(ignore);
+_Py_IDENTIFIER(error);
+_Py_IDENTIFIER(always);
+_Py_static_string(PyId_default, "default");
 
 static int
 check_matched(PyObject *obj, PyObject *arg)
@@ -1149,31 +1153,8 @@ static PyMethodDef warnings_functions[] = {
 
 
 static PyObject *
-create_filter(PyObject *category, const char *action)
+create_filter(PyObject *category, _Py_Identifier *id)
 {
-    _Py_IDENTIFIER(ignore);
-    _Py_IDENTIFIER(error);
-    _Py_IDENTIFIER(always);
-    _Py_static_string(PyId_default, "default");
-    _Py_Identifier *id;
-
-    if (!strcmp(action, "ignore")) {
-        id = &PyId_ignore;
-    }
-    else if (!strcmp(action, "error")) {
-        id = &PyId_error;
-    }
-    else if (!strcmp(action, "default")) {
-        id = &PyId_default;
-    }
-    else if (!strcmp(action, "always")) {
-        id = &PyId_always;
-    }
-    else {
-        PyErr_SetString(PyExc_ValueError, "unknown action");
-        return NULL;
-    }
-
     PyObject *action_str = _PyUnicode_FromId(id);
     if (action_str == NULL) {
         return NULL;
@@ -1199,48 +1180,47 @@ init_filters(const _PyCoreConfig *config)
     }
 #endif
     PyObject *filters = PyList_New(count);
-    unsigned int pos = 0;  /* Post-incremented in each use. */
-    unsigned int x;
-    const char *bytes_action, *resource_action;
-
     if (filters == NULL)
         return NULL;
 
+    size_t pos = 0;  /* Post-incremented in each use. */
 #ifndef Py_DEBUG
     if (!dev_mode) {
         PyList_SET_ITEM(filters, pos++,
-                        create_filter(PyExc_DeprecationWarning, "ignore"));
+                        create_filter(PyExc_DeprecationWarning, &PyId_ignore));
         PyList_SET_ITEM(filters, pos++,
-                        create_filter(PyExc_PendingDeprecationWarning, "ignore"));
+                        create_filter(PyExc_PendingDeprecationWarning, &PyId_ignore));
         PyList_SET_ITEM(filters, pos++,
-                        create_filter(PyExc_ImportWarning, "ignore"));
+                        create_filter(PyExc_ImportWarning, &PyId_ignore));
     }
 #endif
 
+    _Py_Identifier *bytes_action;
     if (Py_BytesWarningFlag > 1)
-        bytes_action = "error";
+        bytes_action = &PyId_error;
     else if (Py_BytesWarningFlag)
-        bytes_action = "default";
+        bytes_action = &PyId_default;
     else
-        bytes_action = "ignore";
+        bytes_action = &PyId_ignore;
     PyList_SET_ITEM(filters, pos++, create_filter(PyExc_BytesWarning,
                     bytes_action));
 
+    _Py_Identifier *resource_action;
     /* resource usage warnings are enabled by default in pydebug mode */
 #ifdef Py_DEBUG
-    resource_action = "always";
+    resource_action = &PyId_always;
 #else
-    resource_action = (dev_mode ? "always" : "ignore");
+    resource_action = (dev_mode ? &PyId_always : &PyId_ignore);
 #endif
     PyList_SET_ITEM(filters, pos++, create_filter(PyExc_ResourceWarning,
                     resource_action));
 
     if (dev_mode) {
         PyList_SET_ITEM(filters, pos++,
-                        create_filter(PyExc_Warning, "default"));
+                        create_filter(PyExc_Warning, &PyId_default));
     }
 
-    for (x = 0; x < pos; x += 1) {
+    for (size_t x = 0; x < pos; x++) {
         if (PyList_GET_ITEM(filters, x) == NULL) {
             Py_DECREF(filters);
             return NULL;



More information about the Python-checkins mailing list