annotate src/opaque.c @ 420:41dbb7a9d5f2 r21-2-18

Import from CVS: tag r21-2-18
author cvs
date Mon, 13 Aug 2007 11:24:09 +0200
parents 697ef44129c6
children 11054d720c21
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"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
46 Lisp_Object Qopaquep;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
47
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
48 static int in_opaque_list_marking;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
49
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
50 /* Holds freed opaque objects created with make_opaque_ptr().
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
51 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
52 create GC junk. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 Lisp_Object Vopaque_ptr_free_list;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
55 static Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
56 mark_opaque (Lisp_Object obj, void (*markobj) (Lisp_Object))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
57 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
58 Lisp_Opaque *p = XOPAQUE (obj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
59 /* 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
60 Lisp_Object size_or_chain = p->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
61 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
62 if (!in_opaque_list_marking)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
63 /* 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
64 as hell better not be marking any of these objects unless
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
65 we're marking an opaque list. */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
66 assert (GC_INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
67 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
68 /* 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
69 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
70 list. */
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
71 assert (!GC_INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
72 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
73 if (GC_INTP (size_or_chain) && OPAQUE_MARKFUN (p))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
74 return OPAQUE_MARKFUN (p) (obj, markobj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
75 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
76 return size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
77 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
78
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 /* Should never, ever be called. (except by an external debugger) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
83 CONST Lisp_Opaque *p = XOPAQUE (obj);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
84 /* 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
85 Lisp_Object size_or_chain = p->size_or_chain;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 char buf[200];
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
87 char size_buf[50];
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
88
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
89 if (INTP (size_or_chain))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
90 sprintf (size_buf, "size=%lu", (unsigned long) OPAQUE_SIZE (p));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
91 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
92 sprintf (size_buf, "freed");
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
93
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
94 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque, %s) 0x%lx>",
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
95 size_buf, (unsigned long) p);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 write_c_string (buf, printcharfun);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 267
diff changeset
99 static size_t
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
100 sizeof_opaque (CONST void *header)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
102 CONST Lisp_Opaque *p = (CONST Lisp_Opaque *) header;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
103 /* 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
104 Lisp_Object size_or_chain = p->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
105 return offsetof (Lisp_Opaque, data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
106 + (GC_INTP (size_or_chain) ? XINT (size_or_chain) : 0);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
109 /* Return an opaque object of size SIZE.
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
110 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
111 If DATA is OPAQUE_UNINIT, the object's data is uninitialized.
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
112 Else the object's data is initialized by copying from DATA. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 Lisp_Object
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
114 make_opaque (size_t size, CONST void *data)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 {
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
116 Lisp_Opaque *p = (Lisp_Opaque *)
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 396
diff changeset
117 alloc_lcrecord (offsetof (Lisp_Opaque, data) + size, &lrecord_opaque);
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
118 p->markfun = 0;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
119 p->size_or_chain = make_int (size);
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
120
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
121 if (data == OPAQUE_CLEAR)
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
122 memset (p->data, '\0', size);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
123 else if (data == OPAQUE_UNINIT)
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
124 DO_NOTHING;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 else
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
126 memcpy (p->data, data, size);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
127
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 Lisp_Object val;
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
130 XSETOPAQUE (val, p);
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
131 return val;
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
132 }
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
135 /* This will not work correctly for opaques with subobjects! */
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
136
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
137 static int
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
138 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth)
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
139 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
140 #ifdef DEBUG_XEMACS
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
141 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
142 /* 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
143 Lisp_Object size_or_chain_1 = XOPAQUE (obj1)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
144 Lisp_Object size_or_chain_2 = XOPAQUE (obj2)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
145 assert (INTP (size_or_chain_1));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
146 assert (INTP (size_or_chain_2));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
147 assert (!XOPAQUE_MARKFUN (obj1) && !XOPAQUE_MARKFUN (obj2));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
148 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
149 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
150 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
151 size_t size;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
152 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) &&
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
153 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
154 }
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
155 }
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 /* This will not work correctly for opaques with subobjects! */
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
158
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
159 static unsigned long
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
160 hash_opaque (Lisp_Object obj, int depth)
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
161 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
162 #ifdef DEBUG_XEMACS
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
163 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
164 /* 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
165 Lisp_Object size_or_chain = XOPAQUE (obj)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
166 assert (INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
167 assert (!XOPAQUE_MARKFUN (obj));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
168 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
169 #endif
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
170 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long))
396
6719134a07c2 Import from CVS: tag r21-2-13
cvs
parents: 380
diff changeset
171 return *((unsigned long *) XOPAQUE_DATA (obj));
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
172 else
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
173 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj));
231
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
174 }
557eaa0339bf Import from CVS: tag r20-5b14
cvs
parents: 185
diff changeset
175
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
176 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
177 mark_opaque, print_opaque, 0,
420
41dbb7a9d5f2 Import from CVS: tag r21-2-18
cvs
parents: 412
diff changeset
178 equal_opaque, hash_opaque, 0,
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
179 sizeof_opaque, Lisp_Opaque);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
180
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
181 static Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
182 mark_opaque_list (Lisp_Object obj, void (*markobj) (Lisp_Object))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
183 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
184 in_opaque_list_marking++;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
185 markobj (XOPAQUE_LIST (obj)->free);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
186 in_opaque_list_marking--;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
187 return Qnil;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
188 }
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 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
191 make_opaque_list (size_t size,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
192 Lisp_Object (*markfun) (Lisp_Object obj,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
193 void (*markobj) (Lisp_Object)))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
194 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
195 Lisp_Object val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
196 Lisp_Opaque_List *p =
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
197 alloc_lcrecord_type (Lisp_Opaque_List, &lrecord_opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
198
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
199 p->markfun = markfun;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
200 p->size = size;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
201 p->free = Qnil;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
202 XSETOPAQUE_LIST (val, p);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
203 return val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
204 }
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 DEFINE_LRECORD_IMPLEMENTATION ("opaque-list", opaque_list,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
207 mark_opaque_list, internal_object_printer,
420
41dbb7a9d5f2 Import from CVS: tag r21-2-18
cvs
parents: 412
diff changeset
208 0, 0, 0, 0, Lisp_Opaque_List);
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 267
diff changeset
209
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
210 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
211 allocate_managed_opaque (Lisp_Object opaque_list, CONST void *data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
212 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
213 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
214 Lisp_Object val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
215
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
216 if (!NILP (li->free))
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
217 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
218 val = li->free;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
219 li->free = XOPAQUE (val)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
220 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
221 assert (NILP (li->free) || OPAQUEP (li->free));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
222 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
223 XOPAQUE (val)->size_or_chain = make_int (li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
224 if (data)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
225 memcpy (XOPAQUE (val)->data, data, li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
226 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
227 memset (XOPAQUE (val)->data, 0, li->size);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
228 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
229 else
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
230 val = make_opaque (li->size, data);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
231 XOPAQUE (val)->markfun = li->markfun;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
232 return val;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
233 }
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 void
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
236 free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque)
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
237 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
238 Lisp_Opaque_List *li = XOPAQUE_LIST (opaque_list);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
239
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
240 #ifdef ERROR_CHECK_GC
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
241 {
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
242 /* 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
243 Lisp_Object size_or_chain = XOPAQUE (opaque)->size_or_chain;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
244 assert (INTP (size_or_chain));
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
245 }
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
246 #endif
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
247 XOPAQUE (opaque)->size_or_chain = li->free;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
248 li->free = opaque;
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
249 }
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 /* stuff to handle opaque pointers */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
253 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
254 make_opaque_ptr (CONST void *val)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
256 return allocate_managed_opaque (Vopaque_ptr_free_list,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
257 (CONST void *) &val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 371
diff changeset
260 /* Be very very careful with this. Same admonitions as with
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 free_cons() apply. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 free_opaque_ptr (Lisp_Object ptr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
266 free_managed_opaque (Vopaque_ptr_free_list, ptr);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
269 Lisp_Object
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
270 make_opaque_long (long val)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
272 return make_opaque (sizeof (val), (void *) &val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 init_opaque_once_early (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 {
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
278 Vopaque_ptr_free_list = make_opaque_list (sizeof (void *), 0);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
279 staticpro (&Vopaque_ptr_free_list);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 }