Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
7b7ae965
Commit
7b7ae965
authored
Jul 06, 2012
by
Dmitry Antipov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* buffer.c (unchain_overlay): Simplify. Add comment.
* marker.c (unchain_marker): Simplify. Fix comments.
parent
a358bac2
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
46 additions
and
54 deletions
+46
-54
src/ChangeLog
src/ChangeLog
+5
-0
src/buffer.c
src/buffer.c
+7
-8
src/marker.c
src/marker.c
+34
-46
No files found.
src/ChangeLog
View file @
7b7ae965
2012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
* buffer.c (unchain_overlay): Simplify. Add comment.
* marker.c (unchain_marker): Simplify. Fix comments.
2012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
Introduce fast path for the widely used marker operation.
...
...
src/buffer.c
View file @
7b7ae965
...
...
@@ -3672,18 +3672,17 @@ modify_overlay (struct buffer *buf, ptrdiff_t start, ptrdiff_t end)
++
BUF_OVERLAY_MODIFF
(
buf
);
}
/* Remove OVERLAY from LIST. */
static
struct
Lisp_Overlay
*
unchain_overlay
(
struct
Lisp_Overlay
*
list
,
struct
Lisp_Overlay
*
overlay
)
{
struct
Lisp_Overlay
*
tmp
,
*
prev
;
for
(
tmp
=
list
,
prev
=
NULL
;
tmp
;
prev
=
tmp
,
tmp
=
tmp
->
next
)
if
(
tmp
==
overlay
)
register
struct
Lisp_Overlay
*
tail
,
**
prev
=
&
list
;
for
(
tail
=
list
;
tail
;
prev
=
&
tail
->
next
,
tail
=
*
prev
)
if
(
tail
==
overlay
)
{
if
(
prev
)
prev
->
next
=
tmp
->
next
;
else
list
=
tmp
->
next
;
*
prev
=
overlay
->
next
;
overlay
->
next
=
NULL
;
break
;
}
...
...
src/marker.c
View file @
7b7ae965
...
...
@@ -672,59 +672,47 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t ch
return
marker
;
}
/* Remove MARKER from the chain of whatever buffer it is in.
Leave it "in no buffer".
This is called during garbage collection,
so we must be careful to ignore and preserve mark bits,
including those in chain fields of markers. */
/* Remove MARKER from the chain of whatever buffer it is in,
leaving it points to nowhere. This is called during garbage
collection, so we must be careful to ignore and preserve
mark bits, including those in chain fields of markers. */
void
unchain_marker
(
register
struct
Lisp_Marker
*
marker
)
{
register
struct
Lisp_Marker
*
tail
,
*
prev
,
*
next
;
register
struct
buffer
*
b
;
b
=
marker
->
buffer
;
if
(
b
==
0
)
return
;
if
(
EQ
(
BVAR
(
b
,
name
),
Qnil
))
abort
();
register
struct
buffer
*
b
=
marker
->
buffer
;
marker
->
buffer
=
0
;
tail
=
BUF_MARKERS
(
b
);
prev
=
NULL
;
while
(
tail
)
if
(
b
)
{
next
=
tail
->
next
;
if
(
marker
==
tail
)
{
if
(
!
prev
)
{
BUF_MARKERS
(
b
)
=
next
;
/* Deleting first marker from the buffer's chain. Crash
if new first marker in chain does not say it belongs
to the same buffer, or at least that they have the same
base buffer. */
if
(
next
&&
b
->
text
!=
next
->
buffer
->
text
)
abort
();
}
else
prev
->
next
=
next
;
/* We have removed the marker from the chain;
no need to scan the rest of the chain. */
return
;
}
else
prev
=
tail
;
tail
=
next
;
register
struct
Lisp_Marker
*
tail
,
**
prev
;
/* No dead buffers here. */
eassert
(
!
NILP
(
BVAR
(
b
,
name
)));
marker
->
buffer
=
NULL
;
prev
=
&
BUF_MARKERS
(
b
);
for
(
tail
=
BUF_MARKERS
(
b
);
tail
;
prev
=
&
tail
->
next
,
tail
=
*
prev
)
if
(
marker
==
tail
)
{
if
(
*
prev
==
BUF_MARKERS
(
b
))
{
/* Deleting first marker from the buffer's chain. Crash
if new first marker in chain does not say it belongs
to the same buffer, or at least that they have the same
base buffer. */
if
(
tail
->
next
&&
b
->
text
!=
tail
->
next
->
buffer
->
text
)
abort
();
}
*
prev
=
tail
->
next
;
/* We have removed the marker from the chain;
no need to scan the rest of the chain. */
break
;
}
/* Error if marker was not in it's chain. */
eassert
(
tail
!=
NULL
);
}
/* Marker was not in its chain. */
abort
();
}
/* Return the char position of marker MARKER, as a C integer. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment