changeset 56204:d79e58a67b48

(struct Lisp_Save_Value): New member dogc. (SAFE_ALLOCA_LISP): Change second arg to number of elements. Set dogc member in Lisp_Save_Value object so it will be GC'ed. (SAFE_FREE_LISP): New macro.
author Kim F. Storm <storm@cua.dk>
date Tue, 22 Jun 2004 13:57:18 +0000
parents 2bb92448ff94
children 307725d46543
files src/lisp.h
diffstat 1 files changed, 27 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lisp.h	Tue Jun 22 13:57:00 2004 +0000
+++ b/src/lisp.h	Tue Jun 22 13:57:18 2004 +0000
@@ -1199,7 +1199,10 @@
   {
     int type : 16;	/* = Lisp_Misc_Save_Value */
     unsigned gcmarkbit : 1;
-    int spacer : 15;
+    int spacer : 14;
+    /* If DOGC is set, POINTER is the address of a memory
+       area containing INTEGER potential Lisp_Objects.  */
+    unsigned int dogc : 1;
     void *pointer;
     int integer;
   };
@@ -3270,22 +3273,6 @@
       }							  \
   } while (0)
 
-/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects.
-   Temporarily inhibits GC since that array is unknow to GC.  */
-
-#define SAFE_ALLOCA_LISP(buf, size)			  \
-  do {							  \
-    if ((size) < MAX_ALLOCA)				  \
-      buf = (Lisp_Object *) alloca (size);		  \
-    else						  \
-      {							  \
-	buf = (Lisp_Object *) xmalloc (size);		  \
-	inhibit_garbage_collection();			  \
-	record_unwind_protect (safe_alloca_unwind,	  \
-			       make_save_value (buf, 0)); \
-      }							  \
-  } while (0)
-
 /* SAFE_FREE frees xmalloced memory and enables GC as needed.  */
 
 #define SAFE_FREE(size)			\
@@ -3295,6 +3282,29 @@
   } while (0)
 
 
+/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects.  */
+
+#define SAFE_ALLOCA_LISP(buf, nelt)			  \
+  do {							  \
+    int size_ = (nelt) * sizeof (Lisp_Object);		  \
+    if (size_ < MAX_ALLOCA)				  \
+      buf = (Lisp_Object *) alloca (size_);		  \
+    else						  \
+      {							  \
+	Lisp_Object arg_;				  \
+	buf = (Lisp_Object *) xmalloc (size_);		  \
+	arg_ = make_save_value (buf, nelt);		  \
+	XSAVE_VALUE (arg_)->dogc = 1;			  \
+	record_unwind_protect (safe_alloca_unwind, arg_); \
+      }							  \
+  } while (0)
+
+#define SAFE_FREE_LISP(nelt)				\
+  do {							\
+    if (((nelt) * sizeof (Lisp_Object)) >= MAX_ALLOCA)	\
+      unbind_to (sa_count, Qnil);			\
+  } while (0)
+
 
 
 #endif /* EMACS_LISP_H */