diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-03 01:47:50 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-03 01:47:50 +0900 |
| commit | 415ec6aca2c49338cab1c410e7c3a296ac928728 (patch) | |
| tree | d86572ffa5280e7b5018b58430fda998dabd5b9c /src/codegen.c | |
| parent | 56a93a3357ab9f50a4105980e0b4d39e7d400e3b (diff) | |
| download | mruby-415ec6aca2c49338cab1c410e7c3a296ac928728.tar.gz mruby-415ec6aca2c49338cab1c410e7c3a296ac928728.zip | |
avoid top-level pool release at codegen_error() and fixed some memory leaks
Diffstat (limited to 'src/codegen.c')
| -rw-r--r-- | src/codegen.c | 12 |
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; } } |
