diff options
author | Kim F. Storm <[email protected]> | 2004-06-21 21:51:18 +0000 |
---|---|---|
committer | Kim F. Storm <[email protected]> | 2004-06-21 21:51:18 +0000 |
commit | 79518a8dfa01f85d5be62523fcfcf6e8f5f642b1 (patch) | |
tree | 35dde1722d08cc34b6636e4cfcbcb3bdf8caa524 /src/lisp.h | |
parent | e6263643ad82b1ee84fe44273a7a5955ac062fe5 (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.h | 31 |
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 |