From: Kouhei S. <ko...@co...> - 2005-09-06 14:03:59
|
須藤です. Ruby/Pangoのメモリの割り当て方がおかしい気がします.たとえば, layout_line_get_extents()はこんな風になっていますが, static VALUE layout_line_get_extents(self) VALUE self; { PangoRectangle ink_rect, logical_rect; pango_layout_line_get_extents(_SELF(self), &ink_rect, &logical_rect); return rb_assoc_new(BOXED2RVAL(&ink_rect, PANGO_TYPE_RECTANGLE), BOXED2RVAL(&logical_rect, PANGO_TYPE_RECTANGLE)); } こんな風にしなければいけないのでしょうか? static VALUE layout_line_get_extents(self) VALUE self; { PangoRectangle *ink_rect, *logical_rect; ink_rect = g_new(PangoRectangle, 1); logical_rect = g_new(PangoRectangle, 1); pango_layout_line_get_extents(_SELF(self), ink_rect, logical_rect); return rb_assoc_new(BOXED2RVAL(ink_rect, PANGO_TYPE_RECTANGLE), BOXED2RVAL(logical_rect, PANGO_TYPE_RECTANGLE)); } 手元では以下のスクリプトを実行したら結果に差が出ました. require 'gtk2' Gtk.init layout = Gtk::Invisible.new.create_pango_layout layout.set_text("a") 10000.times do layout.get_line(0).extents end オリジナルでは, pango-segv.rb:7: [BUG] Segmentation fault になり,修正後では *** glibc detected *** corrupted double-linked list: 0x08346070 *** となりました.むぅ. |