Subject: Re: bug#75521: scratch/igc: Delete unused macro DEFVAR_LISP_NOPROX

From: Pip Cet <[email-masked]>
Date: Mon, 13 Jan 2025 16:46:39 +0000

"Eli Zaretskii" <[email-masked]> writes:

>> Date: Mon, 13 Jan 2025 14:16:04 +0000
>> From: Pip Cet <[email-masked]>
>> Cc: [email-masked], [email-masked]
>>
>> "Eli Zaretskii" <[email-masked]> writes:
>>
>> >> But then font_style_table is sometimes modified so it points to
>> >> (i.e. contains as its element) a new vector, and I don't see how
>> >> Vfont_weight_table is protected then.
>> >
>> > Modified where?
>>
>> font_style_to_value:
>>
>>       if (! noerror)
>> 	return -1;
>>       eassert (len < 255);
>>       elt = make_vector (2, make_fixnum (100));
>>       ASET (elt, 1, val);
>>       ASET (font_style_table, prop - FONT_WEIGHT_INDEX,
>> 	    CALLN (Fvconcat, table, make_vector (1, elt)));
>>       return (100 << 8) | (i << 4);
>
> OK, but the values gets plugged int font_style_table, right?  And my
> reading of mark_object_root_visitor is that it marks its argument
> recursively, so any object reachable from font_style_table should also
> be protected?  Am I wrong?

No, you're not.  Initially, Vfont_weight_table is protected because it's
reached recursively from font_style_table.  If font_style_table is
modified no longer to contain Vfont_weight_table (by the code above),
Vfont_weight_table loses its protection.  Accessing Vfont_weight_table
from Lisp when it's no longer protected will eventually cause a crash.

Pip