summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-03 17:34:23 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-03 17:34:23 +0900
commit597978c1690ca25b6a1ca99f8dd4c70190765bea (patch)
tree25e02a28b8a3086e9f1709bbfa3ab4946cab6822
parent479df23bc0985d0050c27c87285291b43b8bcfbc (diff)
downloadmruby-597978c1690ca25b6a1ca99f8dd4c70190765bea.tar.gz
mruby-597978c1690ca25b6a1ca99f8dd4c70190765bea.zip
mrb_malloc/calloc/realloc should call mrb_garbage_collect before returning NULL
-rw-r--r--src/gc.c16
1 files changed, 11 insertions, 5 deletions
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;
}