aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
authorKim F. Storm <[email protected]>2004-06-21 21:51:18 +0000
committerKim F. Storm <[email protected]>2004-06-21 21:51:18 +0000
commit79518a8dfa01f85d5be62523fcfcf6e8f5f642b1 (patch)
tree35dde1722d08cc34b6636e4cfcbcb3bdf8caa524 /src/lisp.h
parente6263643ad82b1ee84fe44273a7a5955ac062fe5 (diff)
(MAX_ALLOCA): Define here.
(safe_alloca_unwind): Add prototype. (USE_SAFE_ALLOCA, SAFE_ALLOCA, SAFE_FREE): New macros.
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 4ea0e52efb..dc78e52421 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3246,6 +3246,37 @@ extern Lisp_Object Vdirectory_sep_char;
: Fcons ((el), (check)))))
+/* SAFE_ALLOCA normally allocates memory on the stack, but if size is
+ larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack. */
+
+#define MAX_ALLOCA 16*1024
+
+extern Lisp_Object safe_alloca_unwind (Lisp_Object);
+
+#define USE_SAFE_ALLOCA \
+ int sa_count = SPECPDL_INDEX ()
+
+#define SAFE_ALLOCA(buf, type, size) \
+ do { \
+ if ((size) < MAX_ALLOCA) \
+ buf = (type) alloca (size); \
+ else \
+ { \
+ buf = (type) xmalloc (size); \
+ record_unwind_protect (safe_alloca_unwind, \
+ make_save_value (buf, 0)); \
+ } \
+ } while (0)
+
+#define SAFE_FREE(size) \
+ do { \
+ if ((size) >= MAX_ALLOCA) \
+ unbind_to (sa_count, Qnil); \
+ } while (0)
+
+
+
+
#endif /* EMACS_LISP_H */
/* arch-tag: 9b2ed020-70eb-47ac-94ee-e1c2a5107d5e