diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-09-03 08:34:31 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-09-03 08:34:31 +0900 |
| commit | 4f7a1a167db8a3373b356540eaee21f9cf93e7f2 (patch) | |
| tree | ecb3153837939d66d675f08cb67babdd2c83c392 /src/state.c | |
| parent | 5340126443609265d63159e4c391049cb722f828 (diff) | |
| download | mruby-4f7a1a167db8a3373b356540eaee21f9cf93e7f2.tar.gz mruby-4f7a1a167db8a3373b356540eaee21f9cf93e7f2.zip | |
remove memleaks using linked allocator
Diffstat (limited to 'src/state.c')
| -rw-r--r-- | src/state.c | 31 |
1 files changed, 31 insertions, 0 deletions
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); } |
