#define E_DECODE 22 /* Error in decoding into Unicode */
#define E_LINECONT 25 /* Unexpected characters after a line continuation */
#define E_BADSINGLE 27 /* Ill-formed single statement input */
+#define E_INTERACT_STOP 28 /* Interactive mode stopped tokenization */
#ifdef __cplusplus
}
--- /dev/null
+Avoid side effects of checking for specialized syntax errors in the REPL
+that was causing it to ask for extra tokens after a syntax error had been
+detected. Patch by Pablo Galindo
}
p->mark = 0;
p->call_invalid_rules = 1;
+ // Don't try to get extra tokens in interactive mode when trying to
+ // raise specialized errors in the second pass.
+ p->tok->interactive_underflow = IUNDERFLOW_STOP;
}
static int
tok->async_def = 0;
tok->async_def_indent = 0;
tok->async_def_nl = 0;
+ tok->interactive_underflow = IUNDERFLOW_NORMAL;
return tok;
}
static int
tok_underflow_interactive(struct tok_state *tok) {
+ if (tok->interactive_underflow == IUNDERFLOW_STOP) {
+ tok->done = E_INTERACT_STOP;
+ return 1;
+ }
char *newtok = PyOS_Readline(stdin, stdout, tok->prompt);
if (newtok != NULL) {
char *translated = translate_newlines(newtok, 0, tok);
}
}
+ if (tok->done == E_INTERACT_STOP) {
+ return ENDMARKER;
+ }
+
/* Check for EOF and errors now */
if (c == EOF) {
if (tok->level) {
STATE_NORMAL
};
+enum interactive_underflow_t {
+ /* Normal mode of operation: return a new token when asked in interactie mode */
+ IUNDERFLOW_NORMAL,
+ /* Forcefully return ENDMARKER when asked for a new token in interactive mode. This
+ * can be used to prevent the tokenizer to promt the user for new tokens */
+ IUNDERFLOW_STOP,
+};
+
/* Tokenizer state */
struct tok_state {
/* Input state; buf <= cur <= inp <= end */
int async_def_indent; /* Indentation level of the outermost 'async def'. */
int async_def_nl; /* =1 if the outermost 'async def' had at least one
NEWLINE token after it. */
+ /* How to proceed when asked for a new token in interactive mode */
+ enum interactive_underflow_t interactive_underflow;
};
extern struct tok_state *PyTokenizer_FromString(const char *, int);