けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :13115 ] the message: "[ruby-list:13115] Re: ", on
Mar/24 11:36(JST) Mitsuru Oshima writes:

>大島です。

>> |>あと、大きな問題ではないと思うのですが、
>> |# 大きな問題でないってこともないと思いますけどね(^^;;;
>> 
>> ですね.考えてませんでした.

>大きな問題ではない、といったのはweak referenceのidも
>weak referenceがGCされたときに、いずれは回収されるはずなので
>大体OKだな、と思ったからです。もちろん、ちゃんと処理したほうが
>ありがたいです。

あと, もうひとつ問題があって:

  obj = Object.new
  ref = WeakRef.new(obj)
  WeakRef.new(obj)
  # Array.new(100000000)
  ObjectSpace.garbage_collect
  ref[]

なんてやると. 参照先がまだGCされていないのにGCされたことになっちゃうっ
てのもありますね.  

ということで, 新パッチにもバグがありました(^^;;

-- ここから
  ID_MAP =  {}		    # obj -> [ref,...]
  ID_REV_MAP =  {}          # ref -> obj
  ObjectSpace.add_finalizer(lambda{|id|
			      rids = ID_MAP[id]
			      if rids
				for rid in rids
				  ID_REV_MAP[rid] = nil
				end
				ID_MAP[id] = nil
			      end
			      rid = ID_REV_MAP[id]
			      if rid
				ID_REV_MAP[id] = nil
				ID_MAP[rid].delete(id)
      				ID_MAP[rid] = nil if ID_MAP[rid].empty?
			      end
			    })
--			    

ところで,

                ObjectSpace.add_finalizer(lambda{|id|
			      rids = ID_MAP
			      if rids
				for rid in rids
				  ID_REV_MAP[rid] = nil
				  ObjectSpace._id2ref(rid).instace_eval{@__id = nil}
				end
				ID_MAP[id] = nil
			      end

見たいな感じにすると, __getobj__でID_MAPをいちいち見ないで済むと思うん
ですがどうでしょうね?

>あ、newってただの特異メソッドなのですね?

ですね。

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---