aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorAndreas Politz2017-02-07 17:56:50 +0100
committerAndreas Politz2017-10-04 22:32:26 +0200
commit8d7bdfa3fca076b34aaf86548d3243bee11872ad (patch)
tree419c7897f336ad206bb9e99824f35819ba9796c1 /src/alloc.c
parentf204e6e1a418073bd1e24a83947f1f3c53581c7f (diff)
downloademacs-8d7bdfa3fca076b34aaf86548d3243bee11872ad.tar.gz
emacs-8d7bdfa3fca076b34aaf86548d3243bee11872ad.zip
Provide a new tree data-structure for overlays.
* src/itree.c (interval_generator_narrow, interval_generator_next) (interval_node_init, interval_node_begin) (interval_node_end, interval_node_set_region) (interval_tree_create, interval_tree_clear) (interval_tree_init, interval_tree_destroy) (interval_tree_size, interval_tree_insert) (interval_tree_contains, interval_tree_remove) (interval_tree_validate, interval_tree_iter_start) (interval_tree_iter_finish, interval_tree_iter_next) (interval_tree_iter_ensure_space, interval_tree_max_height) (interval_tree_insert_gap, interval_tree_delete_gap) (interval_generator_create, interval_generator_reset) (interval_generator_ensure_space, interval_node_intersects) (interval_generator_next, interval_generator_narrow) (interval_generator_destroy, interval_stack_create) (interval_stack_destroy, interval_stack_clear) (interval_stack_ensure_space, interval_stack_push) (interval_stack_push_flagged, interval_stack_pop) (interval_tree_update_limit, interval_tree_inherit_offset) (interval_tree_propagate_limit, interval_tree_rotate_left) (interval_tree_rotate_right, interval_tree_insert_fix) (interval_tree_remove_fix, interval_tree_transplant) (interval_tree_subtree_min): New file and new functions. * src/itree.h: New file. * configure.ac: Create Makefile for manual overlay tests. * src/Makefile.in: Add itree.o target. * src/alloc.c (build_overlay, mark_overlay, mark_buffer) (sweep_misc, sweep_buffers): Adapt to new tree data-structure. * src/buffer.c (overlays_in, overlays_at): Remove unused arguments prev_ptr and change_req, adapt to new data-structure and reuse code. (copy_overlays, drop_overlays, delete_all_overlays) (reset_buffer, kill-buffer, buffer-swap-text, next_overlay_change) (previous_overlay_change, mouse_face_overlay_overlaps) (disable_line_numbers_overlay_at_eob, overlay_touches_p) (overlay_strings, adjust_overlays_for_insert) (adjust_overlays_for_delete, overlayp, make-overlay, move-overlay) (delete-overlay, overlay-start, overlay-end, overlay-buffer) (overlay-properties, overlays-at, overlays-in) (next-overlay-change, previous-overlay-change, overlay-put) (overlay-get, report_overlay_modification, evaporate_overlays) (init_buffer_once): Adapt to changes and tree data-structure. (overlay-lists, overlay-recenter): Funtions are now obsolete, but kept anyway. (set_buffer_overlays_before, set_buffer_overlays_after) (recenter_overlay_lists,fix_start_end_in_overlays,fix_overlays_before) (unchain_overlay,): Removed functions of the old list data-structure. (swap_buffer_overlays, make_sortvec_item): New functions. (sort_overlays): Adapt to changes and tree data-structure. (sortvec): Moved to buffer.h . (make_lispy_interval_node, overlay_tree, overlay-tree) [ITREE_DEBUG]: New debugging functions. * src/buffer.h (overlays_before, overlays_after): Removed struct member of the list data-structure. (overlays): Added tree struct member. (sortvec): Moved here from buffer.c . (GET_OVERLAYS_AT): Adapt to changes. (set_buffer_intervals, OVERLAY_START, OVERLAY_END, OVERLAY_PLIST): Adapt to tree data-structure. (OVERLAY_POSITION): Removed macro of the list data-structure. (OVERLAY_REAR_ADVANCE_P, OVERLAY_FRONT_ADVANCE_P): New macros. (overlay_start, overlay_end) (set_overlay_region, maybe_alloc_buffer_overlays) (free_buffer_overlays, add_buffer_overlay) (remove_buffer_overlay, buffer_overlay_iter_start) (buffer_overlay_iter_next, buffer_overlay_iter_finish) (buffer_overlay_iter_narrow): New functions. (compare_overlays, make_sortvec_item): Export functions. * src/editfns.c (overlays_around): Reuse overlays_in. (get-pos-property): Adapt to tree data-structure. (transpose-regions): Remove call to deleted function. * src/fileio.c: (insert-file-contents): Remove references to deleted struct member. * src/fns.c (internal_equal): Adapt to tree data-structure. * src/indent.c (check_display_width): Adapt to tree data-structure. (skip_invisible): Remove call to deleted function. * src/insdel.c (adjust_markers_for_insert): Remove calls to deleted functions. * src/intervals.c (adjust_for_invis_intang): Adapt to tree data-structure. * src/keyboard.c (adjust_point_for_property): Adapt to tree data-structure. * src/lisp.h (Lisp_Overlay): Modified struct layout. * src/print.c (temp_output_buffer_setup, print_object): Adapt to tree data-structure. * src/textprop.c (get_char_property_and_overlay): Adapt to tree data-structure. Take advantage of the new data-structure. * src/window.h (overlay_matches_window): New function. * src/xdisp.h (next_overlay_change): Removed function. Use next-overlay-change, which does not use xmalloc anymore. (handle_single_display_spec, load_overlay_strings) (back_to_previous_visible_line_start, note_mouse_highlight): Adapt to tree data-structure. (move_it_to, display_line): Remove calls to deleted functions. * src/xfaces.c (face_at_buffer_position): Adapt to changes and tree data-structure. * test/src/buffer-tests.el: Many tests regarding overlays added. * test/manual/noverlay/itree-tests.c: New file with tests of the tree data-structure on the C level. * test/manual/noverlay/Makefile.in: New file. * test/manual/noverlay/check-sanitize.sh: New file. * test/manual/noverlay/emacs-compat.h: New file. * test/manual/noverlay/.gitignore: New file. * test/manual/noverlay/overlay-perf.el: New file providing performance tests. * test/manual/noverlay/many-errors.h: New file.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 2e6399e7f8d..15a6fc43b72 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -43,6 +43,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
43#include "frame.h" 43#include "frame.h"
44#include "blockinput.h" 44#include "blockinput.h"
45#include "termhooks.h" /* For struct terminal. */ 45#include "termhooks.h" /* For struct terminal. */
46#include "itree.h"
46#ifdef HAVE_WINDOW_SYSTEM 47#ifdef HAVE_WINDOW_SYSTEM
47#include TERM_HEADER 48#include TERM_HEADER
48#endif /* HAVE_WINDOW_SYSTEM */ 49#endif /* HAVE_WINDOW_SYSTEM */
@@ -3835,16 +3836,19 @@ free_save_value (Lisp_Object save)
3835/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */ 3836/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
3836 3837
3837Lisp_Object 3838Lisp_Object
3838build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist) 3839build_overlay (ptrdiff_t begin, ptrdiff_t end,
3840 bool front_advance, bool rear_advance,
3841 Lisp_Object plist)
3839{ 3842{
3840 register Lisp_Object overlay; 3843 Lisp_Object ov = allocate_misc (Lisp_Misc_Overlay);
3844 struct interval_node *node = xmalloc (sizeof (*node));
3841 3845
3842 overlay = allocate_misc (Lisp_Misc_Overlay); 3846 interval_node_init (node, begin, end, front_advance,
3843 OVERLAY_START (overlay) = start; 3847 rear_advance, ov);
3844 OVERLAY_END (overlay) = end; 3848 XOVERLAY (ov)->interval = node;
3845 set_overlay_plist (overlay, plist); 3849 XOVERLAY (ov)->buffer = NULL;
3846 XOVERLAY (overlay)->next = NULL; 3850 set_overlay_plist (ov, plist);
3847 return overlay; 3851 return ov;
3848} 3852}
3849 3853
3850DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, 3854DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
@@ -6280,16 +6284,10 @@ mark_compiled (struct Lisp_Vector *ptr)
6280/* Mark the chain of overlays starting at PTR. */ 6284/* Mark the chain of overlays starting at PTR. */
6281 6285
6282static void 6286static void
6283mark_overlay (struct Lisp_Overlay *ptr) 6287mark_overlay (struct Lisp_Overlay *ov)
6284{ 6288{
6285 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next) 6289 ov->gcmarkbit = 1;
6286 { 6290 mark_object (ov->plist);
6287 ptr->gcmarkbit = 1;
6288 /* These two are always markers and can be marked fast. */
6289 XMARKER (ptr->start)->gcmarkbit = 1;
6290 XMARKER (ptr->end)->gcmarkbit = 1;
6291 mark_object (ptr->plist);
6292 }
6293} 6291}
6294 6292
6295/* Mark Lisp_Objects and special pointers in BUFFER. */ 6293/* Mark Lisp_Objects and special pointers in BUFFER. */
@@ -6308,8 +6306,15 @@ mark_buffer (struct buffer *buffer)
6308 a special way just before the sweep phase, and after stripping 6306 a special way just before the sweep phase, and after stripping
6309 some of its elements that are not needed any more. */ 6307 some of its elements that are not needed any more. */
6310 6308
6311 mark_overlay (buffer->overlays_before); 6309 if (buffer->overlays)
6312 mark_overlay (buffer->overlays_after); 6310 {
6311 struct interval_node *node;
6312 buffer_overlay_iter_start (buffer, PTRDIFF_MIN, PTRDIFF_MAX, ITREE_ASCENDING);
6313
6314 while ((node = buffer_overlay_iter_next (buffer)))
6315 mark_overlay (XOVERLAY (node->data));
6316 buffer_overlay_iter_finish (buffer);
6317 }
6313 6318
6314 /* If this is an indirect buffer, mark its base buffer. */ 6319 /* If this is an indirect buffer, mark its base buffer. */
6315 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) 6320 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
@@ -7090,6 +7095,11 @@ sweep_misc (void)
7090 unchain_marker (&mblk->markers[i].m.u_marker); 7095 unchain_marker (&mblk->markers[i].m.u_marker);
7091 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) 7096 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer)
7092 unchain_finalizer (&mblk->markers[i].m.u_finalizer); 7097 unchain_finalizer (&mblk->markers[i].m.u_finalizer);
7098 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Overlay)
7099 {
7100 xfree (mblk->markers[i].m.u_overlay.interval);
7101 mblk->markers[i].m.u_overlay.interval = NULL;
7102 }
7093#ifdef HAVE_MODULES 7103#ifdef HAVE_MODULES
7094 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr) 7104 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr)
7095 { 7105 {
@@ -7145,6 +7155,7 @@ sweep_buffers (void)
7145 if (!VECTOR_MARKED_P (buffer)) 7155 if (!VECTOR_MARKED_P (buffer))
7146 { 7156 {
7147 *bprev = buffer->next; 7157 *bprev = buffer->next;
7158 free_buffer_overlays (buffer);
7148 lisp_free (buffer); 7159 lisp_free (buffer);
7149 } 7160 }
7150 else 7161 else