@@ -156,16 +156,16 @@ validate_and_copy_tuple(PyObject *tup)
156156
157157// This is also used in compile.c.
158158void
159- _Py_set_localsplus_info (int offset , PyObject * name , _PyLocalsPlusKind kind ,
160- PyObject * names , _PyLocalsPlusKinds kinds )
159+ _Py_set_localsplus_info (int offset , PyObject * name , _PyLocals_Kind kind ,
160+ PyObject * names , PyObject * kinds )
161161{
162162 Py_INCREF (name );
163163 PyTuple_SET_ITEM (names , offset , name );
164- kinds [ offset ] = kind ;
164+ _PyLocals_SetKind ( kinds , offset , kind ) ;
165165}
166166
167167static void
168- get_localsplus_counts (PyObject * names , _PyLocalsPlusKinds kinds ,
168+ get_localsplus_counts (PyObject * names , PyObject * kinds ,
169169 int * pnlocals , int * pnplaincellvars , int * pncellvars ,
170170 int * pnfreevars )
171171{
@@ -175,17 +175,18 @@ get_localsplus_counts(PyObject *names, _PyLocalsPlusKinds kinds,
175175 int nfreevars = 0 ;
176176 Py_ssize_t nlocalsplus = PyTuple_GET_SIZE (names );
177177 for (int i = 0 ; i < nlocalsplus ; i ++ ) {
178- if (kinds [i ] & CO_FAST_LOCAL ) {
178+ _PyLocals_Kind kind = _PyLocals_GetKind (kinds , i );
179+ if (kind & CO_FAST_LOCAL ) {
179180 nlocals += 1 ;
180- if (kinds [ i ] & CO_FAST_CELL ) {
181+ if (kind & CO_FAST_CELL ) {
181182 ncellvars += 1 ;
182183 }
183184 }
184- else if (kinds [ i ] & CO_FAST_CELL ) {
185+ else if (kind & CO_FAST_CELL ) {
185186 ncellvars += 1 ;
186187 nplaincellvars += 1 ;
187188 }
188- else if (kinds [ i ] & CO_FAST_FREE ) {
189+ else if (kind & CO_FAST_FREE ) {
189190 nfreevars += 1 ;
190191 }
191192 }
@@ -204,15 +205,16 @@ get_localsplus_counts(PyObject *names, _PyLocalsPlusKinds kinds,
204205}
205206
206207static PyObject *
207- get_localsplus_names (PyCodeObject * co , _PyLocalsPlusKind kind , int num )
208+ get_localsplus_names (PyCodeObject * co , _PyLocals_Kind kind , int num )
208209{
209210 PyObject * names = PyTuple_New (num );
210211 if (names == NULL ) {
211212 return NULL ;
212213 }
213214 int index = 0 ;
214215 for (int offset = 0 ; offset < co -> co_nlocalsplus ; offset ++ ) {
215- if ((co -> co_localspluskinds [offset ] & kind ) == 0 ) {
216+ _PyLocals_Kind k = _PyLocals_GetKind (co -> co_localspluskinds , offset );
217+ if ((k & kind ) == 0 ) {
216218 continue ;
217219 }
218220 assert (index < num );
@@ -236,8 +238,9 @@ _PyCode_Validate(struct _PyCodeConstructor *con)
236238 con -> consts == NULL || !PyTuple_Check (con -> consts ) ||
237239 con -> names == NULL || !PyTuple_Check (con -> names ) ||
238240 con -> localsplusnames == NULL || !PyTuple_Check (con -> localsplusnames ) ||
239- (PyTuple_GET_SIZE (con -> localsplusnames ) && con -> localspluskinds == NULL ) ||
240- (!PyTuple_GET_SIZE (con -> localsplusnames ) && con -> localspluskinds != NULL ) ||
241+ con -> localspluskinds == NULL || !PyBytes_Check (con -> localspluskinds ) ||
242+ PyTuple_GET_SIZE (con -> localsplusnames )
243+ != PyBytes_GET_SIZE (con -> localspluskinds ) ||
241244 con -> name == NULL || !PyUnicode_Check (con -> name ) ||
242245 con -> filename == NULL || !PyUnicode_Check (con -> filename ) ||
243246 con -> linetable == NULL || !PyBytes_Check (con -> linetable ) ||
@@ -309,7 +312,7 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con)
309312
310313 Py_INCREF (con -> localsplusnames );
311314 co -> co_localsplusnames = con -> localsplusnames ;
312- // We take ownership of the kinds array.
315+ Py_INCREF ( con -> localspluskinds );
313316 co -> co_localspluskinds = con -> localspluskinds ;
314317
315318 co -> co_argcount = con -> argcount ;
@@ -394,7 +397,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
394397{
395398 PyCodeObject * co = NULL ;
396399 PyObject * localsplusnames = NULL ;
397- _PyLocalsPlusKinds localspluskinds = NULL ;
400+ PyObject * localspluskinds = NULL ;
398401
399402 if (varnames == NULL || !PyTuple_Check (varnames ) ||
400403 cellvars == NULL || !PyTuple_Check (cellvars ) ||
@@ -413,7 +416,8 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
413416 if (localsplusnames == NULL ) {
414417 goto error ;
415418 }
416- if (_PyCode_InitLocalsPlusKinds (nlocalsplus , & localspluskinds ) < 0 ) {
419+ localspluskinds = PyBytes_FromStringAndSize (NULL , nlocalsplus );
420+ if (localspluskinds == NULL ) {
417421 goto error ;
418422 }
419423 int offset = 0 ;
@@ -438,7 +442,8 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
438442 // Merge the localsplus indices.
439443 nlocalsplus -= 1 ;
440444 offset -= 1 ;
441- localspluskinds [argoffset ] |= CO_FAST_CELL ;
445+ _PyLocals_Kind kind = _PyLocals_GetKind (localspluskinds , argoffset );
446+ _PyLocals_SetKind (localspluskinds , argoffset , kind | CO_FAST_CELL );
442447 continue ;
443448 }
444449 _Py_set_localsplus_info (offset , name , CO_FAST_CELL ,
@@ -495,7 +500,6 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
495500 goto error ;
496501 }
497502
498- localspluskinds = NULL ; // This keeps it from getting freed below.
499503 Py_INCREF (varnames );
500504 co -> co_varnames = varnames ;
501505 Py_INCREF (cellvars );
@@ -505,7 +509,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
505509
506510error :
507511 Py_XDECREF (localsplusnames );
508- _PyCode_ClearLocalsPlusKinds (localspluskinds );
512+ Py_XDECREF (localspluskinds );
509513 return co ;
510514}
511515
@@ -558,6 +562,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
558562 .consts = nulltuple ,
559563 .names = nulltuple ,
560564 .localsplusnames = nulltuple ,
565+ .localspluskinds = emptystring ,
561566 .exceptiontable = emptystring ,
562567 };
563568 result = _PyCode_New (& con );
@@ -1142,7 +1147,7 @@ code_dealloc(PyCodeObject *co)
11421147 Py_XDECREF (co -> co_consts );
11431148 Py_XDECREF (co -> co_names );
11441149 Py_XDECREF (co -> co_localsplusnames );
1145- _PyCode_ClearLocalsPlusKinds (co -> co_localspluskinds );
1150+ Py_XDECREF (co -> co_localspluskinds );
11461151 Py_XDECREF (co -> co_varnames );
11471152 Py_XDECREF (co -> co_freevars );
11481153 Py_XDECREF (co -> co_cellvars );
0 commit comments