summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-06-28 00:45:47 +0900
committertake_cheeze <[email protected]>2014-06-28 00:45:47 +0900
commitf9076230f2193a3fe2b30b795bd828a7479eba38 (patch)
tree59ecb38d97ec87304723a7abd08e3cf171f86f6c
parent919af61766b1d06cd0e747c1d6257ada14c09eff (diff)
downloadmruby-f9076230f2193a3fe2b30b795bd828a7479eba38.tar.gz
mruby-f9076230f2193a3fe2b30b795bd828a7479eba38.zip
Fix crash in method call in `ObjectSpace.each_object` block.
* Filter `MRB_TT_ENV` and `MRB_TT_ICLASS`. * Set `mrb->string_class` in `mrb_init_exception` instead.
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c7
-rw-r--r--mrbgems/mruby-objectspace/test/objectspace.rb4
-rw-r--r--src/error.c8
3 files changed, 14 insertions, 5 deletions
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
index ba22fc990..8c7452c1e 100644
--- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c
+++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
@@ -119,6 +119,13 @@ os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
return;
}
+ /* filter internal objects */
+ switch (obj->tt) {
+ case MRB_TT_ENV:
+ case MRB_TT_ICLASS:
+ return;
+ }
+
/* filter class kind if target module defined */
if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
return;
diff --git a/mrbgems/mruby-objectspace/test/objectspace.rb b/mrbgems/mruby-objectspace/test/objectspace.rb
index f792c165d..4731d53b5 100644
--- a/mrbgems/mruby-objectspace/test/objectspace.rb
+++ b/mrbgems/mruby-objectspace/test/objectspace.rb
@@ -54,3 +54,7 @@ assert('ObjectSpace.each_object') do
assert_equal arys.length, arys_count
assert_true arys.length < objs.length
end
+
+assert 'Check class pointer of ObjectSpace.each_object.' do
+ ObjectSpace.each_object { |obj| !obj }
+end
diff --git a/src/error.c b/src/error.c
index dcb6063f8..01feecefd 100644
--- a/src/error.c
+++ b/src/error.c
@@ -91,15 +91,10 @@ static mrb_value
exc_to_s(mrb_state *mrb, mrb_value exc)
{
mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
- struct RObject *p;
if (!mrb_string_p(mesg)) {
return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc));
}
- p = mrb_obj_ptr(mesg);
- if (!p->c) {
- p->c = mrb->string_class;
- }
return mesg;
}
@@ -441,6 +436,9 @@ mrb_init_exception(mrb_state *mrb)
{
struct RClass *exception, *runtime_error, *script_error;
+ /* initialize mrb->string_class before creating RString object for nomem_err */
+ mrb->string_class = mrb_define_class(mrb, "String", mrb->object_class);
+
mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */
mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ANY());
mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY());