summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-06-17 11:54:50 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-06-17 11:54:50 +0900
commitabb682eaf1a61ead85e7bb1e68e473b3cfa9a194 (patch)
tree585c779796a2d612ddef689a654537606999b4ff /src
parentd9985631e7bbbfbd9b5d7ec33d6060b5aa02e6c8 (diff)
parent62f41ddd3bf8a1afa3d7ed94081835f8996ecbc4 (diff)
downloadmruby-abb682eaf1a61ead85e7bb1e68e473b3cfa9a194.tar.gz
mruby-abb682eaf1a61ead85e7bb1e68e473b3cfa9a194.zip
Merge pull request #2401 from take-cheeze/fixed_state_atexit_stack
Add fixed state atexit stack feature.
Diffstat (limited to 'src')
-rw-r--r--src/state.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/state.c b/src/state.c
index c0a9c14c2..3e82a159d 100644
--- a/src/state.c
+++ b/src/state.c
@@ -226,7 +226,9 @@ mrb_close(mrb_state *mrb)
for (i = mrb->atexit_stack_len; i > 0; --i) {
mrb->atexit_stack[i - 1](mrb);
}
+#ifndef MRB_FIXED_STATE_ATEXIT_STACK
mrb_free(mrb, mrb->atexit_stack);
+#endif
}
/* free */
@@ -268,6 +270,11 @@ mrb_top_self(mrb_state *mrb)
void
mrb_state_atexit(mrb_state *mrb, mrb_atexit_func f)
{
+#ifdef MRB_FIXED_STATE_ATEXIT_STACK
+ if (mrb->atexit_stack_len + 1 > MRB_FIXED_STATE_ATEXIT_STACK_SIZE) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "exceeded fixed state atexit stack limit");
+ }
+#else
size_t stack_size;
stack_size = sizeof(mrb_atexit_func) * (mrb->atexit_stack_len + 1);
@@ -276,6 +283,7 @@ mrb_state_atexit(mrb_state *mrb, mrb_atexit_func f)
} else {
mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size);
}
+#endif
mrb->atexit_stack[mrb->atexit_stack_len++] = f;
}