diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-06-03 17:34:23 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-06-03 17:34:23 +0900 |
| commit | 597978c1690ca25b6a1ca99f8dd4c70190765bea (patch) | |
| tree | 25e02a28b8a3086e9f1709bbfa3ab4946cab6822 | |
| parent | 479df23bc0985d0050c27c87285291b43b8bcfbc (diff) | |
| download | mruby-597978c1690ca25b6a1ca99f8dd4c70190765bea.tar.gz mruby-597978c1690ca25b6a1ca99f8dd4c70190765bea.zip | |
mrb_malloc/calloc/realloc should call mrb_garbage_collect before returning NULL
| -rw-r--r-- | src/gc.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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; } |
