comparison 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
comparison
equal deleted inserted replaced
336:fe0a93612022 337:fbbf69b4e8a7
53 Lisp_Object Vopaque_ptr_free_list; 53 Lisp_Object Vopaque_ptr_free_list;
54 54
55 static Lisp_Object 55 static Lisp_Object
56 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) 56 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object))
57 { 57 {
58 struct Lisp_Opaque *p = XOPAQUE (obj);
59 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
60 Lisp_Object size_or_chain = p->size_or_chain;
58 #ifdef ERROR_CHECK_GC 61 #ifdef ERROR_CHECK_GC
59 if (!in_opaque_list_marking) 62 if (!in_opaque_list_marking)
60 /* size is non-int for objects on an opaque free list. We sure 63 /* size is non-int for objects on an opaque free list. We sure
61 as hell better not be marking any of these objects unless 64 as hell better not be marking any of these objects unless
62 we're marking an opaque list. */ 65 we're marking an opaque list. */
63 assert (INTP (XOPAQUE (obj)->size_or_chain)); 66 assert (GC_INTP (size_or_chain));
64 else 67 else
65 /* marking an opaque on the free list doesn't do any recursive 68 /* marking an opaque on the free list doesn't do any recursive
66 markings, so we better not have non-freed opaques on a free 69 markings, so we better not have non-freed opaques on a free
67 list. */ 70 list. */
68 assert (!INTP (XOPAQUE (obj)->size_or_chain)); 71 assert (!GC_INTP (size_or_chain));
69 #endif 72 #endif
70 if (INTP (XOPAQUE (obj)->size_or_chain) && XOPAQUE_MARKFUN (obj)) 73 if (GC_INTP (size_or_chain) && OPAQUE_MARKFUN (p))
71 return XOPAQUE_MARKFUN (obj) (obj, markobj); 74 return OPAQUE_MARKFUN (p) (obj, markobj);
72 else 75 else
73 return XOPAQUE (obj)->size_or_chain; 76 return size_or_chain;
74 } 77 }
75 78
76 /* Should never, ever be called. (except by an external debugger) */ 79 /* Should never, ever be called. (except by an external debugger) */
77 static void 80 static void
78 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) 81 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
79 { 82 {
83 CONST struct Lisp_Opaque *p = XOPAQUE (obj);
84 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
85 Lisp_Object size_or_chain = p->size_or_chain;
80 char buf[200]; 86 char buf[200];
81 if (INTP (XOPAQUE (obj)->size_or_chain)) 87 if (GC_INTP (size_or_chain))
82 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, size=%ld) 0x%lx>", 88 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, size=%ld) 0x%lx>",
83 (long) XOPAQUE_SIZE (obj), (unsigned long) XPNTR (obj)); 89 (long) OPAQUE_SIZE (p), (unsigned long) XPNTR (obj));
84 else 90 else
85 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, freed) 0x%lx>", 91 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, freed) 0x%lx>",
86 (unsigned long) XPNTR (obj)); 92 (unsigned long) XPNTR (obj));
87 write_c_string (buf, printcharfun); 93 write_c_string (buf, printcharfun);
88 } 94 }
89 95
90 static size_t 96 static size_t
91 sizeof_opaque (CONST void *header) 97 sizeof_opaque (CONST void *header)
92 { 98 {
93 CONST struct Lisp_Opaque *p = (CONST struct Lisp_Opaque *) header; 99 CONST struct Lisp_Opaque *p = (CONST struct Lisp_Opaque *) header;
94 if (!INTP (p->size_or_chain)) 100 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
101 Lisp_Object size_or_chain = p->size_or_chain;
102 if (!GC_INTP (size_or_chain))
95 return sizeof (*p); 103 return sizeof (*p);
96 return sizeof (*p) + XINT (p->size_or_chain) - sizeof (int); 104 return sizeof (*p) + XINT (size_or_chain) - sizeof (int);
97 } 105 }
98 106
99 Lisp_Object 107 Lisp_Object
100 make_opaque (int size, CONST void *data) 108 make_opaque (int size, CONST void *data)
101 { 109 {
117 125
118 static int 126 static int
119 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) 127 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth)
120 { 128 {
121 #ifdef DEBUG_XEMACS 129 #ifdef DEBUG_XEMACS
122 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2)); 130 {
123 assert (INTP (XOPAQUE(obj1)->size_or_chain)); 131 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
124 assert (INTP (XOPAQUE(obj2)->size_or_chain)); 132 Lisp_Object size_or_chain_1 = XOPAQUE (obj1)->size_or_chain;
125 #endif 133 Lisp_Object size_or_chain_2 = XOPAQUE (obj2)->size_or_chain;
126 if (XOPAQUE_SIZE(obj1) != XOPAQUE_SIZE(obj2)) 134 assert (INTP (size_or_chain_1));
127 return 0; 135 assert (INTP (size_or_chain_2));
128 return (XOPAQUE_SIZE(obj1) == sizeof(*XOPAQUE_DATA(obj1)) 136 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2));
129 ? *XOPAQUE_DATA(obj1) == *XOPAQUE_DATA(obj2) 137 }
130 : memcmp (XOPAQUE_DATA(obj1), XOPAQUE_DATA(obj2), 138 #endif
131 XOPAQUE_SIZE(obj1)) == 0); 139 {
140 size_t size;
141 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) &&
142 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size));
143 }
132 } 144 }
133 145
134 /* This will not work correctly for opaques with subobjects! */ 146 /* This will not work correctly for opaques with subobjects! */
135 147
136 static unsigned long 148 static unsigned long
137 hash_opaque (Lisp_Object obj, int depth) 149 hash_opaque (Lisp_Object obj, int depth)
138 { 150 {
139 #ifdef DEBUG_XEMACS 151 #ifdef DEBUG_XEMACS
140 assert (!XOPAQUE_MARKFUN (obj)); 152 {
141 assert (INTP (XOPAQUE(obj)->size_or_chain)); 153 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
142 #endif 154 Lisp_Object size_or_chain = XOPAQUE (obj)->size_or_chain;
143 if (XOPAQUE_SIZE(obj) == sizeof (unsigned long)) 155 assert (INTP (size_or_chain));
144 return (unsigned int) *XOPAQUE_DATA(obj); 156 assert (!XOPAQUE_MARKFUN (obj));
145 else 157 }
146 return memory_hash (XOPAQUE_DATA(obj), XOPAQUE_SIZE(obj)); 158 #endif
159 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long))
160 return *((unsigned long *) XOPAQUE_DATA (obj));
161 else
162 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj));
147 } 163 }
148 164
149 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, 165 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque,
150 mark_opaque, print_opaque, 0, 166 mark_opaque, print_opaque, 0,
151 equal_opaque, hash_opaque, 167 equal_opaque, hash_opaque,
209 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque) 225 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque)
210 { 226 {
211 struct Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list); 227 struct Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
212 228
213 #ifdef ERROR_CHECK_GC 229 #ifdef ERROR_CHECK_GC
214 assert (INTP (XOPAQUE (opaque)->size_or_chain)); 230 {
231 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
232 Lisp_Object size_or_chain = XOPAQUE (opaque)->size_or_chain;
233 assert (INTP (size_or_chain));
234 }
215 #endif 235 #endif
216 XOPAQUE (opaque)->size_or_chain = li->free; 236 XOPAQUE (opaque)->size_or_chain = li->free;
217 li->free = opaque; 237 li->free = opaque;
218 } 238 }
219 239