aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
authorJoakim Verona2011-12-28 04:12:56 +0100
committerJoakim Verona2011-12-28 04:12:56 +0100
commitbb29f044aa967831cd664c54eba0de0c701436ce (patch)
tree1398cc9780bbae0fdad071a3a3765a571c3f6d7b /src/lisp.h
parent3c935a7e996701244d166f684119f0ff97e25496 (diff)
parent5e605a2e528955721fc6f2bd7b9f174c15075fb1 (diff)
downloademacs-bb29f044aa967831cd664c54eba0de0c701436ce.tar.gz
emacs-bb29f044aa967831cd664c54eba0de0c701436ce.zip
upstream i think
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h247
1 files changed, 118 insertions, 129 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 2056b7caff8..6b19396111c 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -163,14 +163,23 @@ extern int suppress_checking EXTERNALLY_VISIBLE;
163/* First, try and define DECL_ALIGN(type,var) which declares a static 163/* First, try and define DECL_ALIGN(type,var) which declares a static
164 variable VAR of type TYPE with the added requirement that it be 164 variable VAR of type TYPE with the added requirement that it be
165 TYPEBITS-aligned. */ 165 TYPEBITS-aligned. */
166
167#ifndef GCTYPEBITS
168#define GCTYPEBITS 3
169#endif
170
166#ifndef NO_DECL_ALIGN 171#ifndef NO_DECL_ALIGN
167# ifndef DECL_ALIGN 172# ifndef DECL_ALIGN
168# if HAVE_ATTRIBUTE_ALIGNED 173# if HAVE_ATTRIBUTE_ALIGNED
169# define DECL_ALIGN(type, var) \ 174# define DECL_ALIGN(type, var) \
170 type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var 175 type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var
171# elif defined(_MSC_VER) 176# elif defined(_MSC_VER)
177# define ALIGN_GCTYPEBITS 8
178# if (1 << GCTYPEBITS) != ALIGN_GCTYPEBITS
179# error ALIGN_GCTYPEBITS is wrong!
180# endif
172# define DECL_ALIGN(type, var) \ 181# define DECL_ALIGN(type, var) \
173 type __declspec(align(1 << GCTYPEBITS)) var 182 type __declspec(align(ALIGN_GCTYPEBITS)) var
174# else 183# else
175 /* What directives do other compilers use? */ 184 /* What directives do other compilers use? */
176# endif 185# endif
@@ -300,10 +309,6 @@ enum Lisp_Fwd_Type
300 Lisp_Fwd_Kboard_Obj, /* Fwd to a Lisp_Object field of kboards. */ 309 Lisp_Fwd_Kboard_Obj, /* Fwd to a Lisp_Object field of kboards. */
301 }; 310 };
302 311
303#ifndef GCTYPEBITS
304#define GCTYPEBITS 3
305#endif
306
307/* These values are overridden by the m- file on some machines. */ 312/* These values are overridden by the m- file on some machines. */
308#ifndef VALBITS 313#ifndef VALBITS
309#define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS) 314#define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS)
@@ -324,7 +329,7 @@ union Lisp_Object
324 329
325 struct 330 struct
326 { 331 {
327 /* Use explict signed, the signedness of a bit-field of type 332 /* Use explicit signed, the signedness of a bit-field of type
328 int is implementation defined. */ 333 int is implementation defined. */
329 signed EMACS_INT val : VALBITS; 334 signed EMACS_INT val : VALBITS;
330 ENUM_BF (Lisp_Type) type : GCTYPEBITS; 335 ENUM_BF (Lisp_Type) type : GCTYPEBITS;
@@ -349,7 +354,7 @@ union Lisp_Object
349 struct 354 struct
350 { 355 {
351 ENUM_BF (Lisp_Type) type : GCTYPEBITS; 356 ENUM_BF (Lisp_Type) type : GCTYPEBITS;
352 /* Use explict signed, the signedness of a bit-field of type 357 /* Use explicit signed, the signedness of a bit-field of type
353 int is implementation defined. */ 358 int is implementation defined. */
354 signed EMACS_INT val : VALBITS; 359 signed EMACS_INT val : VALBITS;
355 } s; 360 } s;
@@ -2222,143 +2227,127 @@ struct gcpro
2222 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS) 2227 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
2223 2228
2224 2229
2225#define GCPRO1(var) \
2226 GCPRO1_VAR (var, gcpro)
2227#define GCPRO2(var1, var2) \
2228 GCPRO2_VAR (var1, var2, gcpro)
2229#define GCPRO3(var1, var2, var3) \
2230 GCPRO3_VAR (var1, var2, var3, gcpro)
2231#define GCPRO4(var1, var2, var3, var4) \
2232 GCPRO4_VAR (var1, var2, var3, var4, gcpro)
2233#define GCPRO5(var1, var2, var3, var4, var5) \
2234 GCPRO5_VAR (var1, var2, var3, var4, var5, gcpro)
2235#define GCPRO6(var1, var2, var3, var4, var5, var6) \
2236 GCPRO6_VAR (var1, var2, var3, var4, var5, var6, gcpro)
2237#define UNGCPRO UNGCPRO_VAR (gcpro)
2238
2239#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS 2230#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
2240 2231
2241/* Do something silly with gcproN vars just so gcc shuts up. */ 2232/* Do something silly with gcproN vars just so gcc shuts up. */
2242/* You get warnings from MIPSPro... */ 2233/* You get warnings from MIPSPro... */
2243 2234
2244#define GCPRO1_VAR(var, gcpro) ((void) gcpro##1) 2235#define GCPRO1(varname) ((void) gcpro1)
2245#define GCPRO2_VAR(var1, var2, gcpro) \ 2236#define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
2246 ((void) gcpro##2, (void) gcpro##1) 2237#define GCPRO3(varname1, varname2, varname3) \
2247#define GCPRO3_VAR(var1, var2, var3, gcpro) \ 2238 ((void) gcpro3, (void) gcpro2, (void) gcpro1)
2248 ((void) gcpro##3, (void) gcpro##2, (void) gcpro##1) 2239#define GCPRO4(varname1, varname2, varname3, varname4) \
2249#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \ 2240 ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
2250 ((void) gcpro##4, (void) gcpro##3, (void) gcpro##2, (void) gcpro##1) 2241#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2251#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \ 2242 ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
2252 ((void) gcpro##5, (void) gcpro##4, (void) gcpro##3, (void) gcpro##2, \ 2243#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2253 (void) gcpro##1) 2244 ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
2254#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \ 2245 (void) gcpro1)
2255 ((void) gcpro##6, (void) gcpro##5, (void) gcpro##4, (void) gcpro##3, \ 2246#define UNGCPRO ((void) 0)
2256 (void) gcpro##2, (void) gcpro##1)
2257#define UNGCPRO_VAR(gcpro) ((void) 0)
2258 2247
2259#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */ 2248#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
2260 2249
2261#ifndef DEBUG_GCPRO 2250#ifndef DEBUG_GCPRO
2262 2251
2263#define GCPRO1_VAR(var1, gcpro) \ 2252#define GCPRO1(varname) \
2264 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2253 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
2265 gcprolist = &gcpro##1; } 2254 gcprolist = &gcpro1; }
2266 2255
2267#define GCPRO2_VAR(var1, var2, gcpro) \ 2256#define GCPRO2(varname1, varname2) \
2268 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2257 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2269 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2258 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2270 gcprolist = &gcpro##2; } 2259 gcprolist = &gcpro2; }
2271 2260
2272#define GCPRO3_VAR(var1, var2, var3, gcpro) \ 2261#define GCPRO3(varname1, varname2, varname3) \
2273 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2262 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2274 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2263 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2275 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2264 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2276 gcprolist = &gcpro##3; } 2265 gcprolist = &gcpro3; }
2277 2266
2278#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \ 2267#define GCPRO4(varname1, varname2, varname3, varname4) \
2279 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2268 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2280 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2269 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2281 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2270 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2282 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2271 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2283 gcprolist = &gcpro##4; } 2272 gcprolist = &gcpro4; }
2284 2273
2285#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \ 2274#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2286 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2275 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2287 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2276 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2288 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2277 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2289 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2278 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2290 gcpro##5 .next = &gcpro##4; gcpro##5 .var = &var5; gcpro##5 .nvars = 1; \ 2279 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2291 gcprolist = &gcpro##5; } 2280 gcprolist = &gcpro5; }
2292 2281
2293#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \ 2282#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2294 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2283 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2295 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2284 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2296 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2285 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2297 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2286 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2298 gcpro##5 .next = &gcpro##4; gcpro##5 .var = &var5; gcpro##5 .nvars = 1; \ 2287 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2299 gcpro##6 .next = &gcpro##5; gcpro##6 .var = &var6; gcpro##6 .nvars = 1; \ 2288 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
2300 gcprolist = &gcpro##6; } 2289 gcprolist = &gcpro6; }
2301 2290
2302#define UNGCPRO_VAR(gcpro) (gcprolist = gcpro##1 .next) 2291#define UNGCPRO (gcprolist = gcpro1.next)
2303 2292
2304#else 2293#else
2305 2294
2306extern int gcpro_level; 2295extern int gcpro_level;
2307 2296
2308#define GCPRO1_VAR(var1, gcpro) \ 2297#define GCPRO1(varname) \
2309 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2298 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
2310 gcpro##1 .level = gcpro_level++; \ 2299 gcpro1.level = gcpro_level++; \
2311 gcprolist = &gcpro##1; } 2300 gcprolist = &gcpro1; }
2312 2301
2313#define GCPRO2_VAR(var1, var2, gcpro) \ 2302#define GCPRO2(varname1, varname2) \
2314 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2303 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2315 gcpro##1 .level = gcpro_level; \ 2304 gcpro1.level = gcpro_level; \
2316 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2305 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2317 gcpro##2 .level = gcpro_level++; \ 2306 gcpro2.level = gcpro_level++; \
2318 gcprolist = &gcpro##2; } 2307 gcprolist = &gcpro2; }
2319 2308
2320#define GCPRO3_VAR(var1, var2, var3, gcpro) \ 2309#define GCPRO3(varname1, varname2, varname3) \
2321 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2310 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2322 gcpro##1 .level = gcpro_level; \ 2311 gcpro1.level = gcpro_level; \
2323 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2312 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2324 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2313 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2325 gcpro##3 .level = gcpro_level++; \ 2314 gcpro3.level = gcpro_level++; \
2326 gcprolist = &gcpro##3; } 2315 gcprolist = &gcpro3; }
2327 2316
2328#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \ 2317#define GCPRO4(varname1, varname2, varname3, varname4) \
2329 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2318 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2330 gcpro##1 .level = gcpro_level; \ 2319 gcpro1.level = gcpro_level; \
2331 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2320 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2332 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2321 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2333 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2322 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2334 gcpro##4 .level = gcpro_level++; \ 2323 gcpro4.level = gcpro_level++; \
2335 gcprolist = &gcpro##4; } 2324 gcprolist = &gcpro4; }
2336 2325
2337#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \ 2326#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2338 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2327 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2339 gcpro##1 .level = gcpro_level; \ 2328 gcpro1.level = gcpro_level; \
2340 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2329 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2341 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2330 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2342 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2331 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2343 gcpro##5 .next = &gcpro##4; gcpro##5 .var = &var5; gcpro##5 .nvars = 1; \ 2332 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2344 gcpro##5 .level = gcpro_level++; \ 2333 gcpro5.level = gcpro_level++; \
2345 gcprolist = &gcpro##5; } 2334 gcprolist = &gcpro5; }
2346 2335
2347#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \ 2336#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2348 {gcpro##1 .next = gcprolist; gcpro##1 .var = &var1; gcpro##1 .nvars = 1; \ 2337 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2349 gcpro##1 .level = gcpro_level; \ 2338 gcpro1.level = gcpro_level; \
2350 gcpro##2 .next = &gcpro##1; gcpro##2 .var = &var2; gcpro##2 .nvars = 1; \ 2339 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2351 gcpro##3 .next = &gcpro##2; gcpro##3 .var = &var3; gcpro##3 .nvars = 1; \ 2340 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2352 gcpro##4 .next = &gcpro##3; gcpro##4 .var = &var4; gcpro##4 .nvars = 1; \ 2341 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2353 gcpro##5 .next = &gcpro##4; gcpro##5 .var = &var5; gcpro##5 .nvars = 1; \ 2342 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2354 gcpro##6 .next = &gcpro##5; gcpro##6 .var = &var6; gcpro##6 .nvars = 1; \ 2343 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
2355 gcpro##6 .level = gcpro_level++; \ 2344 gcpro6.level = gcpro_level++; \
2356 gcprolist = &gcpro##6; } 2345 gcprolist = &gcpro6; }
2357 2346
2358#define UNGCPRO_VAR(gcpro) \ 2347#define UNGCPRO \
2359 ((--gcpro_level != gcpro##1 .level) \ 2348 ((--gcpro_level != gcpro1.level) \
2360 ? (abort (), 0) \ 2349 ? (abort (), 0) \
2361 : ((gcprolist = gcpro##1 .next), 0)) 2350 : ((gcprolist = gcpro1.next), 0))
2362 2351
2363#endif /* DEBUG_GCPRO */ 2352#endif /* DEBUG_GCPRO */
2364#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */ 2353#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */