summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-09-03 08:34:31 +0900
committerYukihiro Matsumoto <[email protected]>2012-09-03 08:34:31 +0900
commit4f7a1a167db8a3373b356540eaee21f9cf93e7f2 (patch)
treeecb3153837939d66d675f08cb67babdd2c83c392 /src
parent5340126443609265d63159e4c391049cb722f828 (diff)
downloadmruby-4f7a1a167db8a3373b356540eaee21f9cf93e7f2.tar.gz
mruby-4f7a1a167db8a3373b356540eaee21f9cf93e7f2.zip
remove memleaks using linked allocator
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c11
-rw-r--r--src/parse.y4
-rw-r--r--src/proc.c5
-rw-r--r--src/state.c31
4 files changed, 36 insertions, 15 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 2c8089b23..bdd2aeecc 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -2091,9 +2091,6 @@ scope_finish(codegen_scope *s, int idx)
irep->nregs = s->nregs;
mrb->arena_idx = s->ai;
- if (!s->prev && s->filename) {
- mrb_free(mrb, s->filename);
- }
mrb_pool_close(s->mpool);
}
@@ -2499,19 +2496,13 @@ codegen_start(mrb_state *mrb, parser_state *p)
}
scope->mrb = mrb;
if (p->filename) {
- int len = strlen(p->filename);
- char *s = (char*)mrb_malloc(mrb, len+1);
-
- memcpy(s, p->filename, len + 1);
- scope->filename = s;
+ scope->filename = p->filename;
}
if (setjmp(scope->jmp) != 0) {
- //if (scope->filename) mrb_free(mrb, scope->filename);
return -1;
}
// prepare irep
codegen(scope, p->tree, NOVAL);
- // if (scope->filename) mrb_free(mrb, scope->filename);
mrb_pool_close(scope->mpool);
return 0;
}
diff --git a/src/parse.y b/src/parse.y
index 5d1acf012..d7d0ce73e 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -4789,7 +4789,6 @@ void
mrbc_context_free(mrb_state *mrb, mrbc_context *cxt)
{
mrb_free(mrb, cxt->syms);
- mrb_free(mrb, cxt->filename);
mrb_free(mrb, cxt);
}
@@ -4798,10 +4797,9 @@ mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s)
{
if (s) {
int len = strlen(s);
- char *p = (char *)mrb_malloc(mrb, len + 1);
+ char *p = (char *)mrb_alloca(mrb, len + 1);
memcpy(p, s, len + 1);
- if (c->filename) mrb_free(mrb, c->filename);
c->filename = p;
c->lineno = 1;
}
diff --git a/src/proc.c b/src/proc.c
index 44c712a95..0efc8d286 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -144,12 +144,13 @@ void
mrb_init_proc(mrb_state *mrb)
{
struct RProc *m;
- mrb_code *call_iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code));
- mrb_irep *call_irep = (mrb_irep *)mrb_calloc(mrb, sizeof(mrb_irep), 1);
+ mrb_code *call_iseq = (mrb_code *)mrb_alloca(mrb, sizeof(mrb_code));
+ mrb_irep *call_irep = (mrb_irep *)mrb_alloca(mrb, sizeof(mrb_irep));
if ( call_iseq == NULL || call_irep == NULL )
return;
+ memset(call_irep, 0, sizeof(mrb_irep));
*call_iseq = MKOP_A(OP_CALL, 0);
call_irep->idx = -1;
call_irep->iseq = call_iseq;
diff --git a/src/state.c b/src/state.c
index 6efacd68c..e7671d03b 100644
--- a/src/state.c
+++ b/src/state.c
@@ -42,6 +42,35 @@ allocf(mrb_state *mrb, void *p, size_t size, void *ud)
}
}
+struct alloca_header {
+ struct alloca_header *next;
+ char buf[0];
+};
+
+void*
+mrb_alloca(mrb_state *mrb, size_t size)
+{
+ struct alloca_header *p;
+
+ p = mrb_malloc(mrb, sizeof(struct alloca_header)+size);
+ p->next = mrb->mems;
+ mrb->mems = p;
+ return (void*)p->buf;
+}
+
+static void
+mrb_alloca_free(mrb_state *mrb)
+{
+ struct alloca_header *p = mrb->mems;
+ struct alloca_header *tmp;
+
+ while (p) {
+ tmp = p;
+ p = p->next;
+ mrb_free(mrb, tmp);
+ }
+}
+
mrb_state*
mrb_open()
{
@@ -66,11 +95,13 @@ mrb_close(mrb_state *mrb)
mrb_free(mrb, mrb->irep[i]->iseq);
mrb_free(mrb, mrb->irep[i]->pool);
mrb_free(mrb, mrb->irep[i]->syms);
+ mrb_free(mrb, mrb->irep[i]->lines);
mrb_free(mrb, mrb->irep[i]);
}
mrb_free(mrb, mrb->irep);
mrb_free_symtbl(mrb);
mrb_free_heap(mrb);
+ mrb_alloca_free(mrb);
mrb_free(mrb, mrb);
}