@@ -7230,8 +7230,6 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7230
7230
PyObject * localsplusnames = NULL ;
7231
7231
_PyLocalsPlusKinds localspluskinds = NULL ;
7232
7232
PyObject * name = NULL ;
7233
- int flags ;
7234
- int posorkeywordargcount , posonlyargcount , kwonlyargcount ;
7235
7233
7236
7234
names = dict_keys_inorder (c -> u -> u_names , 0 );
7237
7235
if (!names ) {
@@ -7241,9 +7239,10 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7241
7239
goto error ;
7242
7240
}
7243
7241
7244
- flags = compute_code_flags (c );
7245
- if (flags < 0 )
7242
+ int flags = compute_code_flags (c );
7243
+ if (flags < 0 ) {
7246
7244
goto error ;
7245
+ }
7247
7246
7248
7247
consts = PyList_AsTuple (constslist ); /* PyCode_New requires a tuple */
7249
7248
if (consts == NULL ) {
@@ -7253,9 +7252,23 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7253
7252
goto error ;
7254
7253
}
7255
7254
7256
- Py_ssize_t nlocalsplus = PyDict_GET_SIZE (c -> u -> u_varnames ) +
7257
- PyDict_GET_SIZE (c -> u -> u_cellvars ) +
7258
- PyDict_GET_SIZE (c -> u -> u_freevars );
7255
+ assert (c -> u -> u_posonlyargcount < INT_MAX );
7256
+ assert (c -> u -> u_argcount < INT_MAX );
7257
+ assert (c -> u -> u_kwonlyargcount < INT_MAX );
7258
+ int posonlyargcount = (int )c -> u -> u_posonlyargcount ;
7259
+ int posorkwargcount = (int )c -> u -> u_argcount ;
7260
+ assert (INT_MAX - posonlyargcount - posorkwargcount > 0 );
7261
+ int kwonlyargcount = (int )c -> u -> u_kwonlyargcount ;
7262
+
7263
+ Py_ssize_t nlocals = PyDict_GET_SIZE (c -> u -> u_varnames );
7264
+ Py_ssize_t ncellvars = PyDict_GET_SIZE (c -> u -> u_cellvars );
7265
+ Py_ssize_t nfreevars = PyDict_GET_SIZE (c -> u -> u_freevars );
7266
+ assert (nlocals < INT_MAX );
7267
+ assert (ncellvars < INT_MAX );
7268
+ assert (nfreevars < INT_MAX );
7269
+ assert (INT_MAX - nlocals - ncellvars - nfreevars > 0 );
7270
+ int nlocalsplus = (int )nlocals + (int )ncellvars + (int )nfreevars ;
7271
+
7259
7272
localsplusnames = PyTuple_New (nlocalsplus );
7260
7273
if (localsplusnames == NULL ) {
7261
7274
goto error ;
@@ -7265,9 +7278,6 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7265
7278
}
7266
7279
compute_localsplus_info (c , localsplusnames , localspluskinds );
7267
7280
7268
- posonlyargcount = Py_SAFE_DOWNCAST (c -> u -> u_posonlyargcount , Py_ssize_t , int );
7269
- posorkeywordargcount = Py_SAFE_DOWNCAST (c -> u -> u_argcount , Py_ssize_t , int );
7270
- kwonlyargcount = Py_SAFE_DOWNCAST (c -> u -> u_kwonlyargcount , Py_ssize_t , int );
7271
7281
struct _PyCodeConstructor con = {
7272
7282
.filename = c -> c_filename ,
7273
7283
.name = c -> u -> u_name ,
@@ -7283,7 +7293,7 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7283
7293
.localsplusnames = localsplusnames ,
7284
7294
.localspluskinds = localspluskinds ,
7285
7295
7286
- .argcount = posonlyargcount + posorkeywordargcount ,
7296
+ .argcount = posonlyargcount + posorkwargcount ,
7287
7297
.posonlyargcount = posonlyargcount ,
7288
7298
.kwonlyargcount = kwonlyargcount ,
7289
7299
0 commit comments