Mercurial > hg > xemacs-beta
comparison src/opaque.c @ 272:c5d627a313b1 r21-0b34
Import from CVS: tag r21-0b34
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:28:48 +0200 |
parents | 966663fcf606 |
children | fbbf69b4e8a7 |
comparison
equal
deleted
inserted
replaced
271:c7b7086b0a39 | 272:c5d627a313b1 |
---|---|
49 | 49 |
50 /* Holds freed opaque objects created with make_opaque_ptr(). | 50 /* Holds freed opaque objects created with make_opaque_ptr(). |
51 We do this quite often so it's a noticeable win if we don't | 51 We do this quite often so it's a noticeable win if we don't |
52 create GC junk. */ | 52 create GC junk. */ |
53 Lisp_Object Vopaque_ptr_free_list; | 53 Lisp_Object Vopaque_ptr_free_list; |
54 | |
55 static Lisp_Object mark_opaque (Lisp_Object, void (*) (Lisp_Object)); | |
56 static unsigned int sizeof_opaque (CONST void *header); | |
57 static void print_opaque (Lisp_Object obj, Lisp_Object printcharfun, | |
58 int escapeflag); | |
59 static int equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth); | |
60 static unsigned long hash_opaque (Lisp_Object obj, int depth); | |
61 | |
62 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, | |
63 mark_opaque, print_opaque, 0, | |
64 equal_opaque, hash_opaque, | |
65 sizeof_opaque, struct Lisp_Opaque); | |
66 | 54 |
67 static Lisp_Object | 55 static Lisp_Object |
68 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 56 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
69 { | 57 { |
70 #ifdef ERROR_CHECK_GC | 58 #ifdef ERROR_CHECK_GC |
97 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, freed) 0x%lx>", | 85 sprintf (buf, "#<INTERNAL EMACS BUG (opaque, freed) 0x%lx>", |
98 (unsigned long) XPNTR (obj)); | 86 (unsigned long) XPNTR (obj)); |
99 write_c_string (buf, printcharfun); | 87 write_c_string (buf, printcharfun); |
100 } | 88 } |
101 | 89 |
102 static unsigned int | 90 static size_t |
103 sizeof_opaque (CONST void *header) | 91 sizeof_opaque (CONST void *header) |
104 { | 92 { |
105 CONST struct Lisp_Opaque *p = (CONST struct Lisp_Opaque *) header; | 93 CONST struct Lisp_Opaque *p = (CONST struct Lisp_Opaque *) header; |
106 if (!INTP (p->size_or_chain)) | 94 if (!INTP (p->size_or_chain)) |
107 return sizeof (*p); | 95 return sizeof (*p); |
156 return (unsigned int) *XOPAQUE_DATA(obj); | 144 return (unsigned int) *XOPAQUE_DATA(obj); |
157 else | 145 else |
158 return memory_hash (XOPAQUE_DATA(obj), XOPAQUE_SIZE(obj)); | 146 return memory_hash (XOPAQUE_DATA(obj), XOPAQUE_SIZE(obj)); |
159 } | 147 } |
160 | 148 |
161 static Lisp_Object mark_opaque_list (Lisp_Object, void (*) (Lisp_Object)); | 149 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, |
162 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list, | 150 mark_opaque, print_opaque, 0, |
163 mark_opaque_list, internal_object_printer, | 151 equal_opaque, hash_opaque, |
164 0, 0, 0, struct Lisp_Opaque_List); | 152 sizeof_opaque, struct Lisp_Opaque); |
165 | 153 |
166 static Lisp_Object | 154 static Lisp_Object |
167 mark_opaque_list (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 155 mark_opaque_list (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
168 { | 156 { |
169 in_opaque_list_marking++; | 157 in_opaque_list_marking++; |
175 Lisp_Object | 163 Lisp_Object |
176 make_opaque_list (int size, | 164 make_opaque_list (int size, |
177 Lisp_Object (*markfun) (Lisp_Object obj, | 165 Lisp_Object (*markfun) (Lisp_Object obj, |
178 void (*markobj) (Lisp_Object))) | 166 void (*markobj) (Lisp_Object))) |
179 { | 167 { |
180 Lisp_Object val = Qnil; | 168 Lisp_Object val; |
181 struct Lisp_Opaque_List *p = | 169 struct Lisp_Opaque_List *p = |
182 alloc_lcrecord_type (struct Lisp_Opaque_List, lrecord_opaque_list); | 170 alloc_lcrecord_type (struct Lisp_Opaque_List, lrecord_opaque_list); |
183 | 171 |
184 p->markfun = markfun; | 172 p->markfun = markfun; |
185 p->size = size; | 173 p->size = size; |
186 p->free = Qnil; | 174 p->free = Qnil; |
187 XSETOPAQUE_LIST (val, p); | 175 XSETOPAQUE_LIST (val, p); |
188 return val; | 176 return val; |
189 } | 177 } |
178 | |
179 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list, | |
180 mark_opaque_list, internal_object_printer, | |
181 0, 0, 0, struct Lisp_Opaque_List); | |
190 | 182 |
191 Lisp_Object | 183 Lisp_Object |
192 allocate_managed_opaque (Lisp_Object opaque_list, CONST void *data) | 184 allocate_managed_opaque (Lisp_Object opaque_list, CONST void *data) |
193 { | 185 { |
194 struct Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list); | 186 struct Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list); |