summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2014-09-03 10:44:38 +0900
committerTomoyuki Sahara <[email protected]>2014-09-03 10:44:38 +0900
commit2fd49b2b9f93a8493731634f922ef63e42feab8c (patch)
tree410c1b1e82da93cf560cf2b776aadeb8ddd336d3
parent80c37a4138cda9e643d4332d31c2c4fd6882b131 (diff)
downloadmruby-2fd49b2b9f93a8493731634f922ef63e42feab8c.tar.gz
mruby-2fd49b2b9f93a8493731634f922ef63e42feab8c.zip
save and restore arena index to prevent arena overflow.
-rw-r--r--src/class.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/class.c b/src/class.c
index b7da56514..8ec572660 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1069,8 +1069,10 @@ mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
struct RClass *c = mrb_class_ptr(mod);
mrb_value *argv;
mrb_int argc, i;
+ int ai;
mrb_get_args(mrb, "*", &argv, &argc);
+ ai = mrb_gc_arena_save(mrb);
for (i=0; i<argc; i++) {
mrb_value name, str;
mrb_sym method, sym;
@@ -1085,6 +1087,7 @@ mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
name = mrb_symbol_value(sym);
mrb_define_method_raw(mrb, c, method,
mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name));
+ mrb_gc_arena_restore(mrb, ai);
}
return mrb_nil_value();
}
@@ -1106,8 +1109,10 @@ mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
struct RClass *c = mrb_class_ptr(mod);
mrb_value *argv;
mrb_int argc, i;
+ int ai;
mrb_get_args(mrb, "*", &argv, &argc);
+ ai = mrb_gc_arena_save(mrb);
for (i=0; i<argc; i++) {
mrb_value name, str, attr;
mrb_sym method, sym;
@@ -1131,6 +1136,7 @@ mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
mrb_define_method_raw(mrb, c, method,
mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr));
+ mrb_gc_arena_restore(mrb, ai);
}
return mrb_nil_value();
}