]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid casting -1 to possibly-unsigned enum
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 4 Sep 2019 00:34:08 +0000 (17:34 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 4 Sep 2019 00:34:50 +0000 (17:34 -0700)
* src/alloc.c (mark_maybe_pointer):
* src/pdumper.h (pdumper_object_p_precise):
Use pdumper_valid_object_type_p.
* src/pdumper.c (pdumper_find_object_type_impl):
* src/pdumper.h (pdumper_find_object_type):
Return int, not enum Lisp_Type.  All callers changed.
* src/pdumper.h (PDUMPER_NO_OBJECT): Do not cast -1 to enum
Lisp_Type; in theory, C18 says this could yield 7, which would
mean PDUMPER_NO_OBJECT == Lisp_Float (!).
(pdumper_valid_object_type_p): New function.

src/alloc.c
src/pdumper.c
src/pdumper.h

index 5f8ef0a5dda83e56c5b2e43ebcab52247a474db5..089f61f8339e2825f8ffd49599c68dea201fc05e 100644 (file)
@@ -4617,11 +4617,11 @@ mark_maybe_pointer (void *p)
 
   if (pdumper_object_p (p))
     {
-      enum Lisp_Type type = pdumper_find_object_type (p);
-      if (type != PDUMPER_NO_OBJECT)
-        mark_object ((type == Lisp_Symbol)
-                     ? make_lisp_symbol(p)
-                     : make_lisp_ptr(p, type));
+      int type = pdumper_find_object_type (p);
+      if (pdumper_valid_object_type_p (type))
+        mark_object (type == Lisp_Symbol
+                     ? make_lisp_symbol (p)
+                     : make_lisp_ptr (p, type));
       /* See mark_maybe_object for why we can confidently return.  */
       return;
     }
index 5e70e20431c428bcc2bbbf03e963d7f198ab287d..f9c31d125a41ddb8c72f2bf0b7240f853fc4feba 100644 (file)
@@ -5057,7 +5057,7 @@ pdumper_cold_object_p_impl (const void *obj)
   return offset >= dump_private.header.cold_start;
 }
 
-enum Lisp_Type
+int
 pdumper_find_object_type_impl (const void *obj)
 {
   eassert (pdumper_object_p (obj));
@@ -5067,7 +5067,7 @@ pdumper_find_object_type_impl (const void *obj)
   const struct dump_reloc *reloc =
     dump_find_relocation (&dump_private.header.object_starts, offset);
   return (reloc != NULL && dump_reloc_get_offset (*reloc) == offset)
-    ? (enum Lisp_Type) reloc->type
+    ? reloc->type
     : PDUMPER_NO_OBJECT;
 }
 
index 5d1e9c3aea318439d86cd50521a2ec5bf1bcfe9f..83c094f3caa7eafd3e4cbcf0d0bd23d76693792c 100644 (file)
@@ -24,7 +24,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 INLINE_HEADER_BEGIN
 
-#define PDUMPER_NO_OBJECT ((enum Lisp_Type) -1)
+enum { PDUMPER_NO_OBJECT = -1 };
 
 /* Indicate in source code that we're deliberately relying on pdumper
    not preserving the given value.  Compiles to nothing --- for humans
@@ -170,12 +170,12 @@ pdumper_cold_object_p (const void *obj)
 }
 
 
-extern enum Lisp_Type pdumper_find_object_type_impl (const void *obj);
+extern int pdumper_find_object_type_impl (const void *obj);
 
 /* Return the type of the dumped object that starts at OBJ.  It is a
    programming error to call this routine for an OBJ for which
    pdumper_object_p would return false.  */
-INLINE _GL_ATTRIBUTE_CONST enum Lisp_Type
+INLINE _GL_ATTRIBUTE_CONST int
 pdumper_find_object_type (const void *obj)
 {
 #ifdef HAVE_PDUMPER
@@ -186,6 +186,14 @@ pdumper_find_object_type (const void *obj)
 #endif
 }
 
+/* Return true if TYPE is that of a Lisp object.
+   PDUMPER_NO_OBJECT is invalid.  */
+INLINE bool
+pdumper_valid_object_type_p (int type)
+{
+  return 0 <= type;
+}
+
 /* Return whether OBJ points exactly to the start of some object in
    the loaded dump image.  It is a programming error to call this
    routine for an OBJ for which pdumper_object_p would return
@@ -194,7 +202,7 @@ INLINE _GL_ATTRIBUTE_CONST bool
 pdumper_object_p_precise (const void *obj)
 {
 #ifdef HAVE_PDUMPER
-  return pdumper_find_object_type (obj) != PDUMPER_NO_OBJECT;
+  return pdumper_valid_object_type_p (pdumper_find_object_type (obj));
 #else
   (void) obj;
   emacs_abort ();