From f9076230f2193a3fe2b30b795bd828a7479eba38 Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Sat, 28 Jun 2014 00:45:47 +0900 Subject: 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. --- mrbgems/mruby-objectspace/src/mruby_objectspace.c | 7 +++++++ mrbgems/mruby-objectspace/test/objectspace.rb | 4 ++++ src/error.c | 8 +++----- 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()); -- cgit v1.2.3 From 9a28ae921b9c789fa02a4931bebec46cd596acb4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 28 Jun 2014 01:08:23 +0900 Subject: ObjectSpace.each_object should filter out internal (i.e. obj->c == NULL) objects; ref #2429 --- mrbgems/mruby-objectspace/src/mruby_objectspace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c index 8c7452c1e..e4d26221f 100644 --- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c +++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c @@ -126,6 +126,9 @@ os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud) return; } + /* filter half baked (or internal) objects */ + if (!obj->c) 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; -- cgit v1.2.3 From 9726dbefb416f3f8b4fdf4cbe9f4d3bb5757003b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 28 Jun 2014 01:09:09 +0900 Subject: remove String class initialization in error.c; ref #2429 --- src/error.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/error.c b/src/error.c index 01feecefd..dcb6063f8 100644 --- a/src/error.c +++ b/src/error.c @@ -91,10 +91,15 @@ 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; } @@ -436,9 +441,6 @@ 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()); -- cgit v1.2.3