[#46807] [ruby-trunk - Bug #7625][Open] Arrayを継承したオブジェクトのcompactがArrayを返す — "mogya@... (Daisuke Furukawa)" <mogya@...>

19 messages 2012/12/26

[#46822] [ruby-trunk - Feature #7639][Open] More freedom for location of comments — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

14 messages 2012/12/30

[ruby-dev:46695] [ruby-trunk - Bug #7502][Open] ObjectSpace.each_object で inspect できないオブジェクトが渡ってくる

From: "ko1 (Koichi Sasada)" <redmine@...>
Date: 2012-12-03 10:01:59 UTC
List: ruby-dev #46695
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/

In This Thread

Prev Next