Skip to content

Commit 4d73ae7

Browse files
authored
bpo-18407: ast.c uses Py_ssize_t for asdl_seq_LEN() iterator (pythonGH-10655)
When iterating using asdl_seq_LEN(), use 'Py_ssize_t' type instead of 'int' for the iterator variable, to avoid downcast on 64-bit platforms. _Py_asdl_int_seq_new() now also ensures that the index is greater than or equal to 0.
1 parent c48ff73 commit 4d73ae7

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

Include/asdl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena);
3636
do { \
3737
Py_ssize_t _asdl_i = (I); \
3838
assert((S) != NULL); \
39-
assert(_asdl_i < (S)->size); \
39+
assert(0 <= _asdl_i && _asdl_i < (S)->size); \
4040
(S)->elements[_asdl_i] = (V); \
4141
} while (0)
4242
#else

Python/ast.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ static int validate_expr(expr_ty, expr_context_ty);
2222
static int
2323
validate_comprehension(asdl_seq *gens)
2424
{
25-
int i;
25+
Py_ssize_t i;
2626
if (!asdl_seq_LEN(gens)) {
2727
PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
2828
return 0;
@@ -46,7 +46,7 @@ validate_slice(slice_ty slice)
4646
(!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
4747
(!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
4848
case ExtSlice_kind: {
49-
int i;
49+
Py_ssize_t i;
5050
if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
5151
return 0;
5252
for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
@@ -65,7 +65,7 @@ validate_slice(slice_ty slice)
6565
static int
6666
validate_keywords(asdl_seq *keywords)
6767
{
68-
int i;
68+
Py_ssize_t i;
6969
for (i = 0; i < asdl_seq_LEN(keywords); i++)
7070
if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
7171
return 0;
@@ -75,7 +75,7 @@ validate_keywords(asdl_seq *keywords)
7575
static int
7676
validate_args(asdl_seq *args)
7777
{
78-
int i;
78+
Py_ssize_t i;
7979
for (i = 0; i < asdl_seq_LEN(args); i++) {
8080
arg_ty arg = asdl_seq_GET(args, i);
8181
if (arg->annotation && !validate_expr(arg->annotation, Load))
@@ -348,7 +348,7 @@ validate_body(asdl_seq *body, const char *owner)
348348
static int
349349
validate_stmt(stmt_ty stmt)
350350
{
351-
int i;
351+
Py_ssize_t i;
352352
switch (stmt->kind) {
353353
case FunctionDef_kind:
354354
return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
@@ -490,7 +490,7 @@ validate_stmt(stmt_ty stmt)
490490
static int
491491
validate_stmts(asdl_seq *seq)
492492
{
493-
int i;
493+
Py_ssize_t i;
494494
for (i = 0; i < asdl_seq_LEN(seq); i++) {
495495
stmt_ty stmt = asdl_seq_GET(seq, i);
496496
if (stmt) {
@@ -509,7 +509,7 @@ validate_stmts(asdl_seq *seq)
509509
static int
510510
validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
511511
{
512-
int i;
512+
Py_ssize_t i;
513513
for (i = 0; i < asdl_seq_LEN(exprs); i++) {
514514
expr_ty expr = asdl_seq_GET(exprs, i);
515515
if (expr) {
@@ -1060,7 +1060,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
10601060
context for all the contained elements.
10611061
*/
10621062
if (s) {
1063-
int i;
1063+
Py_ssize_t i;
10641064

10651065
for (i = 0; i < asdl_seq_LEN(s); i++) {
10661066
if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
@@ -2355,7 +2355,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
23552355
by treating the sequence as a tuple literal if there are
23562356
no slice features.
23572357
*/
2358-
int j;
2358+
Py_ssize_t j;
23592359
slice_ty slc;
23602360
expr_ty e;
23612361
int simple = 1;

0 commit comments

Comments
 (0)