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;