diff options
author | Kim F. Storm <storm@cua.dk> | 2004-06-22 13:57:18 +0000 |
---|---|---|
committer | Kim F. Storm <storm@cua.dk> | 2004-06-22 13:57:18 +0000 |
commit | 5f5d6c621aadccb1ecb74e41f5c3c9267d55f928 (patch) | |
tree | 2a6852a4151f970eb2b842d4b8fd1426730df171 | |
parent | 7b4cd44a019f6dc8f6da54e23a1fbfb2354c721b (diff) | |
download | emacs-5f5d6c621aadccb1ecb74e41f5c3c9267d55f928.tar.gz |
(struct Lisp_Save_Value): New member dogc.
(SAFE_ALLOCA_LISP): Change second arg to number of elements.
Set dogc member in Lisp_Save_Value object so it will be GC'ed.
(SAFE_FREE_LISP): New macro.
-rw-r--r-- | src/lisp.h | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/lisp.h b/src/lisp.h index c6e585e0863..bc55761c9dc 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1199,7 +1199,10 @@ struct Lisp_Save_Value { int type : 16; /* = Lisp_Misc_Save_Value */ unsigned gcmarkbit : 1; - int spacer : 15; + int spacer : 14; + /* If DOGC is set, POINTER is the address of a memory + area containing INTEGER potential Lisp_Objects. */ + unsigned int dogc : 1; void *pointer; int integer; }; @@ -3270,22 +3273,6 @@ 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) \ @@ -3295,6 +3282,29 @@ extern Lisp_Object safe_alloca_unwind (Lisp_Object); } while (0) +/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects. */ + +#define SAFE_ALLOCA_LISP(buf, nelt) \ + do { \ + int size_ = (nelt) * sizeof (Lisp_Object); \ + if (size_ < MAX_ALLOCA) \ + buf = (Lisp_Object *) alloca (size_); \ + else \ + { \ + Lisp_Object arg_; \ + buf = (Lisp_Object *) xmalloc (size_); \ + arg_ = make_save_value (buf, nelt); \ + XSAVE_VALUE (arg_)->dogc = 1; \ + record_unwind_protect (safe_alloca_unwind, arg_); \ + } \ + } while (0) + +#define SAFE_FREE_LISP(nelt) \ + do { \ + if (((nelt) * sizeof (Lisp_Object)) >= MAX_ALLOCA) \ + unbind_to (sa_count, Qnil); \ + } while (0) + #endif /* EMACS_LISP_H */ |