Mercurial > hg > xemacs-beta
diff src/opaque.c @ 337:fbbf69b4e8a7 r21-0-66
Import from CVS: tag r21-0-66
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:51:02 +0200 |
parents | c5d627a313b1 |
children | cc15677e0335 |
line wrap: on
line diff
--- a/src/opaque.c Mon Aug 13 10:50:41 2007 +0200 +++ b/src/opaque.c Mon Aug 13 10:51:02 2007 +0200 @@ -55,32 +55,38 @@ static Lisp_Object mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) { + struct Lisp_Opaque *p = XOPAQUE (obj); + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = p->size_or_chain; #ifdef ERROR_CHECK_GC if (!in_opaque_list_marking) /* size is non-int for objects on an opaque free list. We sure as hell better not be marking any of these objects unless we're marking an opaque list. */ - assert (INTP (XOPAQUE (obj)->size_or_chain)); + assert (GC_INTP (size_or_chain)); else /* marking an opaque on the free list doesn't do any recursive markings, so we better not have non-freed opaques on a free list. */ - assert (!INTP (XOPAQUE (obj)->size_or_chain)); + assert (!GC_INTP (size_or_chain)); #endif - if (INTP (XOPAQUE (obj)->size_or_chain) && XOPAQUE_MARKFUN (obj)) - return XOPAQUE_MARKFUN (obj) (obj, markobj); + if (GC_INTP (size_or_chain) && OPAQUE_MARKFUN (p)) + return OPAQUE_MARKFUN (p) (obj, markobj); else - return XOPAQUE (obj)->size_or_chain; + return size_or_chain; } /* Should never, ever be called. (except by an external debugger) */ static void print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) { + CONST struct Lisp_Opaque *p = XOPAQUE (obj); + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = p->size_or_chain; char buf[200]; - if (INTP (XOPAQUE (obj)->size_or_chain)) + if (GC_INTP (size_or_chain)) sprintf (buf, "#<INTERNAL EMACS BUG (opaque, size=%ld) 0x%lx>", - (long) XOPAQUE_SIZE (obj), (unsigned long) XPNTR (obj)); + (long) OPAQUE_SIZE (p), (unsigned long) XPNTR (obj)); else sprintf (buf, "#<INTERNAL EMACS BUG (opaque, freed) 0x%lx>", (unsigned long) XPNTR (obj)); @@ -91,9 +97,11 @@ sizeof_opaque (CONST void *header) { CONST struct Lisp_Opaque *p = (CONST struct Lisp_Opaque *) header; - if (!INTP (p->size_or_chain)) + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = p->size_or_chain; + if (!GC_INTP (size_or_chain)) return sizeof (*p); - return sizeof (*p) + XINT (p->size_or_chain) - sizeof (int); + return sizeof (*p) + XINT (size_or_chain) - sizeof (int); } Lisp_Object @@ -119,16 +127,20 @@ equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) { #ifdef DEBUG_XEMACS - assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2)); - assert (INTP (XOPAQUE(obj1)->size_or_chain)); - assert (INTP (XOPAQUE(obj2)->size_or_chain)); + { + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain_1 = XOPAQUE (obj1)->size_or_chain; + Lisp_Object size_or_chain_2 = XOPAQUE (obj2)->size_or_chain; + assert (INTP (size_or_chain_1)); + assert (INTP (size_or_chain_2)); + assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2)); + } #endif - if (XOPAQUE_SIZE(obj1) != XOPAQUE_SIZE(obj2)) - return 0; - return (XOPAQUE_SIZE(obj1) == sizeof(*XOPAQUE_DATA(obj1)) - ? *XOPAQUE_DATA(obj1) == *XOPAQUE_DATA(obj2) - : memcmp (XOPAQUE_DATA(obj1), XOPAQUE_DATA(obj2), - XOPAQUE_SIZE(obj1)) == 0); + { + size_t size; + return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) && + !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size)); + } } /* This will not work correctly for opaques with subobjects! */ @@ -137,13 +149,17 @@ hash_opaque (Lisp_Object obj, int depth) { #ifdef DEBUG_XEMACS - assert (!XOPAQUE_MARKFUN (obj)); - assert (INTP (XOPAQUE(obj)->size_or_chain)); + { + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = XOPAQUE (obj)->size_or_chain; + assert (INTP (size_or_chain)); + assert (!XOPAQUE_MARKFUN (obj)); + } #endif - if (XOPAQUE_SIZE(obj) == sizeof (unsigned long)) - return (unsigned int) *XOPAQUE_DATA(obj); + if (XOPAQUE_SIZE (obj) == sizeof (unsigned long)) + return *((unsigned long *) XOPAQUE_DATA (obj)); else - return memory_hash (XOPAQUE_DATA(obj), XOPAQUE_SIZE(obj)); + return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj)); } DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, @@ -211,7 +227,11 @@ struct Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list); #ifdef ERROR_CHECK_GC - assert (INTP (XOPAQUE (opaque)->size_or_chain)); + { + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = XOPAQUE (opaque)->size_or_chain; + assert (INTP (size_or_chain)); + } #endif XOPAQUE (opaque)->size_or_chain = li->free; li->free = opaque;