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);