[Python-checkins] GH-90699: Remove `_Py_IDENTIFIER` usage from `_json` module (GH-98956)

miss-islington webhook-mailer at python.org
Wed Nov 2 12:03:44 EDT 2022


https://github.com/python/cpython/commit/780757ac586d7275db5ee1f229fb2f3d2268d14e
commit: 780757ac586d7275db5ee1f229fb2f3d2268d14e
branch: main
author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-11-02T09:03:38-07:00
summary:

GH-90699: Remove `_Py_IDENTIFIER` usage from `_json` module (GH-98956)

files:
M Include/internal/pycore_global_strings.h
M Include/internal/pycore_runtime_init_generated.h
M Modules/_json.c

diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h
index 43f4dac89386..7e7718d86885 100644
--- a/Include/internal/pycore_global_strings.h
+++ b/Include/internal/pycore_global_strings.h
@@ -44,6 +44,7 @@ struct _Py_global_strings {
         STRUCT_FOR_STR(dot, ".")
         STRUCT_FOR_STR(dot_locals, ".<locals>")
         STRUCT_FOR_STR(empty, "")
+        STRUCT_FOR_STR(json_decoder, "json.decoder")
         STRUCT_FOR_STR(list_err, "list index out of range")
         STRUCT_FOR_STR(newline, "\n")
         STRUCT_FOR_STR(open_br, "{")
@@ -53,6 +54,7 @@ struct _Py_global_strings {
 
     struct {
         STRUCT_FOR_ID(False)
+        STRUCT_FOR_ID(JSONDecodeError)
         STRUCT_FOR_ID(Py_Repr)
         STRUCT_FOR_ID(TextIOWrapper)
         STRUCT_FOR_ID(True)
@@ -352,6 +354,7 @@ struct _Py_global_strings {
         STRUCT_FOR_ID(extend)
         STRUCT_FOR_ID(facility)
         STRUCT_FOR_ID(factory)
+        STRUCT_FOR_ID(false)
         STRUCT_FOR_ID(family)
         STRUCT_FOR_ID(fanout)
         STRUCT_FOR_ID(fd)
@@ -491,6 +494,7 @@ struct _Py_global_strings {
         STRUCT_FOR_ID(node_offset)
         STRUCT_FOR_ID(ns)
         STRUCT_FOR_ID(nstype)
+        STRUCT_FOR_ID(null)
         STRUCT_FOR_ID(number)
         STRUCT_FOR_ID(obj)
         STRUCT_FOR_ID(object)
@@ -627,6 +631,7 @@ struct _Py_global_strings {
         STRUCT_FOR_ID(traceback)
         STRUCT_FOR_ID(trailers)
         STRUCT_FOR_ID(translate)
+        STRUCT_FOR_ID(true)
         STRUCT_FOR_ID(truncate)
         STRUCT_FOR_ID(twice)
         STRUCT_FOR_ID(txt)
diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h
index f7823d36ef81..d9e8b62e6d7f 100644
--- a/Include/internal/pycore_runtime_init_generated.h
+++ b/Include/internal/pycore_runtime_init_generated.h
@@ -554,6 +554,7 @@ extern "C" {
                 INIT_STR(dot, "."), \
                 INIT_STR(dot_locals, ".<locals>"), \
                 INIT_STR(empty, ""), \
+                INIT_STR(json_decoder, "json.decoder"), \
                 INIT_STR(list_err, "list index out of range"), \
                 INIT_STR(newline, "\n"), \
                 INIT_STR(open_br, "{"), \
@@ -562,6 +563,7 @@ extern "C" {
             }, \
             .identifiers = { \
                 INIT_ID(False), \
+                INIT_ID(JSONDecodeError), \
                 INIT_ID(Py_Repr), \
                 INIT_ID(TextIOWrapper), \
                 INIT_ID(True), \
@@ -861,6 +863,7 @@ extern "C" {
                 INIT_ID(extend), \
                 INIT_ID(facility), \
                 INIT_ID(factory), \
+                INIT_ID(false), \
                 INIT_ID(family), \
                 INIT_ID(fanout), \
                 INIT_ID(fd), \
@@ -1000,6 +1003,7 @@ extern "C" {
                 INIT_ID(node_offset), \
                 INIT_ID(ns), \
                 INIT_ID(nstype), \
+                INIT_ID(null), \
                 INIT_ID(number), \
                 INIT_ID(obj), \
                 INIT_ID(object), \
@@ -1136,6 +1140,7 @@ extern "C" {
                 INIT_ID(traceback), \
                 INIT_ID(trailers), \
                 INIT_ID(translate), \
+                INIT_ID(true), \
                 INIT_ID(truncate), \
                 INIT_ID(twice), \
                 INIT_ID(txt), \
@@ -1437,6 +1442,8 @@ _PyUnicode_InitStaticStrings(void) {
     PyObject *string;
     string = &_Py_ID(False);
     PyUnicode_InternInPlace(&string);
+    string = &_Py_ID(JSONDecodeError);
+    PyUnicode_InternInPlace(&string);
     string = &_Py_ID(Py_Repr);
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(TextIOWrapper);
@@ -2035,6 +2042,8 @@ _PyUnicode_InitStaticStrings(void) {
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(factory);
     PyUnicode_InternInPlace(&string);
+    string = &_Py_ID(false);
+    PyUnicode_InternInPlace(&string);
     string = &_Py_ID(family);
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(fanout);
@@ -2313,6 +2322,8 @@ _PyUnicode_InitStaticStrings(void) {
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(nstype);
     PyUnicode_InternInPlace(&string);
+    string = &_Py_ID(null);
+    PyUnicode_InternInPlace(&string);
     string = &_Py_ID(number);
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(obj);
@@ -2585,6 +2596,8 @@ _PyUnicode_InitStaticStrings(void) {
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(translate);
     PyUnicode_InternInPlace(&string);
+    string = &_Py_ID(true);
+    PyUnicode_InternInPlace(&string);
     string = &_Py_ID(truncate);
     PyUnicode_InternInPlace(&string);
     string = &_Py_ID(twice);
@@ -4784,6 +4797,10 @@ _PyStaticObjects_CheckRefcnt(void) {
         _PyObject_Dump((PyObject *)&_Py_STR(empty));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
     };
+    if (Py_REFCNT((PyObject *)&_Py_STR(json_decoder)) < _PyObject_IMMORTAL_REFCNT) {
+        _PyObject_Dump((PyObject *)&_Py_STR(json_decoder));
+        Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
+    };
     if (Py_REFCNT((PyObject *)&_Py_STR(list_err)) < _PyObject_IMMORTAL_REFCNT) {
         _PyObject_Dump((PyObject *)&_Py_STR(list_err));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@@ -4808,6 +4825,10 @@ _PyStaticObjects_CheckRefcnt(void) {
         _PyObject_Dump((PyObject *)&_Py_ID(False));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
     };
+    if (Py_REFCNT((PyObject *)&_Py_ID(JSONDecodeError)) < _PyObject_IMMORTAL_REFCNT) {
+        _PyObject_Dump((PyObject *)&_Py_ID(JSONDecodeError));
+        Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
+    };
     if (Py_REFCNT((PyObject *)&_Py_ID(Py_Repr)) < _PyObject_IMMORTAL_REFCNT) {
         _PyObject_Dump((PyObject *)&_Py_ID(Py_Repr));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@@ -6004,6 +6025,10 @@ _PyStaticObjects_CheckRefcnt(void) {
         _PyObject_Dump((PyObject *)&_Py_ID(factory));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
     };
+    if (Py_REFCNT((PyObject *)&_Py_ID(false)) < _PyObject_IMMORTAL_REFCNT) {
+        _PyObject_Dump((PyObject *)&_Py_ID(false));
+        Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
+    };
     if (Py_REFCNT((PyObject *)&_Py_ID(family)) < _PyObject_IMMORTAL_REFCNT) {
         _PyObject_Dump((PyObject *)&_Py_ID(family));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@@ -6560,6 +6585,10 @@ _PyStaticObjects_CheckRefcnt(void) {
         _PyObject_Dump((PyObject *)&_Py_ID(nstype));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
     };
+    if (Py_REFCNT((PyObject *)&_Py_ID(null)) < _PyObject_IMMORTAL_REFCNT) {
+        _PyObject_Dump((PyObject *)&_Py_ID(null));
+        Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
+    };
     if (Py_REFCNT((PyObject *)&_Py_ID(number)) < _PyObject_IMMORTAL_REFCNT) {
         _PyObject_Dump((PyObject *)&_Py_ID(number));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@@ -7104,6 +7133,10 @@ _PyStaticObjects_CheckRefcnt(void) {
         _PyObject_Dump((PyObject *)&_Py_ID(translate));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
     };
+    if (Py_REFCNT((PyObject *)&_Py_ID(true)) < _PyObject_IMMORTAL_REFCNT) {
+        _PyObject_Dump((PyObject *)&_Py_ID(true));
+        Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
+    };
     if (Py_REFCNT((PyObject *)&_Py_ID(truncate)) < _PyObject_IMMORTAL_REFCNT) {
         _PyObject_Dump((PyObject *)&_Py_ID(truncate));
         Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
diff --git a/Modules/_json.c b/Modules/_json.c
index 1c39b46937d7..fe8695110f01 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -7,11 +7,11 @@
 #ifndef Py_BUILD_CORE_BUILTIN
 #  define Py_BUILD_CORE_MODULE 1
 #endif
-#define NEEDS_PY_IDENTIFIER
 
 #include "Python.h"
 #include "pycore_ceval.h"         // _Py_EnterRecursiveCall()
 #include "structmember.h"         // PyMemberDef
+#include "pycore_runtime_init.h"  // _Py_ID()
 #include <stdbool.h>              // bool
 
 
@@ -305,15 +305,9 @@ static void
 raise_errmsg(const char *msg, PyObject *s, Py_ssize_t end)
 {
     /* Use JSONDecodeError exception to raise a nice looking ValueError subclass */
-    _Py_static_string(PyId_decoder, "json.decoder");
-    PyObject *decoder = _PyImport_GetModuleId(&PyId_decoder);
-    if (decoder == NULL) {
-        return;
-    }
-
-    _Py_IDENTIFIER(JSONDecodeError);
-    PyObject *JSONDecodeError = _PyObject_GetAttrId(decoder, &PyId_JSONDecodeError);
-    Py_DECREF(decoder);
+    _Py_DECLARE_STR(json_decoder, "json.decoder");
+    PyObject *JSONDecodeError =
+         _PyImport_GetModuleAttr(&_Py_STR(json_decoder), &_Py_ID(JSONDecodeError));
     if (JSONDecodeError == NULL) {
         return;
     }
@@ -1310,28 +1304,13 @@ _encoded_const(PyObject *obj)
 {
     /* Return the JSON string representation of None, True, False */
     if (obj == Py_None) {
-        _Py_static_string(PyId_null, "null");
-        PyObject *s_null = _PyUnicode_FromId(&PyId_null);
-        if (s_null == NULL) {
-            return NULL;
-        }
-        return Py_NewRef(s_null);
+        return Py_NewRef(&_Py_ID(null));
     }
     else if (obj == Py_True) {
-        _Py_static_string(PyId_true, "true");
-        PyObject *s_true = _PyUnicode_FromId(&PyId_true);
-        if (s_true == NULL) {
-            return NULL;
-        }
-        return Py_NewRef(s_true);
+        return Py_NewRef(&_Py_ID(true));
     }
     else if (obj == Py_False) {
-        _Py_static_string(PyId_false, "false");
-        PyObject *s_false = _PyUnicode_FromId(&PyId_false);
-        if (s_false == NULL) {
-            return NULL;
-        }
-        return Py_NewRef(s_false);
+        return Py_NewRef(&_Py_ID(false));
     }
     else {
         PyErr_SetString(PyExc_ValueError, "not a const");
@@ -1530,7 +1509,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
 
     if (*first) {
         *first = false;
-    } 
+    }
     else {
         if (_PyUnicodeWriter_WriteStr(writer, s->item_separator) < 0) {
             Py_DECREF(keystr);



More information about the Python-checkins mailing list