@@ -26,91 +26,80 @@ typedef uint16_t _Py_CODEUNIT;
2626// Use "unsigned char" instead of "uint8_t" here to avoid illegal aliasing:
2727#define _Py_SET_OPCODE (word , opcode ) (((unsigned char *)&(word))[0] = (opcode))
2828
29+ // To avoid repeating ourselves in deepfreeze.py, all PyCodeObject members are
30+ // defined in this macro:
31+ #define _PyCode_DEF (SIZE ) { \
32+ PyObject_VAR_HEAD \
33+ \
34+ /* Note only the following fields are used in hash and/or comparisons \
35+ * \
36+ * - co_name \
37+ * - co_argcount \
38+ * - co_posonlyargcount \
39+ * - co_kwonlyargcount \
40+ * - co_nlocals \
41+ * - co_stacksize \
42+ * - co_flags \
43+ * - co_firstlineno \
44+ * - co_consts \
45+ * - co_names \
46+ * - co_localsplusnames \
47+ * This is done to preserve the name and line number for tracebacks \
48+ * and debuggers; otherwise, constant de-duplication would collapse \
49+ * identical functions/lambdas defined on different lines. \
50+ */ \
51+ \
52+ /* These fields are set with provided values on new code objects. */ \
53+ \
54+ /* The hottest fields (in the eval loop) are grouped here at the top. */ \
55+ PyObject * co_consts ; /* list (constants used) */ \
56+ PyObject * co_names ; /* list of strings (names used) */ \
57+ PyObject * co_exceptiontable ; /* Byte string encoding exception handling \
58+ table */ \
59+ int co_flags ; /* CO_..., see below */ \
60+ int co_warmup ; /* Warmup counter for quickening */ \
61+ \
62+ /* The rest are not so impactful on performance. */ \
63+ int co_argcount ; /* #arguments, except *args */ \
64+ int co_posonlyargcount ; /* #positional only arguments */ \
65+ int co_kwonlyargcount ; /* #keyword only arguments */ \
66+ int co_stacksize ; /* #entries needed for evaluation stack */ \
67+ int co_firstlineno ; /* first source line number */ \
68+ \
69+ /* redundant values (derived from co_localsplusnames and \
70+ co_localspluskinds) */ \
71+ int co_nlocalsplus ; /* number of local + cell + free variables \
72+ */ \
73+ int co_nlocals ; /* number of local variables */ \
74+ int co_nplaincellvars ; /* number of non-arg cell variables */ \
75+ int co_ncellvars ; /* total number of cell variables */ \
76+ int co_nfreevars ; /* number of free variables */ \
77+ \
78+ PyObject * co_localsplusnames ; /* tuple mapping offsets to names */ \
79+ PyObject * co_localspluskinds ; /* Bytes mapping to local kinds (one byte \
80+ per variable) */ \
81+ PyObject * co_filename ; /* unicode (where it was loaded from) */ \
82+ PyObject * co_name ; /* unicode (name, for reference) */ \
83+ PyObject * co_qualname ; /* unicode (qualname, for reference) */ \
84+ PyObject * co_linetable ; /* bytes (encoding addr<->lineno mapping) \
85+ See Objects/lnotab_notes.txt for details. \
86+ */ \
87+ PyObject * co_endlinetable ; /* bytes object that holds end lineno for \
88+ instructions separated across different \
89+ lines */ \
90+ PyObject * co_columntable ; /* bytes object that holds start/end column \
91+ offset each instruction */ \
92+ \
93+ PyObject * co_weakreflist ; /* to support weakrefs to code objects */ \
94+ /* Scratch space for extra data relating to the code object. \
95+ Type is a void* to keep the format private in codeobject.c to force \
96+ people to go through the proper APIs. */ \
97+ void * co_extra ; \
98+ char co_code_adaptive [(SIZE )]; \
99+ }
29100
30101/* Bytecode object */
31- struct PyCodeObject {
32- PyObject_HEAD
33-
34- /* Note only the following fields are used in hash and/or comparisons
35- *
36- * - co_name
37- * - co_argcount
38- * - co_posonlyargcount
39- * - co_kwonlyargcount
40- * - co_nlocals
41- * - co_stacksize
42- * - co_flags
43- * - co_firstlineno
44- * - co_code
45- * - co_consts
46- * - co_names
47- * - co_varnames
48- * - co_freevars
49- * - co_cellvars
50- *
51- * This is done to preserve the name and line number for tracebacks
52- * and debuggers; otherwise, constant de-duplication would collapse
53- * identical functions/lambdas defined on different lines.
54- */
55-
56- /* These fields are set with provided values on new code objects. */
57-
58- // The hottest fields (in the eval loop) are grouped here at the top.
59- PyObject * co_consts ; /* list (constants used) */
60- PyObject * co_names ; /* list of strings (names used) */
61- _Py_CODEUNIT * co_firstinstr ; /* Pointer to first instruction, used for quickening.
62- Unlike the other "hot" fields, this one is
63- actually derived from co_code. */
64- PyObject * co_exceptiontable ; /* Byte string encoding exception handling table */
65- int co_flags ; /* CO_..., see below */
66- int co_warmup ; /* Warmup counter for quickening */
67-
68- // The rest are not so impactful on performance.
69- int co_argcount ; /* #arguments, except *args */
70- int co_posonlyargcount ; /* #positional only arguments */
71- int co_kwonlyargcount ; /* #keyword only arguments */
72- int co_stacksize ; /* #entries needed for evaluation stack */
73- int co_firstlineno ; /* first source line number */
74- PyObject * co_code ; /* instruction opcodes */
75- PyObject * co_localsplusnames ; /* tuple mapping offsets to names */
76- PyObject * co_localspluskinds ; /* Bytes mapping to local kinds (one byte per variable) */
77- PyObject * co_filename ; /* unicode (where it was loaded from) */
78- PyObject * co_name ; /* unicode (name, for reference) */
79- PyObject * co_qualname ; /* unicode (qualname, for reference) */
80- PyObject * co_linetable ; /* bytes (encoding addr<->lineno mapping) See
81- Objects/lnotab_notes.txt for details. */
82- PyObject * co_endlinetable ; /* bytes object that holds end lineno for
83- instructions separated across different
84- lines */
85- PyObject * co_columntable ; /* bytes object that holds start/end column
86- offset each instruction */
87-
88- /* These fields are set with computed values on new code objects. */
89-
90- // redundant values (derived from co_localsplusnames and co_localspluskinds)
91- int co_nlocalsplus ; /* number of local + cell + free variables */
92- int co_nlocals ; /* number of local variables */
93- int co_nplaincellvars ; /* number of non-arg cell variables */
94- int co_ncellvars ; /* total number of cell variables */
95- int co_nfreevars ; /* number of free variables */
96- // lazily-computed values
97- PyObject * co_varnames ; /* tuple of strings (local variable names) */
98- PyObject * co_cellvars ; /* tuple of strings (cell variable names) */
99- PyObject * co_freevars ; /* tuple of strings (free variable names) */
100-
101- /* The remaining fields are zeroed out on new code objects. */
102-
103- PyObject * co_weakreflist ; /* to support weakrefs to code objects */
104- /* Scratch space for extra data relating to the code object.
105- Type is a void* to keep the format private in codeobject.c to force
106- people to go through the proper APIs. */
107- void * co_extra ;
108- /* Quickened instructions and cache, or NULL
109- This should be treated as opaque by all code except the specializer and
110- interpreter. */
111- _Py_CODEUNIT * co_quickened ;
112-
113- };
102+ struct PyCodeObject _PyCode_DEF (1 );
114103
115104/* Masks for co_flags above */
116105#define CO_OPTIMIZED 0x0001
@@ -151,6 +140,8 @@ PyAPI_DATA(PyTypeObject) PyCode_Type;
151140
152141#define PyCode_Check (op ) Py_IS_TYPE(op, &PyCode_Type)
153142#define PyCode_GetNumFree (op ) ((op)->co_nfreevars)
143+ #define _PyCode_CODE (CO ) ((_Py_CODEUNIT *)(CO)->co_code_adaptive)
144+ #define _PyCode_NBYTES (CO ) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT))
154145
155146/* Public interface */
156147PyAPI_FUNC (PyCodeObject * ) PyCode_New (
0 commit comments