diff options
| author | take_cheeze <[email protected]> | 2014-06-28 00:45:47 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-06-28 00:45:47 +0900 |
| commit | f9076230f2193a3fe2b30b795bd828a7479eba38 (patch) | |
| tree | 59ecb38d97ec87304723a7abd08e3cf171f86f6c /mrbgems/mruby-objectspace | |
| parent | 919af61766b1d06cd0e747c1d6257ada14c09eff (diff) | |
| download | mruby-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.
Diffstat (limited to 'mrbgems/mruby-objectspace')
| -rw-r--r-- | mrbgems/mruby-objectspace/src/mruby_objectspace.c | 7 | ||||
| -rw-r--r-- | mrbgems/mruby-objectspace/test/objectspace.rb | 4 |
2 files changed, 11 insertions, 0 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 |
