| @@ -247,10 +247,9 @@ Tokenizer_pop_keeping_context(Tokenizer* self) | |||||
| } | } | ||||
| /* | /* | ||||
| Fail the current tokenization route. | |||||
| Discards the current stack/context/textbuffer and "raises a BAD_ROUTE | |||||
| exception", which is implemented using longjmp(). | |||||
| Fail the current tokenization route. Discards the current | |||||
| stack/context/textbuffer and "raises a BAD_ROUTE exception", which is | |||||
| implemented using longjmp(). | |||||
| */ | */ | ||||
| static void | static void | ||||
| Tokenizer_fail_route(Tokenizer* self) | Tokenizer_fail_route(Tokenizer* self) | ||||
| @@ -268,12 +267,9 @@ Tokenizer_write(Tokenizer* self, PyObject* token) | |||||
| if (Tokenizer_push_textbuffer(self)) | if (Tokenizer_push_textbuffer(self)) | ||||
| return -1; | return -1; | ||||
| if (PyList_Append(Tokenizer_STACK(self), token)) { | |||||
| Py_XDECREF(token); | |||||
| if (PyList_Append(Tokenizer_STACK(self), token)) | |||||
| return -1; | return -1; | ||||
| } | |||||
| Py_XDECREF(token); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -286,12 +282,9 @@ Tokenizer_write_first(Tokenizer* self, PyObject* token) | |||||
| if (Tokenizer_push_textbuffer(self)) | if (Tokenizer_push_textbuffer(self)) | ||||
| return -1; | return -1; | ||||
| if (PyList_Insert(Tokenizer_STACK(self), 0, token)) { | |||||
| Py_XDECREF(token); | |||||
| if (PyList_Insert(Tokenizer_STACK(self), 0, token)) | |||||
| return -1; | return -1; | ||||
| } | |||||
| Py_XDECREF(token); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -301,12 +294,9 @@ Tokenizer_write_first(Tokenizer* self, PyObject* token) | |||||
| static int | static int | ||||
| Tokenizer_write_text(Tokenizer* self, PyObject* text) | Tokenizer_write_text(Tokenizer* self, PyObject* text) | ||||
| { | { | ||||
| if (PyList_Append(Tokenizer_TEXTBUFFER(self), text)) { | |||||
| Py_XDECREF(text); | |||||
| if (PyList_Append(Tokenizer_TEXTBUFFER(self), text)) | |||||
| return -1; | return -1; | ||||
| } | |||||
| Py_XDECREF(text); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -317,18 +307,40 @@ static int | |||||
| Tokenizer_write_all(Tokenizer* self, PyObject* tokenlist) | Tokenizer_write_all(Tokenizer* self, PyObject* tokenlist) | ||||
| { | { | ||||
| if (Tokenizer_push_textbuffer(self)) | if (Tokenizer_push_textbuffer(self)) | ||||
| Py_XDECREF(tokenlist); | |||||
| return -1; | return -1; | ||||
| PyObject* stack = Tokenizer_STACK(self); | PyObject* stack = Tokenizer_STACK(self); | ||||
| Py_ssize_t size = PySequence_Fast_GET_SIZE(stack); | Py_ssize_t size = PySequence_Fast_GET_SIZE(stack); | ||||
| if (PyList_SetSlice(stack, size, size, tokenlist)) { | |||||
| Py_XDECREF(tokenlist); | |||||
| if (PyList_SetSlice(stack, size, size, tokenlist)) | |||||
| return -1; | |||||
| return 0; | |||||
| } | |||||
| /* | |||||
| Pop the current stack, write text, and then write the stack. | |||||
| */ | |||||
| static int | |||||
| Tokenizer_write_text_then_stack(Tokenizer* self, PyObject* text) | |||||
| { | |||||
| PyObject* stack = Tokenizer_pop(self); | |||||
| if (Tokenizer_write_text(self, text)) { | |||||
| Py_XDECREF(stack); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| Py_XDECREF(tokenlist); | |||||
| if (stack) { | |||||
| if (PySequence_Fast_GET_SIZE(stack) > 0) { | |||||
| if (Tokenizer_write_all(self, stack)) { | |||||
| Py_DECREF(stack); | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| Py_DECREF(stack); | |||||
| } | |||||
| self->head--; | |||||
| return 0; | return 0; | ||||
| } | } | ||||