diff options
| author | Paul Eggert | 2015-10-13 23:09:43 -0700 |
|---|---|---|
| committer | Paul Eggert | 2015-10-13 23:10:14 -0700 |
| commit | 2cc412cdc2635ecb99129271abe94bdd744742c2 (patch) | |
| tree | 34064c89c867882aa3c5f285b1f638c40d82cf3b | |
| parent | 3fa424ca48f4f48a40a514153726758b6ed47892 (diff) | |
| download | emacs-2cc412cdc2635ecb99129271abe94bdd744742c2.tar.gz emacs-2cc412cdc2635ecb99129271abe94bdd744742c2.zip | |
Take XPNTR private
* src/alloc.c (PURE_POINTER_P): Remove.
All uses replaced with PURE_P.
(XPNTR_OR_SYMBOL_OFFSET): New function.
(XPNTR): Move here from lisp.h.
Reimplement in terms of XPNTR_OR_SYMBOL_OFFSET.
(mark_maybe_object, valid_lisp_object_p, survives_gc_p):
Remove unnecessary cast.
(purecopy): Use XPNTR_OR_SYMBOL_OFFSET instead of XPNTR,
to avoid an unnecessary runtime test for symbols.
* src/lisp.h (lisp_h_XPNTR, XPNTR): Remove, moving XPNTR to alloc.c.
Only alloc.c needs XPNTR now.
| -rw-r--r-- | src/alloc.c | 59 | ||||
| -rw-r--r-- | src/lisp.h | 6 |
2 files changed, 35 insertions, 30 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 | ||
diff --git a/src/lisp.h b/src/lisp.h index 2d6661787cf..12e00f1f25b 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -351,8 +351,6 @@ error !; | |||
| 351 | #define lisp_h_XCONS(a) \ | 351 | #define lisp_h_XCONS(a) \ |
| 352 | (eassert (CONSP (a)), (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons)) | 352 | (eassert (CONSP (a)), (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons)) |
| 353 | #define lisp_h_XHASH(a) XUINT (a) | 353 | #define lisp_h_XHASH(a) XUINT (a) |
| 354 | #define lisp_h_XPNTR(a) \ | ||
| 355 | (SYMBOLP (a) ? XSYMBOL (a) : (void *) ((intptr_t) (XLI (a) & VALMASK))) | ||
| 356 | #ifndef GC_CHECK_CONS_LIST | 354 | #ifndef GC_CHECK_CONS_LIST |
| 357 | # define lisp_h_check_cons_list() ((void) 0) | 355 | # define lisp_h_check_cons_list() ((void) 0) |
| 358 | #endif | 356 | #endif |
| @@ -397,7 +395,6 @@ error !; | |||
| 397 | # define XCDR(c) lisp_h_XCDR (c) | 395 | # define XCDR(c) lisp_h_XCDR (c) |
| 398 | # define XCONS(a) lisp_h_XCONS (a) | 396 | # define XCONS(a) lisp_h_XCONS (a) |
| 399 | # define XHASH(a) lisp_h_XHASH (a) | 397 | # define XHASH(a) lisp_h_XHASH (a) |
| 400 | # define XPNTR(a) lisp_h_XPNTR (a) | ||
| 401 | # ifndef GC_CHECK_CONS_LIST | 398 | # ifndef GC_CHECK_CONS_LIST |
| 402 | # define check_cons_list() lisp_h_check_cons_list () | 399 | # define check_cons_list() lisp_h_check_cons_list () |
| 403 | # endif | 400 | # endif |
| @@ -916,9 +913,6 @@ XUNTAG (Lisp_Object a, int type) | |||
| 916 | 913 | ||
| 917 | #endif /* ! USE_LSB_TAG */ | 914 | #endif /* ! USE_LSB_TAG */ |
| 918 | 915 | ||
| 919 | /* Extract the pointer hidden within A. */ | ||
| 920 | LISP_MACRO_DEFUN (XPNTR, void *, (Lisp_Object a), (a)) | ||
| 921 | |||
| 922 | /* Extract A's value as an unsigned integer. */ | 916 | /* Extract A's value as an unsigned integer. */ |
| 923 | INLINE EMACS_UINT | 917 | INLINE EMACS_UINT |
| 924 | XUINT (Lisp_Object a) | 918 | XUINT (Lisp_Object a) |