]> git.eshelyaron.com Git - emacs.git/commitdiff
SCHARS and STRING_BYTES are nonnegative
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 5 Jun 2017 06:52:10 +0000 (23:52 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 5 Jun 2017 06:53:47 +0000 (23:53 -0700)
Tell the compiler that SCHARS and STRING_BYTES are nonnegative, in
the hopes that this will optimize a bit better.  Also, check this
at runtime if ENABLE_CHECKING.
* src/lisp.h (SCHARS, STRING_BYTES):
eassume that these functions return nonnegative values.
(STRING_SET_CHARS) [ENABLE_CHECKING]:
eassert that newsize is nonnegative.

src/lisp.h

index ce939fcee62eacf386e7e136670b40fa4ff14c6d..c35bd1f6df16ce18dec657cdb03536317adfa5e0 100644 (file)
@@ -1346,7 +1346,9 @@ SSET (Lisp_Object string, ptrdiff_t index, unsigned char new)
 INLINE ptrdiff_t
 SCHARS (Lisp_Object string)
 {
-  return XSTRING (string)->size;
+  ptrdiff_t nchars = XSTRING (string)->size;
+  eassume (0 <= nchars);
+  return nchars;
 }
 
 #ifdef GC_CHECK_STRING_BYTES
@@ -1356,10 +1358,12 @@ INLINE ptrdiff_t
 STRING_BYTES (struct Lisp_String *s)
 {
 #ifdef GC_CHECK_STRING_BYTES
-  return string_bytes (s);
+  ptrdiff_t nbytes = string_bytes (s);
 #else
-  return s->size_byte < 0 ? s->size : s->size_byte;
+  ptrdiff_t nbytes = s->size_byte < 0 ? s->size : s->size_byte;
 #endif
+  eassume (0 <= nbytes);
+  return nbytes;
 }
 
 INLINE ptrdiff_t
@@ -1373,7 +1377,7 @@ STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize)
   /* This function cannot change the size of data allocated for the
      string when it was created.  */
   eassert (STRING_MULTIBYTE (string)
-          ? newsize <= SBYTES (string)
+          ? 0 <= newsize && newsize <= SBYTES (string)
           : newsize == SCHARS (string));
   XSTRING (string)->size = newsize;
 }