[Python-checkins] gh-93382: Sync up `co_code` changes with 3.11 (GH-94227)

Fidget-Spinner webhook-mailer at python.org
Fri Jun 24 13:55:22 EDT 2022


https://github.com/python/cpython/commit/50a5ab2c0bf7bd10d85e80c9f71a7b7245a0682a
commit: 50a5ab2c0bf7bd10d85e80c9f71a7b7245a0682a
branch: main
author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com>
committer: Fidget-Spinner <28750310+Fidget-Spinner at users.noreply.github.com>
date: 2022-06-25T01:55:18+08:00
summary:

gh-93382: Sync up `co_code` changes with 3.11 (GH-94227)

Sync up co_code changes with 3.11 commit 852b4d4bcd12b0b6839a015a262ce976b134f6f3.

files:
M Include/cpython/code.h
M Misc/NEWS.d/next/Core and Builtins/2022-05-31-16-36-30.gh-issue-93382.Jf6gAj.rst
M Objects/codeobject.c
M Tools/scripts/deepfreeze.py

diff --git a/Include/cpython/code.h b/Include/cpython/code.h
index ebc0df9323bf6..595cd9e94f31a 100644
--- a/Include/cpython/code.h
+++ b/Include/cpython/code.h
@@ -90,7 +90,7 @@ typedef uint16_t _Py_CODEUNIT;
     PyObject *co_qualname;        /* unicode (qualname, for reference) */      \
     PyObject *co_linetable;       /* bytes object that holds location info */  \
     PyObject *co_weakreflist;     /* to support weakrefs to code objects */    \
-    void *_co_code;               /* cached co_code object/attribute */        \
+    PyObject *_co_code;           /* cached co_code object/attribute */        \
     int _co_firsttraceable;       /* index of first traceable instruction */   \
     char *_co_linearray;          /* array of line offsets */                  \
     /* Scratch space for extra data relating to the code object.               \
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-31-16-36-30.gh-issue-93382.Jf6gAj.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-31-16-36-30.gh-issue-93382.Jf6gAj.rst
index 04b9e8ba48187..1fe821edf5a14 100644
--- a/Misc/NEWS.d/next/Core and Builtins/2022-05-31-16-36-30.gh-issue-93382.Jf6gAj.rst	
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-31-16-36-30.gh-issue-93382.Jf6gAj.rst	
@@ -1 +1,2 @@
-Speed up the :c:func:`PyCode_GetCode` function which also improves accessing the :attr:`~types.CodeType.co_code` attribute in Python.
+Cache the result of :c:func:`PyCode_GetCode` function to restore the O(1)
+lookup of the :attr:`~types.CodeType.co_code` attribute.
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 707de11d47922..c38c51b45321c 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -1440,7 +1440,7 @@ _PyCode_GetCode(PyCodeObject *co)
     }
     deopt_code((_Py_CODEUNIT *)PyBytes_AS_STRING(code), Py_SIZE(co));
     assert(co->_co_code == NULL);
-    co->_co_code = (void *)Py_NewRef(code);
+    co->_co_code = Py_NewRef(code);
     return code;
 }
 
diff --git a/Tools/scripts/deepfreeze.py b/Tools/scripts/deepfreeze.py
index a46cf6c01647f..f9fd4e36a81ba 100644
--- a/Tools/scripts/deepfreeze.py
+++ b/Tools/scripts/deepfreeze.py
@@ -274,6 +274,7 @@ def generate_code(self, name: str, code: types.CodeType) -> str:
             self.write(f".co_name = {co_name},")
             self.write(f".co_qualname = {co_qualname},")
             self.write(f".co_linetable = {co_linetable},")
+            self.write(f"._co_code = NULL,")
             self.write("._co_linearray = NULL,")
             self.write(f".co_code_adaptive = {co_code_adaptive},")
             for i, op in enumerate(code.co_code[::2]):



More information about the Python-checkins mailing list