Mercurial > hg > xemacs-beta
comparison src/opaque.c @ 231:557eaa0339bf r20-5b14
Import from CVS: tag r20-5b14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:13:48 +0200 |
parents | 3d6bfa290dbd |
children | 966663fcf606 |
comparison
equal
deleted
inserted
replaced
230:39ed1d2bdd9d | 231:557eaa0339bf |
---|---|
54 | 54 |
55 static Lisp_Object mark_opaque (Lisp_Object, void (*) (Lisp_Object)); | 55 static Lisp_Object mark_opaque (Lisp_Object, void (*) (Lisp_Object)); |
56 static unsigned int sizeof_opaque (CONST void *header); | 56 static unsigned int sizeof_opaque (CONST void *header); |
57 static void print_opaque (Lisp_Object obj, Lisp_Object printcharfun, | 57 static void print_opaque (Lisp_Object obj, Lisp_Object printcharfun, |
58 int escapeflag); | 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 | |
59 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, | 62 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, |
60 mark_opaque, print_opaque, 0, 0, 0, | 63 mark_opaque, print_opaque, 0, |
64 equal_opaque, hash_opaque, | |
61 sizeof_opaque, struct Lisp_Opaque); | 65 sizeof_opaque, struct Lisp_Opaque); |
62 | 66 |
63 static Lisp_Object | 67 static Lisp_Object |
64 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 68 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
65 { | 69 { |
119 memset (p->data, 0, size); | 123 memset (p->data, 0, size); |
120 XSETOPAQUE (val, p); | 124 XSETOPAQUE (val, p); |
121 return val; | 125 return val; |
122 } | 126 } |
123 | 127 |
128 /* This will not work correctly for opaques with subobjects! */ | |
129 | |
130 static int | |
131 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) | |
132 { | |
133 #ifdef DEBUG_XEMACS | |
134 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2)); | |
135 assert (INTP (XOPAQUE(obj1)->size_or_chain)); | |
136 assert (INTP (XOPAQUE(obj2)->size_or_chain)); | |
137 #endif | |
138 if (XOPAQUE_SIZE(obj1) != XOPAQUE_SIZE(obj2)) | |
139 return 0; | |
140 return (XOPAQUE_SIZE(obj1) == sizeof(*XOPAQUE_DATA(obj1)) | |
141 ? *XOPAQUE_DATA(obj1) == *XOPAQUE_DATA(obj2) | |
142 : memcmp (XOPAQUE_DATA(obj1), XOPAQUE_DATA(obj2), | |
143 XOPAQUE_SIZE(obj1)) == 0); | |
144 } | |
145 | |
146 /* This will not work correctly for opaques with subobjects! */ | |
147 | |
148 static unsigned long | |
149 hash_opaque (Lisp_Object obj, int depth) | |
150 { | |
151 #ifdef DEBUG_XEMACS | |
152 assert (!XOPAQUE_MARKFUN (obj)); | |
153 assert (INTP (XOPAQUE(obj)->size_or_chain)); | |
154 #endif | |
155 if (XOPAQUE_SIZE(obj) == sizeof (unsigned long)) | |
156 return (unsigned int) *XOPAQUE_DATA(obj); | |
157 else | |
158 return memory_hash (XOPAQUE_DATA(obj), XOPAQUE_SIZE(obj)); | |
159 } | |
160 | |
124 static Lisp_Object mark_opaque_list (Lisp_Object, void (*) (Lisp_Object)); | 161 static Lisp_Object mark_opaque_list (Lisp_Object, void (*) (Lisp_Object)); |
125 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list, | 162 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list, |
126 mark_opaque_list, internal_object_printer, | 163 mark_opaque_list, internal_object_printer, |
127 0, 0, 0, struct Lisp_Opaque_List); | 164 0, 0, 0, struct Lisp_Opaque_List); |
128 | 165 |