* [RFC] using "optimizaiton 1"
@ 2012-12-14 14:10 Dmitry Antipov
2012-12-14 14:15 ` Eli Zaretskii
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Antipov @ 2012-12-14 14:10 UTC (permalink / raw)
To: Emacs development discussions; +Cc: Eli Zaretskii
[-- Attachment #1: Type: text/plain, Size: 128 bytes --]
Surprisingly, "optimizaiton 1" from redisplay_internal can
handle the case if the region is highlighted, too. Comments?
Dmitry
[-- Attachment #2: redisplay.patch --]
[-- Type: text/plain, Size: 3871 bytes --]
=== modified file 'src/xdisp.c'
--- src/xdisp.c 2012-12-13 16:55:28 +0000
+++ src/xdisp.c 2012-12-14 13:43:30 +0000
@@ -2559,8 +2559,8 @@
#endif /* GLYPH_DEBUG and ENABLE_CHECKING */
-/* Return mark position if current buffer has the region of non-zero length,
- or -1 otherwise. */
+/* Return mark position if current buffer has the region of non-zero
+ length, zero if mark and point are the same, or -1 otherwise. */
static ptrdiff_t
markpos_of_region (void)
@@ -2571,8 +2571,7 @@
{
ptrdiff_t markpos = XMARKER (BVAR (current_buffer, mark))->charpos;
- if (markpos != PT)
- return markpos;
+ return markpos == PT ? 0 : markpos;
}
return -1;
}
@@ -2712,7 +2711,7 @@
and IT->region_end_charpos to the start and end of a visible region
in window IT->w. Set both to -1 to indicate no region. */
markpos = markpos_of_region ();
- if (0 <= markpos
+ if (0 < markpos
/* Maybe highlight only in selected window. */
&& (/* Either show region everywhere. */
highlight_nonselected_windows
@@ -13244,18 +13243,6 @@
clear_garbaged_frames ();
}
-
- /* If showing the region, and mark has changed, we must redisplay
- the whole window. The assignment to this_line_start_pos prevents
- the optimization directly below this if-statement. */
- if (((!NILP (Vtransient_mark_mode)
- && !NILP (BVAR (XBUFFER (w->buffer), mark_active)))
- != !NILP (w->region_showing))
- || (!NILP (w->region_showing)
- && !EQ (w->region_showing,
- Fmarker_position (BVAR (XBUFFER (w->buffer), mark)))))
- CHARPOS (this_line_start_pos) = 0;
-
/* Optimize the case that only the line containing the cursor in the
selected window has changed. Variables starting with this_ are
set in display_line and record information about the line
@@ -13288,7 +13275,8 @@
|| FETCH_BYTE (BYTEPOS (tlbufpos)) == '\n'))
/* Former continuation line has disappeared by becoming empty. */
goto cancel;
- else if (window_outdated (w) || MINI_WINDOW_P (w))
+ else if (window_outdated (w) || MINI_WINDOW_P (w)
+ || 0 <= markpos_of_region ())
{
/* We have to handle the case of continuation around a
wide-column character (see the comment in indent.c around
@@ -13410,6 +13398,10 @@
if (w->cursor_off_p == w->last_cursor_off_p)
goto end_of_redisplay;
}
+#ifdef GLYPH_DEBUG
+ *w->desired_matrix->method = 0;
+ debug_method_add (w, "optimization 2");
+#endif
goto update;
}
/* If highlighting the region, or if the cursor is in the echo area,
@@ -15083,7 +15075,7 @@
/* Can't use this case if highlighting a region. When a
region exists, cursor movement has to do more than just
set the cursor. */
- && markpos_of_region () < 0
+ && markpos_of_region () <= 0
&& NILP (w->region_showing)
&& NILP (Vshow_trailing_whitespace)
/* This code is not used for mini-buffer for the sake of the case
@@ -15752,7 +15744,7 @@
/* If we are highlighting the region, then we just changed
the region, so redisplay to show it. */
- if (0 <= markpos_of_region ())
+ if (0 < markpos_of_region ())
{
clear_glyph_matrix (w->desired_matrix);
if (!try_window (window, startp, 0))
@@ -16457,7 +16449,7 @@
return 0;
/* Can't do this if region may have changed. */
- if (0 <= markpos_of_region ()
+ if (0 < markpos_of_region ()
|| !NILP (w->region_showing)
|| !NILP (Vshow_trailing_whitespace))
return 0;
@@ -17289,7 +17281,7 @@
/* Can't use this if highlighting a region because a cursor movement
will do more than just set the cursor. */
- if (0 <= markpos_of_region ())
+ if (0 < markpos_of_region ())
GIVE_UP (9);
/* Likewise if highlighting trailing whitespace. */
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC] using "optimizaiton 1"
2012-12-14 14:10 [RFC] using "optimizaiton 1" Dmitry Antipov
@ 2012-12-14 14:15 ` Eli Zaretskii
2012-12-14 16:47 ` Dmitry Antipov
0 siblings, 1 reply; 4+ messages in thread
From: Eli Zaretskii @ 2012-12-14 14:15 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: emacs-devel
> Date: Fri, 14 Dec 2012 18:10:10 +0400
> From: Dmitry Antipov <dmantipov@yandex.ru>
> CC: Eli Zaretskii <eliz@gnu.org>
>
> Surprisingly, "optimizaiton 1" from redisplay_internal can
> handle the case if the region is highlighted, too. Comments?
Sorry, I don't understand: handle which case?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC] using "optimizaiton 1"
2012-12-14 14:15 ` Eli Zaretskii
@ 2012-12-14 16:47 ` Dmitry Antipov
2012-12-15 9:57 ` Eli Zaretskii
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Antipov @ 2012-12-14 16:47 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
On 12/14/2012 06:15 PM, Eli Zaretskii wrote:
>> Date: Fri, 14 Dec 2012 18:10:10 +0400
>> From: Dmitry Antipov <dmantipov@yandex.ru>
>> CC: Eli Zaretskii <eliz@gnu.org>
>>
>> Surprisingly, "optimizaiton 1" from redisplay_internal can
>> handle the case if the region is highlighted, too. Comments?
>
> Sorry, I don't understand: handle which case?
IOW, I suspect that this code:
13248 /* If showing the region, and mark has changed, we must redisplay
13249 the whole window. The assignment to this_line_start_pos prevents
13250 the optimization directly below this if-statement. */
13251 if (((!NILP (Vtransient_mark_mode)
13252 && !NILP (BVAR (XBUFFER (w->buffer), mark_active)))
13253 != !NILP (w->region_showing))
13254 || (!NILP (w->region_showing)
13255 && !EQ (w->region_showing,
13256 Fmarker_position (BVAR (XBUFFER (w->buffer), mark)))))
13257 CHARPOS (this_line_start_pos) = 0;
is obsolete (heh, it's there since 1993). If showing the region, and both PT and
mark are on the same line, we should go through the monster if-statement below to:
13293 /* We have to handle the case of continuation around a
13294 wide-column character (see the comment in indent.c around
13295 line 1340).
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC] using "optimizaiton 1"
2012-12-14 16:47 ` Dmitry Antipov
@ 2012-12-15 9:57 ` Eli Zaretskii
0 siblings, 0 replies; 4+ messages in thread
From: Eli Zaretskii @ 2012-12-15 9:57 UTC (permalink / raw)
To: Dmitry Antipov; +Cc: emacs-devel
> Date: Fri, 14 Dec 2012 20:47:28 +0400
> From: Dmitry Antipov <dmantipov@yandex.ru>
> CC: emacs-devel@gnu.org
>
> On 12/14/2012 06:15 PM, Eli Zaretskii wrote:
>
> IOW, I suspect that this code:
>
> 13248 /* If showing the region, and mark has changed, we must redisplay
> 13249 the whole window. The assignment to this_line_start_pos prevents
> 13250 the optimization directly below this if-statement. */
> 13251 if (((!NILP (Vtransient_mark_mode)
> 13252 && !NILP (BVAR (XBUFFER (w->buffer), mark_active)))
> 13253 != !NILP (w->region_showing))
> 13254 || (!NILP (w->region_showing)
> 13255 && !EQ (w->region_showing,
> 13256 Fmarker_position (BVAR (XBUFFER (w->buffer), mark)))))
> 13257 CHARPOS (this_line_start_pos) = 0;
>
> is obsolete (heh, it's there since 1993). If showing the region, and
> both PT and mark are on the same line
How do you conclude that both point and mark are on the same line?
The above just tests whether mark has changed, it doesn't say anything
about point, AFAICT.
In any case, is this situation frequent enough to be worth optimizing?
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-12-15 9:57 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-14 14:10 [RFC] using "optimizaiton 1" Dmitry Antipov
2012-12-14 14:15 ` Eli Zaretskii
2012-12-14 16:47 ` Dmitry Antipov
2012-12-15 9:57 ` Eli Zaretskii
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).