summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-04-01 04:09:27 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2013-04-01 04:09:27 -0700
commit7c2f68862ea9cc58f62cbe2b87b4c4dc2b0294f5 (patch)
tree3453d1e298e96335708fa75d2e737546357374a9
parent57cf264420acb625f4614353a088eb5b884f9c44 (diff)
parentc7ff1bd88150c8f61f7483ea857f198ca1992fc7 (diff)
downloadmruby-7c2f68862ea9cc58f62cbe2b87b4c4dc2b0294f5.tar.gz
mruby-7c2f68862ea9cc58f62cbe2b87b4c4dc2b0294f5.zip
Merge pull request #1121 from monaka/pr-check-malloc-failed2
Check malloc failed
-rw-r--r--include/mruby.h1
-rw-r--r--src/gc.c14
2 files changed, 15 insertions, 0 deletions
diff --git a/include/mruby.h b/include/mruby.h
index e204820a3..5272d0400 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -125,6 +125,7 @@ typedef struct mrb_state {
mrb_bool gc_disabled:1;
mrb_bool gc_full:1;
mrb_bool is_generational_gc_mode:1;
+ mrb_bool out_of_memory:1;
size_t majorgc_old_threshold;
struct alloca_header *mems;
diff --git a/src/gc.c b/src/gc.c
index c90e00c89..07bc23b12 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -157,6 +157,20 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len)
mrb_garbage_collect(mrb);
p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
}
+
+ if (!p2 && len) {
+ if (mrb->out_of_memory) {
+ /* mrb_panic(mrb); */
+ }
+ else {
+ mrb->out_of_memory = 1;
+ mrb_raise(mrb, E_RUNTIME_ERROR, "Out of memory");
+ }
+ }
+ else {
+ mrb->out_of_memory = 0;
+ }
+
return p2;
}