diff options
| author | Andreas Politz | 2017-02-07 17:56:50 +0100 |
|---|---|---|
| committer | Andreas Politz | 2017-10-04 22:32:26 +0200 |
| commit | 8d7bdfa3fca076b34aaf86548d3243bee11872ad (patch) | |
| tree | 419c7897f336ad206bb9e99824f35819ba9796c1 /src/alloc.c | |
| parent | f204e6e1a418073bd1e24a83947f1f3c53581c7f (diff) | |
| download | emacs-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.c | 49 |
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 | ||
| 3837 | Lisp_Object | 3838 | Lisp_Object |
| 3838 | build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist) | 3839 | build_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 | ||
| 3850 | DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | 3854 | DEFUN ("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 | ||
| 6282 | static void | 6286 | static void |
| 6283 | mark_overlay (struct Lisp_Overlay *ptr) | 6287 | mark_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 |