@@ -7230,8 +7230,6 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
72307230 PyObject * localsplusnames = NULL ;
72317231 _PyLocalsPlusKinds localspluskinds = NULL ;
72327232 PyObject * name = NULL ;
7233- int flags ;
7234- int posorkeywordargcount , posonlyargcount , kwonlyargcount ;
72357233
72367234 names = dict_keys_inorder (c -> u -> u_names , 0 );
72377235 if (!names ) {
@@ -7241,9 +7239,10 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
72417239 goto error ;
72427240 }
72437241
7244- flags = compute_code_flags (c );
7245- if (flags < 0 )
7242+ int flags = compute_code_flags (c );
7243+ if (flags < 0 ) {
72467244 goto error ;
7245+ }
72477246
72487247 consts = PyList_AsTuple (constslist ); /* PyCode_New requires a tuple */
72497248 if (consts == NULL ) {
@@ -7253,9 +7252,23 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
72537252 goto error ;
72547253 }
72557254
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+
72597272 localsplusnames = PyTuple_New (nlocalsplus );
72607273 if (localsplusnames == NULL ) {
72617274 goto error ;
@@ -7265,9 +7278,6 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
72657278 }
72667279 compute_localsplus_info (c , localsplusnames , localspluskinds );
72677280
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 );
72717281 struct _PyCodeConstructor con = {
72727282 .filename = c -> c_filename ,
72737283 .name = c -> u -> u_name ,
@@ -7283,7 +7293,7 @@ makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
72837293 .localsplusnames = localsplusnames ,
72847294 .localspluskinds = localspluskinds ,
72857295
7286- .argcount = posonlyargcount + posorkeywordargcount ,
7296+ .argcount = posonlyargcount + posorkwargcount ,
72877297 .posonlyargcount = posonlyargcount ,
72887298 .kwonlyargcount = kwonlyargcount ,
72897299
0 commit comments