@@ -156,16 +156,16 @@ validate_and_copy_tuple(PyObject *tup)
156
156
157
157
// This is also used in compile.c.
158
158
void
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 )
161
161
{
162
162
Py_INCREF (name );
163
163
PyTuple_SET_ITEM (names , offset , name );
164
- kinds [ offset ] = kind ;
164
+ _PyLocals_SetKind ( kinds , offset , kind ) ;
165
165
}
166
166
167
167
static void
168
- get_localsplus_counts (PyObject * names , _PyLocalsPlusKinds kinds ,
168
+ get_localsplus_counts (PyObject * names , PyObject * kinds ,
169
169
int * pnlocals , int * pnplaincellvars , int * pncellvars ,
170
170
int * pnfreevars )
171
171
{
@@ -175,17 +175,18 @@ get_localsplus_counts(PyObject *names, _PyLocalsPlusKinds kinds,
175
175
int nfreevars = 0 ;
176
176
Py_ssize_t nlocalsplus = PyTuple_GET_SIZE (names );
177
177
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 ) {
179
180
nlocals += 1 ;
180
- if (kinds [ i ] & CO_FAST_CELL ) {
181
+ if (kind & CO_FAST_CELL ) {
181
182
ncellvars += 1 ;
182
183
}
183
184
}
184
- else if (kinds [ i ] & CO_FAST_CELL ) {
185
+ else if (kind & CO_FAST_CELL ) {
185
186
ncellvars += 1 ;
186
187
nplaincellvars += 1 ;
187
188
}
188
- else if (kinds [ i ] & CO_FAST_FREE ) {
189
+ else if (kind & CO_FAST_FREE ) {
189
190
nfreevars += 1 ;
190
191
}
191
192
}
@@ -204,15 +205,16 @@ get_localsplus_counts(PyObject *names, _PyLocalsPlusKinds kinds,
204
205
}
205
206
206
207
static PyObject *
207
- get_localsplus_names (PyCodeObject * co , _PyLocalsPlusKind kind , int num )
208
+ get_localsplus_names (PyCodeObject * co , _PyLocals_Kind kind , int num )
208
209
{
209
210
PyObject * names = PyTuple_New (num );
210
211
if (names == NULL ) {
211
212
return NULL ;
212
213
}
213
214
int index = 0 ;
214
215
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 ) {
216
218
continue ;
217
219
}
218
220
assert (index < num );
@@ -236,8 +238,9 @@ _PyCode_Validate(struct _PyCodeConstructor *con)
236
238
con -> consts == NULL || !PyTuple_Check (con -> consts ) ||
237
239
con -> names == NULL || !PyTuple_Check (con -> names ) ||
238
240
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 ) ||
241
244
con -> name == NULL || !PyUnicode_Check (con -> name ) ||
242
245
con -> filename == NULL || !PyUnicode_Check (con -> filename ) ||
243
246
con -> linetable == NULL || !PyBytes_Check (con -> linetable ) ||
@@ -309,7 +312,7 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con)
309
312
310
313
Py_INCREF (con -> localsplusnames );
311
314
co -> co_localsplusnames = con -> localsplusnames ;
312
- // We take ownership of the kinds array.
315
+ Py_INCREF ( con -> localspluskinds );
313
316
co -> co_localspluskinds = con -> localspluskinds ;
314
317
315
318
co -> co_argcount = con -> argcount ;
@@ -394,7 +397,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
394
397
{
395
398
PyCodeObject * co = NULL ;
396
399
PyObject * localsplusnames = NULL ;
397
- _PyLocalsPlusKinds localspluskinds = NULL ;
400
+ PyObject * localspluskinds = NULL ;
398
401
399
402
if (varnames == NULL || !PyTuple_Check (varnames ) ||
400
403
cellvars == NULL || !PyTuple_Check (cellvars ) ||
@@ -413,7 +416,8 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
413
416
if (localsplusnames == NULL ) {
414
417
goto error ;
415
418
}
416
- if (_PyCode_InitLocalsPlusKinds (nlocalsplus , & localspluskinds ) < 0 ) {
419
+ localspluskinds = PyBytes_FromStringAndSize (NULL , nlocalsplus );
420
+ if (localspluskinds == NULL ) {
417
421
goto error ;
418
422
}
419
423
int offset = 0 ;
@@ -438,7 +442,8 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
438
442
// Merge the localsplus indices.
439
443
nlocalsplus -= 1 ;
440
444
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 );
442
447
continue ;
443
448
}
444
449
_Py_set_localsplus_info (offset , name , CO_FAST_CELL ,
@@ -495,7 +500,6 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
495
500
goto error ;
496
501
}
497
502
498
- localspluskinds = NULL ; // This keeps it from getting freed below.
499
503
Py_INCREF (varnames );
500
504
co -> co_varnames = varnames ;
501
505
Py_INCREF (cellvars );
@@ -505,7 +509,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
505
509
506
510
error :
507
511
Py_XDECREF (localsplusnames );
508
- _PyCode_ClearLocalsPlusKinds (localspluskinds );
512
+ Py_XDECREF (localspluskinds );
509
513
return co ;
510
514
}
511
515
@@ -558,6 +562,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
558
562
.consts = nulltuple ,
559
563
.names = nulltuple ,
560
564
.localsplusnames = nulltuple ,
565
+ .localspluskinds = emptystring ,
561
566
.exceptiontable = emptystring ,
562
567
};
563
568
result = _PyCode_New (& con );
@@ -1142,7 +1147,7 @@ code_dealloc(PyCodeObject *co)
1142
1147
Py_XDECREF (co -> co_consts );
1143
1148
Py_XDECREF (co -> co_names );
1144
1149
Py_XDECREF (co -> co_localsplusnames );
1145
- _PyCode_ClearLocalsPlusKinds (co -> co_localspluskinds );
1150
+ Py_XDECREF (co -> co_localspluskinds );
1146
1151
Py_XDECREF (co -> co_varnames );
1147
1152
Py_XDECREF (co -> co_freevars );
1148
1153
Py_XDECREF (co -> co_cellvars );
0 commit comments