Bug #7502

ObjectSpace.each_object で inspect できないオブジェクトが渡ってくる

Added by Koichi Sasada almost 3 years ago. Updated almost 3 years ago.

[ruby-dev:46695]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v:ruby -v: ruby 2.0.0dev (2012-12-03 trunk 38155) [x86_64-linux] Backport:

Description

西山さんに,
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() が役に立つか! と思ったけど, 今回は役立てられなかった.

Associated revisions

Revision 38156
Added by Koichi Sasada almost 3 years ago

  • iseq.h: iseq_catch_table_entry::catch_type should be Fixnum because they are pushed into Array in a compiler. [Bug #7502]
  • test/ruby/test_objectspace.rb: add a test of this issue.

Revision 38156
Added by Koichi Sasada almost 3 years ago

  • iseq.h: iseq_catch_table_entry::catch_type should be Fixnum because they are pushed into Array in a compiler. [Bug #7502]
  • test/ruby/test_objectspace.rb: add a test of this issue.

History

#1 Updated by Koichi Sasada almost 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r38156.
Koichi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • iseq.h: iseq_catch_table_entry::catch_type should be Fixnum because they are pushed into Array in a compiler. [Bug #7502]
  • test/ruby/test_objectspace.rb: add a test of this issue.

Also available in: Atom PDF