Mercurial > hg > xemacs-beta
annotate src/compiler.h @ 5338:8608eadee6ba
Move #'delq, #'delete to Lisp, adding support for sequences.
src/ChangeLog addition:
2011-01-11 Aidan Kehoe <kehoea@parhasard.net>
* device-msw.c (Fmswindows_printer_list): Remove a Fdelete ()
call here, remove the necessity for it.
* fns.c (Fdelete, Fdelq):
* lisp.h:
Move #'delete, #'delq to Lisp, implemented in terms of #'delete*
* select.c (Fown_selection_internal):
* select.c (handle_selection_clear):
Use delq_no_quit() in these functions, don't reimplement it or use
Fdelq(), which is now gone.
lisp/ChangeLog addition:
2011-01-11 Aidan Kehoe <kehoea@parhasard.net>
* subr.el (delete, delq, remove, remq): Move #'remove, #'remq
here, they don't belong in cl-seq.el; move #'delete, #'delq here
from fns.c, implement them in terms of #'delete*, allowing support
for sequences generally.
* update-elc.el (do-autoload-commands): Use #'delete*, not #'delq
here, now the latter's no longer dumped.
* cl-macs.el (delete, delq): Add compiler macros transforming
#'delete and #'delq to #'delete* calls.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Fri, 14 Jan 2011 23:35:29 +0000 |
| parents | d4f666cda5e6 |
| children | 308d34e9f07d |
| rev | line source |
|---|---|
| 1743 | 1 /* Compiler-specific definitions for XEmacs. |
| 2 Copyright (C) 1998-1999, 2003 Free Software Foundation, Inc. | |
| 3 Copyright (C) 1994 Richard Mlynarik. | |
| 5046 | 4 Copyright (C) 1995, 1996, 2000-2004, 2010 Ben Wing. |
| 1743 | 5 |
| 6 This file is part of XEmacs. | |
| 7 | |
| 8 XEmacs is free software; you can redistribute it and/or modify it | |
| 9 under the terms of the GNU General Public License as published by the | |
| 10 Free Software Foundation; either version 2, or (at your option) any | |
| 11 later version. | |
| 12 | |
| 13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 16 for more details. | |
| 17 | |
| 18 You should have received a copy of the GNU General Public License | |
| 19 along with XEmacs; see the file COPYING. If not, write to | |
| 20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 21 Boston, MA 02111-1307, USA. */ | |
| 22 | |
| 23 /* Synched up with: not in FSF. */ | |
| 24 | |
| 25 /* Authorship: | |
| 26 | |
| 27 NOT_REACHED, DOESNT_RETURN, PRINTF_ARGS by Richard Mlynarik, c. 1994. | |
| 28 RETURN_SANS_WARNING by Martin buchholz, 1998 or 1999. | |
| 29 Many changes and improvements by Jerry James, 2003. | |
| 30 Split out of lisp.h, reorganized, and modernized. | |
| 31 {BEGIN,END}_C_DECLS, NEED_GCC, GCC_VERSION | |
| 2286 | 32 ATTRIBUTE_MALLOC, ATTRIBUTE_CONST, ATTRIBUTE_PURE, UNUSED |
| 1743 | 33 */ |
| 34 | |
| 35 #ifndef INCLUDED_compiler_h | |
| 36 #define INCLUDED_compiler_h | |
| 37 | |
| 38 /* Define min() and max(). (Some compilers put them in strange places that | |
| 3025 | 39 won't be referenced by include files used by XEmacs, such as `macros.h' |
| 1743 | 40 under Solaris.) */ |
| 41 | |
| 42 #ifndef min | |
| 1748 | 43 # define min(a,b) (((a) <= (b)) ? (a) : (b)) |
| 1743 | 44 #endif |
| 45 #ifndef max | |
| 1748 | 46 # define max(a,b) (((a) > (b)) ? (a) : (b)) |
| 1743 | 47 #endif |
| 48 | |
| 49 /* Regular C complains about possible clobbering of local vars NOT declared | |
| 50 as volatile if there's a longjmp() in a function. C++ complains if such | |
| 51 vars ARE volatile; or more correctly, sans volatile no problem even when | |
| 52 you longjmp, avec volatile you get unfixable compile errors like | |
| 53 | |
| 54 /src/xemacs/lilfix/src/process-unix.c: In function `void | |
| 55 unix_send_process(Lisp_Object, lstream*)': | |
| 56 /src/xemacs/lilfix/src/process-unix.c:1577: no matching function for call to ` | |
| 57 Lisp_Object::Lisp_Object(volatile Lisp_Object&)' | |
| 58 /src/xemacs/lilfix/src/lisp-union.h:32: candidates are: | |
| 59 Lisp_Object::Lisp_Object(const Lisp_Object&) | |
| 60 */ | |
| 61 | |
| 62 #ifdef __cplusplus | |
| 1748 | 63 # define VOLATILE_IF_NOT_CPP |
| 1743 | 64 #else |
| 1748 | 65 # define VOLATILE_IF_NOT_CPP volatile |
| 1743 | 66 #endif |
| 67 | |
| 68 /* Avoid indentation problems when XEmacs sees the curly braces */ | |
| 69 #ifndef BEGIN_C_DECLS | |
| 70 # ifdef __cplusplus | |
| 71 # define BEGIN_C_DECLS extern "C" { | |
| 72 # define END_C_DECLS } | |
| 73 # else | |
| 74 # define BEGIN_C_DECLS | |
| 75 # define END_C_DECLS | |
| 76 # endif | |
| 77 #endif | |
| 78 | |
| 1748 | 79 /* Guard against older gccs that did not define all of these symbols */ |
| 80 #ifdef __GNUC__ | |
| 81 # ifndef __GNUC_MINOR__ | |
| 82 # define __GNUC_MINOR__ 0 | |
| 83 # endif | |
| 84 # ifndef __GNUC_PATCHLEVEL__ | |
| 85 # define __GNUC_PATCHLEVEL__ 0 | |
| 86 # endif | |
| 87 #endif /* __GNUC__ */ | |
| 1743 | 88 |
| 1748 | 89 /* Simplify testing for specific GCC versions. For non-GNU compilers, |
| 90 GCC_VERSION evaluates to zero. */ | |
| 1743 | 91 #ifndef NEED_GCC |
| 1748 | 92 # define NEED_GCC(major,minor,patch) (major * 1000000 + minor * 1000 + patch) |
| 1743 | 93 #endif /* NEED_GCC */ |
| 94 #ifndef GCC_VERSION | |
| 1748 | 95 # ifdef __GNUC__ |
| 96 # define GCC_VERSION NEED_GCC (__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) | |
| 97 # else | |
| 98 # define GCC_VERSION 0 | |
| 99 # endif /* __GNUC__ */ | |
| 1743 | 100 #endif /* GCC_VERSION */ |
| 101 | |
| 2500 | 102 #ifdef _MSC_VER |
| 103 #define MSC_VERSION _MSC_VER | |
| 104 #else | |
| 105 #define MSC_VERSION 0 | |
| 106 #endif | |
| 107 | |
| 1743 | 108 /* GCC < 2.6.0 could only declare one attribute per function. In that case, |
| 109 we define DOESNT_RETURN in preference to PRINTF_ARGS, which is only used | |
| 110 for checking args against the string spec. */ | |
| 111 #ifndef PRINTF_ARGS | |
| 112 # if (GCC_VERSION >= NEED_GCC (2, 6, 0)) | |
| 113 # define PRINTF_ARGS(string_index,first_to_check) \ | |
| 114 __attribute__ ((format (printf, string_index, first_to_check))) | |
| 115 # else | |
| 116 # define PRINTF_ARGS(string_index,first_to_check) | |
| 117 # endif /* GNUC */ | |
| 118 #endif | |
| 119 | |
| 2268 | 120 #ifndef DOESNT_RETURN_TYPE |
| 1743 | 121 # if (GCC_VERSION > NEED_GCC (0, 0, 0)) |
| 122 # if (GCC_VERSION >= NEED_GCC (2, 5, 0)) | |
| 2270 | 123 # ifndef __INTEL_COMPILER |
| 124 # define RETURN_NOT_REACHED(value) DO_NOTHING | |
| 125 # endif | |
| 2268 | 126 # define DOESNT_RETURN_TYPE(rettype) rettype |
| 127 # define DECLARE_DOESNT_RETURN_TYPE(rettype,decl) rettype decl \ | |
| 128 __attribute__ ((noreturn)) | |
| 1743 | 129 # else /* GCC_VERSION < NEED_GCC (2, 5, 0) */ |
| 2268 | 130 # define DOESNT_RETURN_TYPE(rettype) rettype volatile |
| 131 # define DECLARE_DOESNT_RETURN_TYPE(rettype,decl) rettype volatile decl | |
| 1743 | 132 # endif /* GCC_VERSION >= NEED_GCC (2, 5, 0) */ |
| 2500 | 133 # elif (MSC_VERSION >= 1200) |
| 134 /* MSVC 6.0 has a mechanism to declare functions which never return */ | |
| 135 # define DOESNT_RETURN_TYPE(rettype) __declspec(noreturn) rettype | |
| 136 # define DECLARE_DOESNT_RETURN_TYPE(rettype,decl) \ | |
| 137 __declspec(noreturn) rettype XCDECL decl | |
| 138 # if (MSC_VERSION >= 1300) | |
| 139 /* VC++ 7 issues warnings about return statements in __declspec(noreturn) | |
| 140 functions; this problem didn't exist under VC++ 6 */ | |
| 141 # define RETURN_NOT_REACHED(value) DO_NOTHING | |
| 142 # endif | |
| 143 # else /* not gcc, VC++ */ | |
| 2268 | 144 # define DOESNT_RETURN_TYPE(rettype) rettype |
| 145 # define DECLARE_DOESNT_RETURN_TYPE(rettype,decl) rettype decl | |
| 1743 | 146 # endif /* GCC_VERSION > NEED_GCC (0, 0, 0) */ |
| 2268 | 147 #endif /* DOESNT_RETURN_TYPE */ |
| 148 #ifndef DOESNT_RETURN | |
| 149 # define DOESNT_RETURN DOESNT_RETURN_TYPE (void) | |
| 150 # define DECLARE_DOESNT_RETURN(decl) DECLARE_DOESNT_RETURN_TYPE (void, decl) | |
| 1743 | 151 #endif /* DOESNT_RETURN */ |
| 152 | |
| 153 /* Another try to fix SunPro C compiler warnings */ | |
| 154 /* "end-of-loop code not reached" */ | |
| 155 /* "statement not reached */ | |
| 156 #if defined __SUNPRO_C || defined __USLC__ | |
| 1748 | 157 # define RETURN_SANS_WARNINGS if (1) return |
| 158 # define RETURN_NOT_REACHED(value) DO_NOTHING | |
| 1743 | 159 #endif |
| 160 | |
| 161 /* More ways to shut up compiler. This works in Fcommand_loop_1(), | |
| 162 where there's an infinite loop in a function returning a Lisp object. | |
| 163 */ | |
| 2500 | 164 #if (defined (_MSC_VER) && MSC_VERSION < 1300) || defined (__SUNPRO_C) || \ |
|
4759
aa5ed11f473b
Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents:
4028
diff
changeset
|
165 defined (__SUNPRO_CC) |
| 1748 | 166 # define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS if (0) return Qnil |
| 1743 | 167 #else |
| 1748 | 168 # define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS DO_NOTHING |
| 1743 | 169 #endif |
| 170 | |
| 171 #ifndef RETURN_NOT_REACHED | |
| 1748 | 172 # define RETURN_NOT_REACHED(value) return (value) |
| 1743 | 173 #endif |
| 174 | |
| 175 #ifndef RETURN_SANS_WARNINGS | |
| 1748 | 176 # define RETURN_SANS_WARNINGS return |
| 1743 | 177 #endif |
| 178 | |
| 179 #ifndef DO_NOTHING | |
| 1748 | 180 # define DO_NOTHING do {} while (0) |
| 1743 | 181 #endif |
| 182 | |
| 183 #ifndef DECLARE_NOTHING | |
| 1748 | 184 # define DECLARE_NOTHING struct nosuchstruct |
| 1743 | 185 #endif |
| 186 | |
| 187 #ifndef ATTRIBUTE_MALLOC | |
| 188 # if (GCC_VERSION >= NEED_GCC (2, 96, 0)) | |
| 189 # define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) | |
| 190 # else | |
| 191 # define ATTRIBUTE_MALLOC | |
| 192 # endif /* GCC_VERSION >= NEED_GCC (2, 96, 0) */ | |
| 193 #endif /* ATTRIBUTE_MALLOC */ | |
| 194 | |
| 195 #ifndef ATTRIBUTE_PURE | |
| 196 # if (GCC_VERSION >= NEED_GCC (2, 96, 0)) | |
| 197 # define ATTRIBUTE_PURE __attribute__ ((pure)) | |
| 198 # else | |
| 199 # define ATTRIBUTE_PURE | |
| 200 # endif /* GCC_VERSION >= NEED_GCC (2, 96, 0) */ | |
| 201 #endif /* ATTRIBUTE_PURE */ | |
| 202 | |
| 203 #ifndef ATTRIBUTE_CONST | |
| 204 # if (GCC_VERSION >= NEED_GCC (2, 5, 0)) | |
| 205 # define ATTRIBUTE_CONST __attribute__ ((const)) | |
| 206 # define CONST_FUNC | |
| 207 # else | |
| 208 # define ATTRIBUTE_CONST | |
| 209 # define CONST_FUNC const | |
| 210 # endif /* GCC_VERSION >= NEED_GCC (2, 5, 0) */ | |
| 211 #endif /* ATTRIBUTE_CONST */ | |
| 212 | |
| 3094 | 213 /* |
| 214 NOTE: These macros MUST be named UNUSED (exactly) or something | |
| 215 prefixed with USED_IF_, or DEFUN docstrings will be parsed incorrectly. | |
| 216 See comments in make_docfile.c (write_c_args). You'd think that this | |
| 217 wouldn't happen, but unfortunately we do indeed have some arguments | |
| 218 of DEFUNs unused for GNU compatibility or because features are missing. | |
| 4028 | 219 |
| 220 #### At one time, __attribute__ ((unused)) confused G++. We don't know | |
| 221 which versions. Please report problems and fix conditionals. | |
| 222 #### A similar issue arose with the Intel CC. We know that v7 didn't | |
| 223 work and v9 does. Let us know if v8 works or not, please. | |
| 224 See <m34plsmh88.fsf@jerrypc.cs.usu.edu>. | |
| 3094 | 225 */ |
| 1743 | 226 #ifndef UNUSED_ARG |
| 2286 | 227 # define UNUSED_ARG(decl) unused_##decl |
| 228 #endif | |
| 229 #ifndef UNUSED | |
| 4028 | 230 # if defined(__GNUC__) && (!defined(__INTEL_COMPILER) || __INTEL_COMPILER >= 800) |
| 2286 | 231 # define ATTRIBUTE_UNUSED __attribute__ ((unused)) |
| 1743 | 232 # else |
| 2286 | 233 # define ATTRIBUTE_UNUSED |
| 1743 | 234 # endif |
| 2286 | 235 # define UNUSED(decl) UNUSED_ARG (decl) ATTRIBUTE_UNUSED |
| 236 #endif /* UNUSED */ | |
| 1743 | 237 |
| 5046 | 238 /* Various macros for params/variables used or unused depending on |
| 239 config flags. */ | |
| 240 | |
| 241 #ifdef MULE | |
| 242 # define USED_IF_MULE(decl) decl | |
| 243 #else | |
| 244 # define USED_IF_MULE(decl) UNUSED (decl) | |
| 245 #endif | |
| 246 #ifdef HAVE_XFT | |
| 247 # define USED_IF_XFT(decl) decl | |
| 248 #else | |
| 249 # define USED_IF_XFT(decl) UNUSED (decl) | |
| 250 #endif | |
| 251 #ifdef HAVE_SCROLLBARS | |
| 252 # define USED_IF_SCROLLBARS(decl) decl | |
| 253 #else | |
| 254 # define USED_IF_SCROLLBARS(decl) UNUSED (decl) | |
| 255 #endif | |
| 256 #ifdef NEW_GC | |
| 257 # define USED_IF_NEW_GC(decl) decl | |
| 258 # define UNUSED_IF_NEW_GC(decl) UNUSED (decl) | |
| 259 #else | |
| 260 # define USED_IF_NEW_GC(decl) UNUSED (decl) | |
| 261 # define UNUSED_IF_NEW_GC(decl) decl | |
| 262 #endif | |
| 263 #ifdef HAVE_TTY | |
| 264 #define USED_IF_TTY(decl) decl | |
| 265 #else | |
| 266 #define USED_IF_TTY(decl) UNUSED (decl) | |
| 267 #endif | |
| 268 #ifdef HAVE_TOOLBARS | |
| 269 #define USED_IF_TOOLBARS(decl) decl | |
| 270 #else | |
| 271 #define USED_IF_TOOLBARS(decl) UNUSED (decl) | |
| 272 #endif | |
| 273 | |
|
4908
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
274 /* Declaration that variable or expression X is "used" to defeat |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
275 "unused variable" warnings. DON'T DO THIS FOR PARAMETERS IF IT ALL |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
276 POSSIBLE. Use an UNUSED() or USED_IF_*() declaration on the parameter |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
277 instead. Don't do this for unused local variables that should really |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
278 just be deleted. */ |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
279 #define USED(x) ((void) (x)) |
|
b3ce27ca7647
various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents:
4860
diff
changeset
|
280 |
| 1743 | 281 #ifdef DEBUG_XEMACS |
| 1748 | 282 # define REGISTER |
| 283 # define register | |
| 1743 | 284 #else |
| 1748 | 285 # define REGISTER register |
| 1743 | 286 #endif |
| 287 | |
| 288 #if defined(HAVE_MS_WINDOWS) && defined(HAVE_SHLIB) | |
| 289 # ifdef EMACS_MODULE | |
| 290 # define MODULE_API __declspec(dllimport) | |
| 291 # else | |
| 292 # define MODULE_API __declspec(dllexport) | |
| 293 # endif | |
| 294 #else | |
| 295 # define MODULE_API | |
| 296 #endif | |
| 297 | |
| 2367 | 298 /* Under "strict-aliasing" assumptions, you're not necessarily allowed to |
| 299 access the same memory address as two different types. The proper way | |
| 300 around that is with a union. The macros below help out, e.g. the | |
| 301 definition of XE_MAKEPOINTS(val) is | |
| 302 | |
| 303 ANSI_ALIASING_TYPEDEF (POINTS, POINTS); | |
| 304 #define XE_MAKEPOINTS(l) ANSI_ALIASING_CAST (POINTS, l) | |
| 305 | |
| 306 replacing | |
| 307 | |
| 308 BAD!!! #define XE_MAKEPOINTS(l) (* (POINTS *) &(l)) | |
| 309 | |
| 310 On the other hand, if you are just casting from one pointer to the other | |
| 311 in order to pass a pointer to another function, it's probably OK to just | |
| 312 trick GCC by inserting an intermediate cast to (void *), to avoid | |
| 313 warnings about "dereferencing type-punned pointer". #### I don't know | |
| 314 how kosher this is, but do strict-aliasing rules really apply across | |
| 315 functions? | |
| 316 | |
| 317 Note that the input to e.g. VOIDP_CAST must be an lvalue (i.e. not | |
| 318 &(something)), but the value of the macro is also an lvalue, so in place | |
| 319 of `(void **) &foo' you could write `& VOIDP_CAST (foo)' if you are | |
| 320 subsequently dereferencing the value or don't feel comfortable doing a | |
| 321 trick like `(void **) (void *) &foo'. | |
| 322 | |
| 323 Unfortunately, it does not work to just define the union type on the fly in | |
| 324 the cast -- otherwise, we could avoid the need for a typedef. Or rather, | |
| 325 it does work under gcc but not under Visual C++. | |
| 326 | |
| 327 --ben | |
| 328 */ | |
| 329 | |
| 330 #define ANSI_ALIASING_TYPEDEF(name, type) typedef union { char c; type p; } *ANSI_ALIASING_##name | |
| 331 #define ANSI_ALIASING_CAST(name, val) (((ANSI_ALIASING_##name) &(val))->p) | |
| 332 ANSI_ALIASING_TYPEDEF (voidp, void *); | |
| 333 /* VOIDP_CAST: Cast an lvalue to (void *) in a way that is ANSI-aliasing | |
| 334 safe and will not result in GCC warnings. The result is still an | |
| 335 lvalue, so you can assign to it or take its address. */ | |
| 336 #define VOIDP_CAST(l) ANSI_ALIASING_CAST (voidp, l) | |
| 337 | |
| 1743 | 338 #endif /* INCLUDED_compiler_h */ |
