浏览代码

Fix memory leak.

tags/v0.2
Ben Kurtovic 12 年前
父节点
当前提交
b2f933dddc
共有 1 个文件被更改,包括 20 次插入19 次删除
  1. +20
    -19
      mwparserfromhell/parser/tokenizer.c

+ 20
- 19
mwparserfromhell/parser/tokenizer.c 查看文件

@@ -33,15 +33,15 @@ Tokenizer_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
static struct Textbuffer*
Textbuffer_new(void)
{
struct Textbuffer* buffer = malloc(sizeof(struct Textbuffer));
struct Textbuffer* buffer = PyObject_Malloc(sizeof(struct Textbuffer));
if (!buffer) {
PyErr_NoMemory();
return NULL;
}
buffer->size = 0;
buffer->data = malloc(sizeof(Py_UNICODE) * TEXTBUFFER_BLOCKSIZE);
buffer->data = PyObject_Malloc(sizeof(Py_UNICODE) * TEXTBUFFER_BLOCKSIZE);
if (!buffer->data) {
free(buffer);
PyObject_Free(buffer);
PyErr_NoMemory();
return NULL;
}
@@ -58,7 +58,7 @@ Tokenizer_dealloc(Tokenizer* self)
Py_DECREF(this->stack);
Textbuffer_dealloc(this->textbuffer);
next = this->next;
free(this);
PyObject_Free(this);
this = next;
}
self->ob_type->tp_free((PyObject*) self);
@@ -69,9 +69,9 @@ Textbuffer_dealloc(struct Textbuffer* this)
{
struct Textbuffer* next;
while (this) {
free(this->data);
PyObject_Free(this->data);
next = this->next;
free(this);
PyObject_Free(this);
this = next;
}
}
@@ -98,7 +98,7 @@ Tokenizer_init(Tokenizer* self, PyObject* args, PyObject* kwds)
static int
Tokenizer_push(Tokenizer* self, int context)
{
struct Stack* top = malloc(sizeof(struct Stack));
struct Stack* top = PyObject_Malloc(sizeof(struct Stack));
if (!top) {
PyErr_NoMemory();
return -1;
@@ -180,7 +180,7 @@ Tokenizer_delete_top_of_stack(Tokenizer* self)
Py_DECREF(top->stack);
Textbuffer_dealloc(top->textbuffer);
self->topstack = top->next;
free(top);
PyObject_Free(top);
}

/*
@@ -607,6 +607,7 @@ Tokenizer_verify_safe(Tokenizer* self, const char* unsafes[])
Py_DECREF(textlist);
return -1;
}
Py_DECREF(textdata);
if (PyList_Append(textlist, textdata)) {
Py_DECREF(textlist);
Py_DECREF(textdata);
@@ -943,7 +944,7 @@ Tokenizer_parse_heading(Tokenizer* self)
PyObject* level = PyInt_FromSsize_t(heading->level);
if (!level) {
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}

@@ -951,7 +952,7 @@ Tokenizer_parse_heading(Tokenizer* self)
if (!kwargs) {
Py_DECREF(level);
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}
PyDict_SetItemString(kwargs, "level", level);
@@ -961,14 +962,14 @@ Tokenizer_parse_heading(Tokenizer* self)
Py_DECREF(kwargs);
if (!token) {
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}

if (Tokenizer_write(self, token)) {
Py_DECREF(token);
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}
Py_DECREF(token);
@@ -980,18 +981,18 @@ Tokenizer_parse_heading(Tokenizer* self)
difftext[diff] = *"";
if (Tokenizer_write_text_then_stack(self, difftext)) {
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}
}

if (Tokenizer_write_all(self, heading->title)) {
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);
return -1;
}
Py_DECREF(heading->title);
free(heading);
PyObject_Free(heading);

token = PyObject_CallObject(HeadingEnd, NULL);
if (!token) return -1;
@@ -1045,23 +1046,23 @@ Tokenizer_handle_heading_end(Tokenizer* self)
text[best] = *"";
if (Tokenizer_write_text_then_stack(self, text)) {
Py_DECREF(after->title);
free(after);
PyObject_Free(after);
return NULL;
}
if (Tokenizer_write_all(self, after->title)) {
Py_DECREF(after->title);
free(after);
PyObject_Free(after);
return NULL;
}
Py_DECREF(after->title);
level = after->level;
free(after);
PyObject_Free(after);
}

PyObject* stack = Tokenizer_pop(self);
if (!stack) return NULL;

HeadingData* heading = malloc(sizeof(HeadingData));
HeadingData* heading = PyObject_Malloc(sizeof(HeadingData));
if (!heading) {
PyErr_NoMemory();
return NULL;


正在加载...
取消
保存