emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 374f6a5 2/6: Port --enable-gcc-warnings to GCC 6.1


From: Paul Eggert
Subject: [Emacs-diffs] master 374f6a5 2/6: Port --enable-gcc-warnings to GCC 6.1
Date: Wed, 18 May 2016 07:49:34 +0000 (UTC)

branch: master
commit 374f6a5f34a83d3e4c518f0726558642293fdd71
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Port --enable-gcc-warnings to GCC 6.1
    
    * configure.ac (WERROR_CFLAGS): Omit -Wunused-const-variable=2.
    * lib-src/etags.c (LOOKING_AT, LOOKING_AT_NOCASE):
    Omit test whether pointer plus a constant equals a null pointer.
    * src/alloc.c (compact_small_strings):
    Avoid pointer arithmetic on null pointers.
    * src/alloc.c (mark_face_cache):
    * src/fontset.c (free_realized_fontsets, Fset_fontset_font):
    * src/fringe.c (draw_fringe_bitmap_1)
    (Fset_fringe_bitmap_face):
    * src/macfont.m (macfont_draw):
    * src/msdos.c (IT_set_face, IT_clear_screen):
    * src/nsfont.m (nsfont_draw):
    * src/nsterm.h (FRAME_DEFAULT_FACE):
    * src/nsterm.m (ns_draw_window_cursor)
    (ns_draw_vertical_window_border, ns_draw_window_divider)
    (ns_dumpglyphs_box_or_relief)
    (ns_maybe_dumpglyphs_background, ns_dumpglyphs_image)
    (ns_dumpglyphs_stretch):
    * src/w32term.c (w32_draw_vertical_window_border)
    (w32_draw_window_divider, x_set_mouse_face_gc):
    * src/xdisp.c (estimate_mode_line_height, init_iterator)
    (handle_face_prop, handle_single_display_spec, pop_it)
    (CHAR_COMPOSED_P, get_next_display_element)
    (next_element_from_display_vector, extend_face_to_end_of_line)
    (fill_gstring_glyph_string,BUILD_COMPOSITE_GLYPH_STRING):
    * src/xfaces.c (Finternal_merge_in_global_face, Fface_font)
    (lookup_named_face):
    * src/xterm.c (x_draw_vertical_window_border)
    (x_draw_window_divider, x_set_mouse_face_gc):
    Prefer FACE_OPT_FROM_ID to FACE_FROM_ID when the result might be null.
    * src/xterm.c (try_window_id):
    Redo loop to convince GCC 6.1 that it is null pointer safe.
    (x_color_cells):
    Use eassume as necessary to pacify GCC 6.1.
    * src/dispextern.h (FACE_FROM_ID, IMAGE_FROM_ID): Now returns non-null.
    (FACE_OPT_FROM_ID, IMAGE_OPT_FROM_ID): New macro, with the old
    behavior of the non-_OPT macro, to be used when the result
    might be a null pointer.
    * src/dispnew.c (buffer_posn_from_coords, marginal_area_string)
    [HAVE_WINDOW_SYSTEM]:
    * src/intervals.h (INTERVAL_WRITABLE_P):
    * src/term.c (turn_off_face):
    * src/xdisp.c (get_glyph_face_and_encoding, fill_image_glyph_string)
    (produce_image_glyph, produce_xwidget_glyph):
    * src/xfaces.c (lookup_named_face):
    Remove unnecessary test for null pointer.
    * src/keyboard.c (read_char): Suppress bogus -Wclobbered warning.
    * src/process.c (would_block): New function.
    (server_accept_connection, wait_reading_process_output, send_process):
    Use it.
    * src/xdisp.c (get_window_cursor_type, note_mouse_highlight):
    Prefer IMAGE_OPT_FROM_ID to IMAGE_FROM_ID when the result
    might be null.
---
 configure.ac     |    1 +
 lib-src/etags.c  |    4 +-
 src/alloc.c      |  131 ++++++++++++++++++++++++++++--------------------------
 src/dispextern.h |   30 +++++++++----
 src/dispnew.c    |    8 ++--
 src/fontset.c    |    4 +-
 src/fringe.c     |    4 +-
 src/intervals.h  |   12 ++---
 src/keyboard.c   |    9 ++++
 src/macfont.m    |    3 +-
 src/msdos.c      |    6 +--
 src/nsfont.m     |    2 +-
 src/nsterm.h     |    2 +-
 src/nsterm.m     |   20 +++++----
 src/process.c    |   42 +++++++----------
 src/term.c       |    2 -
 src/w32term.c    |   12 ++---
 src/xdisp.c      |   57 +++++++++++-------------
 src/xfaces.c     |   26 ++++-------
 src/xterm.c      |   33 ++++++++------
 20 files changed, 212 insertions(+), 196 deletions(-)

diff --git a/configure.ac b/configure.ac
index 448c48d..22ec494 100644
--- a/configure.ac
+++ b/configure.ac
@@ -930,6 +930,7 @@ AS_IF([test $gl_gcc_warnings = no],
   nw="$nw -Wformat-nonliteral"      # we do this a lot
   nw="$nw -Wvla"                    # Emacs uses <vla.h>.
   nw="$nw -Wswitch-default"         # Too many warnings for now
+  nw="$nw -Wunused-const-variable=2" # lisp.h declares const objects.
   nw="$nw -Winline"                 # OK to ignore 'inline'
   nw="$nw -Wstrict-overflow"        # OK to optimize assuming that
                                     # signed overflow has undefined behavior
diff --git a/lib-src/etags.c b/lib-src/etags.c
index e8b71e6..570d217 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -4070,13 +4070,13 @@ Yacc_entries (FILE *inf)
   ((assert ("" kw), true)   /* syntax error if not a literal string */ \
    && strneq ((cp), kw, sizeof (kw)-1)         /* cp points at kw */   \
    && notinname ((cp)[sizeof (kw)-1])          /* end of kw */         \
-   && ((cp) = skip_spaces ((cp)+sizeof (kw)-1))) /* skip spaces */
+   && ((cp) = skip_spaces ((cp) + sizeof (kw) - 1), true)) /* skip spaces */
 
 /* Similar to LOOKING_AT but does not use notinname, does not skip */
 #define LOOKING_AT_NOCASE(cp, kw) /* the keyword is a literal string */        
\
   ((assert ("" kw), true) /* syntax error if not a literal string */   \
    && strncaseeq ((cp), kw, sizeof (kw)-1)     /* cp points at kw */   \
-   && ((cp) += sizeof (kw)-1))                 /* skip spaces */
+   && ((cp) += sizeof (kw) - 1, true))         /* skip spaces */
 
 /*
  * Read a file, but do no processing.  This is used to do regexp
diff --git a/src/alloc.c b/src/alloc.c
index c5a4f42..054e1ca 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2174,89 +2174,96 @@ free_large_strings (void)
 static void
 compact_small_strings (void)
 {
-  struct sblock *b, *tb, *next;
-  sdata *from, *to, *end, *tb_end;
-  sdata *to_end, *from_end;
-
   /* TB is the sblock we copy to, TO is the sdata within TB we copy
      to, and TB_END is the end of TB.  */
-  tb = oldest_sblock;
-  tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
-  to = tb->data;
-
-  /* Step through the blocks from the oldest to the youngest.  We
-     expect that old blocks will stabilize over time, so that less
-     copying will happen this way.  */
-  for (b = oldest_sblock; b; b = b->next)
+  struct sblock *tb = oldest_sblock;
+  if (tb)
     {
-      end = b->next_free;
-      eassert ((char *) end <= (char *) b + SBLOCK_SIZE);
+      sdata *tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
+      sdata *to = tb->data;
 
-      for (from = b->data; from < end; from = from_end)
+      /* Step through the blocks from the oldest to the youngest.  We
+        expect that old blocks will stabilize over time, so that less
+        copying will happen this way.  */
+      struct sblock *b = tb;
+      do
        {
-         /* Compute the next FROM here because copying below may
-            overwrite data we need to compute it.  */
-         ptrdiff_t nbytes;
-         struct Lisp_String *s = from->string;
+         sdata *end = b->next_free;
+         eassert ((char *) end <= (char *) b + SBLOCK_SIZE);
+
+         for (sdata *from = b->data; from < end; )
+           {
+             /* Compute the next FROM here because copying below may
+                overwrite data we need to compute it.  */
+             ptrdiff_t nbytes;
+             struct Lisp_String *s = from->string;
 
 #ifdef GC_CHECK_STRING_BYTES
-         /* Check that the string size recorded in the string is the
-            same as the one recorded in the sdata structure.  */
-         if (s && string_bytes (s) != SDATA_NBYTES (from))
-           emacs_abort ();
+             /* Check that the string size recorded in the string is the
+                same as the one recorded in the sdata structure.  */
+             if (s && string_bytes (s) != SDATA_NBYTES (from))
+               emacs_abort ();
 #endif /* GC_CHECK_STRING_BYTES */
 
-         nbytes = s ? STRING_BYTES (s) : SDATA_NBYTES (from);
-         eassert (nbytes <= LARGE_STRING_BYTES);
+             nbytes = s ? STRING_BYTES (s) : SDATA_NBYTES (from);
+             eassert (nbytes <= LARGE_STRING_BYTES);
 
-         nbytes = SDATA_SIZE (nbytes);
-         from_end = (sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
+             nbytes = SDATA_SIZE (nbytes);
+             sdata *from_end = (sdata *) ((char *) from
+                                          + nbytes + GC_STRING_EXTRA);
 
 #ifdef GC_CHECK_STRING_OVERRUN
-         if (memcmp (string_overrun_cookie,
-                     (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
-                     GC_STRING_OVERRUN_COOKIE_SIZE))
-           emacs_abort ();
+             if (memcmp (string_overrun_cookie,
+                         (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
+                         GC_STRING_OVERRUN_COOKIE_SIZE))
+               emacs_abort ();
 #endif
 
-         /* Non-NULL S means it's alive.  Copy its data.  */
-         if (s)
-           {
-             /* If TB is full, proceed with the next sblock.  */
-             to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
-             if (to_end > tb_end)
+             /* Non-NULL S means it's alive.  Copy its data.  */
+             if (s)
                {
-                 tb->next_free = to;
-                 tb = tb->next;
-                 tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
-                 to = tb->data;
-                 to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
-               }
+                 /* If TB is full, proceed with the next sblock.  */
+                 sdata *to_end = (sdata *) ((char *) to
+                                            + nbytes + GC_STRING_EXTRA);
+                 if (to_end > tb_end)
+                   {
+                     tb->next_free = to;
+                     tb = tb->next;
+                     tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
+                     to = tb->data;
+                     to_end = (sdata *) ((char *) to + nbytes + 
GC_STRING_EXTRA);
+                   }
 
-             /* Copy, and update the string's `data' pointer.  */
-             if (from != to)
-               {
-                 eassert (tb != b || to < from);
-                 memmove (to, from, nbytes + GC_STRING_EXTRA);
-                 to->string->data = SDATA_DATA (to);
-               }
+                 /* Copy, and update the string's `data' pointer.  */
+                 if (from != to)
+                   {
+                     eassert (tb != b || to < from);
+                     memmove (to, from, nbytes + GC_STRING_EXTRA);
+                     to->string->data = SDATA_DATA (to);
+                   }
 
-             /* Advance past the sdata we copied to.  */
-             to = to_end;
+                 /* Advance past the sdata we copied to.  */
+                 to = to_end;
+               }
+             from = from_end;
            }
+         b = b->next;
        }
-    }
+      while (b);
 
-  /* The rest of the sblocks following TB don't contain live data, so
-     we can free them.  */
-  for (b = tb->next; b; b = next)
-    {
-      next = b->next;
-      lisp_free (b);
+      /* The rest of the sblocks following TB don't contain live data, so
+        we can free them.  */
+      for (b = tb->next; b; )
+       {
+         struct sblock *next = b->next;
+         lisp_free (b);
+         b = next;
+       }
+
+      tb->next_free = to;
+      tb->next = NULL;
     }
 
-  tb->next_free = to;
-  tb->next = NULL;
   current_sblock = tb;
 }
 
@@ -6119,7 +6126,7 @@ mark_face_cache (struct face_cache *c)
       int i, j;
       for (i = 0; i < c->used; ++i)
        {
-         struct face *face = FACE_FROM_ID (c->f, i);
+         struct face *face = FACE_OPT_FROM_ID (c->f, i);
 
          if (face)
            {
diff --git a/src/dispextern.h b/src/dispextern.h
index 7035872..4deebc1 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -1811,13 +1811,20 @@ struct face_cache
   bool_bf menu_face_changed_p : 1;
 };
 
+/* Return a pointer to the cached face with ID on frame F.  */
+
+#define FACE_FROM_ID(F, ID)                                    \
+  (eassert (UNSIGNED_CMP (ID, <, FRAME_FACE_CACHE (F)->used)), \
+   eassume (FRAME_FACE_CACHE (F)->faces_by_id[ID]),            \
+   FRAME_FACE_CACHE (F)->faces_by_id[ID])
+
 /* Return a pointer to the face with ID on frame F, or null if such a
    face doesn't exist.  */
 
-#define FACE_FROM_ID(F, ID)                            \
-     (UNSIGNED_CMP (ID, <, FRAME_FACE_CACHE (F)->used) \
-      ? FRAME_FACE_CACHE (F)->faces_by_id[ID]          \
-      : NULL)
+#define FACE_OPT_FROM_ID(F, ID)                                \
+  (UNSIGNED_CMP (ID, <, FRAME_FACE_CACHE (F)->used)    \
+   ? FACE_FROM_ID (F, ID)                              \
+   : NULL)
 
 #ifdef HAVE_WINDOW_SYSTEM
 
@@ -3082,13 +3089,20 @@ struct image_cache
 };
 
 
+/* A pointer to the image with id ID on frame F.  */
+
+#define IMAGE_FROM_ID(F, ID)                                   \
+  (eassert (UNSIGNED_CMP (ID, <, FRAME_IMAGE_CACHE (F)->used)),        \
+   eassume (FRAME_IMAGE_CACHE (F)->images[ID]),                        \
+   FRAME_IMAGE_CACHE (F)->images[ID])
+
 /* Value is a pointer to the image with id ID on frame F, or null if
    no image with that id exists.  */
 
-#define IMAGE_FROM_ID(F, ID)                                   \
-     (((ID) >= 0 && (ID) < (FRAME_IMAGE_CACHE (F)->used))      \
-      ? FRAME_IMAGE_CACHE (F)->images[ID]                      \
-      : NULL)
+#define IMAGE_OPT_FROM_ID(F, ID)                               \
+  (UNSIGNED_CMP (ID, <, FRAME_IMAGE_CACHE (F)->used)           \
+   ? IMAGE_FROM_ID (F, ID)                                     \
+   : NULL)
 
 /* Size of bucket vector of image caches.  Should be prime.  */
 
diff --git a/src/dispnew.c b/src/dispnew.c
index 51caa5b..4cc908a 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5177,8 +5177,8 @@ buffer_posn_from_coords (struct window *w, int *x, int 
*y, struct display_pos *p
 #ifdef HAVE_WINDOW_SYSTEM
   if (it.what == IT_IMAGE)
     {
-      if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
-         && !NILP (img->spec))
+      img = IMAGE_OPT_FROM_ID (it.f, it.image_id);
+      if (img && !NILP (img->spec))
        *object = img->spec;
     }
 #endif
@@ -5275,7 +5275,7 @@ mode_line_string (struct window *w, enum window_part part,
          if (glyph->type == IMAGE_GLYPH)
            {
              struct image *img;
-             img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
+             img = IMAGE_OPT_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
              if (img != NULL)
                *object = img->spec;
              y0 -= row->ascent - glyph->ascent;
@@ -5362,7 +5362,7 @@ marginal_area_string (struct window *w, enum window_part 
part,
          if (glyph->type == IMAGE_GLYPH)
            {
              struct image *img;
-             img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
+             img = IMAGE_OPT_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
              if (img != NULL)
                *object = img->spec;
              y0 -= row->ascent - glyph->ascent;
diff --git a/src/fontset.c b/src/fontset.c
index 4ab1367..d87901d 100644
--- a/src/fontset.c
+++ b/src/fontset.c
@@ -1304,7 +1304,7 @@ free_realized_fontsets (Lisp_Object base)
            {
              struct frame *f = XFRAME (FONTSET_FRAME (this));
              int face_id = XINT (XCDR (XCAR (tail)));
-             struct face *face = FACE_FROM_ID (f, face_id);
+             struct face *face = FACE_OPT_FROM_ID (f, face_id);
 
              /* Face THIS itself is also freed by the following call.  */
              free_realized_face (f, face);
@@ -1636,7 +1636,7 @@ appended.  By default, FONT-SPEC overrides the previous 
settings.  */)
            continue;
          if (fontset_id != FRAME_FONTSET (f))
            continue;
-         face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+         face = FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID);
          if (face)
            font_object = font_load_for_lface (f, face->lface, font_spec);
          else
diff --git a/src/fringe.c b/src/fringe.c
index 061f786..55f37b8 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -620,7 +620,7 @@ draw_fringe_bitmap_1 (struct window *w, struct glyph_row 
*row, int left_p, int o
       break;
     }
 
-  p.face = FACE_FROM_ID (f, face_id);
+  p.face = FACE_OPT_FROM_ID (f, face_id);
 
   if (p.face == NULL)
     {
@@ -1627,7 +1627,7 @@ If FACE is nil, reset face to default fringe face.  */)
     {
       struct frame *f = SELECTED_FRAME ();
 
-      if (FACE_FROM_ID (f, FRINGE_FACE_ID)
+      if (FACE_OPT_FROM_ID (f, FRINGE_FACE_ID)
          && lookup_derived_face (f, face, FRINGE_FACE_ID, 1) < 0)
        error ("No such face");
     }
diff --git a/src/intervals.h b/src/intervals.h
index b8cdcfd..6a5a412 100644
--- a/src/intervals.h
+++ b/src/intervals.h
@@ -197,12 +197,12 @@ set_interval_plist (INTERVAL i, Lisp_Object plist)
 
 /* Is this interval writable?  Replace later with cache access.  */
 #define INTERVAL_WRITABLE_P(i)                                 \
-  (i && (NILP (textget ((i)->plist, Qread_only))               \
-         || !NILP (textget ((i)->plist, Qinhibit_read_only))   \
-        || ((CONSP (Vinhibit_read_only)                        \
-             ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \
-                             Vinhibit_read_only))              \
-             : !NILP (Vinhibit_read_only)))))                  \
+  (NILP (textget ((i)->plist, Qread_only))                     \
+   || !NILP (textget ((i)->plist, Qinhibit_read_only))         \
+   || ((CONSP (Vinhibit_read_only)                             \
+       ? !NILP (Fmemq (textget ((i)->plist, Qread_only),       \
+                       Vinhibit_read_only))                    \
+       : !NILP (Vinhibit_read_only))))
 
 /* Macros to tell whether insertions before or after this interval
    should stick to it.  Now we have Vtext_property_default_nonsticky,
diff --git a/src/keyboard.c b/src/keyboard.c
index fe04b3f..ef2e278 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2280,6 +2280,11 @@ read_decoded_event_from_main_queue (struct timespec 
*end_time,
     }
 }
 
+#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wclobbered"
+#endif
+
 /* Read a character from the keyboard; call the redisplay if needed.  */
 /* commandflag 0 means do not autosave, but do redisplay.
    -1 means do not redisplay, but do autosave.
@@ -3120,6 +3125,10 @@ read_char (int commandflag, Lisp_Object map,
   return c;
 }
 
+#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+# pragma GCC diagnostic pop
+#endif
+
 /* Record a key that came from a mouse menu.
    Record it for echoing, for this-command-keys, and so on.  */
 
diff --git a/src/macfont.m b/src/macfont.m
index 0445628..7900134 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -2856,7 +2856,8 @@ macfont_draw (struct glyph_string *s, int from, int to, 
int x, int y,
     {
       if (s->hl == DRAW_MOUSE_FACE)
         {
-          face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+          face = FACE_OPT_FROM_ID (s->f,
+                                  MOUSE_HL_INFO (s->f)->mouse_face_face_id);
           if (!face)
             face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
         }
diff --git a/src/msdos.c b/src/msdos.c
index 62411ea..c2b19a6 100644
--- a/src/msdos.c
+++ b/src/msdos.c
@@ -795,8 +795,8 @@ static void
 IT_set_face (int face)
 {
   struct frame *sf = SELECTED_FRAME ();
-  struct face *fp  = FACE_FROM_ID (sf, face);
-  struct face *dfp = FACE_FROM_ID (sf, DEFAULT_FACE_ID);
+  struct face *fp  = FACE_OPT_FROM_ID (sf, face);
+  struct face *dfp = FACE_OPT_FROM_ID (sf, DEFAULT_FACE_ID);
   unsigned long fg, bg, dflt_fg, dflt_bg;
   struct tty_display_info *tty = FRAME_TTY (sf);
 
@@ -1076,7 +1076,7 @@ IT_clear_screen (struct frame *f)
      any valid faces and will abort.  Instead, use the initial screen
      colors; that should mimic what a Unix tty does, which simply clears
      the screen with whatever default colors are in use.  */
-  if (FACE_FROM_ID (SELECTED_FRAME (), DEFAULT_FACE_ID) == NULL)
+  if (FACE_OPT_FROM_ID (SELECTED_FRAME (), DEFAULT_FACE_ID) == NULL)
     ScreenAttrib = (initial_screen_colors[0] << 4) | initial_screen_colors[1];
   else
     IT_set_face (0);
diff --git a/src/nsfont.m b/src/nsfont.m
index 92e7d11..7c97c6f 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -1071,7 +1071,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, 
int x, int y,
       face = s->face;
       break;
     case NS_DUMPGLYPH_MOUSEFACE:
-      face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+      face = FACE_OPT_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
       if (!face)
         face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
       break;
diff --git a/src/nsterm.h b/src/nsterm.h
index 6cad337..c2285c9 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1014,7 +1014,7 @@ struct x_output
 #define FRAME_NS_TITLEBAR_HEIGHT(f) ((f)->output_data.ns->titlebar_height)
 #define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.ns->toolbar_height)
 
-#define FRAME_DEFAULT_FACE(f) FACE_FROM_ID (f, DEFAULT_FACE_ID)
+#define FRAME_DEFAULT_FACE(f) FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID)
 
 #define FRAME_NS_VIEW(f) ((f)->output_data.ns->view)
 #define FRAME_CURSOR_COLOR(f) ((f)->output_data.ns->cursor_color)
diff --git a/src/nsterm.m b/src/nsterm.m
index 1d48c04..b815d77 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -2878,7 +2878,7 @@ ns_draw_window_cursor (struct window *w, struct glyph_row 
*glyph_row,
   ns_clip_to_row (w, glyph_row, ANY_AREA, NO); /* do ns_focus(f, &r, 1); if 
remove */
 
 
-  face = FACE_FROM_ID (f, phys_cursor_glyph->face_id);
+  face = FACE_OPT_FROM_ID (f, phys_cursor_glyph->face_id);
   if (face && NS_FACE_BACKGROUND (face)
       == ns_index_color (FRAME_CURSOR_COLOR (f), f))
     {
@@ -2950,7 +2950,7 @@ ns_draw_vertical_window_border (struct window *w, int x, 
int y0, int y1)
 
   NSTRACE ("ns_draw_vertical_window_border");
 
-  face = FACE_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
+  face = FACE_OPT_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
   if (face)
       [ns_lookup_indexed_color(face->foreground, f) set];
 
@@ -2972,7 +2972,7 @@ ns_draw_window_divider (struct window *w, int x0, int x1, 
int y0, int y1)
 
   NSTRACE ("ns_draw_window_divider");
 
-  face = FACE_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
+  face = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
   if (face)
       [ns_lookup_indexed_color(face->foreground, f) set];
 
@@ -3305,9 +3305,9 @@ ns_dumpglyphs_box_or_relief (struct glyph_string *s)
 
   if (s->hl == DRAW_MOUSE_FACE)
     {
-      face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+      face = FACE_OPT_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
       if (!face)
-        face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
+        face = FACE_OPT_FROM_ID (s->f, MOUSE_FACE_ID);
     }
   else
     face = s->face;
@@ -3372,8 +3372,9 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, 
char force_p)
           struct face *face;
           if (s->hl == DRAW_MOUSE_FACE)
             {
-              face = FACE_FROM_ID (s->f,
-                                  MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+              face
+               = FACE_OPT_FROM_ID (s->f,
+                                   MOUSE_HL_INFO (s->f)->mouse_face_face_id);
               if (!face)
                 face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
             }
@@ -3439,7 +3440,7 @@ ns_dumpglyphs_image (struct glyph_string *s, NSRect r)
      with its background color), we must clear just the image area. */
   if (s->hl == DRAW_MOUSE_FACE)
     {
-      face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+      face = FACE_OPT_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
       if (!face)
        face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
     }
@@ -3556,7 +3557,8 @@ ns_dumpglyphs_stretch (struct glyph_string *s)
 
       if (s->hl == DRAW_MOUSE_FACE)
        {
-         face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+         face = FACE_OPT_FROM_ID (s->f,
+                                 MOUSE_HL_INFO (s->f)->mouse_face_face_id);
          if (!face)
            face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
        }
diff --git a/src/process.c b/src/process.c
index eed875d..3e5b83d 100644
--- a/src/process.c
+++ b/src/process.c
@@ -151,6 +151,18 @@ bool inhibit_sentinels;
 # define SOCK_CLOEXEC 0
 #endif
 
+/* True if ERRNUM represents an error where the system call would
+   block if a blocking variant were used.  */
+static bool
+would_block (int errnum)
+{
+#ifdef EWOULDBLOCK
+  if (EWOULDBLOCK != EAGAIN && errnum == EWOULDBLOCK)
+    return true;
+#endif
+  return errnum == EAGAIN;
+}
+
 #ifndef HAVE_ACCEPT4
 
 /* Emulate GNU/Linux accept4 and socket well enough for this module.  */
@@ -4453,15 +4465,7 @@ server_accept_connection (Lisp_Object server, int 
channel)
   if (s < 0)
     {
       int code = errno;
-
-      if (code == EAGAIN)
-       return;
-#ifdef EWOULDBLOCK
-      if (code == EWOULDBLOCK)
-       return;
-#endif
-
-      if (!NILP (ps->log))
+      if (!would_block (code) && !NILP (ps->log))
        call3 (ps->log, server, Qnil,
               concat3 (build_string ("accept failed with code"),
                        Fnumber_to_string (make_number (code)),
@@ -5016,12 +5020,8 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
                  int nread = read_process_output (proc, wait_proc->infd);
                  if (nread < 0)
                    {
-                   if (errno == EIO || errno == EAGAIN)
-                     break;
-#ifdef EWOULDBLOCK
-                   if (errno == EWOULDBLOCK)
-                     break;
-#endif
+                     if (errno == EIO || would_block (errno))
+                       break;
                    }
                  else
                    {
@@ -5405,11 +5405,7 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
                  if (do_display)
                    redisplay_preserve_echo_area (12);
                }
-#ifdef EWOULDBLOCK
-             else if (nread == -1 && errno == EWOULDBLOCK)
-               ;
-#endif
-             else if (nread == -1 && errno == EAGAIN)
+             else if (nread == -1 && would_block (errno))
                ;
 #ifdef WINDOWSNT
              /* FIXME: Is this special case still needed?  */
@@ -6147,11 +6143,7 @@ send_process (Lisp_Object proc, const char *buf, 
ptrdiff_t len,
 
          if (rv < 0)
            {
-             if (errno == EAGAIN
-#ifdef EWOULDBLOCK
-                 || errno == EWOULDBLOCK
-#endif
-                 )
+             if (would_block (errno))
                /* Buffer is full.  Wait, accepting input;
                   that may allow the program
                   to finish doing output and read more.  */
diff --git a/src/term.c b/src/term.c
index 4397210..07cc3a9 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1954,8 +1954,6 @@ turn_off_face (struct frame *f, int face_id)
   struct face *face = FACE_FROM_ID (f, face_id);
   struct tty_display_info *tty = FRAME_TTY (f);
 
-  eassert (face != NULL);
-
   if (tty->TS_exit_attribute_mode)
     {
       /* Capability "me" will turn off appearance modes double-bright,
diff --git a/src/w32term.c b/src/w32term.c
index 72e1245..14a43c1 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -613,7 +613,7 @@ w32_draw_vertical_window_border (struct window *w, int x, 
int y0, int y1)
   r.bottom = y1;
 
   hdc = get_frame_dc (f);
-  face = FACE_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
+  face = FACE_OPT_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
   if (face)
     w32_fill_rect (f, hdc, face->foreground, &r);
   else
@@ -630,9 +630,11 @@ w32_draw_window_divider (struct window *w, int x0, int x1, 
int y0, int y1)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   HDC hdc = get_frame_dc (f);
-  struct face *face = FACE_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
-  struct face *face_first = FACE_FROM_ID (f, 
WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
-  struct face *face_last = FACE_FROM_ID (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
+  struct face *face = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
+  struct face *face_first
+    = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
+  struct face *face_last
+    = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
   unsigned long color = face ? face->foreground : FRAME_FOREGROUND_PIXEL (f);
   unsigned long color_first = (face_first
                               ? face_first->foreground
@@ -991,7 +993,7 @@ x_set_mouse_face_gc (struct glyph_string *s)
 
   /* What face has to be used last for the mouse face?  */
   face_id = MOUSE_HL_INFO (s->f)->mouse_face_face_id;
-  face = FACE_FROM_ID (s->f, face_id);
+  face = FACE_OPT_FROM_ID (s->f, face_id);
   if (face == NULL)
     face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
 
diff --git a/src/xdisp.c b/src/xdisp.c
index d0ff952..bec7339 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1813,7 +1813,7 @@ estimate_mode_line_height (struct frame *f, enum face_id 
face_id)
         cache and mode line face are not yet initialized.  */
       if (FRAME_FACE_CACHE (f))
        {
-         struct face *face = FACE_FROM_ID (f, face_id);
+         struct face *face = FACE_OPT_FROM_ID (f, face_id);
          if (face)
            {
              if (face->font)
@@ -2918,7 +2918,7 @@ init_iterator (struct it *it, struct window *w,
 
       /* If we have a boxed mode line, make the first character appear
         with a left box line.  */
-      face = FACE_FROM_ID (it->f, remapped_base_face_id);
+      face = FACE_OPT_FROM_ID (it->f, remapped_base_face_id);
       if (face && face->box != FACE_NO_BOX)
        it->start_of_box_run_p = true;
     }
@@ -3877,9 +3877,9 @@ handle_face_prop (struct it *it)
        {
          struct face *new_face = FACE_FROM_ID (it->f, new_face_id);
          /* If it->face_id is -1, old_face below will be NULL, see
-            the definition of FACE_FROM_ID.  This will happen if this
+            the definition of FACE_OPT_FROM_ID.  This will happen if this
             is the initial call that gets the face.  */
-         struct face *old_face = FACE_FROM_ID (it->f, it->face_id);
+         struct face *old_face = FACE_OPT_FROM_ID (it->f, it->face_id);
 
          /* If the value of face_id of the iterator is -1, we have to
             look in front of IT's position and see whether there is a
@@ -3888,7 +3888,7 @@ handle_face_prop (struct it *it)
            {
              int prev_face_id = face_before_it_pos (it);
 
-             old_face = FACE_FROM_ID (it->f, prev_face_id);
+             old_face = FACE_OPT_FROM_ID (it->f, prev_face_id);
            }
 
          /* If the new face has a box, but the old face does not,
@@ -3988,7 +3988,7 @@ handle_face_prop (struct it *it)
       if (new_face_id != it->face_id)
        {
          struct face *new_face = FACE_FROM_ID (it->f, new_face_id);
-         struct face *old_face = FACE_FROM_ID (it->f, it->face_id);
+         struct face *old_face = FACE_OPT_FROM_ID (it->f, it->face_id);
 
          /* If new face has a box but old face hasn't, this is the
             start of a run of characters with box, i.e. it has a
@@ -4847,7 +4847,6 @@ handle_single_display_spec (struct it *it, Lisp_Object 
spec, Lisp_Object object,
          it->font_height = XCAR (XCDR (spec));
          if (!NILP (it->font_height))
            {
-             struct face *face = FACE_FROM_ID (it->f, it->face_id);
              int new_height = -1;
 
              if (CONSP (it->font_height)
@@ -4866,6 +4865,7 @@ handle_single_display_spec (struct it *it, Lisp_Object 
spec, Lisp_Object object,
                {
                  /* Call function with current height as argument.
                     Value is the new height.  */
+                 struct face *face = FACE_FROM_ID (it->f, it->face_id);
                  Lisp_Object height;
                  height = safe_call1 (it->font_height,
                                       face->lface[LFACE_HEIGHT_INDEX]);
@@ -4887,6 +4887,7 @@ handle_single_display_spec (struct it *it, Lisp_Object 
spec, Lisp_Object object,
                  /* Evaluate IT->font_height with `height' bound to the
                     current specified height to get the new height.  */
                  ptrdiff_t count = SPECPDL_INDEX ();
+                 struct face *face = FACE_FROM_ID (it->f, it->face_id);
 
                  specbind (Qheight, face->lface[LFACE_HEIGHT_INDEX]);
                  value = safe_eval (it->font_height);
@@ -6096,7 +6097,7 @@ pop_it (struct it *it)
       break;
     case GET_FROM_STRING:
       {
-       struct face *face = FACE_FROM_ID (it->f, it->face_id);
+       struct face *face = FACE_OPT_FROM_ID (it->f, it->face_id);
 
        /* Restore the face_box_p flag, since it could have been
           overwritten by the face of the object that we just finished
@@ -6777,7 +6778,7 @@ static next_element_function const 
get_next_element[NUM_IT_METHODS] =
    || ((IT)->cmp_it.stop_pos == (CHARPOS)                              \
        && composition_reseat_it (&(IT)->cmp_it, CHARPOS, BYTEPOS,      \
                                 END_CHARPOS, (IT)->w,                  \
-                                FACE_FROM_ID ((IT)->f, (IT)->face_id), \
+                                FACE_OPT_FROM_ID ((IT)->f, (IT)->face_id),     
\
                                 (IT)->string)))
 
 
@@ -7206,7 +7207,7 @@ get_next_display_element (struct it *it)
       if (it->method == GET_FROM_STRING && it->sp)
        {
          int face_id = underlying_face_id (it);
-         struct face *face = FACE_FROM_ID (it->f, face_id);
+         struct face *face = FACE_OPT_FROM_ID (it->f, face_id);
 
          if (face)
            {
@@ -7739,8 +7740,8 @@ next_element_from_display_vector (struct it *it)
       /* Glyphs in the display vector could have the box face, so we
         need to set the related flags in the iterator, as
         appropriate.  */
-      this_face = FACE_FROM_ID (it->f, it->face_id);
-      prev_face = FACE_FROM_ID (it->f, prev_face_id);
+      this_face = FACE_OPT_FROM_ID (it->f, it->face_id);
+      prev_face = FACE_OPT_FROM_ID (it->f, prev_face_id);
 
       /* Is this character the first character of a box-face run?  */
       it->start_of_box_run_p = (this_face && this_face->box != FACE_NO_BOX
@@ -7765,7 +7766,7 @@ next_element_from_display_vector (struct it *it)
                                            it->saved_face_id);
            }
        }
-      next_face = FACE_FROM_ID (it->f, next_face_id);
+      next_face = FACE_OPT_FROM_ID (it->f, next_face_id);
       it->end_of_box_run_p = (this_face && this_face->box != FACE_NO_BOX
                              && (!next_face
                                  || next_face->box == FACE_NO_BOX));
@@ -18662,7 +18663,7 @@ try_window_id (struct window *w)
       eassert (MATRIX_ROW_DISPLAYS_TEXT_P (first_unchanged_at_end_row));
       row = find_last_row_displaying_text (w->current_matrix, &it,
                                           first_unchanged_at_end_row);
-      eassert (row && MATRIX_ROW_DISPLAYS_TEXT_P (row));
+      eassume (row && MATRIX_ROW_DISPLAYS_TEXT_P (row));
       adjust_window_ends (w, row, true);
       eassert (w->window_end_bytepos >= 0);
       IF_DEBUG (debug_method_add (w, "A"));
@@ -18692,10 +18693,9 @@ try_window_id (struct window *w)
       struct glyph_row *current_row = current_matrix->rows + vpos;
       struct glyph_row *desired_row = desired_matrix->rows + vpos;
 
-      for (row = NULL;
-          row == NULL && vpos >= first_vpos;
-          --vpos, --current_row, --desired_row)
+      for (row = NULL; !row; --vpos, --current_row, --desired_row)
        {
+         eassert (first_vpos <= vpos);
          if (desired_row->enabled_p)
            {
              if (MATRIX_ROW_DISPLAYS_TEXT_P (desired_row))
@@ -18705,7 +18705,6 @@ try_window_id (struct window *w)
            row  = current_row;
        }
 
-      eassert (row != NULL);
       w->window_end_vpos = vpos + 1;
       w->window_end_pos = Z - MATRIX_ROW_END_CHARPOS (row);
       w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (row);
@@ -19630,15 +19629,14 @@ extend_face_to_end_of_line (struct it *it)
     return;
 
   /* The default face, possibly remapped. */
-  default_face = FACE_FROM_ID (f, lookup_basic_face (f, DEFAULT_FACE_ID));
+  default_face = FACE_OPT_FROM_ID (f, lookup_basic_face (f, DEFAULT_FACE_ID));
 
   /* Face extension extends the background and box of IT->face_id
      to the end of the line.  If the background equals the background
      of the frame, we don't have to do anything.  */
-  if (it->face_before_selective_p)
-    face = FACE_FROM_ID (f, it->saved_face_id);
-  else
-    face = FACE_FROM_ID (f, it->face_id);
+  face = FACE_OPT_FROM_ID (f, (it->face_before_selective_p
+                              ? it->face_id
+                              : it->saved_face_id));
 
   if (FRAME_WINDOW_P (f)
       && MATRIX_ROW_DISPLAYS_TEXT_P (it->glyph_row)
@@ -24612,7 +24610,6 @@ get_glyph_face_and_encoding (struct frame *f, struct 
glyph *glyph,
   face = FACE_FROM_ID (f, glyph->face_id);
 
   /* Make sure X resources of the face are allocated.  */
-  eassert (face != NULL);
   prepare_face_for_display (f, face);
 
   if (face->font)
@@ -24744,7 +24741,7 @@ fill_gstring_glyph_string (struct glyph_string *s, int 
face_id,
   s->cmp_id = glyph->u.cmp.id;
   s->cmp_from = glyph->slice.cmp.from;
   s->cmp_to = glyph->slice.cmp.to + 1;
-  s->face = FACE_FROM_ID (s->f, face_id);
+  s->face = FACE_OPT_FROM_ID (s->f, face_id);
   lgstring = composition_gstring_from_id (s->cmp_id);
   s->font = XFONT_OBJECT (LGSTRING_FONT (lgstring));
   glyph++;
@@ -24873,7 +24870,6 @@ fill_image_glyph_string (struct glyph_string *s)
 {
   eassert (s->first_glyph->type == IMAGE_GLYPH);
   s->img = IMAGE_FROM_ID (s->f, s->first_glyph->u.img_id);
-  eassert (s->img);
   s->slice = s->first_glyph->slice.img;
   s->face = FACE_FROM_ID (s->f, s->first_glyph->face_id);
   s->font = s->face->font;
@@ -25337,7 +25333,7 @@ compute_overhangs_and_x (struct glyph_string *s, int x, 
bool backward_p)
 #define BUILD_COMPOSITE_GLYPH_STRING(START, END, HEAD, TAIL, HL, X, LAST_X) \
   do {                                                                     \
     int face_id = (row)->glyphs[area][START].face_id;                      \
-    struct face *base_face = FACE_FROM_ID (f, face_id);                        
    \
+    struct face *base_face = FACE_OPT_FROM_ID (f, face_id);                \
     ptrdiff_t cmp_id = (row)->glyphs[area][START].u.cmp.id;                \
     struct composition *cmp = composition_table[cmp_id];                   \
     XChar2b *char2b;                                                       \
@@ -25960,7 +25956,6 @@ produce_image_glyph (struct it *it)
   eassert (it->what == IT_IMAGE);
 
   face = FACE_FROM_ID (it->f, it->face_id);
-  eassert (face);
   /* Make sure X resources of the face is loaded.  */
   prepare_face_for_display (it->f, face);
 
@@ -25975,7 +25970,6 @@ produce_image_glyph (struct it *it)
     }
 
   img = IMAGE_FROM_ID (it->f, it->image_id);
-  eassert (img);
   /* Make sure X resources of the image is loaded.  */
   prepare_image_for_display (it->f, img);
 
@@ -26131,7 +26125,6 @@ produce_xwidget_glyph (struct it *it)
   eassert (it->what == IT_XWIDGET);
 
   struct face *face = FACE_FROM_ID (it->f, it->face_id);
-  eassert (face);
   /* Make sure X resources of the face is loaded.  */
   prepare_face_for_display (it->f, face);
 
@@ -28018,7 +28011,7 @@ get_window_cursor_type (struct window *w, struct glyph 
*glyph, int *width,
              /* Using a block cursor on large images can be very annoying.
                 So use a hollow cursor for "large" images.
                 If image is not transparent (no mask), also use hollow cursor. 
 */
-             struct image *img = IMAGE_FROM_ID (f, glyph->u.img_id);
+             struct image *img = IMAGE_OPT_FROM_ID (f, glyph->u.img_id);
              if (img != NULL && IMAGEP (img->spec))
                {
                  /* Arbitrarily, interpret "Large" as >32x32 and >NxN
@@ -30105,7 +30098,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
       /* Look for :pointer property on image.  */
       if (glyph != NULL && glyph->type == IMAGE_GLYPH)
        {
-         struct image *img = IMAGE_FROM_ID (f, glyph->u.img_id);
+         struct image *img = IMAGE_OPT_FROM_ID (f, glyph->u.img_id);
          if (img != NULL && IMAGEP (img->spec))
            {
              Lisp_Object image_map, hotspot;
diff --git a/src/xfaces.c b/src/xfaces.c
index ac13700..c42e553 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -3694,7 +3694,7 @@ Default face attributes override any local face 
attributes.  */)
   if (EQ (face, Qdefault))
     {
       struct face_cache *c = FRAME_FACE_CACHE (f);
-      struct face *newface, *oldface = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+      struct face *newface, *oldface = FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID);
       Lisp_Object attrs[LFACE_VECTOR_SIZE];
 
       /* This can be NULL (e.g., in batch mode).  */
@@ -3777,7 +3777,7 @@ return the font name used for CHARACTER.  */)
     {
       struct frame *f = decode_live_frame (frame);
       int face_id = lookup_named_face (f, face, true);
-      struct face *fface = FACE_FROM_ID (f, face_id);
+      struct face *fface = FACE_OPT_FROM_ID (f, face_id);
 
       if (! fface)
        return Qnil;
@@ -4429,15 +4429,13 @@ lookup_named_face (struct frame *f, Lisp_Object symbol, 
bool signal_p)
 {
   Lisp_Object attrs[LFACE_VECTOR_SIZE];
   Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE];
-  struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+  struct face *default_face = FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID);
 
   if (default_face == NULL)
     {
       if (!realize_basic_faces (f))
        return -1;
       default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
-      if (default_face == NULL)
-       emacs_abort (); /* realize_basic_faces must have set it up  */
     }
 
   if (! get_lface_attributes (f, symbol, symbol_attrs, signal_p, 0))
@@ -4600,9 +4598,6 @@ lookup_derived_face (struct frame *f, Lisp_Object symbol, 
int face_id,
   Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE];
   struct face *default_face = FACE_FROM_ID (f, face_id);
 
-  if (!default_face)
-    emacs_abort ();
-
   if (!get_lface_attributes (f, symbol, symbol_attrs, signal_p, 0))
     return -1;
 
@@ -4706,7 +4701,7 @@ x_supports_face_attributes_p (struct frame *f,
       merge_face_vectors (f, attrs, merged_attrs, 0);
 
       face_id = lookup_face (f, merged_attrs);
-      face = FACE_FROM_ID (f, face_id);
+      face = FACE_OPT_FROM_ID (f, face_id);
 
       if (! face)
        error ("Cannot make face");
@@ -4976,14 +4971,12 @@ face for italic.  */)
     attrs[i] = Qunspecified;
   merge_face_ref (f, attributes, attrs, true, 0);
 
-  def_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+  def_face = FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID);
   if (def_face == NULL)
     {
       if (! realize_basic_faces (f))
        error ("Cannot realize default face");
       def_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
-      if (def_face == NULL)
-       emacs_abort ();  /* realize_basic_faces must have set it up  */
     }
 
   /* Dispatch to the appropriate handler.  */
@@ -5453,7 +5446,7 @@ realize_x_face (struct face_cache *cache, Lisp_Object 
attrs[LFACE_VECTOR_SIZE])
 
   /* Determine the font to use.  Most of the time, the font will be
      the same as the font of the default face, so try that first.  */
-  default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+  default_face = FACE_OPT_FROM_ID (f, DEFAULT_FACE_ID);
   if (default_face
       && lface_same_font_attributes_p (default_face->lface, attrs))
     {
@@ -6093,7 +6086,6 @@ face_at_string_position (struct window *w, Lisp_Object 
string,
     *endptr = -1;
 
   base_face = FACE_FROM_ID (f, base_face_id);
-  eassert (base_face);
 
   /* Optimize the default case that there is no face property.  */
   if (NILP (prop)
@@ -6140,7 +6132,7 @@ merge_faces (struct frame *f, Lisp_Object face_name, int 
face_id,
   Lisp_Object attrs[LFACE_VECTOR_SIZE];
   struct face *base_face;
 
-  base_face = FACE_FROM_ID (f, base_face_id);
+  base_face = FACE_OPT_FROM_ID (f, base_face_id);
   if (!base_face)
     return base_face_id;
 
@@ -6168,7 +6160,7 @@ merge_faces (struct frame *f, Lisp_Object face_name, int 
face_id,
       struct face *face;
       if (face_id < 0)
        return base_face_id;
-      face = FACE_FROM_ID (f, face_id);
+      face = FACE_OPT_FROM_ID (f, face_id);
       if (!face)
        return base_face_id;
       merge_face_vectors (f, face->lface, attrs, 0);
@@ -6288,7 +6280,7 @@ DEFUN ("dump-face", Fdump_face, Sdump_face, 0, 1, 0, doc: 
/* */)
     {
       struct face *face;
       CHECK_NUMBER (n);
-      face = FACE_FROM_ID (SELECTED_FRAME (), XINT (n));
+      face = FACE_OPT_FROM_ID (SELECTED_FRAME (), XINT (n));
       if (face == NULL)
        error ("Not a valid face");
       dump_realized_face (face);
diff --git a/src/xterm.c b/src/xterm.c
index 28856cf..beef61d 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1062,7 +1062,7 @@ x_draw_vertical_window_border (struct window *w, int x, 
int y0, int y1)
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   struct face *face;
 
-  face = FACE_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
+  face = FACE_OPT_FROM_ID (f, VERTICAL_BORDER_FACE_ID);
   if (face)
     XSetForeground (FRAME_X_DISPLAY (f), f->output_data.x->normal_gc,
                    face->foreground);
@@ -1081,9 +1081,11 @@ static void
 x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
-  struct face *face = FACE_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
-  struct face *face_first = FACE_FROM_ID (f, 
WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
-  struct face *face_last = FACE_FROM_ID (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
+  struct face *face = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_FACE_ID);
+  struct face *face_first
+    = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
+  struct face *face_last
+    = FACE_OPT_FROM_ID (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
   unsigned long color = face ? face->foreground : FRAME_FOREGROUND_PIXEL (f);
   unsigned long color_first = (face_first
                               ? face_first->foreground
@@ -1505,7 +1507,7 @@ x_set_mouse_face_gc (struct glyph_string *s)
 
   /* What face has to be used last for the mouse face?  */
   face_id = MOUSE_HL_INFO (s->f)->mouse_face_face_id;
-  face = FACE_FROM_ID (s->f, face_id);
+  face = FACE_OPT_FROM_ID (s->f, face_id);
   if (face == NULL)
     face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
 
@@ -2156,6 +2158,7 @@ static const XColor *
 x_color_cells (Display *dpy, int *ncells)
 {
   struct x_display_info *dpyinfo = x_display_info_for_display (dpy);
+  eassume (dpyinfo);
 
   if (dpyinfo->color_cells == NULL)
     {
@@ -2352,17 +2355,19 @@ x_alloc_nearest_color_1 (Display *dpy, Colormap cmap, 
XColor *color)
          equal to a cached pixel color recorded earlier, there was a
          change in the colormap, so clear the color cache.  */
       struct x_display_info *dpyinfo = x_display_info_for_display (dpy);
-      XColor *cached_color;
+      eassume (dpyinfo);
 
-      if (dpyinfo->color_cells
-         && (cached_color = &dpyinfo->color_cells[color->pixel],
-             (cached_color->red != color->red
-              || cached_color->blue != color->blue
-              || cached_color->green != color->green)))
+      if (dpyinfo->color_cells)
        {
-         xfree (dpyinfo->color_cells);
-         dpyinfo->color_cells = NULL;
-         dpyinfo->ncolor_cells = 0;
+         XColor *cached_color = &dpyinfo->color_cells[color->pixel];
+         if (cached_color->red != color->red
+             || cached_color->blue != color->blue
+             || cached_color->green != color->green)
+           {
+             xfree (dpyinfo->color_cells);
+             dpyinfo->color_cells = NULL;
+             dpyinfo->ncolor_cells = 0;
+           }
        }
     }
 



reply via email to

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