diff options
| author | Paul Eggert | 2013-06-16 23:03:19 -0700 |
|---|---|---|
| committer | Paul Eggert | 2013-06-16 23:03:19 -0700 |
| commit | 84575e67fc390815f8f9fc8bea095e006f0890c4 (patch) | |
| tree | a3285603fbe57ecfd7c12b1cfef0f1b431530965 /src/data.c | |
| parent | f612933b88509427a690ea1966eac533b8ef80e1 (diff) | |
| download | emacs-84575e67fc390815f8f9fc8bea095e006f0890c4.tar.gz emacs-84575e67fc390815f8f9fc8bea095e006f0890c4.zip | |
Use functions, not macros, for XINT etc.
In lisp.h, prefer functions to function-like macros, and
constants to object-like macros, when either will do. This:
. simplifies use, as there's no more need to worry about
arguments' side effects being evaluated multiple times.
. makes the code easier to debug on some platforms.
However, when using gcc -O0, keep using function-like macros
for a few critical operations, for performance reasons.
This sort of thing isn't needed with gcc -Og, but -Og
is a GCC 4.8 feature and isn't widely-enough available yet.
Also, move functions from lisp.h to individual modules when possible.
From a suggestion by Andreas Schwab in <http://bugs.gnu.org/11935#68>.
* alloc.c (XFLOAT_INIT, set_symbol_name):
* buffer.c (CHECK_OVERLAY):
* chartab.c (CHECK_CHAR_TABLE, set_char_table_ascii)
(set_char_table_parent):
* coding.c (CHECK_NATNUM_CAR, CHECK_NATNUM_CDR):
* data.c (BOOLFWDP, INTFWDP, KBOARD_OBJFWDP, OBJFWDP, XBOOLFWD)
(XKBOARD_OBJFWD, XINTFWD, XOBJFWD, CHECK_SUBR, set_blv_found)
(blv_value, set_blv_value, set_blv_where, set_blv_defcell)
(set_blv_valcell):
* emacs.c (setlocale) [!HAVE_SETLOCALE]:
* eval.c (specpdl_symbol, specpdl_old_value, specpdl_where)
(specpdl_arg, specpdl_func, backtrace_function, backtrace_nargs)
(backtrace_args, backtrace_debug_on_exit):
* floatfns.c (CHECK_FLOAT):
* fns.c (CHECK_HASH_TABLE, CHECK_LIST_END)
(set_hash_key_and_value, set_hash_next, set_hash_next_slot)
(set_hash_hash, set_hash_hash_slot, set_hash_index)
(set_hash_index_slot):
* keymap.c (CHECK_VECTOR_OR_CHAR_TABLE):
* marker.c (CHECK_MARKER):
* textprop.c (CHECK_STRING_OR_BUFFER):
* window.c (CHECK_WINDOW_CONFIGURATION):
Move here from lisp.h, and make these functions static rather than
extern inline.
* buffer.c (Qoverlayp):
* data.c (Qsubrp):
* fns.c (Qhash_table_p):
* window.c (Qwindow_configuration_p):
Now static.
* lisp.h: Remove the abovementioned defns and decls.
* configure.ac (WARN_CFLAGS): Remove -Wbad-function-cast,
as it generates bogus warnings about reasonable casts of calls.
* alloc.c (gdb_make_enums_visible) [USE_LSB_TAG]:
Remove enum lsb_bits; no longer needed.
(allocate_misc, free_misc): Don't use XMISCTYPE as an lvalue.
* buffer.c (Qoverlap):
* data.c (Qsubrp):
* fns.c (Qhash_table_p):
Now extern, so lisp.h can use these symbols.
* dispextern.h: Include character.h, for MAX_CHAR etc.
(GLYPH, GLYPH_CHAR, GLYPH_FACE, SET_GLYPH_CHAR, SET_GLYPH_FACE)
(SET_GLYPH, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
(SET_GLYPH_FROM_GLYPH_CODE, GLYPH_MODE_LINE_FACE, GLYPH_CHAR_VALID_P)
(GLYPH_CODE_P): Move here from lisp.h.
(GLYPH_CHAR, GLYPH_FACE, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
(GLYPH_CHAR_VALID_P, GLYPH_CODE_P): Now functions, not macros.
(GLYPH_MODE_LINE_FACE): Now enums, not macros.
* eval.c (Fautoload): Cast XUNTAG output to intptr_t, since
XUNTAG now returns void *.
* lisp.h (lisp_h_XLI, lisp_h_XIL, lisp_h_CHECK_LIST_CONS)
(lisp_h_CHECK_NUMBER CHECK_SYMBOL, lisp_h_CHECK_TYPE)
(lisp_h_CONSP, lisp_h_EQ, lisp_h_FLOATP, lisp_h_INTEGERP)
(lisp_h_MARKERP, lisp_h_MISCP, lisp_h_NILP)
(lisp_h_SET_SYMBOL_VAL, lisp_h_SYMBOL_CONSTANT_P)
(lisp_h_SYMBOL_VAL, lisp_h_SYMBOLP, lisp_h_VECTORLIKEP)
(lisp_h_XCAR, lisp_h_XCDR, lisp_h_XCONS, lisp_h_XHASH)
(lisp_h_XPNTR, lisp_h_XSYMBOL):
New macros, renamed from their sans-lisp_h_ counterparts.
(XLI, XIL, CHECK_LIST_CONS, CHECK_NUMBER CHECK_SYMBOL)
(CHECK_TYPE, CONSP, EQ, FLOATP, INTEGERP, MARKERP)
(MISCP, NILP, SET_SYMBOL_VAL, SYMBOL_CONSTANT_P, SYMBOL_VAL, SYMBOLP)
(VECTORLIKEP, XCAR, XCDR, XCONS, XHASH, XPNTR, XSYMBOL):
If compiling via GCC without optimization, define these as macros
in addition to inline functions.
To disable this, compile with -DINLINING=0.
(LISP_MACRO_DEFUN, LISP_MACRO_DEFUN_VOID): New macros.
(check_cons_list) [!GC_CHECK_CONS_LIST]: Likewise.
(make_number, XFASTINT, XINT, XTYPE, XUNTAG): Likewise, but
hand-optimize only in the USE_LSB_TAG case, as GNUish hosts do that.
(INTMASK, VALMASK): Now macros, since static values cannot be
accessed from extern inline functions.
(VALMASK): Also a constant, for benefit of old GDB.
(LISP_INT_TAG_P): Remove; no longer needed as the only caller
is INTEGERP, which can fold it in.
(XLI, XIL, XHASH, XTYPE,XINT, XFASTINT, XUINT)
(make_number, XPNTR, XUNTAG, EQ, XCONS, XVECTOR, XSTRING, XSYMBOL)
(XFLOAT, XPROCESS, XWINDOW, XTERMINAL, XSUBR, XBUFFER, XCHAR_TABLE)
(XSUB_CHAR_TABLE, XBOOL_VECTOR, make_lisp_ptr, CHECK_TYPE)
(CHECK_STRING_OR_BUFFER, XCAR, XCDR, XSETCAR, XSETCDR, CAR, CDR)
(CAR_SAFE, CDR_SAFE, STRING_MULTIBYTE, SDATA, SSDATA, SREF, SSET)
(SCHARS, STRING_BYTES, SBYTES, STRING_SET_CHARS, STRING_COPYIN, AREF)
(ASIZE, ASET, CHAR_TABLE_REF_ASCII, CHAR_TABLE_REF)
(CHAR_TABLE_SET, CHAR_TABLE_EXTRA_SLOTS, SYMBOL_VAL, SYMBOL_ALIAS)
(SYMBOL_BLV, SYMBOL_FWD, SET_SYMBOL_VAL, SET_SYMBOL_ALIAS)
(SET_SYMBOL_BLV, SET_SYMBOL_FWD, SYMBOL_NAME, SYMBOL_INTERNED_P)
(SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P, SYMBOL_CONSTANT_P)
(XHASH_TABLE, HASH_TABLE_P, CHECK_HASH_TABLE, HASH_KEY, HASH_VALUE)
(HASH_NEXT, HASH_HASH, HASH_INDEX, HASH_TABLE_SIZE)
(XMISC, XMISCANY, XMARKER, XOVERLAY, XSAVE_VALUE, XFWDTYPE)
(XINTFWD, XBOOLFWD, XOBJFWD, XBUFFER_OBJFWD, XKBOARD_OBJFWD)
(XFLOAT_DATA, XFLOAT_INIT, NILP, NUMBERP, NATNUMP)
(RANGED_INTEGERP, CONSP, FLOATP, MISCP, STRINGP, SYMBOLP)
(INTEGERP, VECTORLIKEP, VECTORP, OVERLAYP)
(MARKERP, SAVE_VALUEP, AUTOLOADP, INTFWDP, BOOLFWDP, OBJFWDP)
(BUFFER_OBJFWDP, KBOARD_OBJFWDP, PSEUDOVECTOR_TYPEP)
(PSEUDOVECTORP, WINDOW_CONFIGURATIONP, PROCESSP, WINDOWP)
(TERMINALP, SUBRP, COMPILEDP, BUFFERP, CHAR_TABLE_P)
(SUB_CHAR_TABLE_P, BOOL_VECTOR_P, FRAMEP, IMAGEP, ARRAYP)
(CHECK_LIST, CHECK_LIST_CONS, CHECK_LIST_END, CHECK_STRING)
(CHECK_STRING_CAR, CHECK_CONS, CHECK_SYMBOL, CHECK_CHAR_TABLE)
(CHECK_VECTOR, CHECK_VECTOR_OR_STRING, CHECK_ARRAY)
(CHECK_VECTOR_OR_CHAR_TABLE, CHECK_BUFFER, CHECK_WINDOW)
(CHECK_WINDOW_CONFIGURATION, CHECK_PROCESS, CHECK_SUBR)
(CHECK_NUMBER, CHECK_NATNUM, CHECK_MARKER, XFLOATINT)
(CHECK_FLOAT, CHECK_NUMBER_OR_FLOAT, CHECK_OVERLAY)
(CHECK_NUMBER_CAR, CHECK_NUMBER_CDR, CHECK_NATNUM_CAR)
(CHECK_NATNUM_CDR, FUNCTIONP, SPECPDL_INDEX, LOADHIST_ATTACH)
Now functions.
(check_cons_list) [!GC_CHECK_CONS_LIST]: New empty function.
(LISP_MAKE_RVALUE, TYPEMASK): Remove; no longer needed.
(VALMASK): Define in one place rather than in two, merging the
USE_LSB_TAG parts; this is simpler.
(aref_addr, gc_aset, MOST_POSITIVE_FIXNUM, MOST_NEGATIVE_FIXNUM)
(max, min, struct Lisp_String, UNSIGNED_CMP, ASCII_CHAR_P):
Move up, to avoid use before definition.
Also include "globals.h" earlier, for the same reason.
(make_natnum): New function.
(XUNTAG): Now returns void *, not intptr_t, as this means fewer casts.
(union Lisp_Fwd, BOOLFWDP, BOOL_VECTOR_P, BUFFER_OBJFWDP, BUFFERP)
(CHAR_TABLE_P, CHAR_TABLE_REF_ASCII, CONSP, FLOATP, INTEGERP, INTFWDP)
(KBOARD_OBJFWDP, MARKERP, MISCP, NILP, OBJFWDP, OVERLAYP, PROCESSP)
(PSEUDOVECTORP, SAVE_VALUEP, STRINGP, SUB_CHAR_TABLE_P, SUBRP, SYMBOLP)
(VECTORLIKEP, WINDOWP, Qoverlayp, char_table_ref, char_table_set)
(char_table_translate, Qarrayp, Qbufferp, Qbuffer_or_string_p)
(Qchar_table_p, Qconsp, Qfloatp, Qintegerp, Qlambda, Qlistp, Qmarkerp)
(Qnil, Qnumberp, Qsubrp, Qstringp, Qsymbolp, Qvectorp)
(Qvector_or_char_table_p, Qwholenump, Ffboundp, wrong_type_argument)
(initialized, Qhash_table_p, extract_float, Qprocessp, Qwindowp)
(Qwindow_configuration_p, Qimage): New forward declarations.
(XSETFASTINT): Simplify by rewriting in terms of make_natnum.
(STRING_COPYIN): Remove; unused.
(XCAR_AS_LVALUE, XCDR_AS_LVALUE): Remove these macros, replacing with ...
(xcar_addr, xcdr_addr): New functions. All uses changed.
(IEEE_FLOATING_POINT): Now a constant, not a macro.
(GLYPH, GLYPH_CHAR, GLYPH_FACE, SET_GLYPH_CHAR, SET_GLYPH_FACE)
(SET_GLYPH, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
(SET_GLYPH_FROM_GLYPH_CODE, GLYPH_MODE_LINE_FACE, GLYPH_CHAR_VALID_P)
(GLYPH_CODE_P): Move to dispextern.h, to avoid define-before-use.
(TYPE_RANGED_INTEGERP): Simplify.
(Qsubrp, Qhash_table_p, Qoverlayp): New extern decls.
(setlocale, fixup_locale, synchronize_system_messages_locale)
(synchronize_system_time_locale) [!HAVE_SETLOCALE]:
Now empty functions, not macros.
(functionp): Return bool, not int.
* window.c (Qwindow_configuration_p): Now extern,
so window.h can use it.
* window.h (Qwindowp): Move decl back to lisp.h.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/src/data.c b/src/data.c index 9f756de014a..955c39727bb 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -76,7 +76,8 @@ static Lisp_Object Qprocess, Qmarker; | |||
| 76 | static Lisp_Object Qcompiled_function, Qframe; | 76 | static Lisp_Object Qcompiled_function, Qframe; |
| 77 | Lisp_Object Qbuffer; | 77 | Lisp_Object Qbuffer; |
| 78 | static Lisp_Object Qchar_table, Qbool_vector, Qhash_table; | 78 | static Lisp_Object Qchar_table, Qbool_vector, Qhash_table; |
| 79 | static Lisp_Object Qsubrp, Qmany, Qunevalled; | 79 | static Lisp_Object Qsubrp; |
| 80 | static Lisp_Object Qmany, Qunevalled; | ||
| 80 | Lisp_Object Qfont_spec, Qfont_entity, Qfont_object; | 81 | Lisp_Object Qfont_spec, Qfont_entity, Qfont_object; |
| 81 | static Lisp_Object Qdefun; | 82 | static Lisp_Object Qdefun; |
| 82 | 83 | ||
| @@ -85,6 +86,94 @@ static Lisp_Object Qdefalias_fset_function; | |||
| 85 | 86 | ||
| 86 | static void swap_in_symval_forwarding (struct Lisp_Symbol *, struct Lisp_Buffer_Local_Value *); | 87 | static void swap_in_symval_forwarding (struct Lisp_Symbol *, struct Lisp_Buffer_Local_Value *); |
| 87 | 88 | ||
| 89 | static bool | ||
| 90 | BOOLFWDP (union Lisp_Fwd *a) | ||
| 91 | { | ||
| 92 | return XFWDTYPE (a) == Lisp_Fwd_Bool; | ||
| 93 | } | ||
| 94 | static bool | ||
| 95 | INTFWDP (union Lisp_Fwd *a) | ||
| 96 | { | ||
| 97 | return XFWDTYPE (a) == Lisp_Fwd_Int; | ||
| 98 | } | ||
| 99 | static bool | ||
| 100 | KBOARD_OBJFWDP (union Lisp_Fwd *a) | ||
| 101 | { | ||
| 102 | return XFWDTYPE (a) == Lisp_Fwd_Kboard_Obj; | ||
| 103 | } | ||
| 104 | static bool | ||
| 105 | OBJFWDP (union Lisp_Fwd *a) | ||
| 106 | { | ||
| 107 | return XFWDTYPE (a) == Lisp_Fwd_Obj; | ||
| 108 | } | ||
| 109 | |||
| 110 | static struct Lisp_Boolfwd * | ||
| 111 | XBOOLFWD (union Lisp_Fwd *a) | ||
| 112 | { | ||
| 113 | eassert (BOOLFWDP (a)); | ||
| 114 | return &a->u_boolfwd; | ||
| 115 | } | ||
| 116 | static struct Lisp_Kboard_Objfwd * | ||
| 117 | XKBOARD_OBJFWD (union Lisp_Fwd *a) | ||
| 118 | { | ||
| 119 | eassert (KBOARD_OBJFWDP (a)); | ||
| 120 | return &a->u_kboard_objfwd; | ||
| 121 | } | ||
| 122 | static struct Lisp_Intfwd * | ||
| 123 | XINTFWD (union Lisp_Fwd *a) | ||
| 124 | { | ||
| 125 | eassert (INTFWDP (a)); | ||
| 126 | return &a->u_intfwd; | ||
| 127 | } | ||
| 128 | static struct Lisp_Objfwd * | ||
| 129 | XOBJFWD (union Lisp_Fwd *a) | ||
| 130 | { | ||
| 131 | eassert (OBJFWDP (a)); | ||
| 132 | return &a->u_objfwd; | ||
| 133 | } | ||
| 134 | |||
| 135 | static void | ||
| 136 | CHECK_SUBR (Lisp_Object x) | ||
| 137 | { | ||
| 138 | CHECK_TYPE (SUBRP (x), Qsubrp, x); | ||
| 139 | } | ||
| 140 | |||
| 141 | static void | ||
| 142 | set_blv_found (struct Lisp_Buffer_Local_Value *blv, int found) | ||
| 143 | { | ||
| 144 | eassert (found == !EQ (blv->defcell, blv->valcell)); | ||
| 145 | blv->found = found; | ||
| 146 | } | ||
| 147 | |||
| 148 | static Lisp_Object | ||
| 149 | blv_value (struct Lisp_Buffer_Local_Value *blv) | ||
| 150 | { | ||
| 151 | return XCDR (blv->valcell); | ||
| 152 | } | ||
| 153 | |||
| 154 | static void | ||
| 155 | set_blv_value (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val) | ||
| 156 | { | ||
| 157 | XSETCDR (blv->valcell, val); | ||
| 158 | } | ||
| 159 | |||
| 160 | static void | ||
| 161 | set_blv_where (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val) | ||
| 162 | { | ||
| 163 | blv->where = val; | ||
| 164 | } | ||
| 165 | |||
| 166 | static void | ||
| 167 | set_blv_defcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val) | ||
| 168 | { | ||
| 169 | blv->defcell = val; | ||
| 170 | } | ||
| 171 | |||
| 172 | static void | ||
| 173 | set_blv_valcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val) | ||
| 174 | { | ||
| 175 | blv->valcell = val; | ||
| 176 | } | ||
| 88 | 177 | ||
| 89 | Lisp_Object | 178 | Lisp_Object |
| 90 | wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value) | 179 | wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value) |