Takaaki ISHIKAWA
takax****@ieee*****
2011年 8月 30日 (火) 07:35:48 JST
はじめまして,石川と申します. いつも inline-patch のお世話になっています. さて,表題の通り,Cocoa Emacs + auto-save-buffers.el における Emacs.app のクラッシュについて,少々分析しましたので, ご意見いただければ幸いです. 対象としているのは,最新のemacs-23(emacs-e63f572) http://git.savannah.gnu.org/gitweb/?p=emacs.git;a=shortlog;h=refs/heads/emacs-23 に,inline-patch(Revision 573)をあてて,当方の環境(OSX 10.7.1)にて ビルドしたEmacs.appです.Emacs のバージョンは,23.3.50 になります. == クラッシュの状況 == Emacs.app がクラッシュするのは,IME(かわせみ/ことえり)ON時入力中で, auto-save-buffers が自動的にバッファを保存するタイミングです. 再現性が低かったので,gdb で確認したところ,Fevalが発行するabort();が Emacs.appを落としているとわかりました. ------------- (gdb) f 3 #3 0x000000010011b53d in Feval (form=4424034422) at eval.c:2226 2226 abort (); ------------- 直前で Feval をコールしているのは,nsterm.m の - (NSRect)firstRectForCharacterRange: (NSRange)theRange の条件文でした. == 対処案 == 条件文が実現しているアルゴリズムをみると Feval を使わなくても 同等の結果が得られそうなので,inline-patch に次のような変更を 加えることで,当方の環境ではクラッシュしなくなりました. # 処理が遅くなる可能性が少し考えられます. *** 1073,1081 **** if (NS_KEYLOG) NSLog (@"firstRectForCharRange request"); + ! + if (NILP (Feval (Fcons (intern ("ns-in-echo-area"), Qnil)))) ! + win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); ! + else if (WINDOWP (echo_area_window)) + win = XWINDOW (echo_area_window); + else + win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); --- 1073,1079 ---- if (NS_KEYLOG) NSLog (@"firstRectForCharRange request"); + ! + if (WINDOWP (echo_area_window)) + win = XWINDOW (echo_area_window); + else + win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe)); アルゴリズムの全体を把握していない場当たり的な対処方法ですので, レビューしていただければ幸いです. よろしくお願い致します. ---- Takaaki Ishikawa <takax****@ieee*****>