diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/alloc.c b/src/alloc.c index 47885c67534..f19c2328899 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -3833,39 +3833,42 @@ pure_alloc (size, type) | |||
| 3833 | { | 3833 | { |
| 3834 | size_t nbytes; | 3834 | size_t nbytes; |
| 3835 | POINTER_TYPE *result; | 3835 | POINTER_TYPE *result; |
| 3836 | char *beg = purebeg; | 3836 | char *beg; |
| 3837 | |||
| 3838 | again: | ||
| 3839 | beg = purebeg; | ||
| 3840 | result = (POINTER_TYPE *) (beg + pure_bytes_used); | ||
| 3841 | nbytes = ALIGN (size, sizeof (EMACS_INT)); | ||
| 3837 | 3842 | ||
| 3838 | /* Give Lisp_Floats an extra alignment. */ | 3843 | /* Give Lisp_Floats an extra alignment. */ |
| 3839 | if (type == Lisp_Float) | 3844 | if (type == Lisp_Float) |
| 3840 | { | 3845 | { |
| 3846 | POINTER_TYPE *orig = result; | ||
| 3841 | size_t alignment; | 3847 | size_t alignment; |
| 3842 | #if defined __GNUC__ && __GNUC__ >= 2 | 3848 | #if defined __GNUC__ && __GNUC__ >= 2 |
| 3843 | alignment = __alignof (struct Lisp_Float); | 3849 | alignment = __alignof (struct Lisp_Float); |
| 3844 | #else | 3850 | #else |
| 3845 | alignment = sizeof (struct Lisp_Float); | 3851 | alignment = sizeof (struct Lisp_Float); |
| 3846 | #endif | 3852 | #endif |
| 3847 | /* Make sure beg + pure_bytes_used is correctly aligned for a | 3853 | /* Make sure result is correctly aligned for a |
| 3848 | Lisp_Float, which might need stricter alignment than | 3854 | Lisp_Float, which might need stricter alignment than |
| 3849 | EMACS_INT. */ | 3855 | EMACS_INT. */ |
| 3850 | pure_bytes_used | 3856 | result = (POINTER_TYPE *)ALIGN((EMACS_UINT)result, alignment); |
| 3851 | = (ALIGN ((EMACS_UINT) (beg + pure_bytes_used), alignment) | 3857 | nbytes += (char *)result - (char *)orig; |
| 3852 | - (EMACS_UINT) beg); | ||
| 3853 | } | 3858 | } |
| 3854 | 3859 | ||
| 3855 | nbytes = ALIGN (size, sizeof (EMACS_INT)); | ||
| 3856 | |||
| 3857 | if (pure_bytes_used + nbytes > pure_size) | 3860 | if (pure_bytes_used + nbytes > pure_size) |
| 3858 | { | 3861 | { |
| 3859 | /* Don't allocate a large amount here, | 3862 | /* Don't allocate a large amount here, |
| 3860 | because it might get mmap'd and then its address | 3863 | because it might get mmap'd and then its address |
| 3861 | might not be usable. */ | 3864 | might not be usable. */ |
| 3862 | beg = purebeg = (char *) xmalloc (10000); | 3865 | purebeg = (char *) xmalloc (10000); |
| 3863 | pure_size = 10000; | 3866 | pure_size = 10000; |
| 3864 | pure_bytes_used_before_overflow += pure_bytes_used; | 3867 | pure_bytes_used_before_overflow += pure_bytes_used; |
| 3865 | pure_bytes_used = 0; | 3868 | pure_bytes_used = 0; |
| 3869 | goto again; | ||
| 3866 | } | 3870 | } |
| 3867 | 3871 | ||
| 3868 | result = (POINTER_TYPE *) (beg + pure_bytes_used); | ||
| 3869 | pure_bytes_used += nbytes; | 3872 | pure_bytes_used += nbytes; |
| 3870 | return result; | 3873 | return result; |
| 3871 | } | 3874 | } |