diff src/data.c @ 105885:8103235103a7

Let integers use up 2 tags to give them one extra bit and double their range. * lisp.h (USE_2_TAGS_FOR_INTS): New macro. (LISP_INT_TAG, case_Lisp_Int, LISP_STRING_TAG, LISP_INT_TAG_P): New macros. (enum Lisp_Type): Use them. Give explicit values. (Lisp_Type_Limit): Remove. (XINT, XUINT, make_number) [!USE_LISP_UNION_TYPE]: (MOST_NEGATIVE_FIXNUM, MOST_POSITIVE_FIXNUM, INTMASK): Pay attention to USE_2_TAGS_FOR_INTS. (INTEGERP): Use LISP_INT_TAG_P. * fns.c (internal_equal): Simplify the default case. (sxhash): Use case_Lisp_Int. * data.c (wrong_type_argument): Don't check against Lisp_Type_Limit any more. (Ftype_of): Use case_Lisp_Int. (store_symval_forwarding): Take into account the fact that Ints can now have more than one tag. * buffer.c (syms_of_buffer): Use LISP_INT_TAG. buffer_slot_type_mismatch): * xfaces.c (face_attr_equal_p): * print.c (print_object): * alloc.c (mark_maybe_object, mark_object, survives_gc_p): Use case_Lisp_Int.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 06 Nov 2009 18:47:48 +0000
parents 21bdda3ded62
children f2cea199b0c4
line wrap: on
line diff
--- a/src/data.c	Fri Nov 06 11:40:24 2009 +0000
+++ b/src/data.c	Fri Nov 06 18:47:48 2009 +0000
@@ -108,10 +108,12 @@
 wrong_type_argument (predicate, value)
      register Lisp_Object predicate, value;
 {
-  /* If VALUE is not even a valid Lisp object, abort here
-     where we can get a backtrace showing where it came from.  */
-  if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
-    abort ();
+  /* If VALUE is not even a valid Lisp object, we'd want to abort here
+     where we can get a backtrace showing where it came from.  We used
+     to try and do that by checking the tagbits, but nowadays all
+     tagbits are potentially valid.  */
+  /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
+   *   abort (); */
 
   xsignal2 (Qwrong_type_argument, predicate, value);
 }
@@ -184,7 +186,7 @@
 {
   switch (XTYPE (object))
     {
-    case Lisp_Int:
+    case_Lisp_Int:
       return Qinteger;
 
     case Lisp_Symbol:
@@ -975,8 +977,10 @@
 	    int offset = XBUFFER_OBJFWD (valcontents)->offset;
 	    Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
 
-	    if (! NILP (type) && ! NILP (newval)
-		&& XTYPE (newval) != XINT (type))
+	    if (!(NILP (type) || NILP (newval)
+		  || (XINT (type) == LISP_INT_TAG
+		      ? INTEGERP (newval)
+		      : XTYPE (newval) == XINT (type))))
 	      buffer_slot_type_mismatch (newval, XINT (type));
 
 	    if (buf == NULL)