diff options
| author | Paul Eggert | 2017-12-12 12:59:57 -0800 |
|---|---|---|
| committer | Paul Eggert | 2017-12-12 15:17:12 -0800 |
| commit | 244346c744a6700d320a0a0fe8c796be3b3ff023 (patch) | |
| tree | 145dc0ba87fcf82de44e62ecbdeb70fe86c28c7a /src/alloc.c | |
| parent | c705f7250d6f17f1682ee5ad7eec516dbf6c3916 (diff) | |
| download | emacs-244346c744a6700d320a0a0fe8c796be3b3ff023.tar.gz emacs-244346c744a6700d320a0a0fe8c796be3b3ff023.zip | |
Reimplement Lisp_Object as pointer-to-incomplete
This makes Lisp_Object values opaque pointers instead of integers,
which helps avoid the same sort of typos that
CHECK_LISP_OBJECT_TYPE helps to avoid, without having to wrap
pointers inside structures. This also looks forward to supporting
-fcheck-pointer-bounds.
* etc/DEBUG:
* src/.gdbinit (Lisp_Object_Printer.to_string):
Lisp_Object can be a pointer type now.
* src/alloc.c (macro_XPNTR, XPNTR):
* src/emacs-module.c (value_to_lisp_bits, lisp_to_value_bits):
* src/lisp.h (lisp_h_XLI, lisp_h_XIL):
(lisp_h_XUNTAG) [USE_LSB_TAG]:
(XUNTAG) [!USE_LSB_TAG]:
(Lisp_Object, TAG_PTR, make_lisp_symbol):
Support new Lisp_Object implementation as a pointer to an
incomplete type. Keep pointers pointers, as much as possible.
* src/alloc.c (macro_XPNTR_OR_SYMBOL_OFFSET, XPNTR_OR_SYMBOL_OFFSET):
Remove. All uses replaced by plain XPNTR.
* src/emacs-module.c: Work around GCC bug 83162.
* src/lisp.h (LISP_WORDS_ARE_POINTERS, lisp_h_XLP, lisp_h_XPL):
(XLP, XPL) [DEFINE_KEY_OPS_AS_MACROS]:
New macros.
(Lisp_Word, untagged_ptr, Lisp_Word_tag): New types.
(XLP, XPL): New inline functions.
(TAG_PTR): Now expands to an initializer, not an expression.
All uses changed.
(TAG_SYMOFFSET, XLI_BUILTIN_LISPSYM): Remove. All uses removed.
(LISPSYM_INITIALLY): Redo in terms of the new TAG_PTR.
(NIL_IS_ZERO): Redo without XLI_BUILTIN_LISPSYM.
* src/xwidget.c (webkit_javascript_finished_cb): Use XPL
instead of XIL with a non-EMACS_INT arg.
(Fxwidget_webkit_execute_script): Use XLP instead of XLI
followed by two conversions.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/src/alloc.c b/src/alloc.c index 4f3928a4824..38daee065ae 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -502,30 +502,20 @@ pointer_align (void *ptr, int alignment) | |||
| 502 | return (void *) ROUNDUP ((uintptr_t) ptr, alignment); | 502 | return (void *) ROUNDUP ((uintptr_t) ptr, alignment); |
| 503 | } | 503 | } |
| 504 | 504 | ||
| 505 | /* Extract the pointer hidden within A, if A is not a symbol. | 505 | /* Extract the pointer hidden within O. Define this as a function, as |
| 506 | If A is a symbol, extract the hidden pointer's offset from lispsym, | 506 | functions are cleaner and can be used in debuggers. Also, define |
| 507 | converted to void *. */ | 507 | it as a macro if being compiled with GCC without optimization, for |
| 508 | performance in that case. macro_XPNTR is private to this section | ||
| 509 | of code. */ | ||
| 510 | |||
| 511 | #define macro_XPNTR(o) \ | ||
| 512 | ((void *) \ | ||
| 513 | (SYMBOLP (o) \ | ||
| 514 | ? ((char *) lispsym \ | ||
| 515 | - ((EMACS_UINT) Lisp_Symbol << (USE_LSB_TAG ? 0 : VALBITS)) \ | ||
| 516 | + XLI (o)) \ | ||
| 517 | : (char *) XLP (o) - (XLI (o) & ~VALMASK))) | ||
| 508 | 518 | ||
| 509 | #define macro_XPNTR_OR_SYMBOL_OFFSET(a) \ | ||
| 510 | ((void *) (intptr_t) (USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK)) | ||
| 511 | |||
| 512 | /* Extract the pointer hidden within A. */ | ||
| 513 | |||
| 514 | #define macro_XPNTR(a) \ | ||
| 515 | ((void *) ((intptr_t) XPNTR_OR_SYMBOL_OFFSET (a) \ | ||
| 516 | + (SYMBOLP (a) ? (char *) lispsym : NULL))) | ||
| 517 | |||
| 518 | /* For pointer access, define XPNTR and XPNTR_OR_SYMBOL_OFFSET as | ||
| 519 | functions, as functions are cleaner and can be used in debuggers. | ||
| 520 | Also, define them as macros if being compiled with GCC without | ||
| 521 | optimization, for performance in that case. The macro_* names are | ||
| 522 | private to this section of code. */ | ||
| 523 | |||
| 524 | static ATTRIBUTE_UNUSED void * | ||
| 525 | XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a) | ||
| 526 | { | ||
| 527 | return macro_XPNTR_OR_SYMBOL_OFFSET (a); | ||
| 528 | } | ||
| 529 | static ATTRIBUTE_UNUSED void * | 519 | static ATTRIBUTE_UNUSED void * |
| 530 | XPNTR (Lisp_Object a) | 520 | XPNTR (Lisp_Object a) |
| 531 | { | 521 | { |
| @@ -533,7 +523,6 @@ XPNTR (Lisp_Object a) | |||
| 533 | } | 523 | } |
| 534 | 524 | ||
| 535 | #if DEFINE_KEY_OPS_AS_MACROS | 525 | #if DEFINE_KEY_OPS_AS_MACROS |
| 536 | # define XPNTR_OR_SYMBOL_OFFSET(a) macro_XPNTR_OR_SYMBOL_OFFSET (a) | ||
| 537 | # define XPNTR(a) macro_XPNTR (a) | 526 | # define XPNTR(a) macro_XPNTR (a) |
| 538 | #endif | 527 | #endif |
| 539 | 528 | ||
| @@ -5605,7 +5594,7 @@ static Lisp_Object | |||
| 5605 | purecopy (Lisp_Object obj) | 5594 | purecopy (Lisp_Object obj) |
| 5606 | { | 5595 | { |
| 5607 | if (INTEGERP (obj) | 5596 | if (INTEGERP (obj) |
| 5608 | || (! SYMBOLP (obj) && PURE_P (XPNTR_OR_SYMBOL_OFFSET (obj))) | 5597 | || (! SYMBOLP (obj) && PURE_P (XPNTR (obj))) |
| 5609 | || SUBRP (obj)) | 5598 | || SUBRP (obj)) |
| 5610 | return obj; /* Already pure. */ | 5599 | return obj; /* Already pure. */ |
| 5611 | 5600 | ||