1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-06 20:00:46 -08:00

(pure_alloc): Corrected last change; now align the

pointer and adjust the size rather than aligning the size and
adjusting the pointer.  Use a goto to handle overflow exception.
This commit is contained in:
Kim F. Storm 2003-01-12 00:40:09 +00:00
parent 2c10f02917
commit 035261dccc

View file

@ -3833,39 +3833,42 @@ pure_alloc (size, type)
{
size_t nbytes;
POINTER_TYPE *result;
char *beg = purebeg;
char *beg;
again:
beg = purebeg;
result = (POINTER_TYPE *) (beg + pure_bytes_used);
nbytes = ALIGN (size, sizeof (EMACS_INT));
/* Give Lisp_Floats an extra alignment. */
if (type == Lisp_Float)
{
POINTER_TYPE *orig = result;
size_t alignment;
#if defined __GNUC__ && __GNUC__ >= 2
alignment = __alignof (struct Lisp_Float);
#else
alignment = sizeof (struct Lisp_Float);
#endif
/* Make sure beg + pure_bytes_used is correctly aligned for a
/* Make sure result is correctly aligned for a
Lisp_Float, which might need stricter alignment than
EMACS_INT. */
pure_bytes_used
= (ALIGN ((EMACS_UINT) (beg + pure_bytes_used), alignment)
- (EMACS_UINT) beg);
result = (POINTER_TYPE *)ALIGN((EMACS_UINT)result, alignment);
nbytes += (char *)result - (char *)orig;
}
nbytes = ALIGN (size, sizeof (EMACS_INT));
if (pure_bytes_used + nbytes > pure_size)
{
/* Don't allocate a large amount here,
because it might get mmap'd and then its address
might not be usable. */
beg = purebeg = (char *) xmalloc (10000);
purebeg = (char *) xmalloc (10000);
pure_size = 10000;
pure_bytes_used_before_overflow += pure_bytes_used;
pure_bytes_used = 0;
goto again;
}
result = (POINTER_TYPE *) (beg + pure_bytes_used);
pure_bytes_used += nbytes;
return result;
}