summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-12-03 01:47:50 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-12-03 01:47:50 +0900
commit415ec6aca2c49338cab1c410e7c3a296ac928728 (patch)
treed86572ffa5280e7b5018b58430fda998dabd5b9c /src
parent56a93a3357ab9f50a4105980e0b4d39e7d400e3b (diff)
downloadmruby-415ec6aca2c49338cab1c410e7c3a296ac928728.tar.gz
mruby-415ec6aca2c49338cab1c410e7c3a296ac928728.zip
avoid top-level pool release at codegen_error() and fixed some memory leaks
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 7f7ba52f0..ef3a716f9 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -87,8 +87,6 @@ static void codegen(codegen_scope *s, node *tree, int val);
static void
codegen_error(codegen_scope *s, const char *message)
{
- jmp_buf jmp;
-
if (!s) return;
while (s->prev) {
codegen_scope *tmp = s->prev;
@@ -103,9 +101,7 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "codegen error: %s\n", message);
}
#endif
- memcpy(&jmp, &s->jmp, sizeof(jmp_buf));
- mrb_pool_close(s->mpool);
- longjmp(jmp, 1);
+ longjmp(s->jmp, 1);
}
static void*
@@ -2415,6 +2411,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->icapa = 1024;
p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
+ p->irep->iseq = p->iseq;
p->pcapa = 32;
p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
@@ -2916,6 +2913,11 @@ mrb_generate_code(mrb_state *mrb, parser_state *p)
return proc;
}
else {
+ if (scope->filename == scope->irep->filename) {
+ scope->irep->filename = NULL;
+ }
+ mrb_irep_decref(mrb, scope->irep);
+ mrb_pool_close(scope->mpool);
return NULL;
}
}