[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/lisp.h [lexbind]
From: |
Miles Bader |
Subject: |
[Emacs-diffs] Changes to emacs/src/lisp.h [lexbind] |
Date: |
Tue, 06 Jul 2004 07:00:39 -0400 |
Index: emacs/src/lisp.h
diff -c emacs/src/lisp.h:1.423.2.16 emacs/src/lisp.h:1.423.2.17
*** emacs/src/lisp.h:1.423.2.16 Tue Jul 6 09:31:29 2004
--- emacs/src/lisp.h Tue Jul 6 10:20:31 2004
***************
*** 1203,1209 ****
{
int type : 16; /* = Lisp_Misc_Save_Value */
unsigned gcmarkbit : 1;
! int spacer : 15;
void *pointer;
int integer;
};
--- 1203,1212 ----
{
int type : 16; /* = Lisp_Misc_Save_Value */
unsigned gcmarkbit : 1;
! 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;
};
***************
*** 3253,3258 ****
--- 3256,3319 ----
: 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 ()
+
+ /* SAFE_ALLOCA allocates a simple buffer. */
+
+ #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)
+
+ /* SAFE_FREE frees xmalloced memory and enables GC as needed. */
+
+ #define SAFE_FREE(size) \
+ do { \
+ if ((size) >= MAX_ALLOCA) \
+ unbind_to (sa_count, Qnil); \
+ } 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 */
/* arch-tag: 9b2ed020-70eb-47ac-94ee-e1c2a5107d5e