diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/src/alloc.c b/src/alloc.c index 5fc40d13b8d..f08a35074c7 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -179,11 +179,6 @@ static ptrdiff_t pure_size; | |||
| 179 | 179 | ||
| 180 | static ptrdiff_t pure_bytes_used_before_overflow; | 180 | static ptrdiff_t pure_bytes_used_before_overflow; |
| 181 | 181 | ||
| 182 | /* True if P points into pure space. */ | ||
| 183 | |||
| 184 | #define PURE_POINTER_P(P) \ | ||
| 185 | ((uintptr_t) (P) - (uintptr_t) purebeg <= pure_size) | ||
| 186 | |||
| 187 | /* Index in pure at which next pure Lisp object will be allocated.. */ | 182 | /* Index in pure at which next pure Lisp object will be allocated.. */ |
| 188 | 183 | ||
| 189 | static ptrdiff_t pure_bytes_used_lisp; | 184 | static ptrdiff_t pure_bytes_used_lisp; |
| @@ -406,6 +401,28 @@ ALIGN (void *ptr, int alignment) | |||
| 406 | return (void *) ROUNDUP ((uintptr_t) ptr, alignment); | 401 | return (void *) ROUNDUP ((uintptr_t) ptr, alignment); |
| 407 | } | 402 | } |
| 408 | 403 | ||
| 404 | /* Extract the pointer hidden within A, if A is not a symbol. | ||
| 405 | If A is a symbol, extract the hidden pointer's offset from lispsym, | ||
| 406 | converted to void *. */ | ||
| 407 | |||
| 408 | static void * | ||
| 409 | XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a) | ||
| 410 | { | ||
| 411 | intptr_t i = USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK; | ||
| 412 | return (void *) i; | ||
| 413 | } | ||
| 414 | |||
| 415 | /* Extract the pointer hidden within A. */ | ||
| 416 | |||
| 417 | static void * | ||
| 418 | XPNTR (Lisp_Object a) | ||
| 419 | { | ||
| 420 | void *p = XPNTR_OR_SYMBOL_OFFSET (a); | ||
| 421 | if (SYMBOLP (a)) | ||
| 422 | p = (intptr_t) p + (char *) lispsym; | ||
| 423 | return p; | ||
| 424 | } | ||
| 425 | |||
| 409 | static void | 426 | static void |
| 410 | XFLOAT_INIT (Lisp_Object f, double n) | 427 | XFLOAT_INIT (Lisp_Object f, double n) |
| 411 | { | 428 | { |
| @@ -1587,9 +1604,7 @@ string_bytes (struct Lisp_String *s) | |||
| 1587 | ptrdiff_t nbytes = | 1604 | ptrdiff_t nbytes = |
| 1588 | (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte); | 1605 | (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte); |
| 1589 | 1606 | ||
| 1590 | if (!PURE_POINTER_P (s) | 1607 | if (!PURE_P (s) && s->data && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s))) |
| 1591 | && s->data | ||
| 1592 | && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s))) | ||
| 1593 | emacs_abort (); | 1608 | emacs_abort (); |
| 1594 | return nbytes; | 1609 | return nbytes; |
| 1595 | } | 1610 | } |
| @@ -4463,9 +4478,6 @@ live_buffer_p (struct mem_node *m, void *p) | |||
| 4463 | static void | 4478 | static void |
| 4464 | mark_maybe_object (Lisp_Object obj) | 4479 | mark_maybe_object (Lisp_Object obj) |
| 4465 | { | 4480 | { |
| 4466 | void *po; | ||
| 4467 | struct mem_node *m; | ||
| 4468 | |||
| 4469 | #if USE_VALGRIND | 4481 | #if USE_VALGRIND |
| 4470 | if (valgrind_p) | 4482 | if (valgrind_p) |
| 4471 | VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj)); | 4483 | VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj)); |
| @@ -4474,12 +4486,12 @@ mark_maybe_object (Lisp_Object obj) | |||
| 4474 | if (INTEGERP (obj)) | 4486 | if (INTEGERP (obj)) |
| 4475 | return; | 4487 | return; |
| 4476 | 4488 | ||
| 4477 | po = (void *) XPNTR (obj); | 4489 | void *po = XPNTR (obj); |
| 4478 | m = mem_find (po); | 4490 | struct mem_node *m = mem_find (po); |
| 4479 | 4491 | ||
| 4480 | if (m != MEM_NIL) | 4492 | if (m != MEM_NIL) |
| 4481 | { | 4493 | { |
| 4482 | bool mark_p = 0; | 4494 | bool mark_p = false; |
| 4483 | 4495 | ||
| 4484 | switch (XTYPE (obj)) | 4496 | switch (XTYPE (obj)) |
| 4485 | { | 4497 | { |
| @@ -4860,14 +4872,11 @@ valid_pointer_p (void *p) | |||
| 4860 | int | 4872 | int |
| 4861 | valid_lisp_object_p (Lisp_Object obj) | 4873 | valid_lisp_object_p (Lisp_Object obj) |
| 4862 | { | 4874 | { |
| 4863 | void *p; | ||
| 4864 | struct mem_node *m; | ||
| 4865 | |||
| 4866 | if (INTEGERP (obj)) | 4875 | if (INTEGERP (obj)) |
| 4867 | return 1; | 4876 | return 1; |
| 4868 | 4877 | ||
| 4869 | p = (void *) XPNTR (obj); | 4878 | void *p = XPNTR (obj); |
| 4870 | if (PURE_POINTER_P (p)) | 4879 | if (PURE_P (p)) |
| 4871 | return 1; | 4880 | return 1; |
| 4872 | 4881 | ||
| 4873 | if (SYMBOLP (obj) && c_symbol_p (p)) | 4882 | if (SYMBOLP (obj) && c_symbol_p (p)) |
| @@ -4876,7 +4885,7 @@ valid_lisp_object_p (Lisp_Object obj) | |||
| 4876 | if (p == &buffer_defaults || p == &buffer_local_symbols) | 4885 | if (p == &buffer_defaults || p == &buffer_local_symbols) |
| 4877 | return 2; | 4886 | return 2; |
| 4878 | 4887 | ||
| 4879 | m = mem_find (p); | 4888 | struct mem_node *m = mem_find (p); |
| 4880 | 4889 | ||
| 4881 | if (m == MEM_NIL) | 4890 | if (m == MEM_NIL) |
| 4882 | { | 4891 | { |
| @@ -5155,7 +5164,9 @@ Does not copy symbols. Copies strings without text properties. */) | |||
| 5155 | static Lisp_Object | 5164 | static Lisp_Object |
| 5156 | purecopy (Lisp_Object obj) | 5165 | purecopy (Lisp_Object obj) |
| 5157 | { | 5166 | { |
| 5158 | if (PURE_POINTER_P (XPNTR (obj)) || INTEGERP (obj) || SUBRP (obj)) | 5167 | if (INTEGERP (obj) |
| 5168 | || (! SYMBOLP (obj) && PURE_P (XPNTR_OR_SYMBOL_OFFSET (obj))) | ||
| 5169 | || SUBRP (obj)) | ||
| 5159 | return obj; /* Already pure. */ | 5170 | return obj; /* Already pure. */ |
| 5160 | 5171 | ||
| 5161 | if (STRINGP (obj) && XSTRING (obj)->intervals) | 5172 | if (STRINGP (obj) && XSTRING (obj)->intervals) |
| @@ -5976,7 +5987,7 @@ mark_object (Lisp_Object arg) | |||
| 5976 | loop: | 5987 | loop: |
| 5977 | 5988 | ||
| 5978 | po = XPNTR (obj); | 5989 | po = XPNTR (obj); |
| 5979 | if (PURE_POINTER_P (po)) | 5990 | if (PURE_P (po)) |
| 5980 | return; | 5991 | return; |
| 5981 | 5992 | ||
| 5982 | last_marked[last_marked_index++] = obj; | 5993 | last_marked[last_marked_index++] = obj; |
| @@ -6213,7 +6224,7 @@ mark_object (Lisp_Object arg) | |||
| 6213 | break; | 6224 | break; |
| 6214 | default: emacs_abort (); | 6225 | default: emacs_abort (); |
| 6215 | } | 6226 | } |
| 6216 | if (!PURE_POINTER_P (XSTRING (ptr->name))) | 6227 | if (!PURE_P (XSTRING (ptr->name))) |
| 6217 | MARK_STRING (XSTRING (ptr->name)); | 6228 | MARK_STRING (XSTRING (ptr->name)); |
| 6218 | MARK_INTERVAL_TREE (string_intervals (ptr->name)); | 6229 | MARK_INTERVAL_TREE (string_intervals (ptr->name)); |
| 6219 | /* Inner loop to mark next symbol in this bucket, if any. */ | 6230 | /* Inner loop to mark next symbol in this bucket, if any. */ |
| @@ -6360,7 +6371,7 @@ survives_gc_p (Lisp_Object obj) | |||
| 6360 | emacs_abort (); | 6371 | emacs_abort (); |
| 6361 | } | 6372 | } |
| 6362 | 6373 | ||
| 6363 | return survives_p || PURE_POINTER_P ((void *) XPNTR (obj)); | 6374 | return survives_p || PURE_P (XPNTR (obj)); |
| 6364 | } | 6375 | } |
| 6365 | 6376 | ||
| 6366 | 6377 | ||