Mercurial > hg > xemacs-beta
annotate src/extents.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 | a9c41067dd88 |
children | 1fae11d56ad2 |
rev | line source |
---|---|
428 | 1 /* Copyright (c) 1994, 1995 Free Software Foundation. |
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
2 Copyright (c) 1995, 1996, 2002, 2010 Ben Wing. |
428 | 3 |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
440 | 23 #ifndef INCLUDED_extents_h_ |
24 #define INCLUDED_extents_h_ | |
428 | 25 |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
26 DECLARE_LISP_OBJECT (extent, struct extent); |
428 | 27 #define XEXTENT(x) XRECORD (x, extent, struct extent) |
617 | 28 #define wrap_extent(p) wrap_record (p, extent) |
428 | 29 #define EXTENTP(x) RECORDP (x, extent) |
30 #define CHECK_EXTENT(x) CHECK_RECORD (x, extent) | |
31 #define CONCHECK_EXTENT(x) CONCHECK_RECORD (x, extent) | |
32 | |
872 | 33 struct extent_auxiliary; |
428 | 34 |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
35 DECLARE_LISP_OBJECT (extent_auxiliary, struct extent_auxiliary); |
428 | 36 #define XEXTENT_AUXILIARY(x) \ |
37 XRECORD (x, extent_auxiliary, struct extent_auxiliary) | |
617 | 38 #define wrap_extent_auxiliary(p) wrap_record (p, extent_auxiliary) |
428 | 39 #define EXTENT_AUXILIARYP(x) RECORDP (x, extent_auxiliary) |
40 #define CHECK_EXTENT_AUXILIARY(x) CHECK_RECORD (x, extent_auxiliary) | |
41 #define CONCHECK_EXTENT_AUXILIARY(x) CONCHECK_RECORD (x, extent_auxiliary) | |
42 | |
872 | 43 struct extent_info; |
428 | 44 |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
45 DECLARE_LISP_OBJECT (extent_info, struct extent_info); |
428 | 46 #define XEXTENT_INFO(x) XRECORD (x, extent_info, struct extent_info) |
617 | 47 #define wrap_extent_info(p) wrap_record (p, extent_info) |
428 | 48 #define EXTENT_INFOP(x) RECORDP (x, extent_info) |
49 #define CHECK_EXTENT_INFO(x) CHECK_RECORD (x, extent_info) | |
50 #define CONCHECK_EXTENT_INFO(x) CONCHECK_RECORD (x, extent_info) | |
51 | |
3092 | 52 #ifdef NEW_GC |
53 struct gap_array_marker; | |
54 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
55 DECLARE_LISP_OBJECT (gap_array_marker, struct gap_array_marker); |
3092 | 56 #define XGAP_ARRAY_MARKER(x) \ |
57 XRECORD (x, gap_array_marker, struct gap_array_marker) | |
58 #define wrap_gap_array_marker(p) wrap_record (p, gap_array_marker) | |
59 #define GAP_ARRAY_MARKERP(x) RECORDP (x, gap_array_marker) | |
60 #define CHECK_GAP_ARRAY_MARKER(x) CHECK_RECORD (x, gap_array_marker) | |
61 #define CONCHECK_GAP_ARRAY_MARKER(x) CONCHECK_RECORD (x, gap_array_marker) | |
62 | |
63 struct gap_array; | |
64 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
65 DECLARE_LISP_OBJECT (gap_array, struct gap_array); |
3092 | 66 #define XGAP_ARRAY(x) XRECORD (x, gap_array, struct gap_array) |
67 #define wrap_gap_array(p) wrap_record (p, gap_array) | |
68 #define GAP_ARRAYP(x) RECORDP (x, gap_array) | |
69 #define CHECK_GAP_ARRAY(x) CHECK_RECORD (x, gap_array) | |
70 #define CONCHECK_GAP_ARRAY(x) CONCHECK_RECORD (x, gap_array) | |
71 | |
72 struct extent_list_marker; | |
73 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
74 DECLARE_LISP_OBJECT (extent_list_marker, struct extent_list_marker); |
3092 | 75 #define XEXTENT_LIST_MARKER(x) \ |
76 XRECORD (x, extent_list_marker, struct extent_list_marker) | |
77 #define wrap_extent_list_marker(p) wrap_record (p, extent_list_marker) | |
78 #define EXTENT_LIST_MARKERP(x) RECORDP (x, extent_list_marker) | |
79 #define CHECK_EXTENT_LIST_MARKER(x) CHECK_RECORD (x, extent_list_marker) | |
80 #define CONCHECK_EXTENT_LIST_MARKER(x) CONCHECK_RECORD (x, extent_list_marker) | |
81 | |
82 struct extent_list; | |
83 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
84 DECLARE_LISP_OBJECT (extent_list, struct extent_list); |
3092 | 85 #define XEXTENT_LIST(x) XRECORD (x, extent_list, struct extent_list) |
86 #define wrap_extent_list(p) wrap_record (p, extent_list) | |
87 #define EXTENT_LISTP(x) RECORDP (x, extent_list) | |
88 #define CHECK_EXTENT_LIST(x) CHECK_RECORD (x, extent_list) | |
89 #define CONCHECK_EXTENT_LIST(x) CONCHECK_RECORD (x, extent_list) | |
90 | |
91 struct stack_of_extents; | |
92 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4690
diff
changeset
|
93 DECLARE_LISP_OBJECT (stack_of_extents, struct stack_of_extents); |
3092 | 94 #define XSTACK_OF_EXTENTS(x) \ |
95 XRECORD (x, stack_of_extents, struct stack_of_extents) | |
96 #define wrap_stack_of_extents(p) wrap_record (p, stack_of_extents) | |
97 #define STACK_OF_EXTENTSP(x) RECORDP (x, stack_of_extents) | |
98 #define CHECK_STACK_OF_EXTENTS(x) CHECK_RECORD (x, stack_of_extents) | |
99 #define CONCHECK_STACK_OF_EXTENTS(x) CONCHECK_RECORD (x, stack_of_extents) | |
100 #endif /* NEW_GC */ | |
101 | |
872 | 102 /* the layouts for glyphs (extent->flags.glyph_layout). Must fit in 2 bits. */ |
103 typedef enum glyph_layout | |
826 | 104 { |
872 | 105 GL_TEXT, |
106 GL_OUTSIDE_MARGIN, | |
107 GL_INSIDE_MARGIN, | |
108 GL_WHITESPACE | |
109 } glyph_layout; | |
428 | 110 |
872 | 111 struct extent; |
428 | 112 |
872 | 113 void set_extent_endpoints (EXTENT extent, Bytexpos s, Bytexpos e, |
114 Lisp_Object object); | |
428 | 115 |
872 | 116 |
117 void flush_cached_extent_info (Lisp_Object extent_info); | |
647 | 118 |
826 | 119 void set_extent_glyph (EXTENT extent, Lisp_Object glyph, int endp, |
120 glyph_layout layout); | |
121 | |
428 | 122 |
123 /* flags for map_extents() and friends */ | |
124 #define ME_END_CLOSED (1 << 0) | |
125 #define ME_START_OPEN (1 << 1) | |
126 #define ME_ALL_EXTENTS_CLOSED (1 << 2) | |
127 #define ME_ALL_EXTENTS_OPEN (2 << 2) | |
128 #define ME_ALL_EXTENTS_CLOSED_OPEN (3 << 2) | |
129 #define ME_ALL_EXTENTS_OPEN_CLOSED (4 << 2) | |
130 #define ME_ALL_EXTENTS_MASK (7 << 2) | |
131 #define ME_START_IN_REGION (1 << 5) | |
132 #define ME_END_IN_REGION (2 << 5) | |
133 #define ME_START_AND_END_IN_REGION (3 << 5) | |
134 #define ME_START_OR_END_IN_REGION (4 << 5) | |
135 #define ME_IN_REGION_MASK (7 << 5) | |
136 #define ME_NEGATE_IN_REGION (1 << 8) | |
137 /* the following flags are internal-only */ | |
138 #define ME_INCLUDE_INTERNAL (1 << 9) | |
139 #define ME_MIGHT_THROW (1 << 10) | |
140 #define ME_MIGHT_MODIFY_TEXT (1 << 11) | |
141 #define ME_MIGHT_MODIFY_EXTENTS (1 << 12) | |
142 #define ME_MIGHT_MOVE_SOE (1 << 13) | |
143 #define ME_MIGHT_CALL_ELISP (ME_MIGHT_THROW | ME_MIGHT_MODIFY_TEXT | \ | |
144 ME_MIGHT_MODIFY_EXTENTS | ME_MIGHT_MOVE_SOE) | |
145 | |
146 | |
147 extern int inside_undo; | |
442 | 148 extern int in_modeline_generation; |
428 | 149 |
4690
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
150 extern Fixnum mouse_highlight_priority; |
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
151 |
872 | 152 EXFUN (Fextent_at, 5); |
153 EXFUN (Fextent_property, 3); | |
154 EXFUN (Fput_text_property, 5); | |
155 | |
156 EXFUN (Fdetach_extent, 1); | |
157 EXFUN (Fextent_end_position, 1); | |
158 EXFUN (Fextent_object, 1); | |
159 EXFUN (Fextent_properties, 1); | |
160 EXFUN (Fextent_start_position, 1); | |
161 EXFUN (Fget_char_property, 4); | |
162 EXFUN (Fmake_extent, 3); | |
163 EXFUN (Fnext_extent_change, 2); | |
164 EXFUN (Fprevious_extent_change, 2); | |
2506 | 165 EXFUN (Fprevious_single_char_property_change, 4); |
872 | 166 EXFUN (Fset_extent_endpoints, 4); |
167 EXFUN (Fset_extent_parent, 2); | |
168 EXFUN (Fset_extent_property, 3); | |
4690
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
169 EXFUN (Fset_extent_priority, 2); |
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
170 EXFUN (Fset_extent_face, 2); |
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
171 EXFUN (Fmap_extents, 8); |
872 | 172 |
173 enum extent_at_flag | |
174 { | |
175 EXTENT_AT_DEFAULT = 0, | |
176 EXTENT_AT_AFTER = 0, | |
177 EXTENT_AT_BEFORE, | |
178 EXTENT_AT_AT | |
179 }; | |
180 | |
181 Bytexpos extent_endpoint_byte (EXTENT extent, int endp); | |
182 Charxpos extent_endpoint_char (EXTENT extent, int endp); | |
2506 | 183 Bytexpos next_previous_single_property_change (Bytexpos pos, Lisp_Object prop, |
184 Lisp_Object object, | |
185 Bytexpos limit, | |
186 Boolint next, | |
187 Boolint text_props_only); | |
872 | 188 Lisp_Object get_char_property (Bytexpos position, Lisp_Object prop, |
189 Lisp_Object object, enum extent_at_flag fl, | |
190 int text_props_only); | |
191 void adjust_extents (Lisp_Object object, Memxpos from, | |
192 Memxpos to, int amount); | |
193 void adjust_extents_for_deletion (Lisp_Object object, Bytexpos from, | |
194 Bytexpos to, int gapsize, | |
195 int numdel, int movegapsize); | |
196 void verify_extent_modification (Lisp_Object object, Bytexpos from, | |
197 Bytexpos to, | |
198 Lisp_Object inhibit_read_only_value); | |
199 void process_extents_for_insertion (Lisp_Object object, | |
200 Bytexpos opoint, Bytecount length); | |
201 void process_extents_for_deletion (Lisp_Object object, Bytexpos from, | |
202 Bytexpos to, int destroy_them); | |
203 /* Note the following function is in Charbpos's */ | |
204 void report_extent_modification (Lisp_Object buffer, Charbpos start, | |
205 Charbpos end, int afterp); | |
206 void add_string_extents (Lisp_Object string, struct buffer *buf, | |
207 Bytexpos opoint, Bytecount length); | |
208 void splice_in_string_extents (Lisp_Object string, struct buffer *buf, | |
209 Bytexpos opoint, Bytecount length, | |
210 Bytecount pos); | |
211 void copy_string_extents (Lisp_Object new_string, | |
212 Lisp_Object old_string, | |
213 Bytecount new_pos, Bytecount old_pos, | |
214 Bytecount length); | |
215 void detach_all_extents (Lisp_Object object); | |
216 Lisp_Object extent_at (Bytexpos position, Lisp_Object object, | |
217 Lisp_Object property, EXTENT before, | |
218 enum extent_at_flag at_flag, int all_extents); | |
219 | |
220 | |
428 | 221 struct extent_fragment *extent_fragment_new (Lisp_Object buffer_or_string, |
222 struct frame *frm); | |
223 face_index extent_fragment_update (struct window *w, | |
224 struct extent_fragment *ef, | |
826 | 225 Bytexpos pos, Lisp_Object last_glyph); |
428 | 226 void extent_fragment_delete (struct extent_fragment *ef); |
227 | |
228 /* from alloc.c */ | |
229 struct extent *allocate_extent (void); | |
230 | |
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
231 void attach_extent_auxiliary (EXTENT ext); |
428 | 232 void init_buffer_extents (struct buffer *b); |
233 void uninit_buffer_extents (struct buffer *b); | |
234 | |
235 #ifdef ERROR_CHECK_EXTENTS | |
236 void sledgehammer_extent_check (Lisp_Object obj); | |
237 #endif | |
238 | |
239 #ifdef MEMORY_USAGE_STATS | |
240 int compute_buffer_extent_usage (struct buffer *b, | |
241 struct overhead_stats *ovstats); | |
242 #endif | |
243 | |
440 | 244 #endif /* INCLUDED_extents_h_ */ |