Mercurial > hg > xemacs-beta
annotate src/lrecord.h @ 5149:b72f27a08ed5
Reflect --with-datadir setting in late-package directories.
2010-03-18 Mike Sperber <mike@xemacs.org>
* configure.ac: Set LATE_PACKAGE_DIRECTORIES_USER_DEFINED if
`datadir' was changed; set `with_late_packages' to something
sensible for this case.
| author | Mike Sperber <sperber@deinprogramm.de> |
|---|---|
| date | Thu, 18 Mar 2010 13:42:29 +0100 |
| parents | 88bd4f3ef8e4 |
| children | 1fae11d56ad2 |
| rev | line source |
|---|---|
| 428 | 1 /* The "lrecord" structure (header of a compound lisp object). |
| 2 Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. | |
| 5125 | 3 Copyright (C) 1996, 2001, 2002, 2004, 2005, 2009, 2010 Ben Wing. |
| 428 | 4 |
| 5 This file is part of XEmacs. | |
| 6 | |
| 7 XEmacs is free software; you can redistribute it and/or modify it | |
| 8 under the terms of the GNU General Public License as published by the | |
| 9 Free Software Foundation; either version 2, or (at your option) any | |
| 10 later version. | |
| 11 | |
| 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 15 for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
| 18 along with XEmacs; see the file COPYING. If not, write to | |
| 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 20 Boston, MA 02111-1307, USA. */ | |
| 21 | |
| 22 /* Synched up with: Not in FSF. */ | |
| 23 | |
| 2367 | 24 /* This file has been Mule-ized, Ben Wing, 10-13-04. */ |
| 25 | |
| 440 | 26 #ifndef INCLUDED_lrecord_h_ |
| 27 #define INCLUDED_lrecord_h_ | |
| 428 | 28 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
29 /* All objects other than char and int are implemented as structures and |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
30 passed by reference. Such objects are called "record objects" ("record" |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
31 is another term for "structure"). The "wrapped" value of such an object |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
32 (i.e. when stored in a variable of type Lisp_Object) is simply the raw |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
33 pointer coerced to an integral type the same size as the pointer |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
34 (usually `long'). |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
35 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
36 Under old-GC (i.e. when NEW_GC is not defined), there are two kinds of |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
37 record objects: normal objects (those allocated on their own with |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
38 xmalloc()) and frob-block objects (those allocated as pieces of large, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
39 usually 2K, chunks of memory known as "frob blocks"). Under NEW_GC, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
40 there is only one type of record object. Stuff below that applies to |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
41 frob-block objects is assumed to apply to the same type of object as |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
42 normal objects under NEW_GC. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
43 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
44 Record objects have a header at the beginning of their structure, which |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
45 is used internally to identify the type of the object (so that an |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
46 object's type can be recovered from its pointer); in addition, it holds |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
47 a few flags and a "UID", which for most objects is shown when it is |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
48 printed, and is primarily useful for debugging purposes. The header of |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
49 a normal object is declared as NORMAL_LISP_OBJECT_HEADER and that of a |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
50 frob-block object FROB_BLOCK_LISP_OBJECT_HEADER. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
51 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
52 FROB_BLOCK_LISP_OBJECT_HEADER boils down to a `struct lrecord_header'. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
53 This is a 32-bit value made up of bit fields, where 8 bits are used to |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
54 hold the type, 2 or 3 bits are used for flags associated with the |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
55 garbage collector, and the remaining 21 or 22 bits hold the UID. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
56 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
57 Under NEW_GC, NORMAL_LISP_OBJECT_HEADER also resolves to `struct |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
58 lrecord_header'. Under old-GC, however, NORMAL_LISP_OBJECT_HEADER |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
59 resolves to a `struct old_lcrecord_header' (note the `c'), which is a |
|
5142
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
60 larger structure -- on 32-bit machines it occupies 2 machine words |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
61 instead of 1. Such an object is known internally as an "lcrecord". The |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
62 first word of `struct old_lcrecord_header' is an embedded `struct |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
63 lrecord_header' with the same information as for frob-block objects; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
64 that way, all objects can be cast to a `struct lrecord_header' to |
|
5142
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
65 determine their type or other info. The other word is a pointer, used |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
66 to thread all lcrecords together in one big linked list. |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
67 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
68 Under old-GC, normal objects (i.e. lcrecords) are allocated in |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
69 individual chunks using the underlying allocator (i.e. xmalloc(), which |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
70 is a thin wrapper around malloc()). Frob-block objects are more |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
71 efficient than normal objects, as they have a smaller header and don't |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
72 have the additional memory overhead associated with malloc() -- instead, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
73 as mentioned above, they are carved out of 2K chunks of memory called |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
74 "frob blocks"). However, it is slightly more tricky to create such |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
75 objects, as they require special routines in alloc.c to create an object |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
76 of each such type and to sweep them during garbage collection. In |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
77 addition, there is currently no mechanism for handling variable-sized |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
78 frob-block objects (e.g. vectors), whereas variable-sized normal objects |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
79 are not a problem. Frob-block objects are typically used for basic |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
80 objects that exist in large numbers, such as `cons' or `string'. |
| 2720 | 81 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
82 Note that strings are an apparent exception to the statement above that |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
83 variable-sized objects can't be handled. Under old-GC strings work as |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
84 follows. A string consists of two parts -- a fixed-size "string header" |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
85 that is allocated as a standard frob-block object, and a "string-chars" |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
86 structure that is allocated out of special 8K-sized frob blocks that |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
87 have a dedicated garbage-collection handler that compacts the blocks |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
88 during the sweep stage, relocating the string-chars data (but not the |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
89 string headers) to eliminate gaps. Strings larger than 8K are not |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
90 placed in frob blocks, but instead are stored as individually malloc()ed |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
91 blocks of memory. Strings larger than 8K are called "big strings" and |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
92 those smaller than 8K are called "small strings". |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
93 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
94 Under new-GC, there is no difference between big and small strings, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
95 just as there is no difference between normal and frob-block objects. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
96 There is only one allocation method, which is capable of handling |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
97 variable-sized objects. This apparently allocates all objects in |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
98 frob blocks according to the size of the object. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
99 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
100 To create a new normal Lisp object, see the toolbar-button example |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
101 below. To create a new frob-block Lisp object, follow the lead of |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
102 one of the existing frob-block objects, such as extents or events. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
103 Note that you do not need to supply all the methods (see below); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
104 reasonable defaults are provided for many of them. Alternatively, if |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
105 you're just looking for a way of encapsulating data (which possibly |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
106 could contain Lisp_Objects in it), you may well be able to use the |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
107 opaque type. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
108 */ |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
109 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
110 /* |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
111 How to declare a Lisp object: |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
112 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
113 NORMAL_LISP_OBJECT_HEADER: |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
114 Header for normal objects |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
115 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
116 FROB_BLOCK_LISP_OBJECT_HEADER: |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
117 Header for frob-block objects |
| 428 | 118 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
119 How to allocate a Lisp object: |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
120 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
121 - For normal objects of a fixed size, simply call |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
122 ALLOC_NORMAL_LISP_OBJECT (type), where TYPE is the name of the type |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
123 (e.g. toolbar_button). Such objects can be freed manually using |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
124 free_normal_lisp_object. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
125 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
126 - For normal objects whose size can vary (and hence which have a |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
127 size_in_bytes_method rather than a static_size), call |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
128 ALLOC_SIZED_LISP_OBJECT (size, type), where TYPE is the |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
129 name of the type. NOTE: You cannot call free_normal_lisp_object() on such |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
130 on object! (At least when not NEW_GC) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
131 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
132 - For frob-block objects, use |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
133 ALLOC_FROB_BLOCK_LISP_OBJECT (type, lisp_type, var, lrec_ptr). |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
134 But these objects need special handling; if you don't understand this, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
135 just ignore it. |
| 428 | 136 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
137 - Some lrecords, which are used totally internally, use the |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
138 noseeum-* functions for debugging reasons. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
139 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
140 Other operations: |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
141 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
142 - copy_lisp_object (dst, src) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
143 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
144 - zero_nonsized_lisp_object (obj), zero_sized_lisp_object (obj, size): |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
145 BUT NOTE, it is not necessary to zero out newly allocated Lisp objects. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
146 This happens automatically. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
147 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
148 - lisp_object_size (obj): Return the size of a Lisp object. NOTE: This |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
149 requires that the object is properly initialized. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
150 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
151 - lisp_object_storage_size (obj, stats): Return the storage size of a |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
152 Lisp objcet, including malloc or frob-block overhead; also, if STATS |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
153 is non-NULL, accumulate info about the size and overhead into STATS. |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
154 */ |
|
4930
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
155 |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
156 #ifdef NEW_GC |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
157 /* |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
158 There are some limitations under New-GC that lead to the creation of a |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
159 large number of new internal object types. I'm not completely sure what |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
160 all of them are, but they are at least partially related to limitations |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
161 on finalizers. Something else must be going on as well, because |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
162 non-dumpable, non-finalizable objects like devices and frames also have |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
163 their window-system-specific substructures converted into Lisp objects. |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
164 It must have something to do with the fact that these substructures |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
165 contain pointers to Lisp objects, but it's not completely clear why -- |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
166 object descriptions exist to indicate the size of these structures and |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
167 the Lisp object pointers within them. |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
168 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
169 At least one definite issue is that under New-GC dumpable objects cannot |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
170 contain any finalizers (see pdump_register_object()). This means that |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
171 any substructures in dumpable objects that are allocated separately and |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
172 normally freed in a finalizer need instead to be made into actual Lisp |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
173 objects. If those structures are Dynarrs, they need to be made into |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
174 Dynarr Lisp objects (e.g. face-cachel-dynarr or glyph-cachel-dynarr), |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
175 which are created using Dynarr_lisp_new() or Dynarr_new_new2(). |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
176 Furthermore, the objects contained in the Dynarr also need to be Lisp |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
177 objects (e.g. face-cachel or glyph-cachel). |
|
4930
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
178 |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
179 --ben |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
180 */ |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
181 #endif |
|
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
182 |
| 3263 | 183 #ifdef NEW_GC |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
184 #define ALLOC_NORMAL_LISP_OBJECT(type) alloc_lrecord (&lrecord_##type) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
185 #define ALLOC_SIZED_LISP_OBJECT(size, type) \ |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
186 alloc_sized_lrecord (size, &lrecord_##type) |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
187 #define NORMAL_LISP_OBJECT_HEADER struct lrecord_header |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
188 #define FROB_BLOCK_LISP_OBJECT_HEADER struct lrecord_header |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
189 #define LISP_OBJECT_FROB_BLOCK_P(obj) 0 |
| 3263 | 190 #else /* not NEW_GC */ |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
191 #define ALLOC_NORMAL_LISP_OBJECT(type) alloc_automanaged_lcrecord (&lrecord_##type) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
192 #define ALLOC_SIZED_LISP_OBJECT(size, type) \ |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
193 old_alloc_sized_lcrecord (size, &lrecord_##type) |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
194 #define NORMAL_LISP_OBJECT_HEADER struct old_lcrecord_header |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
195 #define FROB_BLOCK_LISP_OBJECT_HEADER struct lrecord_header |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
196 #define LISP_OBJECT_FROB_BLOCK_P(obj) (XRECORD_LHEADER_IMPLEMENTATION(obj)->frob_block_p) |
| 3263 | 197 #endif /* not NEW_GC */ |
| 3024 | 198 |
|
5146
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
199 #define LISP_OBJECT_UID(obj) (XRECORD_LHEADER (obj)->uid) |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
200 |
| 1743 | 201 BEGIN_C_DECLS |
| 1650 | 202 |
| 428 | 203 struct lrecord_header |
| 204 { | |
| 1204 | 205 /* Index into lrecord_implementations_table[]. Objects that have been |
| 206 explicitly freed using e.g. free_cons() have lrecord_type_free in this | |
| 207 field. */ | |
| 442 | 208 unsigned int type :8; |
| 209 | |
| 3263 | 210 #ifdef NEW_GC |
| 2720 | 211 /* 1 if the object is readonly from lisp */ |
| 212 unsigned int lisp_readonly :1; | |
| 213 | |
| 214 /* The `free' field is a flag that indicates whether this lrecord | |
| 215 is currently free or not. This is used for error checking and | |
| 216 debugging. */ | |
| 217 unsigned int free :1; | |
| 218 | |
| 3063 | 219 /* The `uid' field is just for debugging/printing convenience. Having |
| 220 this slot doesn't hurt us spacewise, since the bits are unused | |
| 221 anyway. (The bits are used for strings, though.) */ | |
| 2720 | 222 unsigned int uid :22; |
| 223 | |
| 3263 | 224 #else /* not NEW_GC */ |
| 442 | 225 /* If `mark' is 0 after the GC mark phase, the object will be freed |
| 226 during the GC sweep phase. There are 2 ways that `mark' can be 1: | |
| 227 - by being referenced from other objects during the GC mark phase | |
| 228 - because it is permanently on, for c_readonly objects */ | |
| 229 unsigned int mark :1; | |
| 230 | |
| 231 /* 1 if the object resides in logically read-only space, and does not | |
| 232 reference other non-c_readonly objects. | |
| 233 Invariant: if (c_readonly == 1), then (mark == 1 && lisp_readonly == 1) */ | |
| 234 unsigned int c_readonly :1; | |
| 235 | |
| 428 | 236 /* 1 if the object is readonly from lisp */ |
| 442 | 237 unsigned int lisp_readonly :1; |
| 771 | 238 |
|
5142
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
239 /* The `free' field is currently used only for lcrecords under old-GC. |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
240 It is a flag that indicates whether this lcrecord is on a "free list". |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
241 Free lists are used to minimize the number of calls to malloc() when |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
242 we're repeatedly allocating and freeing a number of the same sort of |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
243 lcrecord. Lcrecords on a free list always get marked in a different |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
244 fashion, so we can use this flag as a sanity check to make sure that |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
245 free lists only have freed lcrecords and there are no freed lcrecords |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
246 elsewhere. */ |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
247 unsigned int free :1; |
|
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
248 |
| 3063 | 249 /* The `uid' field is just for debugging/printing convenience. Having |
| 250 this slot doesn't hurt us spacewise, since the bits are unused | |
| 251 anyway. (The bits are used for strings, though.) */ | |
|
5142
f965e31a35f0
reduce lcrecord headers to 2 words, rename printing_unreadable_object
Ben Wing <ben@xemacs.org>
parents:
5128
diff
changeset
|
252 unsigned int uid :20; |
| 934 | 253 |
| 3263 | 254 #endif /* not NEW_GC */ |
| 428 | 255 }; |
| 256 | |
| 257 struct lrecord_implementation; | |
| 442 | 258 int lrecord_type_index (const struct lrecord_implementation *implementation); |
|
5146
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
259 extern int lrecord_uid_counter[]; |
| 428 | 260 |
| 3263 | 261 #ifdef NEW_GC |
|
5146
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
262 #define set_lheader_implementation(header,imp) do { \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
263 struct lrecord_header* SLI_header = (header); \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
264 SLI_header->type = (imp)->lrecord_type_index; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
265 SLI_header->lisp_readonly = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
266 SLI_header->free = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
267 SLI_header->uid = lrecord_uid_counter[(imp)->lrecord_type_index]++; \ |
| 2720 | 268 } while (0) |
| 3263 | 269 #else /* not NEW_GC */ |
|
5146
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
270 #define set_lheader_implementation(header,imp) do { \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
271 struct lrecord_header* SLI_header = (header); \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
272 SLI_header->type = (imp)->lrecord_type_index; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
273 SLI_header->mark = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
274 SLI_header->c_readonly = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
275 SLI_header->lisp_readonly = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
276 SLI_header->free = 0; \ |
|
88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
Ben Wing <ben@xemacs.org>
parents:
5142
diff
changeset
|
277 SLI_header->uid = lrecord_uid_counter[(imp)->lrecord_type_index]++; \ |
| 428 | 278 } while (0) |
| 3263 | 279 #endif /* not NEW_GC */ |
| 428 | 280 |
| 3263 | 281 #ifndef NEW_GC |
| 3024 | 282 struct old_lcrecord_header |
| 428 | 283 { |
| 284 struct lrecord_header lheader; | |
| 285 | |
| 442 | 286 /* The `next' field is normally used to chain all lcrecords together |
| 428 | 287 so that the GC can find (and free) all of them. |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
288 `old_alloc_sized_lcrecord' threads lcrecords together. |
| 428 | 289 |
| 290 The `next' field may be used for other purposes as long as some | |
| 291 other mechanism is provided for letting the GC do its work. | |
| 292 | |
| 293 For example, the event and marker object types allocate members | |
| 294 out of memory chunks, and are able to find all unmarked members | |
| 295 by sweeping through the elements of the list of chunks. */ | |
| 3024 | 296 struct old_lcrecord_header *next; |
| 428 | 297 }; |
| 298 | |
| 299 /* Used for lcrecords in an lcrecord-list. */ | |
| 300 struct free_lcrecord_header | |
| 301 { | |
| 3024 | 302 struct old_lcrecord_header lcheader; |
| 428 | 303 Lisp_Object chain; |
| 304 }; | |
| 3263 | 305 #endif /* not NEW_GC */ |
| 428 | 306 |
| 3931 | 307 /* DON'T FORGET to update .gdbinit.in if you change this list. */ |
| 442 | 308 enum lrecord_type |
| 309 { | |
| 310 /* Symbol value magic types come first to make SYMBOL_VALUE_MAGIC_P fast. | |
| 311 #### This should be replaced by a symbol_value_magic_p flag | |
| 312 in the Lisp_Symbol lrecord_header. */ | |
| 2720 | 313 lrecord_type_symbol_value_forward, /* 0 */ |
| 3092 | 314 lrecord_type_symbol_value_varalias, |
| 315 lrecord_type_symbol_value_lisp_magic, | |
| 316 lrecord_type_symbol_value_buffer_local, | |
| 442 | 317 lrecord_type_max_symbol_value_magic = lrecord_type_symbol_value_buffer_local, |
| 3092 | 318 lrecord_type_symbol, |
| 319 lrecord_type_subr, | |
|
4677
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
320 lrecord_type_multiple_value, |
| 3092 | 321 lrecord_type_cons, |
| 322 lrecord_type_vector, | |
| 323 lrecord_type_string, | |
| 3263 | 324 #ifndef NEW_GC |
| 442 | 325 lrecord_type_lcrecord_list, |
| 3263 | 326 #endif /* not NEW_GC */ |
| 3092 | 327 lrecord_type_compiled_function, |
| 328 lrecord_type_weak_list, | |
| 329 lrecord_type_bit_vector, | |
| 330 lrecord_type_float, | |
| 331 lrecord_type_hash_table, | |
| 332 lrecord_type_lstream, | |
| 333 lrecord_type_process, | |
| 334 lrecord_type_charset, | |
| 335 lrecord_type_coding_system, | |
| 336 lrecord_type_char_table, | |
| 337 lrecord_type_char_table_entry, | |
| 338 lrecord_type_range_table, | |
| 339 lrecord_type_opaque, | |
| 340 lrecord_type_opaque_ptr, | |
| 341 lrecord_type_buffer, | |
| 342 lrecord_type_extent, | |
| 343 lrecord_type_extent_info, | |
| 344 lrecord_type_extent_auxiliary, | |
| 345 lrecord_type_marker, | |
| 346 lrecord_type_event, | |
| 2720 | 347 #ifdef EVENT_DATA_AS_OBJECTS /* not defined */ |
| 934 | 348 lrecord_type_key_data, |
| 349 lrecord_type_button_data, | |
| 350 lrecord_type_motion_data, | |
| 351 lrecord_type_process_data, | |
| 352 lrecord_type_timeout_data, | |
| 353 lrecord_type_eval_data, | |
| 354 lrecord_type_misc_user_data, | |
| 355 lrecord_type_magic_eval_data, | |
| 356 lrecord_type_magic_data, | |
| 1204 | 357 #endif /* EVENT_DATA_AS_OBJECTS */ |
| 3092 | 358 lrecord_type_keymap, |
| 359 lrecord_type_command_builder, | |
| 360 lrecord_type_timeout, | |
| 361 lrecord_type_specifier, | |
| 362 lrecord_type_console, | |
| 363 lrecord_type_device, | |
| 364 lrecord_type_frame, | |
| 365 lrecord_type_window, | |
| 366 lrecord_type_window_mirror, | |
| 367 lrecord_type_window_configuration, | |
| 368 lrecord_type_gui_item, | |
| 369 lrecord_type_popup_data, | |
| 370 lrecord_type_toolbar_button, | |
| 371 lrecord_type_scrollbar_instance, | |
| 372 lrecord_type_color_instance, | |
| 373 lrecord_type_font_instance, | |
| 374 lrecord_type_image_instance, | |
| 375 lrecord_type_glyph, | |
| 376 lrecord_type_face, | |
| 3931 | 377 lrecord_type_fc_config, |
| 3094 | 378 lrecord_type_fc_pattern, |
| 3092 | 379 lrecord_type_database, |
| 380 lrecord_type_tooltalk_message, | |
| 381 lrecord_type_tooltalk_pattern, | |
| 382 lrecord_type_ldap, | |
| 383 lrecord_type_pgconn, | |
| 384 lrecord_type_pgresult, | |
| 385 lrecord_type_devmode, | |
| 386 lrecord_type_mswindows_dialog_id, | |
| 387 lrecord_type_case_table, | |
| 388 lrecord_type_emacs_ffi, | |
| 389 lrecord_type_emacs_gtk_object, | |
| 390 lrecord_type_emacs_gtk_boxed, | |
| 391 lrecord_type_weak_box, | |
| 392 lrecord_type_ephemeron, | |
| 393 lrecord_type_bignum, | |
| 394 lrecord_type_ratio, | |
| 395 lrecord_type_bigfloat, | |
| 3263 | 396 #ifndef NEW_GC |
| 454 | 397 lrecord_type_free, /* only used for "free" lrecords */ |
| 398 lrecord_type_undefined, /* only used for debugging */ | |
| 3263 | 399 #endif /* not NEW_GC */ |
| 3092 | 400 #ifdef NEW_GC |
|
4930
9f04877ce07e
fix up comments about finalizers and NEWGC internal objects
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
401 /* See comment up top explaining why these extra object types must exist. */ |
| 3092 | 402 lrecord_type_string_indirect_data, |
| 403 lrecord_type_string_direct_data, | |
| 404 lrecord_type_hash_table_entry, | |
| 405 lrecord_type_syntax_cache, | |
| 406 lrecord_type_buffer_text, | |
| 407 lrecord_type_compiled_function_args, | |
| 408 lrecord_type_tty_console, | |
| 409 lrecord_type_stream_console, | |
| 410 lrecord_type_dynarr, | |
| 411 lrecord_type_face_cachel, | |
| 412 lrecord_type_face_cachel_dynarr, | |
| 413 lrecord_type_glyph_cachel, | |
| 414 lrecord_type_glyph_cachel_dynarr, | |
| 415 lrecord_type_x_device, | |
| 416 lrecord_type_gtk_device, | |
| 417 lrecord_type_tty_device, | |
| 418 lrecord_type_mswindows_device, | |
| 419 lrecord_type_msprinter_device, | |
| 420 lrecord_type_x_frame, | |
| 421 lrecord_type_gtk_frame, | |
| 422 lrecord_type_mswindows_frame, | |
| 423 lrecord_type_gap_array_marker, | |
| 424 lrecord_type_gap_array, | |
| 425 lrecord_type_extent_list_marker, | |
| 426 lrecord_type_extent_list, | |
| 427 lrecord_type_stack_of_extents, | |
| 428 lrecord_type_tty_color_instance_data, | |
| 429 lrecord_type_tty_font_instance_data, | |
| 430 lrecord_type_specifier_caching, | |
| 431 lrecord_type_expose_ignore, | |
| 432 #endif /* NEW_GC */ | |
| 433 lrecord_type_last_built_in_type /* must be last */ | |
| 442 | 434 }; |
| 435 | |
| 1632 | 436 extern MODULE_API int lrecord_type_count; |
| 428 | 437 |
| 438 struct lrecord_implementation | |
| 439 { | |
| 2367 | 440 const Ascbyte *name; |
| 442 | 441 |
| 934 | 442 /* information for the dumper: is the object dumpable and should it |
| 443 be dumped. */ | |
| 444 unsigned int dumpable :1; | |
| 445 | |
| 442 | 446 /* `marker' is called at GC time, to make sure that all Lisp_Objects |
| 428 | 447 pointed to by this object get properly marked. It should call |
| 448 the mark_object function on all Lisp_Objects in the object. If | |
| 449 the return value is non-nil, it should be a Lisp_Object to be | |
| 450 marked (don't call the mark_object function explicitly on it, | |
| 451 because the GC routines will do this). Doing it this way reduces | |
| 452 recursion, so the object returned should preferably be the one | |
| 453 with the deepest level of Lisp_Object pointers. This function | |
| 1204 | 454 can be NULL, meaning no GC marking is necessary. |
| 455 | |
| 456 NOTE NOTE NOTE: This is not used by KKCC (which uses the data | |
| 457 description below instead), unless the data description is missing. | |
| 458 Yes, this currently means there is logic duplication. Eventually the | |
| 459 mark methods will be removed. */ | |
| 428 | 460 Lisp_Object (*marker) (Lisp_Object); |
| 442 | 461 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
462 /* `printer' converts the object to a printed representation. `printer' |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
463 should never be NULL (if so, you will get an assertion failure when |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
464 trying to print such an object). Either supply a specific printing |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
465 method, or use the default methods internal_object_printer() (for |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
466 internal objects that should not be visible at Lisp level) or |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
467 external_object_printer() (for objects visible at Lisp level). */ |
| 428 | 468 void (*printer) (Lisp_Object, Lisp_Object printcharfun, int escapeflag); |
| 442 | 469 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
470 /* `finalizer' is called at GC time when the object is about to be freed. |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
471 It should perform any necessary cleanup, such as freeing malloc()ed |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
472 memory or releasing pointers or handles to objects created in external |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
473 libraries, such as window-system windows or file handles. This can be |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
474 NULL, meaning no special finalization is necessary. */ |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
475 void (*finalizer) (Lisp_Object obj); |
| 442 | 476 |
| 428 | 477 /* This can be NULL, meaning compare objects with EQ(). */ |
|
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
478 int (*equal) (Lisp_Object obj1, Lisp_Object obj2, int depth, |
|
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4844
diff
changeset
|
479 int foldcase); |
| 442 | 480 |
| 481 /* `hash' generates hash values for use with hash tables that have | |
| 482 `equal' as their test function. This can be NULL, meaning use | |
| 483 the Lisp_Object itself as the hash. But, you must still satisfy | |
| 484 the constraint that if two objects are `equal', then they *must* | |
| 485 hash to the same value in order for hash tables to work properly. | |
| 486 This means that `hash' can be NULL only if the `equal' method is | |
| 487 also NULL. */ | |
| 2515 | 488 Hashcode (*hash) (Lisp_Object, int); |
| 428 | 489 |
| 1204 | 490 /* Data layout description for your object. See long comment below. */ |
| 491 const struct memory_description *description; | |
| 428 | 492 |
| 442 | 493 /* These functions allow any object type to have builtin property |
| 494 lists that can be manipulated from the lisp level with | |
| 495 `get', `put', `remprop', and `object-plist'. */ | |
| 428 | 496 Lisp_Object (*getprop) (Lisp_Object obj, Lisp_Object prop); |
| 497 int (*putprop) (Lisp_Object obj, Lisp_Object prop, Lisp_Object val); | |
| 498 int (*remprop) (Lisp_Object obj, Lisp_Object prop); | |
| 499 Lisp_Object (*plist) (Lisp_Object obj); | |
| 500 | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
501 /* `disksaver' is called at dump time. It is used for objects that |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
502 contain pointers or handles to objects created in external libraries, |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
503 such as window-system windows or file handles. Such external objects |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
504 cannot be dumped, so it is necessary to release them at dump time and |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
505 arrange somehow or other for them to be resurrected if necessary later |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
506 on. |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
507 |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
508 It seems that even non-dumpable objects may be around at dump time, |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
509 and a disksaver may be provided. (In fact, the only object currently |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
510 with a disksaver, lstream, is non-dumpable.) |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
511 |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
512 Objects rarely need to provide this method; most of the time it will |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
513 be NULL. */ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
514 void (*disksaver) (Lisp_Object); |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
515 |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
516 /* Only one of `static_size' and `size_in_bytes_method' is non-0. If |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
517 `static_size' is 0, this type is not instantiable by |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
518 ALLOC_NORMAL_LISP_OBJECT(). If both are 0 (this should never happen), |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
519 this object cannot be instantiated; you will get an abort() if you |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
520 try.*/ |
| 665 | 521 Bytecount static_size; |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
522 Bytecount (*size_in_bytes_method) (Lisp_Object); |
| 442 | 523 |
| 524 /* The (constant) index into lrecord_implementations_table */ | |
| 525 enum lrecord_type lrecord_type_index; | |
| 526 | |
| 3263 | 527 #ifndef NEW_GC |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
528 /* A "frob-block" lrecord is any lrecord that's not an lcrecord, i.e. |
| 3024 | 529 one that does not have an old_lcrecord_header at the front and which |
| 1204 | 530 is (usually) allocated in frob blocks. */ |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
531 unsigned int frob_block_p :1; |
| 3263 | 532 #endif /* not NEW_GC */ |
| 428 | 533 }; |
| 534 | |
| 617 | 535 /* All the built-in lisp object types are enumerated in `enum lrecord_type'. |
| 442 | 536 Additional ones may be defined by a module (none yet). We leave some |
| 537 room in `lrecord_implementations_table' for such new lisp object types. */ | |
| 538 #define MODULE_DEFINABLE_TYPE_COUNT 32 | |
| 539 | |
| 1632 | 540 extern MODULE_API const struct lrecord_implementation * |
| 541 lrecord_implementations_table[lrecord_type_last_built_in_type + MODULE_DEFINABLE_TYPE_COUNT]; | |
| 428 | 542 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
543 /* Given a Lisp object, return its implementation |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
544 (struct lrecord_implementation) */ |
| 428 | 545 #define XRECORD_LHEADER_IMPLEMENTATION(obj) \ |
| 442 | 546 LHEADER_IMPLEMENTATION (XRECORD_LHEADER (obj)) |
| 547 #define LHEADER_IMPLEMENTATION(lh) lrecord_implementations_table[(lh)->type] | |
| 428 | 548 |
| 3092 | 549 #include "gc.h" |
| 550 | |
| 551 #ifdef NEW_GC | |
| 552 #include "vdb.h" | |
| 553 #endif /* NEW_GC */ | |
| 554 | |
| 428 | 555 extern int gc_in_progress; |
| 556 | |
| 3263 | 557 #ifdef NEW_GC |
| 2720 | 558 #include "mc-alloc.h" |
| 559 | |
| 2994 | 560 #ifdef ALLOC_TYPE_STATS |
| 2720 | 561 void init_lrecord_stats (void); |
| 562 void inc_lrecord_stats (Bytecount size, const struct lrecord_header *h); | |
| 563 void dec_lrecord_stats (Bytecount size_including_overhead, | |
| 564 const struct lrecord_header *h); | |
| 3092 | 565 int lrecord_stats_heap_size (void); |
| 2994 | 566 #endif /* ALLOC_TYPE_STATS */ |
| 2720 | 567 |
| 568 /* Tell mc-alloc how to call a finalizer. */ | |
| 3092 | 569 #define MC_ALLOC_CALL_FINALIZER(ptr) \ |
| 570 { \ | |
| 571 Lisp_Object MCACF_obj = wrap_pointer_1 (ptr); \ | |
| 572 struct lrecord_header *MCACF_lheader = XRECORD_LHEADER (MCACF_obj); \ | |
| 573 if (XRECORD_LHEADER (MCACF_obj) && LRECORDP (MCACF_obj) \ | |
| 574 && !LRECORD_FREE_P (MCACF_lheader) ) \ | |
| 575 { \ | |
| 576 const struct lrecord_implementation *MCACF_implementation \ | |
| 577 = LHEADER_IMPLEMENTATION (MCACF_lheader); \ | |
| 578 if (MCACF_implementation && MCACF_implementation->finalizer) \ | |
| 579 { \ | |
| 580 GC_STAT_FINALIZED; \ | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
581 MCACF_implementation->finalizer (MCACF_obj); \ |
| 3092 | 582 } \ |
| 583 } \ | |
| 584 } while (0) | |
| 2720 | 585 |
| 586 /* Tell mc-alloc how to call a finalizer for disksave. */ | |
| 587 #define MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE(ptr) \ | |
| 588 { \ | |
| 589 Lisp_Object MCACF_obj = wrap_pointer_1 (ptr); \ | |
| 590 struct lrecord_header *MCACF_lheader = XRECORD_LHEADER (MCACF_obj); \ | |
| 591 if (XRECORD_LHEADER (MCACF_obj) && LRECORDP (MCACF_obj) \ | |
| 592 && !LRECORD_FREE_P (MCACF_lheader) ) \ | |
| 593 { \ | |
| 594 const struct lrecord_implementation *MCACF_implementation \ | |
| 595 = LHEADER_IMPLEMENTATION (MCACF_lheader); \ | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
596 if (MCACF_implementation && MCACF_implementation->disksaver) \ |
| 5125 | 597 MCACF_implementation->disksaver (MCACF_obj); \ |
| 2720 | 598 } \ |
| 599 } while (0) | |
| 600 | |
| 601 #define LRECORD_FREE_P(ptr) \ | |
| 602 (((struct lrecord_header *) ptr)->free) | |
| 603 | |
| 604 #define MARK_LRECORD_AS_FREE(ptr) \ | |
| 605 ((void) (((struct lrecord_header *) ptr)->free = 1)) | |
| 606 | |
| 607 #define MARK_LRECORD_AS_NOT_FREE(ptr) \ | |
| 608 ((void) (((struct lrecord_header *) ptr)->free = 0)) | |
| 609 | |
| 610 #define MARKED_RECORD_P(obj) MARKED_P (obj) | |
| 611 #define MARKED_RECORD_HEADER_P(lheader) MARKED_P (lheader) | |
| 612 #define MARK_RECORD_HEADER(lheader) MARK (lheader) | |
| 613 #define UNMARK_RECORD_HEADER(lheader) UNMARK (lheader) | |
| 614 | |
| 615 #define LISP_READONLY_RECORD_HEADER_P(lheader) ((lheader)->lisp_readonly) | |
| 616 #define SET_LISP_READONLY_RECORD_HEADER(lheader) \ | |
| 617 ((void) ((lheader)->lisp_readonly = 1)) | |
| 618 #define MARK_LRECORD_AS_LISP_READONLY(ptr) \ | |
| 619 ((void) (((struct lrecord_header *) ptr)->lisp_readonly = 1)) | |
| 620 | |
| 3263 | 621 #else /* not NEW_GC */ |
| 2720 | 622 |
|
5059
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
623 enum lrecord_alloc_status |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
624 { |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
625 ALLOC_IN_USE, |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
626 ALLOC_FREE, |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
627 ALLOC_ON_FREE_LIST |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
628 }; |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
629 |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
630 void tick_lrecord_stats (const struct lrecord_header *h, |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
631 enum lrecord_alloc_status status); |
|
c8f90d61dcf3
fix memory usage stats to include pdumped objects
Ben Wing <ben@xemacs.org>
parents:
4967
diff
changeset
|
632 |
| 2720 | 633 #define LRECORD_FREE_P(ptr) \ |
| 634 (((struct lrecord_header *) ptr)->type == lrecord_type_free) | |
| 635 | |
| 636 #define MARK_LRECORD_AS_FREE(ptr) \ | |
| 637 ((void) (((struct lrecord_header *) ptr)->type = lrecord_type_free)) | |
| 638 | |
| 442 | 639 #define MARKED_RECORD_P(obj) (XRECORD_LHEADER (obj)->mark) |
| 428 | 640 #define MARKED_RECORD_HEADER_P(lheader) ((lheader)->mark) |
| 641 #define MARK_RECORD_HEADER(lheader) ((void) ((lheader)->mark = 1)) | |
| 642 #define UNMARK_RECORD_HEADER(lheader) ((void) ((lheader)->mark = 0)) | |
| 643 | |
| 644 #define C_READONLY_RECORD_HEADER_P(lheader) ((lheader)->c_readonly) | |
| 645 #define LISP_READONLY_RECORD_HEADER_P(lheader) ((lheader)->lisp_readonly) | |
| 442 | 646 #define SET_C_READONLY_RECORD_HEADER(lheader) do { \ |
| 647 struct lrecord_header *SCRRH_lheader = (lheader); \ | |
| 648 SCRRH_lheader->c_readonly = 1; \ | |
| 649 SCRRH_lheader->lisp_readonly = 1; \ | |
| 650 SCRRH_lheader->mark = 1; \ | |
| 651 } while (0) | |
| 428 | 652 #define SET_LISP_READONLY_RECORD_HEADER(lheader) \ |
| 653 ((void) ((lheader)->lisp_readonly = 1)) | |
| 3263 | 654 #endif /* not NEW_GC */ |
| 1676 | 655 |
| 656 #ifdef USE_KKCC | |
| 657 #define RECORD_DESCRIPTION(lheader) lrecord_memory_descriptions[(lheader)->type] | |
| 658 #else /* not USE_KKCC */ | |
| 442 | 659 #define RECORD_MARKER(lheader) lrecord_markers[(lheader)->type] |
| 1676 | 660 #endif /* not USE_KKCC */ |
| 428 | 661 |
| 934 | 662 #define RECORD_DUMPABLE(lheader) (lrecord_implementations_table[(lheader)->type])->dumpable |
| 1204 | 663 |
| 664 /* Data description stuff | |
| 934 | 665 |
| 1204 | 666 Data layout descriptions describe blocks of memory (in particular, Lisp |
| 667 objects and other objects on the heap, and global objects with pointers | |
| 668 to such heap objects), including their size and a list of the elements | |
| 669 that need relocating, marking or other special handling. They are | |
| 670 currently used in two places: by pdump [the new, portable dumper] and | |
| 671 KKCC [the new garbage collector]. The two subsystems use the | |
| 672 descriptions in different ways, and as a result some of the descriptions | |
| 673 are appropriate only for one or the other, when it is known that only | |
| 674 that subsystem will use the description. (This is particularly the case | |
| 675 with objects that can't be dumped, because pdump needs more info than | |
| 676 KKCC.) However, properly written descriptions are appropriate for both, | |
| 677 and you should strive to write your descriptions that way, since the | |
| 678 dumpable status of an object may change and new uses for the | |
| 679 descriptions may be created. (An example that comes to mind is a | |
| 680 facility for determining the memory usage of XEmacs data structures -- | |
| 681 like `buffer-memory-usage', `window-memory-usage', etc. but more | |
| 682 general.) | |
| 683 | |
| 684 More specifically: | |
| 428 | 685 |
| 1204 | 686 Pdump (the portable dumper) needs to write out all objects in heap |
| 687 space, and later on (in another invocation of XEmacs) load them back | |
| 688 into the heap, relocating all pointers to the heap objects in the global | |
| 689 data space. ("Heap" means anything malloc()ed, including all Lisp | |
| 690 objects, and "global data" means anything declared globally or | |
| 691 `static'.) Pdump, then, needs to be told about the location of all | |
| 692 global pointers to heap objects, all the description of all such | |
| 693 objects, including their size and any pointers to other heap (aka | |
| 694 "relocatable") objects. (Pdump assumes that the heap may occur in | |
| 695 different places in different invocations -- therefore, it is not enough | |
| 696 simply to write out the entire heap and later reload it at the same | |
| 697 location -- but that global data is always in the same place, and hence | |
| 698 pointers to it do not need to be relocated. This assumption holds true | |
| 699 in general for modern operating systems, but would be broken, for | |
| 700 example, in a system without virtual memory, or when dealing with shared | |
| 701 libraries. Also, unlike unexec, pdump does not usually write out or | |
| 702 restore objects in the global data space, and thus they need to be | |
| 703 initialized every time XEmacs is loaded. This is the purpose of the | |
| 704 reinit_*() functions throughout XEmacs. [It's possible, however, to make | |
| 705 pdump restore global data. This must be done, of course, for heap | |
| 706 pointers, but is also done for other values that are not easy to | |
| 707 recompute -- in particular, values established by the Lisp code loaded | |
| 708 at dump time.]) Note that the data type `Lisp_Object' is basically just | |
| 709 a relocatable pointer disguised as a long, and in general pdump treats | |
| 710 the Lisp_Object values and pointers to Lisp objects (e.g. Lisp_Object | |
| 711 vs. `struct frame *') identically. (NOTE: This equivalence depends | |
| 712 crucially on the current "minimal tagbits" implementation of Lisp_Object | |
| 713 pointers.) | |
| 428 | 714 |
| 1204 | 715 Descriptions are used by pdump in three places: (a) descriptions of Lisp |
| 716 objects, referenced in the DEFINE_*LRECORD_*IMPLEMENTATION*() call; (b) | |
| 717 descriptions of global objects to be dumped, registered by | |
| 718 dump_add_root_block(); (c) descriptions of global pointers to | |
| 2367 | 719 non-Lisp_Object heap objects, registered by dump_add_root_block_ptr(). |
| 1204 | 720 The descriptions need to tell pdump which elements of your structure are |
| 721 Lisp_Objects or structure pointers, plus the descriptions in turn of the | |
| 722 non-Lisp_Object structures pointed to. If these structures are you own | |
| 723 private ones, you will have to write these recursive descriptions | |
| 724 yourself; otherwise, you are reusing a structure already in existence | |
| 725 elsewhere and there is probably already a description for it. | |
| 726 | |
| 727 Pdump does not care about Lisp objects that cannot be dumped (the | |
| 728 dumpable flag to DEFINE_*LRECORD_*IMPLEMENTATION*() is 0). | |
| 729 | |
| 730 KKCC also uses data layout descriptions, but differently. It cares | |
| 731 about all objects, dumpable or not, but specifically only wants to know | |
| 732 about Lisp_Objects in your object and in structures pointed to. Thus, | |
| 733 it doesn't care about things like pointers to structures ot other blocks | |
| 734 of memory with no Lisp Objects in them, which pdump would care a lot | |
| 735 about. | |
| 736 | |
| 737 Technically, then, you could write your description differently | |
| 738 depending on whether your object is dumpable -- the full pdump | |
| 739 description if so, the abbreviated KKCC description if not. In fact, | |
| 740 some descriptions are written this way. This is dangerous, though, | |
| 741 because another use might come along for the data descriptions, that | |
| 742 doesn't care about the dumper flag and makes use of some of the stuff | |
| 743 normally omitted from the "abbreviated" description -- see above. | |
| 744 | |
| 5094 | 745 A memory_description is an array of values. The first value of each |
| 746 line is a type, the second the offset in the lrecord structure. The | |
| 747 third and following elements are parameters; their presence, type and | |
| 748 number is type-dependent. | |
| 771 | 749 |
| 1204 | 750 The description ends with an "XD_END" record. |
| 771 | 751 |
| 752 The top-level description of an lrecord or lcrecord does not need | |
| 753 to describe every element, just the ones that need to be relocated, | |
| 754 since the size of the lrecord is known. (The same goes for nested | |
| 755 structures, whenever the structure size is given, rather than being | |
| 756 defaulted by specifying 0 for the size.) | |
| 757 | |
| 1204 | 758 A sized_memory_description is a memory_description plus the size of the |
| 759 block of memory. The size field in a sized_memory_description can be | |
| 760 given as zero, i.e. unspecified, meaning that the last element in the | |
| 761 structure is described in the description and the size of the block can | |
| 762 therefore be computed from it. (This is useful for stretchy arrays.) | |
| 763 | |
| 764 memory_descriptions are used to describe lrecords (the size of the | |
| 765 lrecord is elsewhere in its description, attached to its methods, so it | |
| 766 does not need to be given here) and global objects, where the size is an | |
| 767 argument to the call to dump_add_root_block(). | |
| 768 sized_memory_descriptions are used for pointers and arrays in | |
| 2367 | 769 memory_descriptions and for calls to dump_add_root_block_ptr(). (#### |
| 1204 | 770 It is not obvious why this is so in the latter case. Probably, calls to |
| 2367 | 771 dump_add_root_block_ptr() should use plain memory_descriptions and have |
| 1204 | 772 the size be an argument to the call.) |
| 773 | |
| 774 NOTE: Anywhere that a sized_memory_description occurs inside of a plain | |
| 775 memory_description, a "description map" can be substituted. Rather than | |
| 776 being an actual description, this describes how to find the description | |
| 777 by looking inside of the object being described. This is a convenient | |
| 778 way to describe Lisp objects with subtypes and corresponding | |
| 779 type-specific data. | |
| 428 | 780 |
| 781 Some example descriptions : | |
| 440 | 782 |
| 814 | 783 struct Lisp_String |
| 784 { | |
| 785 struct lrecord_header lheader; | |
| 786 Bytecount size; | |
| 867 | 787 Ibyte *data; |
| 814 | 788 Lisp_Object plist; |
| 789 }; | |
| 790 | |
| 1204 | 791 static const struct memory_description cons_description[] = { |
| 440 | 792 { XD_LISP_OBJECT, offsetof (Lisp_Cons, car) }, |
| 793 { XD_LISP_OBJECT, offsetof (Lisp_Cons, cdr) }, | |
| 428 | 794 { XD_END } |
| 795 }; | |
| 796 | |
| 440 | 797 Which means "two lisp objects starting at the 'car' and 'cdr' elements" |
| 428 | 798 |
| 1204 | 799 static const struct memory_description string_description[] = { |
| 814 | 800 { XD_BYTECOUNT, offsetof (Lisp_String, size) }, |
| 1204 | 801 { XD_OPAQUE_DATA_PTR, offsetof (Lisp_String, data), XD_INDIRECT (0, 1) }, |
| 814 | 802 { XD_LISP_OBJECT, offsetof (Lisp_String, plist) }, |
| 803 { XD_END } | |
| 804 }; | |
| 805 | |
| 806 "A pointer to string data at 'data', the size of the pointed array being | |
| 807 the value of the size variable plus 1, and one lisp object at 'plist'" | |
| 808 | |
| 809 If your object has a pointer to an array of Lisp_Objects in it, something | |
| 810 like this: | |
| 811 | |
| 812 struct Lisp_Foo | |
| 813 { | |
| 814 ...; | |
| 815 int count; | |
| 816 Lisp_Object *objects; | |
| 817 ...; | |
| 818 } | |
| 819 | |
| 2367 | 820 You'd use XD_BLOCK_PTR, something like: |
| 814 | 821 |
| 1204 | 822 static const struct memory_description foo_description[] = { |
| 823 ... | |
| 824 { XD_INT, offsetof (Lisp_Foo, count) }, | |
| 2367 | 825 { XD_BLOCK_PTR, offsetof (Lisp_Foo, objects), |
| 2551 | 826 XD_INDIRECT (0, 0), { &lisp_object_description } }, |
| 1204 | 827 ... |
| 828 }; | |
| 829 | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4937
diff
changeset
|
830 lisp_object_description is declared in gc.c, like this: |
| 1204 | 831 |
| 832 static const struct memory_description lisp_object_description_1[] = { | |
| 814 | 833 { XD_LISP_OBJECT, 0 }, |
| 834 { XD_END } | |
| 835 }; | |
| 836 | |
| 1204 | 837 const struct sized_memory_description lisp_object_description = { |
| 814 | 838 sizeof (Lisp_Object), |
| 1204 | 839 lisp_object_description_1 |
| 814 | 840 }; |
| 841 | |
| 2367 | 842 Another example of XD_BLOCK_PTR: |
| 428 | 843 |
| 1204 | 844 typedef struct htentry |
| 814 | 845 { |
| 846 Lisp_Object key; | |
| 847 Lisp_Object value; | |
| 1204 | 848 } htentry; |
| 814 | 849 |
| 850 struct Lisp_Hash_Table | |
| 851 { | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
852 NORMAL_LISP_OBJECT_HEADER header; |
| 814 | 853 Elemcount size; |
| 854 Elemcount count; | |
| 855 Elemcount rehash_count; | |
| 856 double rehash_size; | |
| 857 double rehash_threshold; | |
| 858 Elemcount golden_ratio; | |
| 859 hash_table_hash_function_t hash_function; | |
| 860 hash_table_test_function_t test_function; | |
| 1204 | 861 htentry *hentries; |
| 814 | 862 enum hash_table_weakness weakness; |
| 863 Lisp_Object next_weak; // Used to chain together all of the weak | |
| 864 // hash tables. Don't mark through this. | |
| 865 }; | |
| 866 | |
| 1204 | 867 static const struct memory_description htentry_description_1[] = { |
| 868 { XD_LISP_OBJECT, offsetof (htentry, key) }, | |
| 869 { XD_LISP_OBJECT, offsetof (htentry, value) }, | |
| 814 | 870 { XD_END } |
| 871 }; | |
| 872 | |
| 1204 | 873 static const struct sized_memory_description htentry_description = { |
| 874 sizeof (htentry), | |
| 875 htentry_description_1 | |
| 814 | 876 }; |
| 877 | |
| 1204 | 878 const struct memory_description hash_table_description[] = { |
| 814 | 879 { XD_ELEMCOUNT, offsetof (Lisp_Hash_Table, size) }, |
| 2367 | 880 { XD_BLOCK_PTR, offsetof (Lisp_Hash_Table, hentries), XD_INDIRECT (0, 1), |
| 2551 | 881 { &htentry_description } }, |
| 814 | 882 { XD_LO_LINK, offsetof (Lisp_Hash_Table, next_weak) }, |
| 883 { XD_END } | |
| 884 }; | |
| 885 | |
| 886 Note that we don't need to declare all the elements in the structure, just | |
| 887 the ones that need to be relocated (Lisp_Objects and structures) or that | |
| 888 need to be referenced as counts for relocated objects. | |
| 889 | |
| 1204 | 890 A description map looks like this: |
| 891 | |
| 892 static const struct sized_memory_description specifier_extra_description_map [] = { | |
| 893 { offsetof (Lisp_Specifier, methods) }, | |
| 894 { offsetof (struct specifier_methods, extra_description) }, | |
| 895 { -1 } | |
| 896 }; | |
| 897 | |
| 898 const struct memory_description specifier_description[] = { | |
| 899 ... | |
| 2367 | 900 { XD_BLOCK_ARRAY, offset (Lisp_Specifier, data), 1, |
| 2551 | 901 { specifier_extra_description_map } }, |
| 1204 | 902 ... |
| 903 { XD_END } | |
| 904 }; | |
| 905 | |
| 906 This would be appropriate for an object that looks like this: | |
| 907 | |
| 908 struct specifier_methods | |
| 909 { | |
| 910 ... | |
| 911 const struct sized_memory_description *extra_description; | |
| 912 ... | |
| 913 }; | |
| 914 | |
| 915 struct Lisp_Specifier | |
| 916 { | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
917 NORMAL_LISP_OBJECT_HEADER header; |
| 1204 | 918 struct specifier_methods *methods; |
| 919 | |
| 920 ... | |
| 921 // type-specific extra data attached to a specifier | |
| 922 max_align_t data[1]; | |
| 923 }; | |
| 924 | |
| 925 The description map means "retrieve a pointer into the object at offset | |
| 926 `offsetof (Lisp_Specifier, methods)' , then in turn retrieve a pointer | |
| 927 into that object at offset `offsetof (struct specifier_methods, | |
| 928 extra_description)', and that is the sized_memory_description to use." | |
| 929 There can be any number of indirections, which can be either into | |
| 930 straight pointers or Lisp_Objects. The way that description maps are | |
| 931 distinguished from normal sized_memory_descriptions is that in the | |
| 932 former, the memory_description pointer is NULL. | |
| 933 | |
| 934 --ben | |
| 935 | |
| 814 | 936 |
| 937 The existing types : | |
| 938 | |
| 939 | |
| 428 | 940 XD_LISP_OBJECT |
| 1204 | 941 |
| 942 A Lisp object. This is also the type to use for pointers to other lrecords | |
| 943 (e.g. struct frame *). | |
| 428 | 944 |
| 440 | 945 XD_LISP_OBJECT_ARRAY |
| 1204 | 946 |
| 771 | 947 An array of Lisp objects or (equivalently) pointers to lrecords. |
| 948 The parameter (i.e. third element) is the count. This would be declared | |
| 949 as Lisp_Object foo[666]. For something declared as Lisp_Object *foo, | |
| 2367 | 950 use XD_BLOCK_PTR, whose description parameter is a sized_memory_description |
| 771 | 951 consisting of only XD_LISP_OBJECT and XD_END. |
| 440 | 952 |
| 428 | 953 XD_LO_LINK |
| 1204 | 954 |
| 771 | 955 Weak link in a linked list of objects of the same type. This is a |
| 956 link that does NOT generate a GC reference. Thus the pdumper will | |
| 957 not automatically add the referenced object to the table of all | |
| 958 objects to be dumped, and when storing and loading the dumped data | |
| 959 will automatically prune unreferenced objects in the chain and link | |
| 960 each referenced object to the next referenced object, even if it's | |
| 961 many links away. We also need to special handling of a similar | |
| 962 nature for the root of the chain, which will be a staticpro()ed | |
| 963 object. | |
| 432 | 964 |
| 428 | 965 XD_OPAQUE_PTR |
| 1204 | 966 |
| 428 | 967 Pointer to undumpable data. Must be NULL when dumping. |
| 968 | |
| 2551 | 969 XD_OPAQUE_PTR_CONVERTIBLE |
| 970 | |
| 971 Pointer to data which is not directly dumpable but can be converted | |
| 972 to a dumpable, opaque external representation. The parameter is | |
| 973 a pointer to an opaque_convert_functions struct. | |
| 974 | |
| 975 XD_OPAQUE_DATA_CONVERTIBLE | |
| 976 | |
| 977 Data which is not directly dumpable but can be converted to a | |
| 978 dumpable, opaque external representation. The parameter is a | |
| 979 pointer to an opaque_convert_functions struct. | |
| 980 | |
| 2367 | 981 XD_BLOCK_PTR |
| 1204 | 982 |
| 771 | 983 Pointer to block of described memory. (This is misnamed: It is NOT |
| 984 necessarily a pointer to a struct foo.) Parameters are number of | |
| 1204 | 985 contiguous blocks and sized_memory_description. |
| 771 | 986 |
| 2367 | 987 XD_BLOCK_ARRAY |
| 1204 | 988 |
| 771 | 989 Array of blocks of described memory. Parameters are number of |
| 2367 | 990 structures and sized_memory_description. This differs from XD_BLOCK_PTR |
| 771 | 991 in that the parameter is declared as struct foo[666] instead of |
| 992 struct *foo. In other words, the block of memory holding the | |
| 993 structures is within the containing structure, rather than being | |
| 994 elsewhere, with a pointer in the containing structure. | |
| 428 | 995 |
| 1204 | 996 NOTE NOTE NOTE: Be sure that you understand the difference between |
| 2367 | 997 XD_BLOCK_PTR and XD_BLOCK_ARRAY: |
| 1204 | 998 - struct foo bar[666], i.e. 666 inline struct foos |
| 2367 | 999 --> XD_BLOCK_ARRAY, argument 666, pointing to a description of |
| 1204 | 1000 struct foo |
| 1001 - struct foo *bar, i.e. pointer to a block of 666 struct foos | |
| 2367 | 1002 --> XD_BLOCK_PTR, argument 666, pointing to a description of |
| 1204 | 1003 struct foo |
| 1004 - struct foo *bar[666], i.e. 666 pointers to separate blocks of struct foos | |
| 2367 | 1005 --> XD_BLOCK_ARRAY, argument 666, pointing to a description of |
| 1204 | 1006 a single pointer to struct foo; the description is a single |
| 2367 | 1007 XD_BLOCK_PTR, argument 1, which in turn points to a description |
| 1204 | 1008 of struct foo. |
| 1009 | |
| 2367 | 1010 NOTE also that an XD_BLOCK_PTR of 666 foos is equivalent to an |
| 1011 XD_BLOCK_PTR of 1 bar, where the description of `bar' is an | |
| 1012 XD_BLOCK_ARRAY of 666 foos. | |
| 1013 | |
| 428 | 1014 XD_OPAQUE_DATA_PTR |
| 1204 | 1015 |
| 428 | 1016 Pointer to dumpable opaque data. Parameter is the size of the data. |
| 1017 Pointed data must be relocatable without changes. | |
| 1018 | |
| 771 | 1019 XD_UNION |
| 1204 | 1020 |
| 1021 Union of two or more different types of data. Parameters are a constant | |
| 1022 which determines which type the data is (this is usually an XD_INDIRECT, | |
| 1023 referring to one of the fields in the structure), and a "sizing lobby" (a | |
| 1024 sized_memory_description, which points to a memory_description and | |
| 1025 indicates its size). The size field in the sizing lobby describes the | |
| 1026 size of the union field in the object, and the memory_description in it | |
| 1027 is referred to as a "union map" and has a special interpretation: The | |
| 1028 offset field is replaced by a constant, which is compared to the first | |
| 1029 parameter of the XD_UNION descriptor to determine if this description | |
| 1030 applies to the union data, and XD_INDIRECT references refer to the | |
| 1031 containing object and description. Note that the description applies | |
| 2367 | 1032 "inline" to the union data, like XD_BLOCK_ARRAY and not XD_BLOCK_PTR. |
| 1204 | 1033 If the union data is a pointer to different types of structures, each |
| 2367 | 1034 element in the memory_description should be an XD_BLOCK_PTR. See |
| 1204 | 1035 unicode.c, redisplay.c and objects.c for examples of XD_UNION. |
| 1036 | |
| 1037 XD_UNION_DYNAMIC_SIZE | |
| 1038 | |
| 1039 Same as XD_UNION except that this is used for objects where the size of | |
| 1040 the object containing the union varies depending on the particular value | |
| 1041 of the union constant. That is, an object with plain XD_UNION typically | |
| 1042 has the union declared as `union foo' or as `void *', where an object | |
| 1043 with XD_UNION_DYNAMIC_SIZE typically has the union as the last element, | |
| 2367 | 1044 and declared as something like Rawbyte foo[1]. With plain XD_UNION, the |
| 1204 | 1045 object is (usually) of fixed size and always contains enough space for |
| 1046 the data associated with all possible union constants, and thus the union | |
| 1047 constant can potentially change during the lifetime of the object. With | |
| 1048 XD_UNION_DYNAMIC_SIZE, however, the union constant is fixed at the time | |
| 1049 of creation of the object, and the size of the object is computed | |
| 1050 dynamically at creation time based on the size of the data associated | |
| 1051 with the union constant. Currently, the only difference between XD_UNION | |
| 1052 and XD_UNION_DYNAMIC_SIZE is how the size of the union data is | |
| 1053 calculated, when (a) the structure containing the union has no size | |
| 1054 given; (b) the union occurs as the last element in the structure; and (c) | |
| 1055 the union has no size given (in the first-level sized_memory_description | |
| 1056 pointed to). In this circumstance, the size of XD_UNION comes from the | |
| 1057 max size of the data associated with all possible union constants, | |
| 1058 whereas the size of XD_UNION_DYNAMIC_SIZE comes from the size of the data | |
| 1059 associated with the currently specified (and unchangeable) union | |
| 1060 constant. | |
| 771 | 1061 |
| 2367 | 1062 XD_ASCII_STRING |
| 1204 | 1063 |
| 2367 | 1064 Pointer to a C string, purely ASCII. |
| 428 | 1065 |
| 1066 XD_DOC_STRING | |
| 1204 | 1067 |
| 2367 | 1068 Pointer to a doc string (C string in pure ASCII if positive, |
| 1069 opaque value if negative) | |
| 428 | 1070 |
| 1071 XD_INT_RESET | |
| 1204 | 1072 |
| 428 | 1073 An integer which will be reset to a given value in the dump file. |
| 1074 | |
| 1204 | 1075 XD_ELEMCOUNT |
| 771 | 1076 |
| 665 | 1077 Elemcount value. Used for counts. |
| 647 | 1078 |
| 665 | 1079 XD_BYTECOUNT |
| 1204 | 1080 |
| 665 | 1081 Bytecount value. Used for counts. |
| 647 | 1082 |
| 665 | 1083 XD_HASHCODE |
| 1204 | 1084 |
| 665 | 1085 Hashcode value. Used for the results of hashing functions. |
| 428 | 1086 |
| 1087 XD_INT | |
| 1204 | 1088 |
| 428 | 1089 int value. Used for counts. |
| 1090 | |
| 1091 XD_LONG | |
| 1204 | 1092 |
| 428 | 1093 long value. Used for counts. |
| 1094 | |
| 771 | 1095 XD_BYTECOUNT |
| 1204 | 1096 |
| 771 | 1097 bytecount value. Used for counts. |
| 1098 | |
| 428 | 1099 XD_END |
| 1204 | 1100 |
| 428 | 1101 Special type indicating the end of the array. |
| 1102 | |
| 1103 | |
| 1104 Special macros: | |
| 1204 | 1105 |
| 1106 XD_INDIRECT (line, delta) | |
| 1107 Usable where a count, size, offset or union constant is requested. Gives | |
| 1108 the value of the element which is at line number 'line' in the | |
| 1109 description (count starts at zero) and adds delta to it, which must | |
| 1110 (currently) be positive. | |
| 428 | 1111 */ |
| 1112 | |
| 1204 | 1113 enum memory_description_type |
| 647 | 1114 { |
| 440 | 1115 XD_LISP_OBJECT_ARRAY, |
| 428 | 1116 XD_LISP_OBJECT, |
| 3092 | 1117 #ifdef NEW_GC |
| 1118 XD_LISP_OBJECT_BLOCK_PTR, | |
| 1119 #endif /* NEW_GC */ | |
| 428 | 1120 XD_LO_LINK, |
| 1121 XD_OPAQUE_PTR, | |
| 2551 | 1122 XD_OPAQUE_PTR_CONVERTIBLE, |
| 1123 XD_OPAQUE_DATA_CONVERTIBLE, | |
| 1124 XD_OPAQUE_DATA_PTR, | |
| 2367 | 1125 XD_BLOCK_PTR, |
| 1126 XD_BLOCK_ARRAY, | |
| 771 | 1127 XD_UNION, |
| 1204 | 1128 XD_UNION_DYNAMIC_SIZE, |
| 2367 | 1129 XD_ASCII_STRING, |
| 428 | 1130 XD_DOC_STRING, |
| 1131 XD_INT_RESET, | |
| 665 | 1132 XD_BYTECOUNT, |
| 1133 XD_ELEMCOUNT, | |
| 1134 XD_HASHCODE, | |
| 428 | 1135 XD_INT, |
| 1136 XD_LONG, | |
| 1204 | 1137 XD_END |
| 428 | 1138 }; |
| 1139 | |
| 1204 | 1140 enum data_description_entry_flags |
| 647 | 1141 { |
| 1204 | 1142 /* If set, KKCC does not process this entry. |
| 1143 | |
| 1144 (1) One obvious use is with things that pdump saves but which do not get | |
| 1145 marked normally -- for example the next and prev fields in a marker. The | |
| 1146 marker chain is weak, with its entries removed when they are finalized. | |
| 1147 | |
| 1148 (2) This can be set on structures not containing any Lisp objects, or (more | |
| 1149 usefully) on structures that contain Lisp objects but where the objects | |
| 1150 always occur in another structure as well. For example, the extent lists | |
| 1151 kept by a buffer keep the extents in two lists, one sorted by the start | |
| 1152 of the extent and the other by the end. There's no point in marking | |
| 1153 both, since each contains the same objects as the other; but when dumping | |
| 1154 (if we were to dump such a structure), when computing memory size, etc., | |
| 1155 it's crucial to tag both sides. | |
| 1156 */ | |
| 1157 XD_FLAG_NO_KKCC = 1, | |
| 1158 /* If set, pdump does not process this entry. */ | |
| 1159 XD_FLAG_NO_PDUMP = 2, | |
| 1160 /* Indicates that this is a "default" entry in a union map. */ | |
| 1161 XD_FLAG_UNION_DEFAULT_ENTRY = 4, | |
| 3263 | 1162 #ifndef NEW_GC |
| 1204 | 1163 /* Indicates that this is a free Lisp object we're marking. |
| 1164 Only relevant for ERROR_CHECK_GC. This occurs when we're marking | |
| 1165 lcrecord-lists, where the objects have had their type changed to | |
| 1166 lrecord_type_free and also have had their free bit set, but we mark | |
| 1167 them as normal. */ | |
| 1429 | 1168 XD_FLAG_FREE_LISP_OBJECT = 8 |
| 3263 | 1169 #endif /* not NEW_GC */ |
| 1204 | 1170 #if 0 |
| 1429 | 1171 , |
| 1204 | 1172 /* Suggestions for other possible flags: */ |
| 1173 | |
| 1174 /* Eliminate XD_UNION_DYNAMIC_SIZE and replace it with a flag, like this. */ | |
| 1175 XD_FLAG_UNION_DYNAMIC_SIZE = 16, | |
| 1176 /* Require that everyone who uses a description map has to flag it, so | |
| 1177 that it's easy to tell, when looking through the code, where the | |
| 1178 description maps are and who's using them. This might also become | |
| 1179 necessary if for some reason the format of the description map is | |
| 1180 expanded and we need to stick a pointer in the second slot (although | |
| 1181 we could still ensure that the second slot in the first entry was NULL | |
| 1182 or <0). */ | |
| 1429 | 1183 XD_FLAG_DESCRIPTION_MAP = 32 |
| 1204 | 1184 #endif |
| 428 | 1185 }; |
| 1186 | |
| 2551 | 1187 union memory_contents_description |
| 1188 { | |
| 1189 /* The first element is used by static initializers only. We always read | |
| 1190 from one of the other two pointers. */ | |
| 1191 const void *write_only; | |
| 1192 const struct sized_memory_description *descr; | |
| 1193 const struct opaque_convert_functions *funcs; | |
| 1194 }; | |
| 1195 | |
| 1204 | 1196 struct memory_description |
| 1197 { | |
| 1198 enum memory_description_type type; | |
| 1199 Bytecount offset; | |
| 1200 EMACS_INT data1; | |
| 2551 | 1201 union memory_contents_description data2; |
| 1204 | 1202 /* Indicates which subsystems process this entry, plus (potentially) other |
| 1203 flags that apply to this entry. */ | |
| 1204 int flags; | |
| 1205 }; | |
| 428 | 1206 |
| 1204 | 1207 struct sized_memory_description |
| 1208 { | |
| 1209 Bytecount size; | |
| 1210 const struct memory_description *description; | |
| 1211 }; | |
| 1212 | |
| 2551 | 1213 |
| 1214 struct opaque_convert_functions | |
| 1215 { | |
| 1216 /* Used by XD_OPAQUE_PTR_CONVERTIBLE and | |
| 1217 XD_OPAQUE_DATA_CONVERTIBLE */ | |
| 1218 | |
| 1219 /* Converter to external representation, for those objects from | |
| 1220 external libraries that can't be directly dumped as opaque data | |
| 1221 because they contain pointers. This is called at dump time to | |
| 1222 convert to an opaque, pointer-less representation. | |
| 1223 | |
| 1224 This function must put a pointer to the opaque result in *data | |
| 1225 and its size in *size. */ | |
| 1226 void (*convert)(const void *object, void **data, Bytecount *size); | |
| 1227 | |
| 1228 /* Post-conversion cleanup. Optional (null if not provided). | |
| 1229 | |
| 1230 When provided it will be called post-dumping to free any storage | |
| 1231 allocated for the conversion results. */ | |
| 1232 void (*convert_free)(const void *object, void *data, Bytecount size); | |
| 1233 | |
| 1234 /* De-conversion. | |
| 1235 | |
| 1236 At reload time, rebuilds the object from the converted form. | |
| 1237 "object" is 0 for the PTR case, return is ignored in the DATA | |
| 1238 case. */ | |
| 1239 void *(*deconvert)(void *object, void *data, Bytecount size); | |
| 1240 | |
| 1241 }; | |
| 1242 | |
| 1204 | 1243 extern const struct sized_memory_description lisp_object_description; |
| 1244 | |
| 1245 #define XD_INDIRECT(val, delta) (-1 - (Bytecount) ((val) | ((delta) << 8))) | |
| 428 | 1246 |
| 1204 | 1247 #define XD_IS_INDIRECT(code) ((code) < 0) |
| 1248 #define XD_INDIRECT_VAL(code) ((-1 - (code)) & 255) | |
| 1249 #define XD_INDIRECT_DELTA(code) ((-1 - (code)) >> 8) | |
| 1250 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1251 /* DEFINE_*_LISP_OBJECT is for objects with constant size. (Either |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1252 DEFINE_DUMPABLE_LISP_OBJECT for objects that can be saved in a dumped |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1253 executable, or DEFINE_NODUMP_LISP_OBJECT for objects that cannot be |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1254 saved -- e.g. that contain pointers to non-persistent external objects |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1255 such as window-system windows.) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1256 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1257 DEFINE_*_SIZABLE_LISP_OBJECT is for objects whose size varies. |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1258 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1259 DEFINE_*_FROB_BLOCK_LISP_OBJECT is for objects that are allocated in |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1260 large blocks ("frob blocks"), which are parceled up individually. Such |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1261 objects need special handling in alloc.c. This does not apply to |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1262 NEW_GC, because it does this automatically. |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1263 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1264 DEFINE_*_INTERNAL_LISP_OBJECT is for "internal" objects that should |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1265 never be visible on the Lisp level. This is a shorthand for the most |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1266 common type of internal objects, which have no equal or hash method |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1267 (since they generally won't appear in hash tables), no finalizer and |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1268 internal_object_printer() as their print method (which prints that the |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1269 object is internal and shouldn't be visible externally). For internal |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1270 objects needing a finalizer, equal or hash method, or wanting to |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1271 customize the print method, use the normal DEFINE_*_LISP_OBJECT |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1272 mechanism for defining these objects. |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1273 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1274 DEFINE_*_GENERAL_LISP_OBJECT is for objects that need to provide one of |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1275 the less common methods that are omitted on most objects. These methods |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1276 include the methods supporting the unified property interface using |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1277 `get', `put', `remprop' and `object-plist', and (for dumpable objects |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1278 only) the `disksaver' method. |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1279 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1280 DEFINE_MODULE_* is for objects defined in an external module. |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1281 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1282 MAKE_LISP_OBJECT and MAKE_MODULE_LISP_OBJECT are what underlies all of |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1283 these; they define a structure containing pointers to object methods |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1284 and other info such as the size of the structure containing the object. |
| 428 | 1285 */ |
| 1286 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1287 /* #### FIXME What's going on here? */ |
| 800 | 1288 #if defined (ERROR_CHECK_TYPES) |
| 1289 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) | |
| 428 | 1290 #else |
| 800 | 1291 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) |
| 428 | 1292 #endif |
| 1293 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1294 /********* The dumpable versions *********** */ |
| 934 | 1295 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1296 #define DEFINE_DUMPABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1297 DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
| 934 | 1298 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1299 #define DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1300 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype) |
| 934 | 1301 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1302 #define DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1303 DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1304 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1305 #define DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1306 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype) |
| 934 | 1307 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1308 #define DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1309 DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1310 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1311 #define DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1312 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof(structtype),0,1,structtype) |
| 934 | 1313 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1314 #define DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1315 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,0,sizer,1,structtype) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1316 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1317 #define DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1318 DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1319 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1320 #define DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1321 DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,sizer,structtype) |
| 934 | 1322 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1323 /********* The non-dumpable versions *********** */ |
| 934 | 1324 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1325 #define DEFINE_NODUMP_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1326 DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
| 934 | 1327 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1328 #define DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1329 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1330 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1331 #define DEFINE_NODUMP_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1332 DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype) |
| 934 | 1333 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1334 #define DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1335 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype) |
| 934 | 1336 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1337 #define DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1338 DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1339 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1340 #define DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1341 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof(structtype),0,1,structtype) |
| 934 | 1342 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1343 #define DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1344 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,0,sizer,1,structtype) |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1345 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1346 #define DEFINE_NODUMP_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1347 DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,structtype) |
| 934 | 1348 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1349 #define DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1350 DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,sizer,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1351 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1352 /********* MAKE_LISP_OBJECT, the underlying macro *********** */ |
| 934 | 1353 |
| 3263 | 1354 #ifdef NEW_GC |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1355 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \ |
| 2720 | 1356 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
| 1357 const struct lrecord_implementation lrecord_##c_name = \ | |
| 1358 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1359 getprop, putprop, remprop, plist, disksaver, size, sizer, \ |
| 2720 | 1360 lrecord_type_##c_name } |
| 3263 | 1361 #else /* not NEW_GC */ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1362 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \ |
| 1204 | 1363 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
| 934 | 1364 const struct lrecord_implementation lrecord_##c_name = \ |
| 1365 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1366 getprop, putprop, remprop, plist, disksaver, size, sizer, \ |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1367 lrecord_type_##c_name, frob_block_p } |
| 3263 | 1368 #endif /* not NEW_GC */ |
| 934 | 1369 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1370 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1371 /********* The module dumpable versions *********** */ |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1372 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1373 #define DEFINE_DUMPABLE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1374 DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
| 934 | 1375 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1376 #define DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1377 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype) |
| 934 | 1378 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1379 #define DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1380 DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1381 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1382 #define DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1383 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype) |
| 934 | 1384 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1385 /********* The module non-dumpable versions *********** */ |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1386 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1387 #define DEFINE_NODUMP_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1388 DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1389 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1390 #define DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1391 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype) |
| 934 | 1392 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1393 #define DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1394 DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype) |
| 934 | 1395 |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1396 #define DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \ |
|
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1397 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype) |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1398 |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1399 /********* MAKE_MODULE_LISP_OBJECT, the underlying macro *********** */ |
| 934 | 1400 |
| 3263 | 1401 #ifdef NEW_GC |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1402 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \ |
| 2720 | 1403 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
| 1404 int lrecord_type_##c_name; \ | |
| 1405 struct lrecord_implementation lrecord_##c_name = \ | |
| 1406 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1407 getprop, putprop, remprop, plist, disksaver, size, sizer, \ |
| 2720 | 1408 lrecord_type_last_built_in_type } |
| 3263 | 1409 #else /* not NEW_GC */ |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1410 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \ |
| 1204 | 1411 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
| 934 | 1412 int lrecord_type_##c_name; \ |
| 1413 struct lrecord_implementation lrecord_##c_name = \ | |
| 1414 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
|
5124
623d57b7fbe8
separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents:
5120
diff
changeset
|
1415 getprop, putprop, remprop, plist, disksaver, size, sizer, \ |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1416 lrecord_type_last_built_in_type, frob_block_p } |
| 3263 | 1417 #endif /* not NEW_GC */ |
| 934 | 1418 |
| 1676 | 1419 #ifdef USE_KKCC |
| 1420 extern MODULE_API const struct memory_description *lrecord_memory_descriptions[]; | |
| 1421 | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1422 #define INIT_LISP_OBJECT(type) do { \ |
| 1676 | 1423 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \ |
| 1424 lrecord_memory_descriptions[lrecord_type_##type] = \ | |
| 1425 lrecord_implementations_table[lrecord_type_##type]->description; \ | |
| 1426 } while (0) | |
| 1427 #else /* not USE_KKCC */ | |
| 1632 | 1428 extern MODULE_API Lisp_Object (*lrecord_markers[]) (Lisp_Object); |
| 442 | 1429 |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1430 #define INIT_LISP_OBJECT(type) do { \ |
| 442 | 1431 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \ |
| 1432 lrecord_markers[lrecord_type_##type] = \ | |
| 1433 lrecord_implementations_table[lrecord_type_##type]->marker; \ | |
| 1434 } while (0) | |
| 1676 | 1435 #endif /* not USE_KKCC */ |
| 428 | 1436 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1437 #define INIT_MODULE_LISP_OBJECT(type) do { \ |
| 444 | 1438 lrecord_type_##type = lrecord_type_count++; \ |
| 1439 lrecord_##type.lrecord_type_index = lrecord_type_##type; \ | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1440 INIT_LISP_OBJECT(type); \ |
| 444 | 1441 } while (0) |
| 1442 | |
| 996 | 1443 #ifdef HAVE_SHLIB |
| 1444 /* Allow undefining types in order to support module unloading. */ | |
| 1445 | |
| 1676 | 1446 #ifdef USE_KKCC |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1447 #define UNDEF_LISP_OBJECT(type) do { \ |
| 1676 | 1448 lrecord_implementations_table[lrecord_type_##type] = NULL; \ |
| 1449 lrecord_memory_descriptions[lrecord_type_##type] = NULL; \ | |
| 1450 } while (0) | |
| 1451 #else /* not USE_KKCC */ | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1452 #define UNDEF_LISP_OBJECT(type) do { \ |
| 996 | 1453 lrecord_implementations_table[lrecord_type_##type] = NULL; \ |
| 1454 lrecord_markers[lrecord_type_##type] = NULL; \ | |
| 1455 } while (0) | |
| 1676 | 1456 #endif /* not USE_KKCC */ |
| 996 | 1457 |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1458 #define UNDEF_MODULE_LISP_OBJECT(type) do { \ |
| 996 | 1459 if (lrecord_##type.lrecord_type_index == lrecord_type_count - 1) { \ |
| 1460 /* This is the most recently defined type. Clean up nicely. */ \ | |
| 1461 lrecord_type_##type = lrecord_type_count--; \ | |
| 1462 } /* Else we can't help leaving a hole with this implementation. */ \ | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1463 UNDEF_LISP_OBJECT(type); \ |
| 996 | 1464 } while (0) |
| 1465 | |
| 1466 #endif /* HAVE_SHLIB */ | |
| 1467 | |
| 428 | 1468 #define LRECORDP(a) (XTYPE (a) == Lisp_Type_Record) |
| 1469 #define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a)) | |
| 1470 | |
| 1471 #define RECORD_TYPEP(x, ty) \ | |
| 647 | 1472 (LRECORDP (x) && (XRECORD_LHEADER (x)->type == (unsigned int) (ty))) |
| 442 | 1473 |
| 1474 /* Steps to create a new object: | |
| 1475 | |
| 1476 1. Declare the struct for your object in a header file somewhere. | |
| 1477 Remember that it must begin with | |
| 1478 | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1479 NORMAL_LISP_OBJECT_HEADER header; |
| 442 | 1480 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1481 2. Put the "standard junk" (DECLARE_LISP_OBJECT()/XFOO/etc.) below the |
| 617 | 1482 struct definition -- see below. |
| 442 | 1483 |
| 1484 3. Add this header file to inline.c. | |
| 1485 | |
| 1486 4. Create the methods for your object. Note that technically you don't | |
| 1487 need any, but you will almost always want at least a mark method. | |
| 1488 | |
| 1204 | 1489 4. Create the data layout description for your object. See |
| 1490 toolbar_button_description below; the comment above in `struct lrecord', | |
| 1491 describing the purpose of the descriptions; and comments elsewhere in | |
| 1492 this file describing the exact syntax of the description structures. | |
| 1493 | |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1494 6. Define your object with DEFINE_*_LISP_OBJECT() or some |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1495 variant. At the minimum, you need to decide whether your object can |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1496 be dumped. Objects that are created as part of the loadup process and |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1497 need to be persistent across dumping should be created dumpable. |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1498 Nondumpable objects are generally those associated with display, |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1499 particularly those containing a pointer to an external library object |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1500 (e.g. a window-system window). |
| 442 | 1501 |
| 1204 | 1502 7. Include the header file in the .c file where you defined the object. |
| 442 | 1503 |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1504 8. Put a call to INIT_LISP_OBJECT() for the object in the |
| 442 | 1505 .c file's syms_of_foo() function. |
| 1506 | |
| 1204 | 1507 9. Add a type enum for the object to enum lrecord_type, earlier in this |
| 442 | 1508 file. |
| 1509 | |
| 1204 | 1510 --ben |
| 1511 | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1512 An example: |
| 428 | 1513 |
| 442 | 1514 ------------------------------ in toolbar.h ----------------------------- |
| 1515 | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1516 struct toolbar_button |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1517 { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1518 NORMAL_LISP_OBJECT_HEADER header; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1519 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1520 Lisp_Object next; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1521 Lisp_Object frame; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1522 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1523 Lisp_Object up_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1524 Lisp_Object down_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1525 Lisp_Object disabled_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1526 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1527 Lisp_Object cap_up_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1528 Lisp_Object cap_down_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1529 Lisp_Object cap_disabled_glyph; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1530 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1531 Lisp_Object callback; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1532 Lisp_Object enabled_p; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1533 Lisp_Object help_string; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1534 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1535 char enabled; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1536 char down; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1537 char pushright; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1538 char blank; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1539 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1540 int x, y; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1541 int width, height; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1542 int dirty; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1543 int vertical; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1544 int border_width; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1545 }; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1546 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1547 [[ the standard junk: ]] |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1548 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1549 DECLARE_LISP_OBJECT (toolbar_button, struct toolbar_button); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1550 #define XTOOLBAR_BUTTON(x) XRECORD (x, toolbar_button, struct toolbar_button) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1551 #define wrap_toolbar_button(p) wrap_record (p, toolbar_button) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1552 #define TOOLBAR_BUTTONP(x) RECORDP (x, toolbar_button) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1553 #define CHECK_TOOLBAR_BUTTON(x) CHECK_RECORD (x, toolbar_button) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1554 #define CONCHECK_TOOLBAR_BUTTON(x) CONCHECK_RECORD (x, toolbar_button) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1555 |
| 442 | 1556 ------------------------------ in toolbar.c ----------------------------- |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1557 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1558 #include "toolbar.h" |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1559 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1560 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1561 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1562 static const struct memory_description toolbar_button_description [] = { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1563 { XD_LISP_OBJECT, offsetof (struct toolbar_button, next) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1564 { XD_LISP_OBJECT, offsetof (struct toolbar_button, frame) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1565 { XD_LISP_OBJECT, offsetof (struct toolbar_button, up_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1566 { XD_LISP_OBJECT, offsetof (struct toolbar_button, down_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1567 { XD_LISP_OBJECT, offsetof (struct toolbar_button, disabled_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1568 { XD_LISP_OBJECT, offsetof (struct toolbar_button, cap_up_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1569 { XD_LISP_OBJECT, offsetof (struct toolbar_button, cap_down_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1570 { XD_LISP_OBJECT, offsetof (struct toolbar_button, cap_disabled_glyph) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1571 { XD_LISP_OBJECT, offsetof (struct toolbar_button, callback) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1572 { XD_LISP_OBJECT, offsetof (struct toolbar_button, enabled_p) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1573 { XD_LISP_OBJECT, offsetof (struct toolbar_button, help_string) }, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1574 { XD_END } |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1575 }; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1576 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1577 static Lisp_Object |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1578 allocate_toolbar_button (struct frame *f, int pushright) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1579 { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1580 struct toolbar_button *tb; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1581 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1582 tb = XTOOLBAR_BUTTON (ALLOC_NORMAL_LISP_OBJECT (toolbar_button)); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1583 tb->next = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1584 tb->frame = wrap_frame (f); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1585 tb->up_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1586 tb->down_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1587 tb->disabled_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1588 tb->cap_up_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1589 tb->cap_down_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1590 tb->cap_disabled_glyph = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1591 tb->callback = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1592 tb->enabled_p = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1593 tb->help_string = Qnil; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1594 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1595 tb->pushright = pushright; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1596 tb->x = tb->y = tb->width = tb->height = -1; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1597 tb->dirty = 1; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1598 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1599 return wrap_toolbar_button (tb); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1600 } |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1601 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1602 static Lisp_Object |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1603 mark_toolbar_button (Lisp_Object obj) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1604 { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1605 struct toolbar_button *data = XTOOLBAR_BUTTON (obj); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1606 mark_object (data->next); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1607 mark_object (data->frame); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1608 mark_object (data->up_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1609 mark_object (data->down_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1610 mark_object (data->disabled_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1611 mark_object (data->cap_up_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1612 mark_object (data->cap_down_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1613 mark_object (data->cap_disabled_glyph); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1614 mark_object (data->callback); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1615 mark_object (data->enabled_p); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1616 return data->help_string; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1617 } |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1618 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1619 DEFINE_NODUMP_LISP_OBJECT ("toolbar-button", toolbar_button, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1620 mark_toolbar_button, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1621 external_object_printer, 0, 0, 0, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1622 toolbar_button_description, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1623 struct toolbar_button); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1624 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1625 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1626 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1627 void |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1628 syms_of_toolbar (void) |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1629 { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1630 INIT_LISP_OBJECT (toolbar_button); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1631 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1632 ...; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1633 } |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1634 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1635 ------------------------------ in inline.c ----------------------------- |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1636 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1637 #ifdef HAVE_TOOLBARS |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1638 #include "toolbar.h" |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1639 #endif |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1640 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1641 ------------------------------ in lrecord.h ----------------------------- |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1642 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1643 enum lrecord_type |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1644 { |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1645 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1646 lrecord_type_toolbar_button, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1647 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1648 }; |
| 442 | 1649 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1650 ------------------------------ in .gdbinit.in.in ----------------------------- |
| 442 | 1651 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1652 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1653 else |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1654 if $lrecord_type == lrecord_type_toolbar_button |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1655 pstructtype toolbar_button |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1656 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1657 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1658 ... |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1659 end |
| 442 | 1660 |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1661 --ben |
| 1204 | 1662 |
| 442 | 1663 */ |
| 1664 | |
| 1665 /* | |
| 1666 | |
| 1667 Note: Object types defined in external dynamically-loaded modules (not | |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1668 part of the XEmacs main source code) should use DECLARE_*_MODULE_LISP_OBJECT |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1669 and DEFINE_*_MODULE_LISP_OBJECT rather than DECLARE_*_LISP_OBJECT |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1670 and DEFINE_*_LISP_OBJECT. The MODULE versions declare and |
| 3029 | 1671 allocate an enumerator for the type being defined. |
| 442 | 1672 |
| 1673 */ | |
| 1674 | |
| 428 | 1675 |
| 800 | 1676 #ifdef ERROR_CHECK_TYPES |
| 428 | 1677 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1678 # define DECLARE_LISP_OBJECT(c_name, structtype) \ |
| 788 | 1679 extern const struct lrecord_implementation lrecord_##c_name; \ |
| 826 | 1680 DECLARE_INLINE_HEADER ( \ |
| 1681 structtype * \ | |
| 2367 | 1682 error_check_##c_name (Lisp_Object obj, const Ascbyte *file, int line) \ |
| 826 | 1683 ) \ |
| 788 | 1684 { \ |
| 1685 assert_at_line (RECORD_TYPEP (obj, lrecord_type_##c_name), file, line); \ | |
| 1686 return (structtype *) XPNTR (obj); \ | |
| 1687 } \ | |
| 428 | 1688 extern Lisp_Object Q##c_name##p |
| 1689 | |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1690 # define DECLARE_MODULE_API_LISP_OBJECT(c_name, structtype) \ |
| 1632 | 1691 extern MODULE_API const struct lrecord_implementation lrecord_##c_name; \ |
| 1692 DECLARE_INLINE_HEADER ( \ | |
| 1693 structtype * \ | |
| 2367 | 1694 error_check_##c_name (Lisp_Object obj, const Ascbyte *file, int line) \ |
| 1632 | 1695 ) \ |
| 1696 { \ | |
| 1697 assert_at_line (RECORD_TYPEP (obj, lrecord_type_##c_name), file, line); \ | |
| 1698 return (structtype *) XPNTR (obj); \ | |
| 1699 } \ | |
| 1700 extern MODULE_API Lisp_Object Q##c_name##p | |
| 1701 | |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1702 # define DECLARE_MODULE_LISP_OBJECT(c_name, structtype) \ |
| 788 | 1703 extern int lrecord_type_##c_name; \ |
| 1704 extern struct lrecord_implementation lrecord_##c_name; \ | |
| 826 | 1705 DECLARE_INLINE_HEADER ( \ |
| 1706 structtype * \ | |
| 2367 | 1707 error_check_##c_name (Lisp_Object obj, const Ascbyte *file, int line) \ |
| 826 | 1708 ) \ |
| 788 | 1709 { \ |
| 1710 assert_at_line (RECORD_TYPEP (obj, lrecord_type_##c_name), file, line); \ | |
| 1711 return (structtype *) XPNTR (obj); \ | |
| 1712 } \ | |
| 444 | 1713 extern Lisp_Object Q##c_name##p |
| 442 | 1714 |
| 788 | 1715 # define XRECORD(x, c_name, structtype) \ |
| 1716 error_check_##c_name (x, __FILE__, __LINE__) | |
| 428 | 1717 |
| 826 | 1718 DECLARE_INLINE_HEADER ( |
| 1719 Lisp_Object | |
| 2367 | 1720 wrap_record_1 (const void *ptr, enum lrecord_type ty, const Ascbyte *file, |
| 800 | 1721 int line) |
| 826 | 1722 ) |
| 617 | 1723 { |
| 793 | 1724 Lisp_Object obj = wrap_pointer_1 (ptr); |
| 1725 | |
| 788 | 1726 assert_at_line (RECORD_TYPEP (obj, ty), file, line); |
| 617 | 1727 return obj; |
| 1728 } | |
| 1729 | |
| 788 | 1730 #define wrap_record(ptr, ty) \ |
| 1731 wrap_record_1 (ptr, lrecord_type_##ty, __FILE__, __LINE__) | |
| 617 | 1732 |
| 800 | 1733 #else /* not ERROR_CHECK_TYPES */ |
| 428 | 1734 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1735 # define DECLARE_LISP_OBJECT(c_name, structtype) \ |
| 428 | 1736 extern Lisp_Object Q##c_name##p; \ |
| 442 | 1737 extern const struct lrecord_implementation lrecord_##c_name |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1738 # define DECLARE_MODULE_API_LISP_OBJECT(c_name, structtype) \ |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1739 extern MODULE_API Lisp_Object Q##c_name##p; \ |
| 1638 | 1740 extern MODULE_API const struct lrecord_implementation lrecord_##c_name |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1741 # define DECLARE_MODULE_LISP_OBJECT(c_name, structtype) \ |
| 442 | 1742 extern Lisp_Object Q##c_name##p; \ |
| 647 | 1743 extern int lrecord_type_##c_name; \ |
| 444 | 1744 extern struct lrecord_implementation lrecord_##c_name |
| 428 | 1745 # define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x)) |
| 617 | 1746 /* wrap_pointer_1 is so named as a suggestion not to use it unless you |
| 1747 know what you're doing. */ | |
| 1748 #define wrap_record(ptr, ty) wrap_pointer_1 (ptr) | |
| 428 | 1749 |
| 800 | 1750 #endif /* not ERROR_CHECK_TYPES */ |
| 428 | 1751 |
| 442 | 1752 #define RECORDP(x, c_name) RECORD_TYPEP (x, lrecord_type_##c_name) |
| 428 | 1753 |
| 1754 /* Note: we now have two different kinds of type-checking macros. | |
| 1755 The "old" kind has now been renamed CONCHECK_foo. The reason for | |
| 1756 this is that the CONCHECK_foo macros signal a continuable error, | |
| 1757 allowing the user (through debug-on-error) to substitute a different | |
| 1758 value and return from the signal, which causes the lvalue argument | |
| 1759 to get changed. Quite a lot of code would crash if that happened, | |
| 1760 because it did things like | |
| 1761 | |
| 1762 foo = XCAR (list); | |
| 1763 CHECK_STRING (foo); | |
| 1764 | |
| 1765 and later on did XSTRING (XCAR (list)), assuming that the type | |
| 1766 is correct (when it might be wrong, if the user substituted a | |
| 1767 correct value in the debugger). | |
| 1768 | |
| 1769 To get around this, I made all the CHECK_foo macros signal a | |
| 1770 non-continuable error. Places where a continuable error is OK | |
| 1771 (generally only when called directly on the argument of a Lisp | |
| 1772 primitive) should be changed to use CONCHECK(). | |
| 1773 | |
| 1774 FSF Emacs does not have this problem because RMS took the cheesy | |
| 1775 way out and disabled returning from a signal entirely. */ | |
| 1776 | |
| 1777 #define CONCHECK_RECORD(x, c_name) do { \ | |
| 442 | 1778 if (!RECORD_TYPEP (x, lrecord_type_##c_name)) \ |
| 428 | 1779 x = wrong_type_argument (Q##c_name##p, x); \ |
| 1780 } while (0) | |
| 1781 #define CONCHECK_NONRECORD(x, lisp_enum, predicate) do {\ | |
| 1782 if (XTYPE (x) != lisp_enum) \ | |
| 1783 x = wrong_type_argument (predicate, x); \ | |
| 1784 } while (0) | |
| 1785 #define CHECK_RECORD(x, c_name) do { \ | |
| 442 | 1786 if (!RECORD_TYPEP (x, lrecord_type_##c_name)) \ |
| 428 | 1787 dead_wrong_type_argument (Q##c_name##p, x); \ |
| 1788 } while (0) | |
| 1789 #define CHECK_NONRECORD(x, lisp_enum, predicate) do { \ | |
| 1790 if (XTYPE (x) != lisp_enum) \ | |
| 1791 dead_wrong_type_argument (predicate, x); \ | |
| 1792 } while (0) | |
| 1793 | |
| 3263 | 1794 #ifndef NEW_GC |
| 1204 | 1795 /*-------------------------- lcrecord-list -----------------------------*/ |
| 1796 | |
| 1797 struct lcrecord_list | |
| 1798 { | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1799 NORMAL_LISP_OBJECT_HEADER header; |
| 1204 | 1800 Lisp_Object free; |
| 1801 Elemcount size; | |
| 1802 const struct lrecord_implementation *implementation; | |
| 1803 }; | |
| 1804 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1805 DECLARE_LISP_OBJECT (lcrecord_list, struct lcrecord_list); |
| 1204 | 1806 #define XLCRECORD_LIST(x) XRECORD (x, lcrecord_list, struct lcrecord_list) |
| 1807 #define wrap_lcrecord_list(p) wrap_record (p, lcrecord_list) | |
| 1808 #define LCRECORD_LISTP(x) RECORDP (x, lcrecord_list) | |
| 1809 /* #define CHECK_LCRECORD_LIST(x) CHECK_RECORD (x, lcrecord_list) | |
| 1810 Lcrecord lists should never escape to the Lisp level, so | |
| 1811 functions should not be doing this. */ | |
| 1812 | |
| 826 | 1813 /* Various ways of allocating lcrecords. All bytes (except lcrecord |
| 1204 | 1814 header) are zeroed in returned structure. |
| 1815 | |
| 1816 See above for a discussion of the difference between plain lrecords and | |
| 1817 lrecords. lcrecords themselves are divided into three types: (1) | |
| 1818 auto-managed, (2) hand-managed, and (3) unmanaged. "Managed" refers to | |
| 1819 using a special object called an lcrecord-list to keep track of freed | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1820 lcrecords, which can freed with free_normal_lisp_object() or the like |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1821 and later be recycled when a new lcrecord is required, rather than |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1822 requiring new malloc(). Thus, allocation of lcrecords can be very |
| 1204 | 1823 cheap. (Technically, the lcrecord-list manager could divide up large |
| 1824 chunks of memory and allocate out of that, mimicking what happens with | |
| 1825 lrecords. At that point, however, we'd want to rethink the whole | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1826 division between lrecords and lcrecords.) |
| 1204 | 1827 |
| 1828 NOTE: There is a fundamental limitation of lcrecord-lists, which is that | |
| 1829 they only handle blocks of a particular, fixed size. Thus, objects that | |
| 1830 can be of varying sizes need to do various tricks. These considerations | |
| 1831 in particular dictate the various types of management: | |
| 1832 | |
| 1833 -- "Auto-managed" means that you just go ahead and allocate the lcrecord | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1834 whenever you want, using ALLOC_NORMAL_LISP_OBJECT(), and the appropriate |
| 1204 | 1835 lcrecord-list manager is automatically created. To free, you just call |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1836 "free_normal_lisp_object()" and the appropriate lcrecord-list manager is |
| 1204 | 1837 automatically located and called. The limitation here of course is that |
| 1838 all your objects are of the same size. (#### Eventually we should have a | |
| 1839 more sophisticated system that tracks the sizes seen and creates one | |
| 1840 lcrecord list per size, indexed in a hash table. Usually there are only | |
| 1841 a limited number of sizes, so this works well.) | |
| 826 | 1842 |
| 1204 | 1843 -- "Hand-managed" exists because we haven't yet written the more |
| 1844 sophisticated scheme for auto-handling different-sized lcrecords, as | |
| 1845 described in the end of the last paragraph. In this model, you go ahead | |
| 1846 and create the lcrecord-list objects yourself for the sizes you will | |
| 1847 need, using make_lcrecord_list(). Then, create lcrecords using | |
| 1848 alloc_managed_lcrecord(), passing in the lcrecord-list you created, and | |
| 1849 free them with free_managed_lcrecord(). | |
| 1850 | |
| 1851 -- "Unmanaged" means you simply allocate lcrecords, period. No | |
| 1852 lcrecord-lists, no way to free them. This may be suitable when the | |
| 1853 lcrecords are variable-sized and (a) you're too lazy to write the code | |
| 1854 to hand-manage them, or (b) the objects you create are always or almost | |
| 1855 always Lisp-visible, and thus there's no point in freeing them (and it | |
| 1856 wouldn't be safe to do so). You just create them with | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1857 ALLOC_SIZED_LISP_OBJECT(), and that's it. |
| 1204 | 1858 |
| 1859 --ben | |
| 1860 | |
| 1861 Here is an in-depth look at the steps required to create a allocate an | |
| 1862 lcrecord using the hand-managed style. Since this is the most | |
| 1863 complicated, you will learn a lot about the other styles as well. In | |
| 1864 addition, there is useful general information about what freeing an | |
| 1865 lcrecord really entails, and what are the precautions: | |
| 1866 | |
| 1867 1) Create an lcrecord-list object using make_lcrecord_list(). This is | |
| 1868 often done at initialization. Remember to staticpro_nodump() this | |
| 1869 object! The arguments to make_lcrecord_list() are the same as would be | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1870 passed to ALLOC_SIZED_LISP_OBJECT(). |
| 428 | 1871 |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1872 2) Instead of calling ALLOC_SIZED_LISP_OBJECT(), call |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1873 alloc_managed_lcrecord() and pass the lcrecord-list earlier created. |
| 1204 | 1874 |
| 1875 3) When done with the lcrecord, call free_managed_lcrecord(). The | |
| 1876 standard freeing caveats apply: ** make sure there are no pointers to | |
| 1877 the object anywhere! ** | |
| 1878 | |
| 1879 4) Calling free_managed_lcrecord() is just like kissing the | |
| 1880 lcrecord goodbye as if it were garbage-collected. This means: | |
| 1881 -- the contents of the freed lcrecord are undefined, and the | |
| 1882 contents of something produced by alloc_managed_lcrecord() | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1883 are undefined, just like for ALLOC_SIZED_LISP_OBJECT(). |
| 1204 | 1884 -- the mark method for the lcrecord's type will *NEVER* be called |
| 1885 on freed lcrecords. | |
| 1886 -- the finalize method for the lcrecord's type will be called | |
| 1887 at the time that free_managed_lcrecord() is called. | |
| 1888 */ | |
| 1889 | |
| 1890 /* UNMANAGED MODEL: */ | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1891 Lisp_Object old_alloc_lcrecord (const struct lrecord_implementation *); |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1892 Lisp_Object old_alloc_sized_lcrecord (Bytecount size, |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1893 const struct lrecord_implementation *); |
| 1204 | 1894 |
| 1895 /* HAND-MANAGED MODEL: */ | |
| 1896 Lisp_Object make_lcrecord_list (Elemcount size, | |
| 1897 const struct lrecord_implementation | |
| 1898 *implementation); | |
| 1899 Lisp_Object alloc_managed_lcrecord (Lisp_Object lcrecord_list); | |
| 1900 void free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord); | |
| 1901 | |
| 1902 /* AUTO-MANAGED MODEL: */ | |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1903 MODULE_API Lisp_Object |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1904 alloc_automanaged_sized_lcrecord (Bytecount size, |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1905 const struct lrecord_implementation *imp); |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1906 MODULE_API Lisp_Object |
|
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1907 alloc_automanaged_lcrecord (const struct lrecord_implementation *imp); |
| 3017 | 1908 |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1909 #define old_alloc_lcrecord_type(type, imp) \ |
|
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1910 ((type *) XPNTR (alloc_automanaged_lcrecord (sizeof (type), imp))) |
| 2720 | 1911 |
| 3024 | 1912 void old_free_lcrecord (Lisp_Object rec); |
| 771 | 1913 |
| 3263 | 1914 #else /* NEW_GC */ |
| 2720 | 1915 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1916 MODULE_API Lisp_Object alloc_sized_lrecord (Bytecount size, |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1917 const struct lrecord_implementation *imp); |
|
5117
3742ea8250b5
Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents:
3063
diff
changeset
|
1918 Lisp_Object noseeum_alloc_sized_lrecord (Bytecount size, |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1919 const struct lrecord_implementation *imp); |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1920 MODULE_API Lisp_Object alloc_lrecord (const struct lrecord_implementation *imp); |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1921 Lisp_Object noseeum_alloc_lrecord (const struct lrecord_implementation *imp); |
| 3092 | 1922 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1923 MODULE_API Lisp_Object alloc_lrecord_array (int elemcount, |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
diff
changeset
|
1924 const struct lrecord_implementation *imp); |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1925 MODULE_API Lisp_Object alloc_sized_lrecord_array (Bytecount size, |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1926 int elemcount, |
|
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
1927 const struct lrecord_implementation *imp); |
| 2720 | 1928 |
| 3263 | 1929 #endif /* NEW_GC */ |
| 3017 | 1930 |
| 1204 | 1931 DECLARE_INLINE_HEADER ( |
| 1932 Bytecount | |
| 1933 detagged_lisp_object_size (const struct lrecord_header *h) | |
| 1934 ) | |
| 1935 { | |
| 1936 const struct lrecord_implementation *imp = LHEADER_IMPLEMENTATION (h); | |
| 1937 | |
| 1938 return (imp->size_in_bytes_method ? | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1939 imp->size_in_bytes_method (wrap_pointer_1 (h)) : |
| 1204 | 1940 imp->static_size); |
| 1941 } | |
| 1942 | |
| 1943 DECLARE_INLINE_HEADER ( | |
| 1944 Bytecount | |
| 1945 lisp_object_size (Lisp_Object o) | |
| 1946 ) | |
| 1947 { | |
| 1948 return detagged_lisp_object_size (XRECORD_LHEADER (o)); | |
| 1949 } | |
| 1950 | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1951 struct overhead_stats; |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1952 |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1953 MODULE_API void copy_lisp_object (Lisp_Object dst, Lisp_Object src); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1954 MODULE_API void zero_sized_lisp_object (Lisp_Object obj, Bytecount size); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1955 MODULE_API void zero_nonsized_lisp_object (Lisp_Object obj); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1956 #ifdef MEMORY_USAGE_STATS |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1957 Bytecount lisp_object_storage_size (Lisp_Object obj, |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1958 struct overhead_stats *ovstats); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1959 #endif /* MEMORY_USAGE_STATS */ |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1960 void free_normal_lisp_object (Lisp_Object obj); |
|
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
1961 |
| 1204 | 1962 |
| 1963 /************************************************************************/ | |
| 1964 /* Dumping */ | |
| 1965 /************************************************************************/ | |
| 1966 | |
| 2367 | 1967 /* dump_add_root_block_ptr (&var, &desc) dumps the structure pointed to by |
| 1204 | 1968 `var'. This is for a single relocatable pointer located in the data |
| 2367 | 1969 segment (i.e. the block pointed to is in the heap). |
| 1970 | |
| 1971 If the structure pointed to is not a `struct' but an array, you should | |
| 1972 set the size field of the sized_memory_description to 0, and use | |
| 1973 XD_BLOCK_ARRAY in the inner memory_description. | |
| 1974 | |
| 1975 NOTE that a "root struct pointer" could also be described using | |
| 1976 dump_add_root_block(), with SIZE == sizeof (void *), and a description | |
| 1977 containing a single XD_BLOCK_PTR entry, offset 0, size 1, with a | |
| 1978 structure description the same as the value passed to | |
| 1979 dump_add_root_block_ptr(). That would require an extra level of | |
| 1980 description, though, as compared to using dump_add_root_block_ptr(), | |
| 1981 and thus this function is generally more convenient. | |
| 1982 */ | |
| 1204 | 1983 #ifdef PDUMP |
| 2367 | 1984 void dump_add_root_block_ptr (void *, const struct sized_memory_description *); |
| 1204 | 1985 #else |
| 2367 | 1986 #define dump_add_root_block_ptr(varaddr, descaddr) DO_NOTHING |
| 1204 | 1987 #endif |
| 1988 | |
| 1989 /* dump_add_opaque (&var, size) dumps the opaque static structure `var'. | |
| 1990 This is for a static block of memory (in the data segment, not the | |
| 1991 heap), with no relocatable pointers in it. */ | |
| 1992 #ifdef PDUMP | |
| 1993 #define dump_add_opaque(varaddr,size) dump_add_root_block (varaddr, size, NULL) | |
| 1994 #else | |
| 1995 #define dump_add_opaque(varaddr,size) DO_NOTHING | |
| 1996 #endif | |
| 1997 | |
| 1998 /* dump_add_root_block (ptr, size, desc) dumps the static structure | |
| 1999 located at `var' of size SIZE and described by DESC. This is for a | |
| 2000 static block of memory (in the data segment, not the heap), with | |
| 2001 relocatable pointers in it. */ | |
| 2002 #ifdef PDUMP | |
| 2003 void dump_add_root_block (const void *ptraddress, Bytecount size, | |
| 2004 const struct memory_description *desc); | |
| 2005 #else | |
| 2367 | 2006 #define dump_add_root_block(ptraddress, size, desc) DO_NOTHING |
| 1204 | 2007 #endif |
| 2008 | |
| 2009 /* Call dump_add_opaque_int (&int_var) to dump `int_var', of type `int'. */ | |
| 2010 #ifdef PDUMP | |
| 2011 #define dump_add_opaque_int(int_varaddr) do { \ | |
| 2012 int *dao_ = (int_varaddr); /* type check */ \ | |
| 2013 dump_add_opaque (dao_, sizeof (*dao_)); \ | |
| 2014 } while (0) | |
| 2015 #else | |
| 2016 #define dump_add_opaque_int(int_varaddr) DO_NOTHING | |
| 2017 #endif | |
| 2018 | |
| 2019 /* Call dump_add_opaque_fixnum (&fixnum_var) to dump `fixnum_var', of type | |
| 2020 `Fixnum'. */ | |
| 2021 #ifdef PDUMP | |
| 2022 #define dump_add_opaque_fixnum(fixnum_varaddr) do { \ | |
| 2023 Fixnum *dao_ = (fixnum_varaddr); /* type check */ \ | |
| 2024 dump_add_opaque (dao_, sizeof (*dao_)); \ | |
| 2025 } while (0) | |
| 2026 #else | |
| 2027 #define dump_add_opaque_fixnum(fixnum_varaddr) DO_NOTHING | |
| 2028 #endif | |
| 2029 | |
| 2030 /* Call dump_add_root_lisp_object (&var) to ensure that var is properly | |
| 2031 updated after pdump. */ | |
| 2032 #ifdef PDUMP | |
| 2033 void dump_add_root_lisp_object (Lisp_Object *); | |
| 2034 #else | |
| 2035 #define dump_add_root_lisp_object(varaddr) DO_NOTHING | |
| 2036 #endif | |
| 2037 | |
| 2038 /* Call dump_add_weak_lisp_object (&var) to ensure that var is properly | |
| 2039 updated after pdump. var must point to a linked list of objects out of | |
| 2040 which some may not be dumped */ | |
| 2041 #ifdef PDUMP | |
| 2042 void dump_add_weak_object_chain (Lisp_Object *); | |
| 2043 #else | |
| 2044 #define dump_add_weak_object_chain(varaddr) DO_NOTHING | |
| 2045 #endif | |
| 2046 | |
| 2047 /* Nonzero means Emacs has already been initialized. | |
| 2048 Used during startup to detect startup of dumped Emacs. */ | |
| 1632 | 2049 extern MODULE_API int initialized; |
| 1204 | 2050 |
| 2051 #ifdef PDUMP | |
| 1688 | 2052 #include "dumper.h" |
| 3263 | 2053 #ifdef NEW_GC |
| 2720 | 2054 #define DUMPEDP(adr) 0 |
| 3263 | 2055 #else /* not NEW_GC */ |
| 2367 | 2056 #define DUMPEDP(adr) ((((Rawbyte *) (adr)) < pdump_end) && \ |
| 2057 (((Rawbyte *) (adr)) >= pdump_start)) | |
| 3263 | 2058 #endif /* not NEW_GC */ |
| 1204 | 2059 #else |
| 2060 #define DUMPEDP(adr) 0 | |
| 2061 #endif | |
| 2062 | |
| 1330 | 2063 #define OBJECT_DUMPED_P(obj) DUMPEDP (XPNTR (obj)) |
| 2064 | |
| 1204 | 2065 /***********************************************************************/ |
| 2066 /* data descriptions */ | |
| 2067 /***********************************************************************/ | |
| 2068 | |
| 2069 | |
| 2070 #if defined (USE_KKCC) || defined (PDUMP) | |
| 2071 | |
| 2072 extern int in_pdump; | |
| 2073 | |
| 2074 EMACS_INT lispdesc_indirect_count_1 (EMACS_INT code, | |
| 2075 const struct memory_description *idesc, | |
| 2076 const void *idata); | |
| 2077 const struct sized_memory_description *lispdesc_indirect_description_1 | |
| 2078 (const void *obj, const struct sized_memory_description *sdesc); | |
| 2367 | 2079 Bytecount lispdesc_block_size_1 (const void *obj, Bytecount size, |
| 2080 const struct memory_description *desc); | |
| 2081 | |
| 2082 DECLARE_INLINE_HEADER ( | |
| 2083 Bytecount lispdesc_block_size (const void *obj, | |
| 2084 const struct sized_memory_description *sdesc)) | |
| 2085 { | |
| 2086 return lispdesc_block_size_1 (obj, sdesc->size, sdesc->description); | |
| 2087 } | |
| 1204 | 2088 |
| 2089 DECLARE_INLINE_HEADER ( | |
| 2090 EMACS_INT | |
| 2091 lispdesc_indirect_count (EMACS_INT code, | |
| 2092 const struct memory_description *idesc, | |
| 2093 const void *idata) | |
| 2094 ) | |
| 2095 { | |
| 2096 if (XD_IS_INDIRECT (code)) | |
| 2097 code = lispdesc_indirect_count_1 (code, idesc, idata); | |
| 2098 return code; | |
| 2099 } | |
| 2100 | |
| 2101 DECLARE_INLINE_HEADER ( | |
| 2102 const struct sized_memory_description * | |
| 2103 lispdesc_indirect_description (const void *obj, | |
| 2104 const struct sized_memory_description *sdesc) | |
| 2105 ) | |
| 2106 { | |
| 2107 if (sdesc->description) | |
| 2108 return sdesc; | |
| 2109 else | |
| 2110 return lispdesc_indirect_description_1 (obj, sdesc); | |
| 2111 } | |
| 2112 | |
| 2113 | |
| 2114 /* Do standard XD_UNION processing. DESC1 is an entry in DESC, which | |
| 2115 describes the entire data structure. Returns NULL (do nothing, nothing | |
| 2116 matched), or a new value for DESC1. In the latter case, assign to DESC1 | |
| 2117 in your function and goto union_switcheroo. */ | |
| 2118 | |
| 2119 DECLARE_INLINE_HEADER ( | |
| 2120 const struct memory_description * | |
| 2121 lispdesc_process_xd_union (const struct memory_description *desc1, | |
| 2122 const struct memory_description *desc, | |
| 2123 const void *data) | |
| 2124 ) | |
| 2125 { | |
| 2126 int count = 0; | |
| 2127 EMACS_INT variant = lispdesc_indirect_count (desc1->data1, desc, | |
| 2128 data); | |
| 2129 desc1 = | |
| 2551 | 2130 lispdesc_indirect_description (data, desc1->data2.descr)->description; |
| 1204 | 2131 |
| 2132 for (count = 0; desc1[count].type != XD_END; count++) | |
| 2133 { | |
| 2134 if ((desc1[count].flags & XD_FLAG_UNION_DEFAULT_ENTRY) || | |
| 2135 desc1[count].offset == variant) | |
| 2136 { | |
| 2137 return &desc1[count]; | |
| 2138 } | |
| 2139 } | |
| 2140 | |
| 2141 return NULL; | |
| 2142 } | |
| 2143 | |
| 2144 #endif /* defined (USE_KKCC) || defined (PDUMP) */ | |
| 428 | 2145 |
| 1743 | 2146 END_C_DECLS |
| 1650 | 2147 |
| 440 | 2148 #endif /* INCLUDED_lrecord_h_ */ |
