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