Package: xemacs21
Version: 21.4.21-4
Severity: important
User: [EMAIL PROTECTED]
Usertag: rc-m68k

Hi,

xemacs currently segfaults on m68k. The reason isn't entirely clear to
me yet, but I wanted to put this bugreport out so that perhaps some
other people could join in.

(gdb) where
#0  0x8005d0d2 in Fsetcdr (cons_cell=0, newcdr=-2144562184) at data.c:633
#1  0x8006cfea in warn_when_safe_lispobj (class=0, level=0, obj=-2144562184)
    at eval.c:5296
#2  0x8006e98c in Fsignal (error_symbol=0, data=-2144562234) at eval.c:2048
#3  0x8006fcc8 in signal_error (sig=0, data=-2144562234) at eval.c:2062
#4  0x8005b6a0 in dead_wrong_type_argument (predicate=0, value=-2144632030)
    at data.c:116
#5  0x8013980a in Fintern (string=-2144632030, obarray=-2144627976)
    at symbols.c:213
#6  0x8013997a in defsymbol (location=0x8028eee4, name=0x8019ede9 "t")
    at symbols.c:3380
#7  0x80139b12 in init_symbols_once_early () at symbols.c:3292
#8  0x8006b9e6 in xemacs_21_4_21_m68k_unknown_linux (argc=5, argv=0xefa6cd54, 
    envp=0xefa6cd6c, restart=0) at emacs.c:1333
#9  0x8006c52c in main (argc=5, argv=0xefa6cd54, envp=0xefa6cd6c)
    at emacs.c:2829

What's going on is that defsymbol calls Fintern like this:

  *location = Fintern (make_string_nocopy ((const Bufbyte *) name,
                                           strlen (name)),
                       Qnil);

One of the first thing Fintern does is CHECK_STRING. This (through a
twisty maze of cpp macros, all alike) expands to:

  do { if (!((((enum Lisp_Type) (((unsigned long)(string)) & ~(((1UL << ((4 * 
8) - 2)) - 1UL) << 2))) == Lisp_Type_Record) && (((unsigned int)(((struct 
lrecord_header *) ((void *) (string)))->type)) == ((unsigned 
int)(lrecord_type_string))))) dead_wrong_type_argument (Qstringp, string); } 
while (0);

That is, after running it through indent:

        do {
                if(!
                   ((((enum Lisp_Type)(((unsigned long)(string)) & 
                                       ~(((1UL << ((4 * 8) - 2)) -
                                          1UL) << 2))) == Lisp_Type_Record)
                    &&
                    (((unsigned
                       int)(((struct lrecord_header *)((void *)(string)))->
                            type)) == ((unsigned int)(lrecord_type_string)))))
                        dead_wrong_type_argument(Qstringp, string);
        } while(0);

Which in this particular case happens to mean that
dead_wrong_type_argument gets called with a Qstringp that is 0 at this
point. Since Fsetcdr wants to dereference whatever becomes of Qstringp
as a pointer, we obviously get a segfault.

I've not finished debugging this yet, but any insight as to what's going
wrong is welcome.

-- 
<Lo-lan-do> Home is where you have to wash the dishes.
  -- #debian-devel, Freenode, 2004-09-22



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to