]> git.eshelyaron.com Git - emacs.git/commitdiff
(SAFE_ALLOCA_LISP): New macro to allocate Lisp_Objects.
authorKim F. Storm <storm@cua.dk>
Mon, 21 Jun 2004 22:35:29 +0000 (22:35 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 21 Jun 2004 22:35:29 +0000 (22:35 +0000)
Temporarily inhibits GC if memory is xmalloc'ed, as the Lisp_Objects
in that memory area are unknown to GC.  Add comments.

src/lisp.h

index dc78e52421398a1e517a4129e15ea43954ac59cb..c6e585e086332d5f8d79e5245614e0f786ba0172 100644 (file)
@@ -3256,6 +3256,8 @@ extern Lisp_Object safe_alloca_unwind (Lisp_Object);
 #define USE_SAFE_ALLOCA                        \
   int sa_count = SPECPDL_INDEX ()
 
+/* SAFE_ALLOCA allocates a simple buffer.  */
+
 #define SAFE_ALLOCA(buf, type, size)                     \
   do {                                                   \
     if ((size) < MAX_ALLOCA)                             \
@@ -3268,6 +3270,24 @@ extern Lisp_Object safe_alloca_unwind (Lisp_Object);
       }                                                          \
   } 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)                        \
   do {                                 \
     if ((size) >= MAX_ALLOCA)          \