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() が役に立つか! と思ったけど, 今回は役立てられなかった.
on 2012-12-03 11:02
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.