| @@ -347,28 +347,39 @@ static void* Tokenizer_fail_route(Tokenizer* self) | |||||
| /* | /* | ||||
| Write a token to the end of the current token stack. | Write a token to the end of the current token stack. | ||||
| */ | */ | ||||
| static int Tokenizer_emit(Tokenizer* self, PyObject* token) | |||||
| static int Tokenizer_emit_FAST(Tokenizer* self, PyObject* token) | |||||
| { | { | ||||
| PyObject* instance; | |||||
| if (Tokenizer_push_textbuffer(self)) | if (Tokenizer_push_textbuffer(self)) | ||||
| return -1; | return -1; | ||||
| if (PyList_Append(self->topstack->stack, token)) | |||||
| instance = PyObject_CallObject(token, NULL); | |||||
| if (!instance) | |||||
| return -1; | return -1; | ||||
| if (PyList_Append(self->topstack->stack, instance)) { | |||||
| Py_DECREF(instance); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(instance); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| /* | /* | ||||
| Write a token to the beginning of the current token stack. | |||||
| Write a token to the end of the current token stack. | |||||
| */ | */ | ||||
| static int Tokenizer_emit_first(Tokenizer* self, PyObject* token) | |||||
| static int Tokenizer_emit(Tokenizer* self, PyObject* token) | |||||
| { | { | ||||
| if (Tokenizer_push_textbuffer(self)) | if (Tokenizer_push_textbuffer(self)) | ||||
| return -1; | return -1; | ||||
| if (PyList_Insert(self->topstack->stack, 0, token)) | |||||
| if (PyList_Append(self->topstack->stack, token)) | |||||
| return -1; | return -1; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int Tokenizer_emit_FAST(Tokenizer* self, PyObject* token) | |||||
| /* | |||||
| Write a token to the beginning of the current token stack. | |||||
| */ | |||||
| static int Tokenizer_emit_first(Tokenizer* self, PyObject* token) | |||||
| { | { | ||||
| PyObject* instance; | PyObject* instance; | ||||
| @@ -377,7 +388,7 @@ static int Tokenizer_emit_FAST(Tokenizer* self, PyObject* token) | |||||
| instance = PyObject_CallObject(token, NULL); | instance = PyObject_CallObject(token, NULL); | ||||
| if (!instance) | if (!instance) | ||||
| return -1; | return -1; | ||||
| if (PyList_Append(self->topstack->stack, instance)) { | |||||
| if (PyList_Insert(self->topstack->stack, 0, instance)) { | |||||
| Py_DECREF(instance); | Py_DECREF(instance); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -385,20 +396,31 @@ static int Tokenizer_emit_FAST(Tokenizer* self, PyObject* token) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int Tokenizer_emit_first_FAST(Tokenizer* self, PyObject* token) | |||||
| /* | |||||
| Write a token to the beginning of the current token stack, with kwargs. | |||||
| Steals a reference to kwargs. | |||||
| */ | |||||
| static int Tokenizer_emit_first_kwargs(Tokenizer* self, PyObject* token, | |||||
| PyObject* kwargs) | |||||
| { | { | ||||
| PyObject* instance; | PyObject* instance; | ||||
| if (Tokenizer_push_textbuffer(self)) | |||||
| if (Tokenizer_push_textbuffer(self)) { | |||||
| Py_DECREF(kwargs); | |||||
| return -1; | return -1; | ||||
| instance = PyObject_CallObject(token, NULL); | |||||
| if (!instance) | |||||
| } | |||||
| instance = PyObject_Call(token, NOARGS, kwargs); | |||||
| if (!instance) { | |||||
| Py_DECREF(kwargs); | |||||
| return -1; | return -1; | ||||
| } | |||||
| if (PyList_Insert(self->topstack->stack, 0, instance)) { | if (PyList_Insert(self->topstack->stack, 0, instance)) { | ||||
| Py_DECREF(instance); | Py_DECREF(instance); | ||||
| Py_DECREF(kwargs); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| Py_DECREF(instance); | Py_DECREF(instance); | ||||
| Py_DECREF(kwargs); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -547,7 +569,7 @@ static int Tokenizer_parse_template(Tokenizer* self) | |||||
| } | } | ||||
| if (!template) | if (!template) | ||||
| return -1; | return -1; | ||||
| if (Tokenizer_emit_first_FAST(self, TemplateOpen)) { | |||||
| if (Tokenizer_emit_first(self, TemplateOpen)) { | |||||
| Py_DECREF(template); | Py_DECREF(template); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -576,7 +598,7 @@ static int Tokenizer_parse_argument(Tokenizer* self) | |||||
| } | } | ||||
| if (!argument) | if (!argument) | ||||
| return -1; | return -1; | ||||
| if (Tokenizer_emit_first_FAST(self, ArgumentOpen)) { | |||||
| if (Tokenizer_emit_first(self, ArgumentOpen)) { | |||||
| Py_DECREF(argument); | Py_DECREF(argument); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -1164,7 +1186,7 @@ static int Tokenizer_parse_comment(Tokenizer* self) | |||||
| } | } | ||||
| if (this == *"-" && Tokenizer_READ(self, 1) == this && | if (this == *"-" && Tokenizer_READ(self, 1) == this && | ||||
| Tokenizer_READ(self, 2) == *">") { | Tokenizer_READ(self, 2) == *">") { | ||||
| if (Tokenizer_emit_first_FAST(self, CommentStart)) | |||||
| if (Tokenizer_emit_first(self, CommentStart)) | |||||
| return -1; | return -1; | ||||
| if (Tokenizer_emit_FAST(self, CommentEnd)) | if (Tokenizer_emit_FAST(self, CommentEnd)) | ||||
| return -1; | return -1; | ||||
| @@ -1188,11 +1210,10 @@ static int Tokenizer_parse_comment(Tokenizer* self) | |||||
| */ | */ | ||||
| static int Tokenizer_push_tag_buffer(Tokenizer* self, TagData* data) | static int Tokenizer_push_tag_buffer(Tokenizer* self, TagData* data) | ||||
| { | { | ||||
| PyObject *token, *tokens, *kwargs, *pad_first, *pad_before_eq, | |||||
| *pad_after_eq; | |||||
| PyObject *tokens, *kwargs, *pad_first, *pad_before_eq, *pad_after_eq; | |||||
| if (data->context & TAG_QUOTED) { | if (data->context & TAG_QUOTED) { | ||||
| if (Tokenizer_emit_first_FAST(self, TagAttrQuote)) | |||||
| if (Tokenizer_emit_first(self, TagAttrQuote)) | |||||
| return -1; | return -1; | ||||
| tokens = Tokenizer_pop(self); | tokens = Tokenizer_pop(self); | ||||
| if (!tokens) | if (!tokens) | ||||
| @@ -1217,15 +1238,8 @@ static int Tokenizer_push_tag_buffer(Tokenizer* self, TagData* data) | |||||
| Py_DECREF(pad_first); | Py_DECREF(pad_first); | ||||
| Py_DECREF(pad_before_eq); | Py_DECREF(pad_before_eq); | ||||
| Py_DECREF(pad_after_eq); | Py_DECREF(pad_after_eq); | ||||
| token = PyObject_Call(TagAttrStart, NOARGS, kwargs); | |||||
| Py_DECREF(kwargs); | |||||
| if (!token) | |||||
| return -1; | |||||
| if (Tokenizer_emit_first(self, token)) { | |||||
| Py_DECREF(token); | |||||
| if (Tokenizer_emit_first_kwargs(self, TagAttrStart, kwargs)) | |||||
| return -1; | return -1; | ||||
| } | |||||
| Py_DECREF(token); | |||||
| tokens = Tokenizer_pop(self); | tokens = Tokenizer_pop(self); | ||||
| if (!tokens) | if (!tokens) | ||||
| return -1; | return -1; | ||||