| @@ -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 | |||
| Tokenizer_fail_route(Tokenizer* self) | |||
| @@ -268,12 +267,9 @@ Tokenizer_write(Tokenizer* self, PyObject* token) | |||
| if (Tokenizer_push_textbuffer(self)) | |||
| return -1; | |||
| if (PyList_Append(Tokenizer_STACK(self), token)) { | |||
| Py_XDECREF(token); | |||
| if (PyList_Append(Tokenizer_STACK(self), token)) | |||
| return -1; | |||
| } | |||
| Py_XDECREF(token); | |||
| return 0; | |||
| } | |||
| @@ -286,12 +282,9 @@ Tokenizer_write_first(Tokenizer* self, PyObject* token) | |||
| if (Tokenizer_push_textbuffer(self)) | |||
| return -1; | |||
| if (PyList_Insert(Tokenizer_STACK(self), 0, token)) { | |||
| Py_XDECREF(token); | |||
| if (PyList_Insert(Tokenizer_STACK(self), 0, token)) | |||
| return -1; | |||
| } | |||
| Py_XDECREF(token); | |||
| return 0; | |||
| } | |||
| @@ -301,12 +294,9 @@ Tokenizer_write_first(Tokenizer* self, PyObject* token) | |||
| static int | |||
| 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; | |||
| } | |||
| Py_XDECREF(text); | |||
| return 0; | |||
| } | |||
| @@ -317,18 +307,40 @@ static int | |||
| Tokenizer_write_all(Tokenizer* self, PyObject* tokenlist) | |||
| { | |||
| if (Tokenizer_push_textbuffer(self)) | |||
| Py_XDECREF(tokenlist); | |||
| return -1; | |||
| PyObject* stack = Tokenizer_STACK(self); | |||
| 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; | |||
| } | |||
| 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; | |||
| } | |||