40864


Emacs のソースコードを読みながら、構造を勉強しながら、いじっています。

Emacs のソースコードで、`src/xterm.h` 内 `struct x_display_info` の定義に、

[code]

      /* This is a cons cell of the form (NAME . FONT-LIST-CACHE).  */
      Lisp_Object name_list_element;
    
[/code]

という部分があります。

GC の際にはこの Lisp_Object も mark してやる必要があると思うのですが、その処理が見つかりません。どこで mark してるのでしょうか?  
具体的には、

[code]

    mark_object (dpyinfo->name_list_element);
    
[/code]

か、またはその代わりの呼び出しがどこかにあるはず、と考えています。

ご存じの方いらっしゃいましたら教えて下さい。

私が見ているコードは  
<https://github.com/emacs-mirror/emacs>  
ですが、教えていただけるなら、リリース版でも開発版でも何でも構いません。

emacs の bug report 先に投げてみることも考えましたが、単なる疑問であって何か症状が起きているわけではないので、そちらには投げていません。

よろしくお願いします。


CC BY-SA 3.0
2018-01-08T15:16:39.573
40823
2018-01-10T13:09:53.360
2018-01-10T13:02:37.703
5288
5288
question
emacs gc
Emacs のコード中 name_list_element を mark している箇所が見つからない


見つけましたので自己回答します。

`src/alloc.c` に以下の関数があります。  

[code]

    static void
    compact_font_caches (void)
    {
      struct terminal *t;
    
      for (t = terminal_list; t; t = t->next_terminal)
        {
          Lisp_Object cache = TERMINAL_FONT_CACHE (t);
          /* Inhibit compacting the caches if the user so wishes.  Some of
             the users don't mind a larger memory footprint, but do mind
             slower redisplay.  */
          if (!inhibit_compacting_font_caches
              && CONSP (cache))
            {
              Lisp_Object entry;
    
              for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry))
                XSETCAR (entry, compact_font_cache_entry (XCAR (entry)));
            }
          mark_object (cache);
        }
    }
    
[/code]

ここで、`TERMINAL_FONT_CACHE` は `src/termhooks.h` で

[code]

    #define TERMINAL_FONT_CACHE(t)                                              \
      (t->type == output_x_window ? t->display_info.x->name_list_element : Qnil)
    
[/code]

と定義されています。  
従って、上記コード中の

[code]

          mark_object (cache);
    
[/code]

の部分が私の探していたものでした。


CC BY-SA 3.0
2018-01-10T13:09:53.360
40864
2018-01-10T13:09:53.360
5288
40823
answer