diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-07-09 11:42:24 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-07-09 11:42:24 +0900 |
| commit | c3201370554a5d48c59f97daf61a725310d4bbbc (patch) | |
| tree | 061650ef60a9d2b30929f1b3782911ea45f53e53 /src/gc.c | |
| parent | 0e2a81740a284e823894ec5b1d804e282df15b7e (diff) | |
| parent | 8cef93d228ec5d2cb57b84cf0ae3945363080546 (diff) | |
| download | mruby-c3201370554a5d48c59f97daf61a725310d4bbbc.tar.gz mruby-c3201370554a5d48c59f97daf61a725310d4bbbc.zip | |
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -167,10 +167,17 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = mrb_realloc(mrb, 0, nelem*len); + void *p = NULL; + size_t size; + + if (nelem <= SIZE_MAX / len) { + size = nelem * len; + p = mrb_realloc(mrb, 0, size); + + if (p && size > 0) + memset(p, 0, size); + } - if (len > 0) - memset(p, 0, nelem*len); return p; } @@ -239,12 +246,10 @@ unlink_free_heap_page(mrb_state *mrb, struct heap_page *page) static void add_heap(mrb_state *mrb) { - struct heap_page *page = mrb_malloc(mrb, sizeof(struct heap_page)); + struct heap_page *page = mrb_calloc(mrb, 1, sizeof(struct heap_page)); RVALUE *p, *e; struct RBasic *prev = NULL; - memset(page, 0, sizeof(struct heap_page)); - for (p = page->objects, e=p+HEAP_PAGE_SIZE; p<e; p++) { p->as.free.tt = MRB_TT_FREE; p->as.free.next = prev; |
