summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/selectmodule.c2
-rw-r--r--Parser/tokenizer.c19
-rw-r--r--Parser/tokenizer.h2
3 files changed, 21 insertions, 2 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index de80b82..81fedd5 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 38a9e9a..725a2f1 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 9abc598..bdef859 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 *));