From: Masao M. <mu...@hi...> - 2005-09-06 17:18:14
|
むとうです。 On Tue, 06 Sep 2005 23:03:53 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > 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)); > } うーん。例えば、pango-1.8.1のpango-layout.cのpango_layout_line_get_x_ranges() の実装を見てみると、オリジナルの方と同じやり方してるんですよね...。 > 手元では以下のスクリプトを実行したら結果に差が出ました. > > 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 *** > > となりました.むぅ. ってか、layout.get_line(0)で落ちてません? require 'gtk2' Gtk.init win = Gtk::Window.new win.realize layout = win.create_pango_layout layout.set_text("a") 10000.times do layout.get_line(0) end -- .:% Masao Mutoh<mu...@hi...> |