From 597978c1690ca25b6a1ca99f8dd4c70190765bea Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 17:34:23 +0900 Subject: mrb_malloc/calloc/realloc should call mrb_garbage_collect before returning NULL --- src/gc.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index cce35efa4..b269ecfb4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -121,25 +121,31 @@ gettimeofday_time(void) #define GC_STEP_SIZE 1024 - void* mrb_realloc(mrb_state *mrb, void *p, size_t len) { - return (mrb->allocf)(mrb, p, len); + p = (mrb->allocf)(mrb, p, len); + + if (!p && len > 0 && mrb->heaps) { + mrb_garbage_collect(mrb); + p = (mrb->allocf)(mrb, p, len); + } + return p; } void* mrb_malloc(mrb_state *mrb, size_t len) { - return (mrb->allocf)(mrb, 0, len); + return mrb_realloc(mrb, 0, len); } void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = (mrb->allocf)(mrb, 0, nelem*len); + void *p = mrb_realloc(mrb, 0, nelem*len); - memset(p, 0, nelem*len); + if (len > 0) + memset(p, 0, nelem*len); return p; } -- cgit v1.2.3