Mercurial > hg > xemacs-beta
annotate src/lrecord.h @ 5146:88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-15 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (c_readonly):
* alloc.c (deadbeef_memory):
* alloc.c (make_compiled_function):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (noseeum_make_marker):
* alloc.c (ADDITIONAL_FREE_string):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* casetab.c:
* casetab.c (print_case_table):
* console.c:
* console.c (print_console):
* database.c (print_database):
* database.c (finalize_database):
* device-msw.c (sync_printer_with_devmode):
* device-msw.c (print_devmode):
* device-msw.c (finalize_devmode):
* device.c:
* device.c (print_device):
* elhash.c:
* elhash.c (print_hash_table):
* eval.c (print_multiple_value):
* eval.c (mark_multiple_value):
* events.c (deinitialize_event):
* events.c (print_event):
* events.c (event_equal):
* extents.c:
* extents.c (soe_dump):
* extents.c (soe_insert):
* extents.c (soe_delete):
* extents.c (soe_move):
* extents.c (extent_fragment_update):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* frame.c:
* frame.c (print_frame):
* free-hook.c:
* free-hook.c (check_free):
* glyphs.c:
* glyphs.c (print_image_instance):
* glyphs.c (print_glyph):
* gui.c:
* gui.c (copy_gui_item):
* hash.c:
* hash.c (NULL_ENTRY):
* hash.c (KEYS_DIFFER_P):
* keymap.c (print_keymap):
* keymap.c (MARKED_SLOT):
* lisp.h:
* lrecord.h:
* lrecord.h (LISP_OBJECT_UID):
* lrecord.h (set_lheader_implementation):
* lrecord.h (struct old_lcrecord_header):
* lstream.c (print_lstream):
* lstream.c (finalize_lstream):
* marker.c (print_marker):
* marker.c (marker_equal):
* mc-alloc.c (visit_all_used_page_headers):
* mule-charset.c:
* mule-charset.c (print_charset):
* objects.c (print_color_instance):
* objects.c (print_font_instance):
* objects.c (finalize_font_instance):
* opaque.c (print_opaque):
* opaque.c (print_opaque_ptr):
* opaque.c (equal_opaque_ptr):
* print.c (internal_object_printer):
* print.c (enum printing_badness):
* rangetab.c (print_range_table):
* rangetab.c (range_table_equal):
* specifier.c (print_specifier):
* specifier.c (finalize_specifier):
* symbols.c:
* symbols.c (print_symbol_value_magic):
* tooltalk.c:
* tooltalk.c (print_tooltalk_message):
* tooltalk.c (print_tooltalk_pattern):
* window.c (print_window):
* window.c (debug_print_window):
(1) Make lrecord UID's have a separate UID space for each object.
Otherwise, with 20-bit UID's, we rapidly wrap around, especially
when common objects like conses and strings increment the UID value
for every object created. (Originally I tried making two UID spaces,
one for objects that always print readably and hence don't display
the UID, and one for other objects. But certain objects like markers
for which a UID is displayed are still generated rapidly enough that
UID overflow is a serious issue.) This also has the advantage of
making UID values smaller, hence easier to remember -- their main
purpose is to make it easier to keep track of different objects of
the same type when debugging code. Make sure we dump lrecord UID's
so that we don't have problems with pdumped and non-dumped objects
having the same UID.
(2) Display UID's consistently whenever an object (a) doesn't
consistently print readably (objects like cons and string, which
always print readably, can't display a UID), and (b) doesn't
otherwise have a unique property that makes objects of a
particular type distinguishable. (E.g. buffers didn't and still
don't print an ID, but the buffer name uniquely identifies the
buffer.) Some types, such as event, extent, compiled-function,
didn't always (or didn't ever) display an ID; others (such as
marker, extent, lstream, opaque, opaque-ptr, any object using
internal_object_printer()) used to display the actual machine
pointer instead.
(3) Rename NORMAL_LISP_OBJECT_UID to LISP_OBJECT_UID; make it work
over all Lisp objects and take a Lisp object, not a struct pointer.
(4) Some misc cleanups in alloc.c, elhash.c.
(5) Change code in events.c that "deinitializes" an event so that
it doesn't increment the event UID counter in the process. Also
use deadbeef_memory() to overwrite memory instead of doing the same
with custom code. In the process, make deadbeef_memory() in
alloc.c always available, and delete extraneous copy in mc-alloc.c.
Also capitalize all uses of 0xDEADBEEF. Similarly in elhash.c
call deadbeef_memory().
(6) Resurrect "debug SOE" code in extents.c. Make it conditional
on DEBUG_XEMACS and on a `debug-soe' variable, rather than on
SOE_DEBUG. Make it output to stderr, not stdout.
(7) Delete some custom print methods that were identical to
external_object_printer().
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 15 Mar 2010 16:35:38 -0500 |
parents | f965e31a35f0 |
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_ */ |