summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-09-03 11:02:52 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-09-03 11:02:52 +0900
commit1fdf47d71aff39b780384969c6883a9a04f9ac90 (patch)
treeeac3966fe2fb7713238debc964d4b50bc204b510 /src
parentf6e7de5fa885732943dbdb65e5556550d24eb2ba (diff)
parent2fd49b2b9f93a8493731634f922ef63e42feab8c (diff)
downloadmruby-1fdf47d71aff39b780384969c6883a9a04f9ac90.tar.gz
mruby-1fdf47d71aff39b780384969c6883a9a04f9ac90.zip
Merge pull request #2582 from iij/pr-attr-accessor-save-arena
save and restore arena index to prevent arena overflow.
Diffstat (limited to 'src')
-rw-r--r--src/class.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/class.c b/src/class.c
index 5f082fc45..c11346223 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();
}