comparison src/opaque.c @ 396:6719134a07c2 r21-2-13

Import from CVS: tag r21-2-13
author cvs
date Mon, 13 Aug 2007 11:12:05 +0200
parents 8626e4521993
children 74fd4e045ea6
comparison
equal deleted inserted replaced
395:de2c2a7459d2 396:6719134a07c2
54 Lisp_Object Vopaque_ptr_free_list; 54 Lisp_Object Vopaque_ptr_free_list;
55 55
56 static Lisp_Object 56 static Lisp_Object
57 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) 57 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object))
58 { 58 {
59 Lisp_Opaque *p = XOPAQUE (obj); 59 Lisp_Opaque *p = XOPAQUE (obj);
60 Lisp_Object size_or_chain = p->size_or_chain; 60 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
61 Lisp_Object size_or_chain = p->size_or_chain;
61 #ifdef ERROR_CHECK_GC 62 #ifdef ERROR_CHECK_GC
62 if (!in_opaque_list_marking) 63 if (!in_opaque_list_marking)
63 /* size is non-int for objects on an opaque free list. We sure 64 /* size is non-int for objects on an opaque free list. We sure
64 as hell better not be marking any of these objects unless 65 as hell better not be marking any of these objects unless
65 we're marking an opaque list. */ 66 we're marking an opaque list. */
79 /* Should never, ever be called. (except by an external debugger) */ 80 /* Should never, ever be called. (except by an external debugger) */
80 static void 81 static void
81 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) 82 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
82 { 83 {
83 CONST Lisp_Opaque *p = XOPAQUE (obj); 84 CONST Lisp_Opaque *p = XOPAQUE (obj);
85 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
86 Lisp_Object size_or_chain = p->size_or_chain;
84 char buf[200]; 87 char buf[200];
85 char size_buf[50]; 88 char size_buf[50];
86 89
87 if (INTP (p->size_or_chain)) 90 if (INTP (size_or_chain))
88 sprintf (size_buf, "size=%lu", (unsigned long) OPAQUE_SIZE (p)); 91 sprintf (size_buf, "size=%lu", (unsigned long) OPAQUE_SIZE (p));
89 else 92 else
90 sprintf (size_buf, "freed"); 93 sprintf (size_buf, "freed");
91 94
92 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque, %s) 0x%lx>", 95 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque, %s) 0x%lx>",
96 99
97 static size_t 100 static size_t
98 sizeof_opaque (CONST void *header) 101 sizeof_opaque (CONST void *header)
99 { 102 {
100 CONST Lisp_Opaque *p = (CONST Lisp_Opaque *) header; 103 CONST Lisp_Opaque *p = (CONST Lisp_Opaque *) header;
104 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
105 Lisp_Object size_or_chain = p->size_or_chain;
101 return offsetof (Lisp_Opaque, data) 106 return offsetof (Lisp_Opaque, data)
102 + (GC_INTP (p->size_or_chain) ? XINT (p->size_or_chain) : 0); 107 + (GC_INTP (size_or_chain) ? XINT (size_or_chain) : 0);
103 } 108 }
104 109
105 /* Return an opaque object of size SIZE. 110 /* Return an opaque object of size SIZE.
106 If DATA is OPAQUE_CLEAR, the object's data is memset to '\0' bytes. 111 If DATA is OPAQUE_CLEAR, the object's data is memset to '\0' bytes.
107 If DATA is OPAQUE_UNINIT, the object's data is uninitialized. 112 If DATA is OPAQUE_UNINIT, the object's data is uninitialized.
131 /* This will not work correctly for opaques with subobjects! */ 136 /* This will not work correctly for opaques with subobjects! */
132 137
133 static int 138 static int
134 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) 139 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth)
135 { 140 {
136 size_t size;
137 #ifdef DEBUG_XEMACS 141 #ifdef DEBUG_XEMACS
138 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2)); 142 {
139 assert (INTP (XOPAQUE (obj1)->size_or_chain)); 143 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
140 assert (INTP (XOPAQUE (obj2)->size_or_chain)); 144 Lisp_Object size_or_chain_1 = XOPAQUE (obj1)->size_or_chain;
141 #endif 145 Lisp_Object size_or_chain_2 = XOPAQUE (obj2)->size_or_chain;
142 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) && 146 assert (INTP (size_or_chain_1));
143 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size)); 147 assert (INTP (size_or_chain_2));
148 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2));
149 }
150 #endif
151 {
152 size_t size;
153 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) &&
154 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size));
155 }
144 } 156 }
145 157
146 /* This will not work correctly for opaques with subobjects! */ 158 /* This will not work correctly for opaques with subobjects! */
147 159
148 static unsigned long 160 static unsigned long
149 hash_opaque (Lisp_Object obj, int depth) 161 hash_opaque (Lisp_Object obj, int depth)
150 { 162 {
151 #ifdef DEBUG_XEMACS 163 #ifdef DEBUG_XEMACS
152 assert (!XOPAQUE_MARKFUN (obj)); 164 {
153 assert (INTP (XOPAQUE (obj)->size_or_chain)); 165 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
166 Lisp_Object size_or_chain = XOPAQUE (obj)->size_or_chain;
167 assert (INTP (size_or_chain));
168 assert (!XOPAQUE_MARKFUN (obj));
169 }
154 #endif 170 #endif
155 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long)) 171 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long))
156 return *((unsigned long *) XOPAQUE_DATA(obj)); 172 return *((unsigned long *) XOPAQUE_DATA (obj));
157 else 173 else
158 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj)); 174 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj));
159 } 175 }
160 176
161 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, 177 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque,
221 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque) 237 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque)
222 { 238 {
223 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list); 239 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
224 240
225 #ifdef ERROR_CHECK_GC 241 #ifdef ERROR_CHECK_GC
226 assert (INTP (XOPAQUE (opaque)->size_or_chain)); 242 {
243 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
244 Lisp_Object size_or_chain = XOPAQUE (opaque)->size_or_chain;
245 assert (INTP (size_or_chain));
246 }
227 #endif 247 #endif
228 XOPAQUE (opaque)->size_or_chain = li->free; 248 XOPAQUE (opaque)->size_or_chain = li->free;
229 li->free = opaque; 249 li->free = opaque;
230 } 250 }
231 251