From: "ko1 (Koichi Sasada)" Date: 2012-12-03T19:01:59+09:00 Subject: [ruby-dev:46695] [ruby-trunk - Bug #7502][Open] ObjectSpace.each_object で inspect できないオブジェクトが渡ってくる Issue #7502 has been reported by ko1 (Koichi Sasada). ---------------------------------------- Bug #7502: ObjectSpace.each_object で inspect できないオブジェクトが渡ってくる https://bugs.ruby-lang.org/issues/7502 Author: ko1 (Koichi Sasada) Status: Open Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 ruby -v: ruby -v: ruby 2.0.0dev (2012-12-03 trunk 38155) [x86_64-linux] 西山さんに, http://bugs.ruby-lang.org/issues/7435#note-4 のコードが動かない,と教えて貰って調べてみると, 64bit 環境で 4 な VALUE が入った Array オブジェクトが 辿れることがわかりました. (64bit flonum 環境では,4 はあり得ない値) どこかと調べてみると,compile.c で #define ADD_CATCH_ENTRY(type, ls, le, iseqv, lc) \ (rb_ary_push(iseq->compile_data->catch_table_ary, \ rb_ary_new3(5, (type), \ (VALUE)(ls) | 1, (VALUE)(le) | 1, \ (VALUE)(iseqv), (VALUE)(lc) | 1))) とあるところで type が 4 だった,というオチでした.type には iseq_catch_table_entry::catch_type が入っており,こいつらは指定のない enum なので,4 が入ったという感じです. iseq_catch_table_entry::catch_type の各値を Fixnum にすることで解決しようと思います. ここを tmp ary にするなり,別の方法もありますが,とりあえず. 今回のことで得た教訓: - ARRAY_PTR[x] = y というコードは死ぬべきである (こうなっているところを探し回って 4 が代入されたところを探した) 2.1 では,ここをマクロ化したい(ライトバリアとかにも役立つ). - ObjectSpace.reachable_objects_from() が役に立つか! と思ったけど, 今回は役立てられなかった. -- http://bugs.ruby-lang.org/