diff options
| author | Kim F. Storm | 2004-06-21 21:51:18 +0000 |
|---|---|---|
| committer | Kim F. Storm | 2004-06-21 21:51:18 +0000 |
| commit | 79518a8dfa01f85d5be62523fcfcf6e8f5f642b1 (patch) | |
| tree | 35dde1722d08cc34b6636e4cfcbcb3bdf8caa524 /src | |
| parent | e6263643ad82b1ee84fe44273a7a5955ac062fe5 (diff) | |
| download | emacs-79518a8dfa01f85d5be62523fcfcf6e8f5f642b1.tar.gz emacs-79518a8dfa01f85d5be62523fcfcf6e8f5f642b1.zip | |
(MAX_ALLOCA): Define here.
(safe_alloca_unwind): Add prototype.
(USE_SAFE_ALLOCA, SAFE_ALLOCA, SAFE_FREE): New macros.
Diffstat (limited to 'src')
| -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 4ea0e52efb7..dc78e524213 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -3246,6 +3246,37 @@ extern Lisp_Object Vdirectory_sep_char; | |||
| 3246 | : Fcons ((el), (check))))) | 3246 | : Fcons ((el), (check))))) |
| 3247 | 3247 | ||
| 3248 | 3248 | ||
| 3249 | /* SAFE_ALLOCA normally allocates memory on the stack, but if size is | ||
| 3250 | larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack. */ | ||
| 3251 | |||
| 3252 | #define MAX_ALLOCA 16*1024 | ||
| 3253 | |||
| 3254 | extern Lisp_Object safe_alloca_unwind (Lisp_Object); | ||
| 3255 | |||
| 3256 | #define USE_SAFE_ALLOCA \ | ||
| 3257 | int sa_count = SPECPDL_INDEX () | ||
| 3258 | |||
| 3259 | #define SAFE_ALLOCA(buf, type, size) \ | ||
| 3260 | do { \ | ||
| 3261 | if ((size) < MAX_ALLOCA) \ | ||
| 3262 | buf = (type) alloca (size); \ | ||
| 3263 | else \ | ||
| 3264 | { \ | ||
| 3265 | buf = (type) xmalloc (size); \ | ||
| 3266 | record_unwind_protect (safe_alloca_unwind, \ | ||
| 3267 | make_save_value (buf, 0)); \ | ||
| 3268 | } \ | ||
| 3269 | } while (0) | ||
| 3270 | |||
| 3271 | #define SAFE_FREE(size) \ | ||
| 3272 | do { \ | ||
| 3273 | if ((size) >= MAX_ALLOCA) \ | ||
| 3274 | unbind_to (sa_count, Qnil); \ | ||
| 3275 | } while (0) | ||
| 3276 | |||
| 3277 | |||
| 3278 | |||
| 3279 | |||
| 3249 | #endif /* EMACS_LISP_H */ | 3280 | #endif /* EMACS_LISP_H */ |
| 3250 | 3281 | ||
| 3251 | /* arch-tag: 9b2ed020-70eb-47ac-94ee-e1c2a5107d5e | 3282 | /* arch-tag: 9b2ed020-70eb-47ac-94ee-e1c2a5107d5e |