diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index de80b826599..81fedd51956 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -49,10 +49,12 @@ list2set(list, set, fd2obj) v = getintvalue(o); } else if ( (filenomethod = getattr(o, "fileno")) != NULL ) { fno = call_object(filenomethod, NULL); + DECREF(filenomethod); if ( fno == NULL ) return -1; if ( !is_intobject(fno) ) { err_badarg(); + DECREF(fno); return -1; } v = getintvalue(fno); diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 38a9e9ad9f6..725a2f1221b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -109,6 +109,7 @@ tok_new() tok->pendin = 0; tok->prompt = tok->nextprompt = NULL; tok->lineno = 0; + tok->level = 0; return tok; } @@ -390,7 +391,7 @@ tok_get(tok, p_start, p_end) /* We can't jump back right here since we still may need to skip to the end of a comment */ } - if (!blankline) { + if (!blankline && tok->level == 0) { if (col == tok->indstack[tok->indent]) { /* No change */ } @@ -483,7 +484,7 @@ tok_get(tok, p_start, p_end) /* Newline */ if (c == '\n') { tok->atbol = 1; - if (blankline) + if (blankline || tok->level > 0) goto nextline; *p_end = tok->cur - 1; /* Leave '\n' out of the string */ return NEWLINE; @@ -612,6 +613,20 @@ tok_get(tok, p_start, p_end) tok_backup(tok, c2); } + /* Keep track of parenteses nesting level */ + switch (c) { + case '(': + case '[': + case '{': + tok->level++; + break; + case ')': + case ']': + case '}': + tok->level--; + break; + } + /* Punctuation character */ *p_end = tok->cur; return tok_1char(c); diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 9abc59878fc..bdef859ce7b 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -46,6 +46,8 @@ struct tok_state { int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ char *prompt, *nextprompt; /* For interactive prompting */ int lineno; /* Current line number */ + int level; /* () [] {} Parentheses nesting level */ + /* Used to allow free continuations inside them */ }; extern struct tok_state *tok_setups PROTO((char *));