annotate src/opaque.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 2f8bb876ab1d
children 41dbb7a9d5f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Opaque Lisp objects.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 Copyright (C) 1993, 1994, 1995 Sun Microsystems, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 Copyright (C) 1995, 1996 Ben Wing.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 /* Synched up with: Not in FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 /* Written by Ben Wing, October 1993. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 /* "Opaque" is used internally to hold keep track of allocated memory
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 so it gets GC'd properly, and to store arbitrary data in places
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 where a Lisp_Object is required and which may get GC'd. (e.g. as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 the argument to record_unwind_protect()). Once created in C,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 opaque objects cannot be resized.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 OPAQUE OBJECTS SHOULD NEVER ESCAPE TO THE LISP LEVEL. Some code
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 depends on this. As such, opaque objects are a generalization
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 of the Qunbound marker.
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
35
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
36 "Opaque lists" are used to keep track of lots of opaque objects
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
37 of a particular size so that they can be efficiently "freed" and
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
38 re-used again without actually entering the Lisp allocation system
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
39 (and consequently doing a malloc()).
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 #include <config.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 #include "lisp.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 #include "opaque.h"
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
45 #include <stddef.h>
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
47 Lisp_Object Qopaquep;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
48
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
49 static int in_opaque_list_marking;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
50
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
51 /* Holds freed opaque objects created with make_opaque_ptr().
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
52 We do this quite often so it's a noticeable win if we don't
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
53 create GC junk. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 Lisp_Object Vopaque_ptr_free_list;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
56 static Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
57 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
58 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
59 Lisp_Opaque *p = XOPAQUE (obj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
60 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
61 Lisp_Object size_or_chain = p->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
62 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
63 if (!in_opaque_list_marking)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
64 /* size is non-int for objects on an opaque free list. We sure
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
65 as hell better not be marking any of these objects unless
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
66 we're marking an opaque list. */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
67 assert (GC_INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
68 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
69 /* marking an opaque on the free list doesn't do any recursive
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
70 markings, so we better not have non-freed opaques on a free
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
71 list. */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
72 assert (!GC_INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
73 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
74 if (GC_INTP (size_or_chain) && OPAQUE_MARKFUN (p))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
75 return OPAQUE_MARKFUN (p) (obj, markobj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
76 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
77 return size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
78 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
79
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 /* Should never, ever be called. (except by an external debugger) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
84 CONST Lisp_Opaque *p = XOPAQUE (obj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
85 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
86 Lisp_Object size_or_chain = p->size_or_chain;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 char buf[200];
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
88 char size_buf[50];
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
89
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
90 if (INTP (size_or_chain))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
91 sprintf (size_buf, "size=%lu", (unsigned long) OPAQUE_SIZE (p));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
92 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
93 sprintf (size_buf, "freed");
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
94
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
95 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque, %s) 0x%lx>",
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
96 size_buf, (unsigned long) p);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 write_c_string (buf, printcharfun);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 267
diff changeset
100 static size_t
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
101 sizeof_opaque (CONST void *header)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
103 CONST Lisp_Opaque *p = (CONST Lisp_Opaque *) header;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
104 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
105 Lisp_Object size_or_chain = p->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
106 return offsetof (Lisp_Opaque, data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
107 + (GC_INTP (size_or_chain) ? XINT (size_or_chain) : 0);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
110 /* Return an opaque object of size SIZE.
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
111 If DATA is OPAQUE_CLEAR, the object's data is memset to '\0' bytes.
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
112 If DATA is OPAQUE_UNINIT, the object's data is uninitialized.
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
113 Else the object's data is initialized by copying from DATA. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 Lisp_Object
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
115 make_opaque (size_t size, CONST void *data)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 {
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
117 Lisp_Opaque *p = (Lisp_Opaque *)
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 396
diff changeset
118 alloc_lcrecord (offsetof (Lisp_Opaque, data) + size, &lrecord_opaque);
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
119 p->markfun = 0;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
120 p->size_or_chain = make_int (size);
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
121
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
122 if (data == OPAQUE_CLEAR)
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
123 memset (p->data, '\0', size);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
124 else if (data == OPAQUE_UNINIT)
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
125 DO_NOTHING;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 else
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
127 memcpy (p->data, data, size);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
128
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
129 {
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
130 Lisp_Object val;
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
131 XSETOPAQUE (val, p);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
132 return val;
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
133 }
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
136 /* This will not work correctly for opaques with subobjects! */
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
137
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
138 static int
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
139 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth)
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
140 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
141 #ifdef DEBUG_XEMACS
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
142 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
143 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
144 Lisp_Object size_or_chain_1 = XOPAQUE (obj1)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
145 Lisp_Object size_or_chain_2 = XOPAQUE (obj2)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
146 assert (INTP (size_or_chain_1));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
147 assert (INTP (size_or_chain_2));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
148 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
149 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
150 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
151 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
152 size_t size;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
153 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) &&
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
154 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
155 }
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
156 }
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
157
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
158 /* This will not work correctly for opaques with subobjects! */
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
159
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
160 static unsigned long
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
161 hash_opaque (Lisp_Object obj, int depth)
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
162 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
163 #ifdef DEBUG_XEMACS
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
164 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
165 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
166 Lisp_Object size_or_chain = XOPAQUE (obj)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
167 assert (INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
168 assert (!XOPAQUE_MARKFUN (obj));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
169 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
170 #endif
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
171 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long))
396
6719134a07c2 Import from CVS: tag r21-2-13
cvs
parents: 380
diff changeset
172 return *((unsigned long *) XOPAQUE_DATA (obj));
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
173 else
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
174 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj));
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
175 }
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
176
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
177 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
178 mark_opaque, print_opaque, 0,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
179 equal_opaque, hash_opaque,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
180 sizeof_opaque, Lisp_Opaque);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
181
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
182 static Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
183 mark_opaque_list (Lisp_Object obj, void (*markobj) (Lisp_Object))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
184 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
185 in_opaque_list_marking++;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
186 markobj (XOPAQUE_LIST (obj)->free);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
187 in_opaque_list_marking--;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
188 return Qnil;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
189 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
190
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
191 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
192 make_opaque_list (size_t size,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
193 Lisp_Object (*markfun) (Lisp_Object obj,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
194 void (*markobj) (Lisp_Object)))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
195 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
196 Lisp_Object val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
197 Lisp_Opaque_List *p =
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
198 alloc_lcrecord_type (Lisp_Opaque_List, &lrecord_opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
199
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
200 p->markfun = markfun;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
201 p->size = size;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
202 p->free = Qnil;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
203 XSETOPAQUE_LIST (val, p);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
204 return val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
205 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
206
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
207 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
208 mark_opaque_list, internal_object_printer,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
209 0, 0, 0, Lisp_Opaque_List);
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 267
diff changeset
210
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
211 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
212 allocate_managed_opaque (Lisp_Object opaque_list, CONST void *data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
213 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
214 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
215 Lisp_Object val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
216
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
217 if (!NILP (li->free))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
218 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
219 val = li->free;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
220 li->free = XOPAQUE (val)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
221 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
222 assert (NILP (li->free) || OPAQUEP (li->free));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
223 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
224 XOPAQUE (val)->size_or_chain = make_int (li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
225 if (data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
226 memcpy (XOPAQUE (val)->data, data, li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
227 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
228 memset (XOPAQUE (val)->data, 0, li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
229 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
230 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
231 val = make_opaque (li->size, data);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
232 XOPAQUE (val)->markfun = li->markfun;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
233 return val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
234 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
235
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
236 void
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
237 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
238 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
239 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
240
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
241 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
242 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
243 /* Egcs 1.1.1 sometimes crashes on INTP (p->size_or_chain) */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
244 Lisp_Object size_or_chain = XOPAQUE (opaque)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
245 assert (INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
246 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
247 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
248 XOPAQUE (opaque)->size_or_chain = li->free;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
249 li->free = opaque;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
250 }
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 /* stuff to handle opaque pointers */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
254 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
255 make_opaque_ptr (CONST void *val)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
257 return allocate_managed_opaque (Vopaque_ptr_free_list,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
258 (CONST void *) &val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
261 /* Be very very careful with this. Same admonitions as with
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 free_cons() apply. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 free_opaque_ptr (Lisp_Object ptr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
267 free_managed_opaque (Vopaque_ptr_free_list, ptr);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
270 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
271 make_opaque_long (long val)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
273 return make_opaque (sizeof (val), (void *) &val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 init_opaque_once_early (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
279 Vopaque_ptr_free_list = make_opaque_list (sizeof (void *), 0);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
280 staticpro (&Vopaque_ptr_free_list);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 }