summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-07-09 11:42:24 +0900
committerYukihiro Matsumoto <[email protected]>2012-07-09 11:42:24 +0900
commitc3201370554a5d48c59f97daf61a725310d4bbbc (patch)
tree061650ef60a9d2b30929f1b3782911ea45f53e53 /src/gc.c
parent0e2a81740a284e823894ec5b1d804e282df15b7e (diff)
parent8cef93d228ec5d2cb57b84cf0ae3945363080546 (diff)
downloadmruby-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.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/gc.c b/src/gc.c
index 2663e9780..78d8ee6a9 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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;