aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 3795795c49a..21f652b81ac 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4496,12 +4496,15 @@ enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
4496extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1)); 4496extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
4497 4497
4498#define USE_SAFE_ALLOCA \ 4498#define USE_SAFE_ALLOCA \
4499 ptrdiff_t sa_avail = MAX_ALLOCA; \
4499 ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false 4500 ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false
4500 4501
4502#define AVAIL_ALLOCA(size) (sa_avail -= (size), alloca (size))
4503
4501/* SAFE_ALLOCA allocates a simple buffer. */ 4504/* SAFE_ALLOCA allocates a simple buffer. */
4502 4505
4503#define SAFE_ALLOCA(size) ((size) <= MAX_ALLOCA \ 4506#define SAFE_ALLOCA(size) ((size) <= sa_avail \
4504 ? alloca (size) \ 4507 ? AVAIL_ALLOCA (size) \
4505 : (sa_must_free = true, record_xmalloc (size))) 4508 : (sa_must_free = true, record_xmalloc (size)))
4506 4509
4507/* SAFE_NALLOCA sets BUF to a newly allocated array of MULTIPLIER * 4510/* SAFE_NALLOCA sets BUF to a newly allocated array of MULTIPLIER *
@@ -4510,8 +4513,8 @@ extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
4510 4513
4511#define SAFE_NALLOCA(buf, multiplier, nitems) \ 4514#define SAFE_NALLOCA(buf, multiplier, nitems) \
4512 do { \ 4515 do { \
4513 if ((nitems) <= MAX_ALLOCA / sizeof *(buf) / (multiplier)) \ 4516 if ((nitems) <= sa_avail / sizeof *(buf) / (multiplier)) \
4514 (buf) = alloca (sizeof *(buf) * (multiplier) * (nitems)); \ 4517 (buf) = AVAIL_ALLOCA (sizeof *(buf) * (multiplier) * (nitems)); \
4515 else \ 4518 else \
4516 { \ 4519 { \
4517 (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \ 4520 (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \
@@ -4543,8 +4546,8 @@ extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
4543 4546
4544#define SAFE_ALLOCA_LISP(buf, nelt) \ 4547#define SAFE_ALLOCA_LISP(buf, nelt) \
4545 do { \ 4548 do { \
4546 if ((nelt) <= MAX_ALLOCA / word_size) \ 4549 if ((nelt) <= sa_avail / word_size) \
4547 (buf) = alloca ((nelt) * word_size); \ 4550 (buf) = AVAIL_ALLOCA ((nelt) * word_size); \
4548 else if ((nelt) <= min (PTRDIFF_MAX, SIZE_MAX) / word_size) \ 4551 else if ((nelt) <= min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
4549 { \ 4552 { \
4550 Lisp_Object arg_; \ 4553 Lisp_Object arg_; \