| #include "Python.h" | |
| #include "pycore_pystate.h" | |
| #include "pycore_token.h" | |
| #include "errcode.h" | |
| #include "state.h" | |
| /* Never change this */ | |
| #define TABSIZE 8 | |
| /* Create and initialize a new tok_state structure */ | |
| struct tok_state * | |
| _PyTokenizer_tok_new(void) | |
| { | |
| struct tok_state *tok = (struct tok_state *)PyMem_Calloc( | |
| 1, | |
| sizeof(struct tok_state)); | |
| if (tok == NULL) | |
| return NULL; | |
| tok->buf = tok->cur = tok->inp = NULL; | |
| tok->fp_interactive = 0; | |
| tok->interactive_src_start = NULL; | |
| tok->interactive_src_end = NULL; | |
| tok->start = NULL; | |
| tok->end = NULL; | |
| tok->done = E_OK; | |
| tok->fp = NULL; | |
| tok->input = NULL; | |
| tok->tabsize = TABSIZE; | |
| tok->indent = 0; | |
| tok->indstack[0] = 0; | |
| tok->atbol = 1; | |
| tok->pendin = 0; | |
| tok->prompt = tok->nextprompt = NULL; | |
| tok->lineno = 0; | |
| tok->starting_col_offset = -1; | |
| tok->col_offset = -1; | |
| tok->level = 0; | |
| tok->altindstack[0] = 0; | |
| tok->decoding_state = STATE_INIT; | |
| tok->decoding_erred = 0; | |
| tok->enc = NULL; | |
| tok->encoding = NULL; | |
| tok->cont_line = 0; | |
| tok->filename = NULL; | |
| tok->decoding_readline = NULL; | |
| tok->decoding_buffer = NULL; | |
| tok->readline = NULL; | |
| tok->type_comments = 0; | |
| tok->interactive_underflow = IUNDERFLOW_NORMAL; | |
| tok->underflow = NULL; | |
| tok->str = NULL; | |
| tok->report_warnings = 1; | |
| tok->tok_extra_tokens = 0; | |
| tok->comment_newline = 0; | |
| tok->implicit_newline = 0; | |
| tok->tok_mode_stack[0] = (tokenizer_mode){.kind =TOK_REGULAR_MODE, .f_string_quote='\0', .f_string_quote_size = 0, .f_string_debug=0}; | |
| tok->tok_mode_stack_index = 0; | |
| #ifdef Py_DEBUG | |
| tok->debug = _Py_GetConfig()->parser_debug; | |
| #endif | |
| return tok; | |
| } | |
| static void | |
| free_fstring_expressions(struct tok_state *tok) | |
| { | |
| int index; | |
| tokenizer_mode *mode; | |
| for (index = tok->tok_mode_stack_index; index >= 0; --index) { | |
| mode = &(tok->tok_mode_stack[index]); | |
| if (mode->last_expr_buffer != NULL) { | |
| PyMem_Free(mode->last_expr_buffer); | |
| mode->last_expr_buffer = NULL; | |
| mode->last_expr_size = 0; | |
| mode->last_expr_end = -1; | |
| mode->in_format_spec = 0; | |
| } | |
| } | |
| } | |
| /* Free a tok_state structure */ | |
| void | |
| _PyTokenizer_Free(struct tok_state *tok) | |
| { | |
| if (tok->encoding != NULL) { | |
| PyMem_Free(tok->encoding); | |
| } | |
| Py_XDECREF(tok->decoding_readline); | |
| Py_XDECREF(tok->decoding_buffer); | |
| Py_XDECREF(tok->readline); | |
| Py_XDECREF(tok->filename); | |
| if ((tok->readline != NULL || tok->fp != NULL ) && tok->buf != NULL) { | |
| PyMem_Free(tok->buf); | |
| } | |
| if (tok->input) { | |
| PyMem_Free(tok->input); | |
| } | |
| if (tok->interactive_src_start != NULL) { | |
| PyMem_Free(tok->interactive_src_start); | |
| } | |
| free_fstring_expressions(tok); | |
| PyMem_Free(tok); | |
| } | |
| void | |
| _PyToken_Free(struct token *token) { | |
| Py_XDECREF(token->metadata); | |
| } | |
| void | |
| _PyToken_Init(struct token *token) { | |
| token->metadata = NULL; | |
| } | |
| int | |
| _PyLexer_type_comment_token_setup(struct tok_state *tok, struct token *token, int type, int col_offset, | |
| int end_col_offset, const char *start, const char *end) | |
| { | |
| token->level = tok->level; | |
| token->lineno = token->end_lineno = tok->lineno; | |
| token->col_offset = col_offset; | |
| token->end_col_offset = end_col_offset; | |
| token->start = start; | |
| token->end = end; | |
| return type; | |
| } | |
| int | |
| _PyLexer_token_setup(struct tok_state *tok, struct token *token, int type, const char *start, const char *end) | |
| { | |
| assert((start == NULL && end == NULL) || (start != NULL && end != NULL)); | |
| token->level = tok->level; | |
| if (ISSTRINGLIT(type)) { | |
| token->lineno = tok->first_lineno; | |
| } | |
| else { | |
| token->lineno = tok->lineno; | |
| } | |
| token->end_lineno = tok->lineno; | |
| token->col_offset = token->end_col_offset = -1; | |
| token->start = start; | |
| token->end = end; | |
| if (start != NULL && end != NULL) { | |
| token->col_offset = tok->starting_col_offset; | |
| token->end_col_offset = tok->col_offset; | |
| } | |
| return type; | |
| } |