Skip to content

Commit e10e7da

Browse files
Be more strict about types.
1 parent 68c7776 commit e10e7da

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

Python/compile.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)