aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorPaul Eggert2017-12-12 12:59:57 -0800
committerPaul Eggert2017-12-12 15:17:12 -0800
commit244346c744a6700d320a0a0fe8c796be3b3ff023 (patch)
tree145dc0ba87fcf82de44e62ecbdeb70fe86c28c7a /src/alloc.c
parentc705f7250d6f17f1682ee5ad7eec516dbf6c3916 (diff)
downloademacs-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.c39
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
524static ATTRIBUTE_UNUSED void *
525XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a)
526{
527 return macro_XPNTR_OR_SYMBOL_OFFSET (a);
528}
529static ATTRIBUTE_UNUSED void * 519static ATTRIBUTE_UNUSED void *
530XPNTR (Lisp_Object a) 520XPNTR (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
5605purecopy (Lisp_Object obj) 5594purecopy (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