]> git.eshelyaron.com Git - emacs.git/commitdiff
(OFFSETOF, PSEUDOVECSIZE): New macros.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 8 Apr 2006 14:15:04 +0000 (14:15 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 8 Apr 2006 14:15:04 +0000 (14:15 +0000)
src/lisp.h

index 2eaa098705747848349c71df2f0fd7d92f7611b5..56b5645b9dc189c4720a0061ee8cf91518b1551a 100644 (file)
@@ -702,6 +702,13 @@ struct Lisp_String
     unsigned char *data;
   };
 
+#ifdef offsetof
+#define OFFSETOF(type,field) offsetof(type,field)
+#else
+#define OFFSETOF(type,field) \
+  ((int)((char*)&((type*)0)->field - (char*)0))
+#endif
+
 /* If a struct is made to look like a vector, this macro returns the length
    of the shortest vector that would hold that struct.  */
 #define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
@@ -709,6 +716,13 @@ struct Lisp_String
                         + sizeof(Lisp_Object) - 1) /* round up */     \
                       / sizeof (Lisp_Object))
 
+/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
+   at the end and we need to compute the number of Lisp_Object fields (the
+   ones that the GC needs to trace).  */
+#define PSEUDOVECSIZE(type, nonlispfield) \
+  ((offsetof(type, nonlispfield) - offsetof(struct Lisp_Vector, contents[0])) \
+   / sizeof (Lisp_Object))
+
 struct Lisp_Vector
   {
     EMACS_INT size;