X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fopaque.c;h=70d29b931c43366659db6515ed7baa9329d9861b;hb=02276b8e7e7b7e647493d52f77beb00d64951836;hp=d15bac5c2911478e905cb231717dca32723c70ed;hpb=77dcef404dc78635f6ffa8f71a803d2bc7cc8921;p=chise%2Fxemacs-chise.git- diff --git a/src/opaque.c b/src/opaque.c index d15bac5..70d29b9 100644 --- a/src/opaque.c +++ b/src/opaque.c @@ -42,7 +42,6 @@ Boston, MA 02111-1307, USA. */ #include #include "lisp.h" #include "opaque.h" -#include Lisp_Object Qopaquep; @@ -56,8 +55,9 @@ Lisp_Object Vopaque_ptr_free_list; static Lisp_Object mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) { - Lisp_Opaque *p = XOPAQUE (obj); - Lisp_Object size_or_chain = p->size_or_chain; + 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 @@ -81,10 +81,12 @@ static void print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) { CONST 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]; char size_buf[50]; - if (INTP (p->size_or_chain)) + if (INTP (size_or_chain)) sprintf (size_buf, "size=%lu", (unsigned long) OPAQUE_SIZE (p)); else sprintf (size_buf, "freed"); @@ -98,8 +100,10 @@ static size_t sizeof_opaque (CONST void *header) { CONST Lisp_Opaque *p = (CONST Lisp_Opaque *) header; + /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */ + Lisp_Object size_or_chain = p->size_or_chain; return offsetof (Lisp_Opaque, data) - + (GC_INTP (p->size_or_chain) ? XINT (p->size_or_chain) : 0); + + (GC_INTP (size_or_chain) ? XINT (size_or_chain) : 0); } /* Return an opaque object of size SIZE. @@ -110,7 +114,7 @@ Lisp_Object make_opaque (size_t size, CONST void *data) { Lisp_Opaque *p = (Lisp_Opaque *) - alloc_lcrecord (offsetof (Lisp_Opaque, data) + size, lrecord_opaque); + alloc_lcrecord (offsetof (Lisp_Opaque, data) + size, &lrecord_opaque); p->markfun = 0; p->size_or_chain = make_int (size); @@ -133,14 +137,21 @@ make_opaque (size_t size, CONST void *data) static int equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) { - size_t size; #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 - return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) && - !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size)); + { + 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! */ @@ -149,18 +160,22 @@ static unsigned long 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 long *) XOPAQUE_DATA(obj)); + return *((unsigned long *) XOPAQUE_DATA (obj)); else return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj)); } DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, mark_opaque, print_opaque, 0, - equal_opaque, hash_opaque, + equal_opaque, hash_opaque, 0, sizeof_opaque, Lisp_Opaque); static Lisp_Object @@ -179,7 +194,7 @@ make_opaque_list (size_t size, { Lisp_Object val; Lisp_Opaque_List *p = - alloc_lcrecord_type (Lisp_Opaque_List, lrecord_opaque_list); + alloc_lcrecord_type (Lisp_Opaque_List, &lrecord_opaque_list); p->markfun = markfun; p->size = size; @@ -190,7 +205,7 @@ make_opaque_list (size_t size, DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list, mark_opaque_list, internal_object_printer, - 0, 0, 0, Lisp_Opaque_List); + 0, 0, 0, 0, Lisp_Opaque_List); Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list, CONST void *data) @@ -223,7 +238,11 @@ free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque) 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;