パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Emacs CVS HEAD で M+ フォントを使うと落ちる」記事へのコメント

  • |   default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
    |   if (default_face
    |       && lface_same_font_attributes_p (default_face->lface, attrs))
    |     {
    |       face->font = default_face->font;
    |       face->fontset
    |     = make_fontset_for_ascii_face (f, default_face->fontset, face);
    |     }
    |   else
    |     { .... skip ......
    |   

    --
    fjの教祖様
    • > つまり、このロジックには「一番最初の行で、 default_face が NULL だった場合」が考慮されていない。

      if (fontset == -1) を if (fontset == -1 && default_face) に変えれば
      SEGV は避けられるのですけれど、結局 abort() してしまいますからね…。変
      えるかどうか微妙なところのように思います。

      > fs_query_fontset( name, 0 ) は -1 を返さないのか?

      fs_query_fontset( name, 0 ) が -1 を返す可能性があることに今さら気がつ
      きました…。

      ;; ねぼけてるなぁ…
      --
      コズミック・ジョーカー
      • いや、default_face が NULL だったら何をするか…で最初に分岐するべきだろう。

        default_face って基本 NULL に「ならない」ように初期化されているものなんだっけ?? もしそうなら、この段階で停止させてデバッグを開始させるべきだと思う。

        そうでないなら、default_face には「全く何も指定されなかった場合」のケースを入れるべき。
        --
        fjの教祖様
        • > default_face って基本 NULL に「ならない」ように初期化されているものなんだっけ?? もしそうなら、この段階で停止させてデバッグを開始させるべきだと思う。

          frame で使われるフォントが変わったりした時は NULL になります。 で、この
          時は face_fontset (attrs) が -1 以外の値を返すはずなのでこのようになっ
          ているみたいですね。

          結局、 fs_query_fontset( name, 0 ) の中で使われている name のワイルドカー
          ドを正規表現に変換する関数が `+' をエスケープしていないことが原因でマッ
          チせずに -1 を返していることが原因でした。

          ;; `[' とか `.' とかもエスケープするべきなのだろうにされていない…。
          --
          コズミック・ジョーカー
          親コメント
          • face_fontset(attr) は「本来」ならば、default_face==NULL の場合、絶対 -1 を返さないんだろうか?

            もし「絶対返さない」なら、論理的に冗長な何かがある気がする。たとえば、default_face を NULL に書き換えた段階で、NULL にしないで違う値を代入できるはずだ、とか。
            その一方で、普通は -1 を返すケースがあるような気がする。いろいろ設定が間違っている場合とか…。

            この段階で納得がいかない。
            --
            fjの教祖様
            親コメント

クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人

処理中...