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]