From: Masao M. <mu...@hi...> - 2005-02-22 15:47:52
|
むとうです。 On Tue, 22 Feb 2005 02:58:28 +0900 Masao Mutoh <mu...@hi...> wrote: > むとうです。 > > 最近のRubyを試されている方で、 > Ruby-GNOME2が動かなくなっている、という方いませんか? > > 今日、気づいたのですが、 > ruby 1.9.0 (2005-02-20)/ruby 1.8.2 (2005-02-20) > の2つでgtk-demoのStock Item and Icon Browserが動作 > しなくなっています。 > > ruby 1.8.2 (2004-12-25) なら動作します。 > > どなたかこの件について何かご存じありませんか? とりあえず、現象はわかりました。 glib/src/rbgobj_type.cのrbgobj_lookup_class()にデバッグ文を 入れてみました。 この関数はklassからRGObjClassInfoというgtype等が入っている 構造体をlookupするものです。 なので、GTKなオブジェクトであれば必ずヒットするはずです。 static int d = 0; const RGObjClassInfo * rbgobj_lookup_class(klass) VALUE klass; { VALUE data = rb_hash_aref(klass_to_cinfo, klass); if (!NIL_P(data)){ RGObjClassInfo* cinfo; Data_Get_Struct(data, RGObjClassInfo, cinfo); return cinfo; } if (TYPE(klass) == T_CLASS){ printf("%s: go superclass: %d", rb_class2name(klass), d); printf(": super class = %s\n", rb_class2name(rb_funcall(klass, id_superclass, 0))); d += 1; return rbgobj_lookup_class(rb_funcall(klass, id_superclass, 0)); } rb_raise(rb_eRuntimeError, "can't get gobject class infomation"); } サンプルスクリプト: require 'gtk2' Gtk.init test = Gtk::Window.new class << test end p test.class p test.class.superclass test.show_all 結果: Gtk::Window Gtk::Bin Gtk::Window: go superclass: 0: super class = Class Class: go superclass: 1: super class = Class Class: go superclass: 2: super class = Class Class: go superclass: 3: super class = Class Class: go superclass: 4: super class = Class Class: go superclass: 5: super class = Class Class: go superclass: 6: super class = Class Class: go superclass: 7: super class = Class (以下無限ループ) ---------- printf文のところで、klassがClassだったら例外あげる、とかも 考えられますが、それでは、期待した動作になりません。 期待した動作、についてですが、ここでは2つ期待した動作になっていません。 1. Gtk::Window自体がrb_hash_aref(klass_to_cinfo, klass)で引っかからない (本来であれば最初に引っかかるはず)。 2. Gtk::WindowのスーパークラスがGtk::BinにならずにClassになってしまっている (こちらはどちらかというとどうでも良いのですが) ---------- これが、ruby 1.8.2 (2004-12-25) [i686-linux]だと、以下の結果になります。 Gtk::Window Gtk::Bin Gtk::Window: go superclass: 0: super class = Gtk::Window (ここで終わり) ---------- つまり、特異クラス(でいいんでしたっけ?)の内部的な扱いが変わったって ことですかね...。 このままではあまりに拡張ライブラリの内部の話なのでruby-devに 投げれないですね。 もう少し現象を追って整理してから報告しないとですね。 #誰か代わりにやってくれないですか?(^^;) P.S. 今日はここまでにします。なんか体調悪くて。 -- .:% Masao Mutoh<mu...@hi...> |