emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 1e5392a: Make sure buffer is live before retrieving underline pro


From: Martin Rudalics
Subject: master 1e5392a: Make sure buffer is live before retrieving underline properties (Bug#38038)
Date: Tue, 12 Nov 2019 10:45:01 -0500 (EST)

branch: master
commit 1e5392a4ae710486f77afb5898c552b5b0e85061
Author: Martin Rudalics <address@hidden>
Commit: Martin Rudalics <address@hidden>

    Make sure buffer is live before retrieving underline properties (Bug#38038)
    
    * src/window.h (WINDOW_BUFFER_LOCAL_VALUE): New macro.
    * src/nsterm.m (ns_draw_text_decoration):
    * src/w32term.c (w32_draw_glyph_string):
    * src/xterm.c (x_draw_glyph_string): Make sure buffer is live
    before retrieving underline properties from it (Bug#38038).
---
 src/nsterm.m  | 29 ++++++++++++++++-------------
 src/w32term.c | 17 +++++++++--------
 src/window.h  |  7 +++++++
 src/xterm.c   | 17 +++++++++--------
 4 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 9d5082b..e1d745e 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -3435,19 +3435,22 @@ ns_draw_text_decoration (struct glyph_string *s, struct 
face *face,
               unsigned long descent = s->y + s->height - s->ybase;
               unsigned long minimum_offset;
               BOOL underline_at_descent_line, 
use_underline_position_properties;
-              Lisp_Object val = buffer_local_value (Qunderline_minimum_offset,
-                                                    s->w->contents);
-              if (FIXNUMP (val))
-                minimum_offset = XFIXNAT (val);
-              else
-                minimum_offset = 1;
-              val = buffer_local_value (Qx_underline_at_descent_line,
-                                        s->w->contents);
-              underline_at_descent_line = !(NILP (val) || EQ (val, Qunbound));
-              val = buffer_local_value (Qx_use_underline_position_properties,
-                                        s->w->contents);
-              use_underline_position_properties =
-               !(NILP (val) || EQ (val, Qunbound));
+             Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
+                                (Qunderline_minimum_offset, s->w));
+
+             if (FIXNUMP (val))
+               minimum_offset = XFIXNAT (val);
+             else
+               minimum_offset = 1;
+
+             val = (WINDOW_BUFFER_LOCAL_VALUE
+                    (Qx_underline_at_descent_line, s->w));
+             underline_at_descent_line = !(NILP (val) || EQ (val, Qunbound));
+
+             val = (WINDOW_BUFFER_LOCAL_VALUE
+                    (Qx_use_underline_position_properties, s->w));
+             use_underline_position_properties
+               = !(NILP (val) || EQ (val, Qunbound));
 
               /* Use underline thickness of font, defaulting to 1.  */
               thickness = (font && font->underline_thickness > 0)
diff --git a/src/w32term.c b/src/w32term.c
index 9da0845..d0537c6 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -2512,20 +2512,21 @@ w32_draw_glyph_string (struct glyph_string *s)
                  unsigned long minimum_offset;
                  BOOL underline_at_descent_line;
                  BOOL use_underline_position_properties;
-                 Lisp_Object val
-                   = buffer_local_value (Qunderline_minimum_offset,
-                                         s->w->contents);
+                 Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
+                                    (Qunderline_minimum_offset, s->w));
+
                  if (FIXNUMP (val))
                    minimum_offset = max (0, XFIXNUM (val));
                  else
                    minimum_offset = 1;
-                 val = buffer_local_value (Qx_underline_at_descent_line,
-                                           s->w->contents);
+
+                 val = (WINDOW_BUFFER_LOCAL_VALUE
+                        (Qx_underline_at_descent_line, s->w));
                  underline_at_descent_line
                    = !(NILP (val) || EQ (val, Qunbound));
-                 val
-                   = buffer_local_value (Qx_use_underline_position_properties,
-                                         s->w->contents);
+
+                 val = (WINDOW_BUFFER_LOCAL_VALUE
+                        (Qx_use_underline_position_properties, s->w));
                  use_underline_position_properties
                    = !(NILP (val) || EQ (val, Qunbound));
 
diff --git a/src/window.h b/src/window.h
index 71946a5..5b9a314 100644
--- a/src/window.h
+++ b/src/window.h
@@ -608,6 +608,13 @@ wset_next_buffers (struct window *w, Lisp_Object val)
    ? (W)->contents                             \
    : Qnil)
 
+/* Local value of variable V in window W's buffer.  Nil if W has no
+   buffer.  */
+#define WINDOW_BUFFER_LOCAL_VALUE(V, W)                \
+  (BUFFERP ((W)->contents)                     \
+   ? buffer_local_value(V, (W)->contents)      \
+   : Qnil)
+
 /* Return the canonical column width of the frame of window W.  */
 #define WINDOW_FRAME_COLUMN_WIDTH(W) \
   (FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W))))
diff --git a/src/xterm.c b/src/xterm.c
index 44fbd27..f700580 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -3847,20 +3847,21 @@ x_draw_glyph_string (struct glyph_string *s)
                  unsigned long minimum_offset;
                  bool underline_at_descent_line;
                  bool use_underline_position_properties;
-                 Lisp_Object val
-                   = buffer_local_value (Qunderline_minimum_offset,
-                                         s->w->contents);
+                 Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
+                                    (Qunderline_minimum_offset, s->w));
+
                  if (FIXNUMP (val))
                    minimum_offset = max (0, XFIXNUM (val));
                  else
                    minimum_offset = 1;
-                 val = buffer_local_value (Qx_underline_at_descent_line,
-                                           s->w->contents);
+
+                 val = (WINDOW_BUFFER_LOCAL_VALUE
+                        (Qx_underline_at_descent_line, s->w));
                  underline_at_descent_line
                    = !(NILP (val) || EQ (val, Qunbound));
-                 val
-                   = buffer_local_value (Qx_use_underline_position_properties,
-                                         s->w->contents);
+
+                 val = (WINDOW_BUFFER_LOCAL_VALUE
+                        (Qx_use_underline_position_properties, s->w));
                  use_underline_position_properties
                    = !(NILP (val) || EQ (val, Qunbound));
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]