GNU bug report logs - #6618
24.0.50; stack overflow in equal

Previous Next

Package: emacs;

Reported by: john ffitch <jpff <at> codemist.co.uk>

Date: Mon, 12 Jul 2010 11:03:03 UTC

Severity: normal

Found in version 24.0.50

Done: Chong Yidong <cyd <at> stupidchicken.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Bernhard Herzog <bernhard.herzog <at> intevation.de>
To: 6618 <at> debbugs.gnu.org
Subject: bug#6618: Bug was probably introduced by revision 100788
Date: Tue, 13 Jul 2010 12:39:08 +0200
I'm running into the same problem and I've debugged it a little. AFAICT the 
problem was introduced with revision 100788.  The revision immediately before 
that works fine, but I can observer the problem with revision 100788.  The 
ChangeLog entry for this is

2010-07-12  Kenichi Handa  <handa <at> m17n.org>

       * font.h (enum font_property_index): New member FONT_ENTITY_INDEX.

       * font.c (font_open_entity): Record ENTITY in FONT_OBJECT's slot
       of FONT_ENTITY_INDEX.
       (Ffont_get): If KEY is :otf and the font-object doesn't have the
       property, get the property value dynamically.
       (Ffont_put): Accept font-entity and font-object too.
       (Ffont_get_glyhphs): Renamed from Fget_font_glyphs.  Arguments and
       return value changed.
       (syms_of_font): Adjusted for the above change.

It's most likely the first change in font.c: "Record ENTITY in FONT_OBJECT's 
slot of FONT_ENTITY_INDEX.":

--- src/font.c  2010-07-11 10:31:10 +0000
+++ src/font.c  2010-07-12 02:28:50 +0000
@@ -3005,7 +3005,7 @@
     return Qnil;
   ASET (entity, FONT_OBJLIST_INDEX,
        Fcons (font_object, AREF (entity, FONT_OBJLIST_INDEX)));
-  ASET (font_object, FONT_OBJLIST_INDEX, Qnil);
+  ASET (font_object, FONT_ENTITY_INDEX, entity);
   num_fonts++;
 
   font = XFONT_OBJECT (font_object);

This introduces circular references: font_object now refers to entity and 
entity refers back to font_object.  This probably leads to the stack overflow 
in equal later on.  A backtrace in gdb looks like this, after about 200 
recursive calls of internal_equal:

#200 0x081a2012 in internal_equal (o1=<value optimized out>, o2=149618949, 
    depth=<value optimized out>, props=0) at fns.c:2127
#201 0x081a2012 in internal_equal (o1=<value optimized out>, o2=149761965, 
    depth=<value optimized out>, props=0) at fns.c:2127
#202 0x081a21ba in Fequal (o1=141309301, o2=149761965) at fns.c:2015
#203 0x080ddd67 in Finternal_set_lisp_face_attribute (face=138409674, 
    attr=138389402, value=149761965, frame=150016069) at xfaces.c:3288


  Bernhard




This bug report was last modified 15 years and 27 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.