aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 0370c52fad6..1c98925fa8d 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -397,8 +397,16 @@ typedef EMACS_INT Lisp_Word;
397 (eassert (CONSP (a)), XUNTAG (a, Lisp_Cons, struct Lisp_Cons)) 397 (eassert (CONSP (a)), XUNTAG (a, Lisp_Cons, struct Lisp_Cons))
398#define lisp_h_XHASH(a) XUFIXNUM_RAW (a) 398#define lisp_h_XHASH(a) XUFIXNUM_RAW (a)
399#if USE_LSB_TAG 399#if USE_LSB_TAG
400# define lisp_h_make_fixnum(n) \ 400# define lisp_h_make_fixnum_wrap(n) \
401 XIL ((EMACS_INT) (((EMACS_UINT) (n) << INTTYPEBITS) + Lisp_Int0)) 401 XIL ((EMACS_INT) (((EMACS_UINT) (n) << INTTYPEBITS) + Lisp_Int0))
402# if defined HAVE_STATEMENT_EXPRESSIONS && defined HAVE_TYPEOF
403# define lisp_h_make_fixnum(n) \
404 ({ typeof (n) lisp_h_make_fixnum_n = n; \
405 eassert (!FIXNUM_OVERFLOW_P (lisp_h_make_fixnum_n)); \
406 lisp_h_make_fixnum_wrap (lisp_h_make_fixnum_n); })
407# else
408# define lisp_h_make_fixnum(n) lisp_h_make_fixnum_wrap (n)
409# endif
402# define lisp_h_XFIXNUM_RAW(a) (XLI (a) >> INTTYPEBITS) 410# define lisp_h_XFIXNUM_RAW(a) (XLI (a) >> INTTYPEBITS)
403# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK)) 411# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
404#endif 412#endif
@@ -1125,12 +1133,18 @@ enum More_Lisp_Bits
1125#define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS) 1133#define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS)
1126#define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM) 1134#define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
1127 1135
1136/* True if the possibly-unsigned integer I doesn't fit in a fixnum. */
1137
1138#define FIXNUM_OVERFLOW_P(i) \
1139 (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM))
1140
1128#if USE_LSB_TAG 1141#if USE_LSB_TAG
1129 1142
1130INLINE Lisp_Object 1143INLINE Lisp_Object
1131(make_fixnum) (EMACS_INT n) 1144(make_fixnum) (EMACS_INT n)
1132{ 1145{
1133 return lisp_h_make_fixnum (n); 1146 eassert (!FIXNUM_OVERFLOW_P (n));
1147 return lisp_h_make_fixnum_wrap (n);
1134} 1148}
1135 1149
1136INLINE EMACS_INT 1150INLINE EMACS_INT
@@ -1139,6 +1153,13 @@ INLINE EMACS_INT
1139 return lisp_h_XFIXNUM_RAW (a); 1153 return lisp_h_XFIXNUM_RAW (a);
1140} 1154}
1141 1155
1156INLINE Lisp_Object
1157make_ufixnum (EMACS_INT n)
1158{
1159 eassert (0 <= n && n <= INTMASK);
1160 return lisp_h_make_fixnum_wrap (n);
1161}
1162
1142#else /* ! USE_LSB_TAG */ 1163#else /* ! USE_LSB_TAG */
1143 1164
1144/* Although compiled only if ! USE_LSB_TAG, the following functions 1165/* Although compiled only if ! USE_LSB_TAG, the following functions
@@ -1149,6 +1170,7 @@ INLINE EMACS_INT
1149INLINE Lisp_Object 1170INLINE Lisp_Object
1150make_fixnum (EMACS_INT n) 1171make_fixnum (EMACS_INT n)
1151{ 1172{
1173 eassert (! FIXNUM_OVERFLOW_P (n));
1152 EMACS_INT int0 = Lisp_Int0; 1174 EMACS_INT int0 = Lisp_Int0;
1153 if (USE_LSB_TAG) 1175 if (USE_LSB_TAG)
1154 { 1176 {
@@ -1179,6 +1201,22 @@ XFIXNUM_RAW (Lisp_Object a)
1179 return i >> INTTYPEBITS; 1201 return i >> INTTYPEBITS;
1180} 1202}
1181 1203
1204INLINE Lisp_Object
1205make_ufixnum (EMACS_INT n)
1206{
1207 eassert (0 <= n && n <= INTMASK);
1208 EMACS_INT int0 = Lisp_Int0;
1209 if (USE_LSB_TAG)
1210 {
1211 EMACS_UINT u = n;
1212 n = u << INTTYPEBITS;
1213 n += int0;
1214 }
1215 else
1216 n += int0 << VALBITS;
1217 return XIL (n);
1218}
1219
1182#endif /* ! USE_LSB_TAG */ 1220#endif /* ! USE_LSB_TAG */
1183 1221
1184INLINE bool 1222INLINE bool
@@ -1232,11 +1270,6 @@ INLINE bool
1232 return lisp_h_EQ (x, y); 1270 return lisp_h_EQ (x, y);
1233} 1271}
1234 1272
1235/* True if the possibly-unsigned integer I doesn't fit in a fixnum. */
1236
1237#define FIXNUM_OVERFLOW_P(i) \
1238 (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM))
1239
1240INLINE intmax_t 1273INLINE intmax_t
1241clip_to_bounds (intmax_t lower, intmax_t num, intmax_t upper) 1274clip_to_bounds (intmax_t lower, intmax_t num, intmax_t upper)
1242{ 1275{