This source file includes following definitions.
- DEFINE_GDB_SYMBOL_END
- LISP_MACRO_DEFUN
- XINT
- XFASTINT
- XSYMBOL
- XTYPE
- XUNTAG
- LISP_MACRO_DEFUN
- LISP_MACRO_DEFUN
- clip_to_bounds
- LISP_MACRO_DEFUN
- XSTRING
- XFLOAT
- XPROCESS
- XWINDOW
- XTERMINAL
- XSUBR
- XBUFFER
- XCHAR_TABLE
- XSUB_CHAR_TABLE
- XBOOL_VECTOR
- make_lisp_ptr
- make_lisp_symbol
- builtin_lisp_symbol
- XINTPTR
- make_pointer_integer
- LISP_MACRO_DEFUN_VOID
- xcar_addr
- xcdr_addr
- LISP_MACRO_DEFUN
- XSETCDR
- CAR
- CDR
- CAR_SAFE
- CDR_SAFE
- STRING_MULTIBYTE
- SDATA
- SSDATA
- SREF
- SSET
- SCHARS
- STRING_BYTES
- SBYTES
- STRING_SET_CHARS
- bool_vector_size
- bool_vector_data
- bool_vector_uchar_data
- bool_vector_words
- bool_vector_bytes
- bool_vector_bitref
- bool_vector_ref
- bool_vector_set
- AREF
- aref_addr
- ASIZE
- ASET
- gc_aset
- memclear
- CHAR_TABLE_REF_ASCII
- CHAR_TABLE_REF
- CHAR_TABLE_SET
- CHAR_TABLE_EXTRA_SLOTS
- LISP_MACRO_DEFUN
- SYMBOL_BLV
- SYMBOL_FWD
- LISP_MACRO_DEFUN_VOID
- SET_SYMBOL_BLV
- SET_SYMBOL_FWD
- SYMBOL_NAME
- SYMBOL_INTERNED_P
- SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P
- XHASH_TABLE
- HASH_TABLE_P
- HASH_KEY
- HASH_VALUE
- HASH_NEXT
- HASH_HASH
- HASH_INDEX
- HASH_TABLE_SIZE
- sxhash_combine
- SXHASH_REDUCE
- save_type
- XSAVE_POINTER
- set_save_pointer
- XSAVE_FUNCPOINTER
- XSAVE_INTEGER
- set_save_integer
- XSAVE_OBJECT
- XMISC
- XMISCANY
- XMISCTYPE
- XMARKER
- XOVERLAY
- XSAVE_VALUE
- XFINALIZER
- XFWDTYPE
- XBUFFER_OBJFWD
- XFLOAT_DATA
- LISP_MACRO_DEFUN
- NATNUMP
- RANGED_INTEGERP
- LISP_MACRO_DEFUN
- VECTORP
- OVERLAYP
- SAVE_VALUEP
- FINALIZERP
- AUTOLOADP
- BUFFER_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
- LISP_MACRO_DEFUN_VOID
- CHECK_STRING_CAR
- CHECK_CONS
- CHECK_VECTOR
- CHECK_BOOL_VECTOR
- CHECK_VECTOR_OR_STRING
- CHECK_ARRAY
- CHECK_BUFFER
- CHECK_WINDOW
- CHECK_PROCESS
- CHECK_NATNUM
- XFLOATINT
- CHECK_NUMBER_OR_FLOAT
- CHECK_NUMBER_CAR
- CHECK_NUMBER_CDR
- FUNCTIONP
- SPECPDL_INDEX
- vcopy
- set_hash_key_slot
- set_hash_value_slot
- set_symbol_function
- set_symbol_plist
- set_symbol_next
- blv_found
- set_overlay_plist
- string_intervals
- set_string_intervals
- set_char_table_defalt
- set_char_table_purpose
- set_char_table_extras
- set_char_table_contents
- set_sub_char_table_contents
- next_almost_prime
- list2i
- list3i
- list4i
- make_formatted_string
- build_pure_c_string
- build_string
- make_uninit_vector
- make_uninit_sub_char_table
- esprintf
- intern
- intern_c_string
- error
- fast_string_match_ignore_case
- fixup_locale
- synchronize_system_messages_locale
- synchronize_system_time_locale
- emacs_abort
- egetenv
- lisp_word_count
- maybe_gc
- functionp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #ifndef EMACS_LISP_H
22 #define EMACS_LISP_H
23
24 #include <setjmp.h>
25 #include <stdalign.h>
26 #include <stdarg.h>
27 #include <stddef.h>
28 #include <float.h>
29 #include <inttypes.h>
30 #include <limits.h>
31
32 #include <intprops.h>
33 #include <verify.h>
34
35 INLINE_HEADER_BEGIN
36
37
38
39
40
41
42
43
44
45
46
47 #define DECLARE_GDB_SYM(type, id) type const id EXTERNALLY_VISIBLE
48 #ifdef MAIN_PROGRAM
49 # define DEFINE_GDB_SYMBOL_BEGIN(type, id) DECLARE_GDB_SYM (type, id)
50 # define DEFINE_GDB_SYMBOL_END(id) = id;
51 #else
52 # define DEFINE_GDB_SYMBOL_BEGIN(type, id) extern DECLARE_GDB_SYM (type, id)
53 # define DEFINE_GDB_SYMBOL_END(val) ;
54 #endif
55
56
57 #undef min
58 #undef max
59 #define max(a, b) ((a) > (b) ? (a) : (b))
60 #define min(a, b) ((a) < (b) ? (a) : (b))
61
62
63 #define ARRAYELTS(arr) (sizeof (arr) / sizeof (arr)[0])
64
65
66 DEFINE_GDB_SYMBOL_BEGIN (int, GCTYPEBITS)
67 #define GCTYPEBITS 3
68 DEFINE_GDB_SYMBOL_END (GCTYPEBITS)
69
70
71
72
73
74 #if (defined alignas \
75 && (defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ \
76 || defined DARWIN_OS || defined __sun || defined __MINGW32__ \
77 || defined CYGWIN))
78 # define NONPOINTER_BITS 0
79 #else
80 # define NONPOINTER_BITS GCTYPEBITS
81 #endif
82
83
84
85
86
87 #ifndef EMACS_INT_MAX
88 # if INTPTR_MAX <= 0
89 # error "INTPTR_MAX misconfigured"
90 # elif INTPTR_MAX <= INT_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
91 typedef int EMACS_INT;
92 typedef unsigned int EMACS_UINT;
93 # define EMACS_INT_MAX INT_MAX
94 # define pI ""
95 # elif INTPTR_MAX <= LONG_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
96 typedef long int EMACS_INT;
97 typedef unsigned long EMACS_UINT;
98 # define EMACS_INT_MAX LONG_MAX
99 # define pI "l"
100
101
102 # elif INTPTR_MAX <= LLONG_MAX
103 typedef long long int EMACS_INT;
104 typedef unsigned long long int EMACS_UINT;
105 # define EMACS_INT_MAX LLONG_MAX
106 # define pI "ll"
107 # else
108 # error "INTPTR_MAX too large"
109 # endif
110 #endif
111
112
113
114 enum { BOOL_VECTOR_BITS_PER_CHAR =
115 #define BOOL_VECTOR_BITS_PER_CHAR 8
116 BOOL_VECTOR_BITS_PER_CHAR
117 };
118
119
120
121
122 #if BOOL_VECTOR_BITS_PER_CHAR == CHAR_BIT
123 typedef size_t bits_word;
124 # define BITS_WORD_MAX SIZE_MAX
125 enum { BITS_PER_BITS_WORD = CHAR_BIT * sizeof (bits_word) };
126 #else
127 typedef unsigned char bits_word;
128 # define BITS_WORD_MAX ((1u << BOOL_VECTOR_BITS_PER_CHAR) - 1)
129 enum { BITS_PER_BITS_WORD = BOOL_VECTOR_BITS_PER_CHAR };
130 #endif
131 verify (BITS_WORD_MAX >> (BITS_PER_BITS_WORD - 1) == 1);
132
133
134 enum
135 {
136 BITS_PER_CHAR = CHAR_BIT,
137 BITS_PER_SHORT = CHAR_BIT * sizeof (short),
138 BITS_PER_LONG = CHAR_BIT * sizeof (long int),
139 BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT)
140 };
141
142
143
144
145
146
147 #ifdef PRIdMAX
148 typedef intmax_t printmax_t;
149 typedef uintmax_t uprintmax_t;
150 # define pMd PRIdMAX
151 # define pMu PRIuMAX
152 #else
153 typedef EMACS_INT printmax_t;
154 typedef EMACS_UINT uprintmax_t;
155 # define pMd pI"d"
156 # define pMu pI"u"
157 #endif
158
159
160
161
162
163
164 #if PTRDIFF_MAX == INT_MAX
165 # define pD ""
166 #elif PTRDIFF_MAX == LONG_MAX
167 # define pD "l"
168 #elif PTRDIFF_MAX == LLONG_MAX
169 # define pD "ll"
170 #else
171 # define pD "t"
172 #endif
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 #ifndef ENABLE_CHECKING
200 # define eassert(cond) ((void) (false && (cond)))
201 # define eassume(cond) assume (cond)
202 #else
203
204 extern _Noreturn void die (const char *, const char *, int);
205
206 extern bool suppress_checking EXTERNALLY_VISIBLE;
207
208 # define eassert(cond) \
209 (suppress_checking || (cond) \
210 ? (void) 0 \
211 : die (# cond, __FILE__, __LINE__))
212 # define eassume(cond) \
213 (suppress_checking \
214 ? assume (cond) \
215 : (cond) \
216 ? (void) 0 \
217 : die (# cond, __FILE__, __LINE__))
218 #endif
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239 enum Lisp_Bits
240 {
241
242
243 #define GCALIGNMENT 8
244
245
246 VALBITS = BITS_PER_EMACS_INT - GCTYPEBITS,
247
248
249 INTTYPEBITS = GCTYPEBITS - 1,
250
251
252 FIXNUM_BITS = VALBITS + 1
253 };
254
255 #if GCALIGNMENT != 1 << GCTYPEBITS
256 # error "GCALIGNMENT and GCTYPEBITS are inconsistent"
257 #endif
258
259
260
261
262
263 #define VAL_MAX (EMACS_INT_MAX >> (GCTYPEBITS - 1))
264
265
266
267
268
269
270 DEFINE_GDB_SYMBOL_BEGIN (bool, USE_LSB_TAG)
271 #define USE_LSB_TAG (VAL_MAX / 2 < INTPTR_MAX)
272 DEFINE_GDB_SYMBOL_END (USE_LSB_TAG)
273
274 #if !USE_LSB_TAG && !defined WIDE_EMACS_INT
275 # error "USE_LSB_TAG not supported on this platform; please report this." \
276 "Try 'configure --with-wide-int' to work around the problem."
277 error !;
278 #endif
279
280 #ifndef alignas
281 # define alignas(alignment)
282 # if USE_LSB_TAG
283 # error "USE_LSB_TAG requires alignas"
284 # endif
285 #endif
286
287 #ifdef HAVE_STRUCT_ATTRIBUTE_ALIGNED
288 # define GCALIGNED __attribute__ ((aligned (GCALIGNMENT)))
289 #else
290 # define GCALIGNED
291 #endif
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326 #if CHECK_LISP_OBJECT_TYPE
327 # define lisp_h_XLI(o) ((o).i)
328 # define lisp_h_XIL(i) ((Lisp_Object) { i })
329 #else
330 # define lisp_h_XLI(o) (o)
331 # define lisp_h_XIL(i) (i)
332 #endif
333 #define lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (CONSP (x), Qlistp, y)
334 #define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGERP (x), Qintegerp, x)
335 #define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x)
336 #define lisp_h_CHECK_TYPE(ok, predicate, x) \
337 ((ok) ? (void) 0 : (void) wrong_type_argument (predicate, x))
338 #define lisp_h_CONSP(x) (XTYPE (x) == Lisp_Cons)
339 #define lisp_h_EQ(x, y) (XLI (x) == XLI (y))
340 #define lisp_h_FLOATP(x) (XTYPE (x) == Lisp_Float)
341 #define lisp_h_INTEGERP(x) ((XTYPE (x) & (Lisp_Int0 | ~Lisp_Int1)) == Lisp_Int0)
342 #define lisp_h_MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
343 #define lisp_h_MISCP(x) (XTYPE (x) == Lisp_Misc)
344 #define lisp_h_NILP(x) EQ (x, Qnil)
345 #define lisp_h_SET_SYMBOL_VAL(sym, v) \
346 (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value = (v))
347 #define lisp_h_SYMBOL_CONSTANT_P(sym) (XSYMBOL (sym)->constant)
348 #define lisp_h_SYMBOL_VAL(sym) \
349 (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value)
350 #define lisp_h_SYMBOLP(x) (XTYPE (x) == Lisp_Symbol)
351 #define lisp_h_VECTORLIKEP(x) (XTYPE (x) == Lisp_Vectorlike)
352 #define lisp_h_XCAR(c) XCONS (c)->car
353 #define lisp_h_XCDR(c) XCONS (c)->u.cdr
354 #define lisp_h_XCONS(a) \
355 (eassert (CONSP (a)), (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons))
356 #define lisp_h_XHASH(a) XUINT (a)
357 #define lisp_h_XPNTR(a) \
358 (SYMBOLP (a) ? XSYMBOL (a) : (void *) ((intptr_t) (XLI (a) & VALMASK)))
359 #ifndef GC_CHECK_CONS_LIST
360 # define lisp_h_check_cons_list() ((void) 0)
361 #endif
362 #if USE_LSB_TAG
363 # define lisp_h_make_number(n) \
364 XIL ((EMACS_INT) (((EMACS_UINT) (n) << INTTYPEBITS) + Lisp_Int0))
365 # define lisp_h_XFASTINT(a) XINT (a)
366 # define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
367 # define lisp_h_XSYMBOL(a) \
368 (eassert (SYMBOLP (a)), \
369 (struct Lisp_Symbol *) ((uintptr_t) XLI (a) - Lisp_Symbol \
370 + (char *) lispsym))
371 # define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
372 # define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
373 #endif
374
375
376
377
378 #if (defined __NO_INLINE__ \
379 && ! defined __OPTIMIZE__ && ! defined __OPTIMIZE_SIZE__ \
380 && ! (defined INLINING && ! INLINING))
381 # define XLI(o) lisp_h_XLI (o)
382 # define XIL(i) lisp_h_XIL (i)
383 # define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_CONS (x, y)
384 # define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x)
385 # define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x)
386 # define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x)
387 # define CONSP(x) lisp_h_CONSP (x)
388 # define EQ(x, y) lisp_h_EQ (x, y)
389 # define FLOATP(x) lisp_h_FLOATP (x)
390 # define INTEGERP(x) lisp_h_INTEGERP (x)
391 # define MARKERP(x) lisp_h_MARKERP (x)
392 # define MISCP(x) lisp_h_MISCP (x)
393 # define NILP(x) lisp_h_NILP (x)
394 # define SET_SYMBOL_VAL(sym, v) lisp_h_SET_SYMBOL_VAL (sym, v)
395 # define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym)
396 # define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym)
397 # define SYMBOLP(x) lisp_h_SYMBOLP (x)
398 # define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x)
399 # define XCAR(c) lisp_h_XCAR (c)
400 # define XCDR(c) lisp_h_XCDR (c)
401 # define XCONS(a) lisp_h_XCONS (a)
402 # define XHASH(a) lisp_h_XHASH (a)
403 # define XPNTR(a) lisp_h_XPNTR (a)
404 # ifndef GC_CHECK_CONS_LIST
405 # define check_cons_list() lisp_h_check_cons_list ()
406 # endif
407 # if USE_LSB_TAG
408 # define make_number(n) lisp_h_make_number (n)
409 # define XFASTINT(a) lisp_h_XFASTINT (a)
410 # define XINT(a) lisp_h_XINT (a)
411 # define XSYMBOL(a) lisp_h_XSYMBOL (a)
412 # define XTYPE(a) lisp_h_XTYPE (a)
413 # define XUNTAG(a, type) lisp_h_XUNTAG (a, type)
414 # endif
415 #endif
416
417
418
419
420
421 #define LISP_MACRO_DEFUN(name, type, argdecls, args) \
422 INLINE type (name) argdecls { return lisp_h_##name args; }
423
424
425 #define LISP_MACRO_DEFUN_VOID(name, argdecls, args) \
426 INLINE void (name) argdecls { lisp_h_##name args; }
427
428
429
430
431
432
433
434
435
436
437 #define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1))
438 #define case_Lisp_Int case Lisp_Int0: case Lisp_Int1
439
440
441
442
443 #if (defined __STRICT_ANSI__ || defined _MSC_VER || defined __IBMC__ \
444 || (defined __SUNPRO_C && __STDC__))
445 #define ENUM_BF(TYPE) unsigned int
446 #else
447 #define ENUM_BF(TYPE) enum TYPE
448 #endif
449
450
451 enum Lisp_Type
452 {
453
454 Lisp_Symbol = 0,
455
456
457
458 Lisp_Misc = 1,
459
460
461 Lisp_Int0 = 2,
462 Lisp_Int1 = USE_LSB_TAG ? 6 : 3,
463
464
465
466 Lisp_String = 4,
467
468
469
470
471
472 Lisp_Vectorlike = 5,
473
474
475 Lisp_Cons = USE_LSB_TAG ? 3 : 6,
476
477 Lisp_Float = 7
478 };
479
480
481
482
483
484
485 enum Lisp_Misc_Type
486 {
487 Lisp_Misc_Free = 0x5eab,
488 Lisp_Misc_Marker,
489 Lisp_Misc_Overlay,
490 Lisp_Misc_Save_Value,
491 Lisp_Misc_Finalizer,
492
493
494 Lisp_Misc_Float,
495
496 Lisp_Misc_Limit
497 };
498
499
500
501
502 enum Lisp_Fwd_Type
503 {
504 Lisp_Fwd_Int,
505 Lisp_Fwd_Bool,
506 Lisp_Fwd_Obj,
507 Lisp_Fwd_Buffer_Obj,
508 Lisp_Fwd_Kboard_Obj
509 };
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565 #ifdef CHECK_LISP_OBJECT_TYPE
566
567 typedef struct { EMACS_INT i; } Lisp_Object;
568
569 #define LISP_INITIALLY(i) {i}
570
571 #undef CHECK_LISP_OBJECT_TYPE
572 enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = true };
573 #else
574
575
576
577 typedef EMACS_INT Lisp_Object;
578 #define LISP_INITIALLY(i) (i)
579 enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = false };
580 #endif
581
582 #define LISP_INITIALLY_ZERO LISP_INITIALLY (0)
583
584
585
586
587 union Lisp_Fwd;
588 INLINE bool BOOL_VECTOR_P (Lisp_Object);
589 INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *);
590 INLINE bool BUFFERP (Lisp_Object);
591 INLINE bool CHAR_TABLE_P (Lisp_Object);
592 INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object, ptrdiff_t);
593 INLINE bool (CONSP) (Lisp_Object);
594 INLINE bool (FLOATP) (Lisp_Object);
595 INLINE bool functionp (Lisp_Object);
596 INLINE bool (INTEGERP) (Lisp_Object);
597 INLINE bool (MARKERP) (Lisp_Object);
598 INLINE bool (MISCP) (Lisp_Object);
599 INLINE bool (NILP) (Lisp_Object);
600 INLINE bool OVERLAYP (Lisp_Object);
601 INLINE bool PROCESSP (Lisp_Object);
602 INLINE bool PSEUDOVECTORP (Lisp_Object, int);
603 INLINE bool SAVE_VALUEP (Lisp_Object);
604 INLINE bool FINALIZERP (Lisp_Object);
605 INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t,
606 Lisp_Object);
607 INLINE bool STRINGP (Lisp_Object);
608 INLINE bool SUB_CHAR_TABLE_P (Lisp_Object);
609 INLINE bool SUBRP (Lisp_Object);
610 INLINE bool (SYMBOLP) (Lisp_Object);
611 INLINE bool (VECTORLIKEP) (Lisp_Object);
612 INLINE bool WINDOWP (Lisp_Object);
613 INLINE bool TERMINALP (Lisp_Object);
614 INLINE struct Lisp_Save_Value *XSAVE_VALUE (Lisp_Object);
615 INLINE struct Lisp_Finalizer *XFINALIZER (Lisp_Object);
616 INLINE struct Lisp_Symbol *(XSYMBOL) (Lisp_Object);
617 INLINE void *(XUNTAG) (Lisp_Object, int);
618
619
620 extern Lisp_Object char_table_ref (Lisp_Object, int);
621 extern void char_table_set (Lisp_Object, int, Lisp_Object);
622
623
624 extern _Noreturn Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
625 extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object);
626
627
628 extern bool might_dump;
629
630
631 extern bool initialized;
632
633
634 extern double extract_float (Lisp_Object);
635
636
637
638
639 enum symbol_interned
640 {
641 SYMBOL_UNINTERNED = 0,
642 SYMBOL_INTERNED = 1,
643 SYMBOL_INTERNED_IN_INITIAL_OBARRAY = 2
644 };
645
646 enum symbol_redirect
647 {
648 SYMBOL_PLAINVAL = 4,
649 SYMBOL_VARALIAS = 1,
650 SYMBOL_LOCALIZED = 2,
651 SYMBOL_FORWARDED = 3
652 };
653
654 struct Lisp_Symbol
655 {
656 bool_bf gcmarkbit : 1;
657
658
659
660
661
662
663 ENUM_BF (symbol_redirect) redirect : 3;
664
665
666
667
668 unsigned constant : 2;
669
670
671
672 unsigned interned : 2;
673
674
675
676 bool_bf declared_special : 1;
677
678
679 bool_bf pinned : 1;
680
681
682 Lisp_Object name;
683
684
685
686 union {
687 Lisp_Object value;
688 struct Lisp_Symbol *alias;
689 struct Lisp_Buffer_Local_Value *blv;
690 union Lisp_Fwd *fwd;
691 } val;
692
693
694 Lisp_Object function;
695
696
697 Lisp_Object plist;
698
699
700 struct Lisp_Symbol *next;
701 };
702
703
704
705
706
707 #define EXFUN(fnname, maxargs) \
708 extern Lisp_Object fnname DEFUN_ARGS_ ## maxargs
709
710
711
712 #define DEFUN_ARGS_MANY (ptrdiff_t, Lisp_Object *)
713 #define DEFUN_ARGS_UNEVALLED (Lisp_Object)
714 #define DEFUN_ARGS_0 (void)
715 #define DEFUN_ARGS_1 (Lisp_Object)
716 #define DEFUN_ARGS_2 (Lisp_Object, Lisp_Object)
717 #define DEFUN_ARGS_3 (Lisp_Object, Lisp_Object, Lisp_Object)
718 #define DEFUN_ARGS_4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
719 #define DEFUN_ARGS_5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
720 Lisp_Object)
721 #define DEFUN_ARGS_6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
722 Lisp_Object, Lisp_Object)
723 #define DEFUN_ARGS_7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
724 Lisp_Object, Lisp_Object, Lisp_Object)
725 #define DEFUN_ARGS_8 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
726 Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
727
728
729 #define TAG_PTR(tag, ptr) \
730 ((USE_LSB_TAG ? (tag) : (EMACS_UINT) (tag) << VALBITS) + (uintptr_t) (ptr))
731
732
733
734 #define TAG_SYMOFFSET(offset) \
735 TAG_PTR (Lisp_Symbol, \
736 ((uintptr_t) (offset) >> (USE_LSB_TAG ? 0 : GCTYPEBITS)))
737
738
739
740
741 #define XLI_BUILTIN_LISPSYM(iname) TAG_SYMOFFSET ((iname) * sizeof *lispsym)
742
743
744
745
746 #define DEFINE_LISP_SYMBOL(name) \
747 DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \
748 DEFINE_GDB_SYMBOL_END (LISP_INITIALLY (XLI_BUILTIN_LISPSYM (i##name)))
749
750
751
752
753
754 #ifndef DEFINE_NON_NIL_Q_SYMBOL_MACROS
755 # define DEFINE_NON_NIL_Q_SYMBOL_MACROS true
756 #endif
757
758 #include "globals.h"
759
760
761
762 LISP_MACRO_DEFUN (XLI, EMACS_INT, (Lisp_Object o), (o))
763 LISP_MACRO_DEFUN (XIL, Lisp_Object, (EMACS_INT i), (i))
764
765
766
767 DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, ARRAY_MARK_FLAG)
768 # define ARRAY_MARK_FLAG PTRDIFF_MIN
769 DEFINE_GDB_SYMBOL_END (ARRAY_MARK_FLAG)
770
771
772
773 DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, PSEUDOVECTOR_FLAG)
774 # define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2)
775 DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG)
776
777
778
779
780 enum pvec_type
781 {
782 PVEC_NORMAL_VECTOR,
783 PVEC_FREE,
784 PVEC_PROCESS,
785 PVEC_FRAME,
786 PVEC_WINDOW,
787 PVEC_BOOL_VECTOR,
788 PVEC_BUFFER,
789 PVEC_HASH_TABLE,
790 PVEC_TERMINAL,
791 PVEC_WINDOW_CONFIGURATION,
792 PVEC_SUBR,
793 PVEC_OTHER,
794
795 PVEC_COMPILED,
796 PVEC_CHAR_TABLE,
797 PVEC_SUB_CHAR_TABLE,
798 PVEC_FONT
799 };
800
801 enum More_Lisp_Bits
802 {
803
804
805
806
807
808 PSEUDOVECTOR_SIZE_BITS = 12,
809 PSEUDOVECTOR_SIZE_MASK = (1 << PSEUDOVECTOR_SIZE_BITS) - 1,
810
811
812
813 PSEUDOVECTOR_REST_BITS = 12,
814 PSEUDOVECTOR_REST_MASK = (((1 << PSEUDOVECTOR_REST_BITS) - 1)
815 << PSEUDOVECTOR_SIZE_BITS),
816
817
818 PSEUDOVECTOR_AREA_BITS = PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS,
819 PVEC_TYPE_MASK = 0x3f << PSEUDOVECTOR_AREA_BITS
820 };
821
822
823
824
825
826
827
828 DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK)
829 # define VALMASK (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX)
830 DEFINE_GDB_SYMBOL_END (VALMASK)
831
832
833
834 #define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS)
835 #define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
836
837 #if USE_LSB_TAG
838
839 LISP_MACRO_DEFUN (make_number, Lisp_Object, (EMACS_INT n), (n))
840 LISP_MACRO_DEFUN (XINT, EMACS_INT, (Lisp_Object a), (a))
841 LISP_MACRO_DEFUN (XFASTINT, EMACS_INT, (Lisp_Object a), (a))
842 LISP_MACRO_DEFUN (XSYMBOL, struct Lisp_Symbol *, (Lisp_Object a), (a))
843 LISP_MACRO_DEFUN (XTYPE, enum Lisp_Type, (Lisp_Object a), (a))
844 LISP_MACRO_DEFUN (XUNTAG, void *, (Lisp_Object a, int type), (a, type))
845
846 #else
847
848
849
850
851
852
853
854 INLINE Lisp_Object
855 make_number (EMACS_INT n)
856 {
857 EMACS_INT int0 = Lisp_Int0;
858 if (USE_LSB_TAG)
859 {
860 EMACS_UINT u = n;
861 n = u << INTTYPEBITS;
862 n += int0;
863 }
864 else
865 {
866 n &= INTMASK;
867 n += (int0 << VALBITS);
868 }
869 return XIL (n);
870 }
871
872
873 INLINE EMACS_INT
874 XINT (Lisp_Object a)
875 {
876 EMACS_INT i = XLI (a);
877 if (! USE_LSB_TAG)
878 {
879 EMACS_UINT u = i;
880 i = u << INTTYPEBITS;
881 }
882 return i >> INTTYPEBITS;
883 }
884
885
886
887
888 INLINE EMACS_INT
889 XFASTINT (Lisp_Object a)
890 {
891 EMACS_INT int0 = Lisp_Int0;
892 EMACS_INT n = USE_LSB_TAG ? XINT (a) : XLI (a) - (int0 << VALBITS);
893 eassert (0 <= n);
894 return n;
895 }
896
897
898 INLINE struct Lisp_Symbol *
899 XSYMBOL (Lisp_Object a)
900 {
901 uintptr_t i = (uintptr_t) XUNTAG (a, Lisp_Symbol);
902 if (! USE_LSB_TAG)
903 i <<= GCTYPEBITS;
904 void *p = (char *) lispsym + i;
905 return p;
906 }
907
908
909 INLINE enum Lisp_Type
910 XTYPE (Lisp_Object a)
911 {
912 EMACS_UINT i = XLI (a);
913 return USE_LSB_TAG ? i & ~VALMASK : i >> VALBITS;
914 }
915
916
917 INLINE void *
918 XUNTAG (Lisp_Object a, int type)
919 {
920 intptr_t i = USE_LSB_TAG ? XLI (a) - type : XLI (a) & VALMASK;
921 return (void *) i;
922 }
923
924 #endif
925
926
927 LISP_MACRO_DEFUN (XPNTR, void *, (Lisp_Object a), (a))
928
929
930 INLINE EMACS_UINT
931 XUINT (Lisp_Object a)
932 {
933 EMACS_UINT i = XLI (a);
934 return USE_LSB_TAG ? i >> INTTYPEBITS : i & INTMASK;
935 }
936
937
938
939
940 LISP_MACRO_DEFUN (XHASH, EMACS_INT, (Lisp_Object a), (a))
941
942
943 INLINE Lisp_Object
944 make_natnum (EMACS_INT n)
945 {
946 eassert (0 <= n && n <= MOST_POSITIVE_FIXNUM);
947 EMACS_INT int0 = Lisp_Int0;
948 return USE_LSB_TAG ? make_number (n) : XIL (n + (int0 << VALBITS));
949 }
950
951
952 LISP_MACRO_DEFUN (EQ, bool, (Lisp_Object x, Lisp_Object y), (x, y))
953
954
955
956
957
958 #define FIXNUM_OVERFLOW_P(i) \
959 (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM))
960
961 INLINE ptrdiff_t
962 clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper)
963 {
964 return num < lower ? lower : num <= upper ? num : upper;
965 }
966
967
968
969
970 LISP_MACRO_DEFUN (XCONS, struct Lisp_Cons *, (Lisp_Object a), (a))
971
972 INLINE struct Lisp_Vector *
973 XVECTOR (Lisp_Object a)
974 {
975 eassert (VECTORLIKEP (a));
976 return XUNTAG (a, Lisp_Vectorlike);
977 }
978
979 INLINE struct Lisp_String *
980 XSTRING (Lisp_Object a)
981 {
982 eassert (STRINGP (a));
983 return XUNTAG (a, Lisp_String);
984 }
985
986
987
988 #define SYMBOL_INDEX(sym) i##sym
989
990 INLINE struct Lisp_Float *
991 XFLOAT (Lisp_Object a)
992 {
993 eassert (FLOATP (a));
994 return XUNTAG (a, Lisp_Float);
995 }
996
997
998
999 INLINE struct Lisp_Process *
1000 XPROCESS (Lisp_Object a)
1001 {
1002 eassert (PROCESSP (a));
1003 return XUNTAG (a, Lisp_Vectorlike);
1004 }
1005
1006 INLINE struct window *
1007 XWINDOW (Lisp_Object a)
1008 {
1009 eassert (WINDOWP (a));
1010 return XUNTAG (a, Lisp_Vectorlike);
1011 }
1012
1013 INLINE struct terminal *
1014 XTERMINAL (Lisp_Object a)
1015 {
1016 eassert (TERMINALP (a));
1017 return XUNTAG (a, Lisp_Vectorlike);
1018 }
1019
1020 INLINE struct Lisp_Subr *
1021 XSUBR (Lisp_Object a)
1022 {
1023 eassert (SUBRP (a));
1024 return XUNTAG (a, Lisp_Vectorlike);
1025 }
1026
1027 INLINE struct buffer *
1028 XBUFFER (Lisp_Object a)
1029 {
1030 eassert (BUFFERP (a));
1031 return XUNTAG (a, Lisp_Vectorlike);
1032 }
1033
1034 INLINE struct Lisp_Char_Table *
1035 XCHAR_TABLE (Lisp_Object a)
1036 {
1037 eassert (CHAR_TABLE_P (a));
1038 return XUNTAG (a, Lisp_Vectorlike);
1039 }
1040
1041 INLINE struct Lisp_Sub_Char_Table *
1042 XSUB_CHAR_TABLE (Lisp_Object a)
1043 {
1044 eassert (SUB_CHAR_TABLE_P (a));
1045 return XUNTAG (a, Lisp_Vectorlike);
1046 }
1047
1048 INLINE struct Lisp_Bool_Vector *
1049 XBOOL_VECTOR (Lisp_Object a)
1050 {
1051 eassert (BOOL_VECTOR_P (a));
1052 return XUNTAG (a, Lisp_Vectorlike);
1053 }
1054
1055
1056
1057 INLINE Lisp_Object
1058 make_lisp_ptr (void *ptr, enum Lisp_Type type)
1059 {
1060 Lisp_Object a = XIL (TAG_PTR (type, ptr));
1061 eassert (XTYPE (a) == type && XUNTAG (a, type) == ptr);
1062 return a;
1063 }
1064
1065 INLINE Lisp_Object
1066 make_lisp_symbol (struct Lisp_Symbol *sym)
1067 {
1068 Lisp_Object a = XIL (TAG_SYMOFFSET ((char *) sym - (char *) lispsym));
1069 eassert (XSYMBOL (a) == sym);
1070 return a;
1071 }
1072
1073 INLINE Lisp_Object
1074 builtin_lisp_symbol (int index)
1075 {
1076 return make_lisp_symbol (lispsym + index);
1077 }
1078
1079 #define XSETINT(a, b) ((a) = make_number (b))
1080 #define XSETFASTINT(a, b) ((a) = make_natnum (b))
1081 #define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons))
1082 #define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike))
1083 #define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String))
1084 #define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (b))
1085 #define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float))
1086 #define XSETMISC(a, b) ((a) = make_lisp_ptr (b, Lisp_Misc))
1087
1088
1089
1090 #define XSETPVECTYPE(v, code) \
1091 ((v)->header.size |= PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS))
1092 #define XSETPVECTYPESIZE(v, code, lispsize, restsize) \
1093 ((v)->header.size = (PSEUDOVECTOR_FLAG \
1094 | ((code) << PSEUDOVECTOR_AREA_BITS) \
1095 | ((restsize) << PSEUDOVECTOR_SIZE_BITS) \
1096 | (lispsize)))
1097
1098
1099 #define XSETPSEUDOVECTOR(a, b, code) \
1100 XSETTYPED_PSEUDOVECTOR (a, b, \
1101 (((struct vectorlike_header *) \
1102 XUNTAG (a, Lisp_Vectorlike)) \
1103 ->size), \
1104 code)
1105 #define XSETTYPED_PSEUDOVECTOR(a, b, size, code) \
1106 (XSETVECTOR (a, b), \
1107 eassert ((size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) \
1108 == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS))))
1109
1110 #define XSETWINDOW_CONFIGURATION(a, b) \
1111 (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW_CONFIGURATION))
1112 #define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_PROCESS))
1113 #define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW))
1114 #define XSETTERMINAL(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_TERMINAL))
1115 #define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUBR))
1116 #define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_COMPILED))
1117 #define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER))
1118 #define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE))
1119 #define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR))
1120 #define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE))
1121
1122
1123
1124
1125
1126
1127 INLINE void *
1128 XINTPTR (Lisp_Object a)
1129 {
1130 return XUNTAG (a, Lisp_Int0);
1131 }
1132
1133 INLINE Lisp_Object
1134 make_pointer_integer (void *p)
1135 {
1136 Lisp_Object a = XIL (TAG_PTR (Lisp_Int0, p));
1137 eassert (INTEGERP (a) && XINTPTR (a) == p);
1138 return a;
1139 }
1140
1141
1142
1143 LISP_MACRO_DEFUN_VOID (CHECK_TYPE,
1144 (int ok, Lisp_Object predicate, Lisp_Object x),
1145 (ok, predicate, x))
1146
1147
1148
1149 typedef struct interval *INTERVAL;
1150
1151 struct GCALIGNED Lisp_Cons
1152 {
1153
1154 Lisp_Object car;
1155
1156 union
1157 {
1158
1159 Lisp_Object cdr;
1160
1161
1162 struct Lisp_Cons *chain;
1163 } u;
1164 };
1165
1166
1167
1168
1169
1170
1171
1172
1173 INLINE Lisp_Object *
1174 xcar_addr (Lisp_Object c)
1175 {
1176 return &XCONS (c)->car;
1177 }
1178 INLINE Lisp_Object *
1179 xcdr_addr (Lisp_Object c)
1180 {
1181 return &XCONS (c)->u.cdr;
1182 }
1183
1184
1185 LISP_MACRO_DEFUN (XCAR, Lisp_Object, (Lisp_Object c), (c))
1186 LISP_MACRO_DEFUN (XCDR, Lisp_Object, (Lisp_Object c), (c))
1187
1188
1189
1190
1191
1192 INLINE void
1193 XSETCAR (Lisp_Object c, Lisp_Object n)
1194 {
1195 *xcar_addr (c) = n;
1196 }
1197 INLINE void
1198 XSETCDR (Lisp_Object c, Lisp_Object n)
1199 {
1200 *xcdr_addr (c) = n;
1201 }
1202
1203
1204 INLINE Lisp_Object
1205 CAR (Lisp_Object c)
1206 {
1207 return (CONSP (c) ? XCAR (c)
1208 : NILP (c) ? Qnil
1209 : wrong_type_argument (Qlistp, c));
1210 }
1211 INLINE Lisp_Object
1212 CDR (Lisp_Object c)
1213 {
1214 return (CONSP (c) ? XCDR (c)
1215 : NILP (c) ? Qnil
1216 : wrong_type_argument (Qlistp, c));
1217 }
1218
1219
1220 INLINE Lisp_Object
1221 CAR_SAFE (Lisp_Object c)
1222 {
1223 return CONSP (c) ? XCAR (c) : Qnil;
1224 }
1225 INLINE Lisp_Object
1226 CDR_SAFE (Lisp_Object c)
1227 {
1228 return CONSP (c) ? XCDR (c) : Qnil;
1229 }
1230
1231
1232
1233 struct GCALIGNED Lisp_String
1234 {
1235 ptrdiff_t size;
1236 ptrdiff_t size_byte;
1237 INTERVAL intervals;
1238 unsigned char *data;
1239 };
1240
1241
1242 INLINE bool
1243 STRING_MULTIBYTE (Lisp_Object str)
1244 {
1245 return 0 <= XSTRING (str)->size_byte;
1246 }
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261 #define STRING_BYTES_BOUND \
1262 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, min (SIZE_MAX, PTRDIFF_MAX) - 1))
1263
1264
1265 #define STRING_SET_UNIBYTE(STR) \
1266 do { \
1267 if (EQ (STR, empty_multibyte_string)) \
1268 (STR) = empty_unibyte_string; \
1269 else \
1270 XSTRING (STR)->size_byte = -1; \
1271 } while (false)
1272
1273
1274
1275 #define STRING_SET_MULTIBYTE(STR) \
1276 do { \
1277 if (EQ (STR, empty_unibyte_string)) \
1278 (STR) = empty_multibyte_string; \
1279 else \
1280 XSTRING (STR)->size_byte = XSTRING (STR)->size; \
1281 } while (false)
1282
1283
1284
1285 INLINE unsigned char *
1286 SDATA (Lisp_Object string)
1287 {
1288 return XSTRING (string)->data;
1289 }
1290 INLINE char *
1291 SSDATA (Lisp_Object string)
1292 {
1293
1294 return (char *) SDATA (string);
1295 }
1296 INLINE unsigned char
1297 SREF (Lisp_Object string, ptrdiff_t index)
1298 {
1299 return SDATA (string)[index];
1300 }
1301 INLINE void
1302 SSET (Lisp_Object string, ptrdiff_t index, unsigned char new)
1303 {
1304 SDATA (string)[index] = new;
1305 }
1306 INLINE ptrdiff_t
1307 SCHARS (Lisp_Object string)
1308 {
1309 return XSTRING (string)->size;
1310 }
1311
1312 #ifdef GC_CHECK_STRING_BYTES
1313 extern ptrdiff_t string_bytes (struct Lisp_String *);
1314 #endif
1315 INLINE ptrdiff_t
1316 STRING_BYTES (struct Lisp_String *s)
1317 {
1318 #ifdef GC_CHECK_STRING_BYTES
1319 return string_bytes (s);
1320 #else
1321 return s->size_byte < 0 ? s->size : s->size_byte;
1322 #endif
1323 }
1324
1325 INLINE ptrdiff_t
1326 SBYTES (Lisp_Object string)
1327 {
1328 return STRING_BYTES (XSTRING (string));
1329 }
1330 INLINE void
1331 STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize)
1332 {
1333 XSTRING (string)->size = newsize;
1334 }
1335
1336
1337
1338
1339
1340
1341
1342
1343 struct vectorlike_header
1344 {
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364 ptrdiff_t size;
1365 };
1366
1367
1368
1369 struct Lisp_Vector
1370 {
1371 struct vectorlike_header header;
1372 Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
1373 };
1374
1375
1376 enum
1377 {
1378 ALIGNOF_STRUCT_LISP_VECTOR
1379 = alignof (union { struct vectorlike_header a; Lisp_Object b; })
1380 };
1381
1382
1383
1384 struct Lisp_Bool_Vector
1385 {
1386
1387
1388 struct vectorlike_header header;
1389
1390 EMACS_INT size;
1391
1392
1393
1394
1395 bits_word data[FLEXIBLE_ARRAY_MEMBER];
1396 };
1397
1398 INLINE EMACS_INT
1399 bool_vector_size (Lisp_Object a)
1400 {
1401 EMACS_INT size = XBOOL_VECTOR (a)->size;
1402 eassume (0 <= size);
1403 return size;
1404 }
1405
1406 INLINE bits_word *
1407 bool_vector_data (Lisp_Object a)
1408 {
1409 return XBOOL_VECTOR (a)->data;
1410 }
1411
1412 INLINE unsigned char *
1413 bool_vector_uchar_data (Lisp_Object a)
1414 {
1415 return (unsigned char *) bool_vector_data (a);
1416 }
1417
1418
1419
1420 INLINE EMACS_INT
1421 bool_vector_words (EMACS_INT size)
1422 {
1423 eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
1424 return (size + BITS_PER_BITS_WORD - 1) / BITS_PER_BITS_WORD;
1425 }
1426
1427 INLINE EMACS_INT
1428 bool_vector_bytes (EMACS_INT size)
1429 {
1430 eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
1431 return (size + BOOL_VECTOR_BITS_PER_CHAR - 1) / BOOL_VECTOR_BITS_PER_CHAR;
1432 }
1433
1434
1435
1436 INLINE bool
1437 bool_vector_bitref (Lisp_Object a, EMACS_INT i)
1438 {
1439 eassume (0 <= i && i < bool_vector_size (a));
1440 return !! (bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR]
1441 & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)));
1442 }
1443
1444 INLINE Lisp_Object
1445 bool_vector_ref (Lisp_Object a, EMACS_INT i)
1446 {
1447 return bool_vector_bitref (a, i) ? Qt : Qnil;
1448 }
1449
1450
1451
1452 INLINE void
1453 bool_vector_set (Lisp_Object a, EMACS_INT i, bool b)
1454 {
1455 unsigned char *addr;
1456
1457 eassume (0 <= i && i < bool_vector_size (a));
1458 addr = &bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR];
1459
1460 if (b)
1461 *addr |= 1 << (i % BOOL_VECTOR_BITS_PER_CHAR);
1462 else
1463 *addr &= ~ (1 << (i % BOOL_VECTOR_BITS_PER_CHAR));
1464 }
1465
1466
1467
1468
1469 enum
1470 {
1471 header_size = offsetof (struct Lisp_Vector, contents),
1472 bool_header_size = offsetof (struct Lisp_Bool_Vector, data),
1473 word_size = sizeof (Lisp_Object)
1474 };
1475
1476
1477
1478 INLINE Lisp_Object
1479 AREF (Lisp_Object array, ptrdiff_t idx)
1480 {
1481 return XVECTOR (array)->contents[idx];
1482 }
1483
1484 INLINE Lisp_Object *
1485 aref_addr (Lisp_Object array, ptrdiff_t idx)
1486 {
1487 return & XVECTOR (array)->contents[idx];
1488 }
1489
1490 INLINE ptrdiff_t
1491 ASIZE (Lisp_Object array)
1492 {
1493 return XVECTOR (array)->header.size;
1494 }
1495
1496 INLINE void
1497 ASET (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
1498 {
1499 eassert (0 <= idx && idx < ASIZE (array));
1500 XVECTOR (array)->contents[idx] = val;
1501 }
1502
1503 INLINE void
1504 gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
1505 {
1506
1507
1508 eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG));
1509 XVECTOR (array)->contents[idx] = val;
1510 }
1511
1512
1513
1514
1515 enum { NIL_IS_ZERO = XLI_BUILTIN_LISPSYM (iQnil) == 0 };
1516
1517
1518
1519 INLINE void
1520 memclear (void *p, ptrdiff_t nbytes)
1521 {
1522 eassert (0 <= nbytes);
1523 verify (NIL_IS_ZERO);
1524
1525 memset (p, 0, nbytes);
1526 }
1527
1528
1529
1530
1531 #define VECSIZE(type) \
1532 ((sizeof (type) - header_size + word_size - 1) / word_size)
1533
1534
1535
1536
1537
1538 #define PSEUDOVECSIZE(type, nonlispfield) \
1539 ((offsetof (type, nonlispfield) - header_size) / word_size)
1540
1541
1542
1543
1544
1545
1546 #define UNSIGNED_CMP(a, op, b) \
1547 (max (sizeof ((a) + 0), sizeof ((b) + 0)) <= sizeof (unsigned) \
1548 ? ((a) + (unsigned) 0) op ((b) + (unsigned) 0) \
1549 : ((a) + (uintmax_t) 0) op ((b) + (uintmax_t) 0))
1550
1551
1552 #define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80)
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565 enum CHARTAB_SIZE_BITS
1566 {
1567 CHARTAB_SIZE_BITS_0 = 6,
1568 CHARTAB_SIZE_BITS_1 = 4,
1569 CHARTAB_SIZE_BITS_2 = 5,
1570 CHARTAB_SIZE_BITS_3 = 7
1571 };
1572
1573 extern const int chartab_size[4];
1574
1575 struct Lisp_Char_Table
1576 {
1577
1578
1579
1580
1581 struct vectorlike_header header;
1582
1583
1584
1585 Lisp_Object defalt;
1586
1587
1588
1589
1590 Lisp_Object parent;
1591
1592
1593
1594 Lisp_Object purpose;
1595
1596
1597
1598 Lisp_Object ascii;
1599
1600 Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)];
1601
1602
1603 Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER];
1604 };
1605
1606 struct Lisp_Sub_Char_Table
1607 {
1608
1609
1610 struct vectorlike_header header;
1611
1612
1613
1614
1615
1616
1617
1618 int depth;
1619
1620
1621 int min_char;
1622
1623
1624 Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
1625 };
1626
1627 INLINE Lisp_Object
1628 CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx)
1629 {
1630 struct Lisp_Char_Table *tbl = NULL;
1631 Lisp_Object val;
1632 do
1633 {
1634 tbl = tbl ? XCHAR_TABLE (tbl->parent) : XCHAR_TABLE (ct);
1635 val = (! SUB_CHAR_TABLE_P (tbl->ascii) ? tbl->ascii
1636 : XSUB_CHAR_TABLE (tbl->ascii)->contents[idx]);
1637 if (NILP (val))
1638 val = tbl->defalt;
1639 }
1640 while (NILP (val) && ! NILP (tbl->parent));
1641
1642 return val;
1643 }
1644
1645
1646
1647 INLINE Lisp_Object
1648 CHAR_TABLE_REF (Lisp_Object ct, int idx)
1649 {
1650 return (ASCII_CHAR_P (idx)
1651 ? CHAR_TABLE_REF_ASCII (ct, idx)
1652 : char_table_ref (ct, idx));
1653 }
1654
1655
1656
1657 INLINE void
1658 CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Object val)
1659 {
1660 if (ASCII_CHAR_P (idx) && SUB_CHAR_TABLE_P (XCHAR_TABLE (ct)->ascii))
1661 set_sub_char_table_contents (XCHAR_TABLE (ct)->ascii, idx, val);
1662 else
1663 char_table_set (ct, idx, val);
1664 }
1665
1666
1667
1668
1669
1670 struct Lisp_Subr
1671 {
1672 struct vectorlike_header header;
1673 union {
1674 Lisp_Object (*a0) (void);
1675 Lisp_Object (*a1) (Lisp_Object);
1676 Lisp_Object (*a2) (Lisp_Object, Lisp_Object);
1677 Lisp_Object (*a3) (Lisp_Object, Lisp_Object, Lisp_Object);
1678 Lisp_Object (*a4) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1679 Lisp_Object (*a5) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1680 Lisp_Object (*a6) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1681 Lisp_Object (*a7) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1682 Lisp_Object (*a8) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1683 Lisp_Object (*aUNEVALLED) (Lisp_Object args);
1684 Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object *);
1685 } function;
1686 short min_args, max_args;
1687 const char *symbol_name;
1688 const char *intspec;
1689 const char *doc;
1690 };
1691
1692 enum char_table_specials
1693 {
1694
1695
1696
1697 CHAR_TABLE_STANDARD_SLOTS = PSEUDOVECSIZE (struct Lisp_Char_Table, extras),
1698
1699
1700
1701 SUB_CHAR_TABLE_OFFSET = PSEUDOVECSIZE (struct Lisp_Sub_Char_Table, contents)
1702 };
1703
1704
1705
1706 INLINE int
1707 CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct)
1708 {
1709 return ((ct->header.size & PSEUDOVECTOR_SIZE_MASK)
1710 - CHAR_TABLE_STANDARD_SLOTS);
1711 }
1712
1713
1714 verify (offsetof (struct Lisp_Sub_Char_Table, contents)
1715 == offsetof (struct Lisp_Vector, contents[SUB_CHAR_TABLE_OFFSET]));
1716
1717
1718
1719
1720
1721
1722
1723 LISP_MACRO_DEFUN (SYMBOL_VAL, Lisp_Object, (struct Lisp_Symbol *sym), (sym))
1724
1725 INLINE struct Lisp_Symbol *
1726 SYMBOL_ALIAS (struct Lisp_Symbol *sym)
1727 {
1728 eassert (sym->redirect == SYMBOL_VARALIAS);
1729 return sym->val.alias;
1730 }
1731 INLINE struct Lisp_Buffer_Local_Value *
1732 SYMBOL_BLV (struct Lisp_Symbol *sym)
1733 {
1734 eassert (sym->redirect == SYMBOL_LOCALIZED);
1735 return sym->val.blv;
1736 }
1737 INLINE union Lisp_Fwd *
1738 SYMBOL_FWD (struct Lisp_Symbol *sym)
1739 {
1740 eassert (sym->redirect == SYMBOL_FORWARDED);
1741 return sym->val.fwd;
1742 }
1743
1744 LISP_MACRO_DEFUN_VOID (SET_SYMBOL_VAL,
1745 (struct Lisp_Symbol *sym, Lisp_Object v), (sym, v))
1746
1747 INLINE void
1748 SET_SYMBOL_ALIAS (struct Lisp_Symbol *sym, struct Lisp_Symbol *v)
1749 {
1750 eassert (sym->redirect == SYMBOL_VARALIAS);
1751 sym->val.alias = v;
1752 }
1753 INLINE void
1754 SET_SYMBOL_BLV (struct Lisp_Symbol *sym, struct Lisp_Buffer_Local_Value *v)
1755 {
1756 eassert (sym->redirect == SYMBOL_LOCALIZED);
1757 sym->val.blv = v;
1758 }
1759 INLINE void
1760 SET_SYMBOL_FWD (struct Lisp_Symbol *sym, union Lisp_Fwd *v)
1761 {
1762 eassert (sym->redirect == SYMBOL_FORWARDED);
1763 sym->val.fwd = v;
1764 }
1765
1766 INLINE Lisp_Object
1767 SYMBOL_NAME (Lisp_Object sym)
1768 {
1769 return XSYMBOL (sym)->name;
1770 }
1771
1772
1773
1774 INLINE bool
1775 SYMBOL_INTERNED_P (Lisp_Object sym)
1776 {
1777 return XSYMBOL (sym)->interned != SYMBOL_UNINTERNED;
1778 }
1779
1780
1781
1782 INLINE bool
1783 SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym)
1784 {
1785 return XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
1786 }
1787
1788
1789
1790
1791
1792 LISP_MACRO_DEFUN (SYMBOL_CONSTANT_P, int, (Lisp_Object sym), (sym))
1793
1794
1795
1796 #define DEFSYM(sym, name)
1797
1798
1799
1800
1801
1802
1803
1804
1805 struct hash_table_test
1806 {
1807
1808 Lisp_Object name;
1809
1810
1811 Lisp_Object user_hash_function;
1812
1813
1814 Lisp_Object user_cmp_function;
1815
1816
1817 bool (*cmpfn) (struct hash_table_test *t, Lisp_Object, Lisp_Object);
1818
1819
1820 EMACS_UINT (*hashfn) (struct hash_table_test *t, Lisp_Object);
1821 };
1822
1823 struct Lisp_Hash_Table
1824 {
1825
1826 struct vectorlike_header header;
1827
1828
1829
1830 Lisp_Object weak;
1831
1832
1833
1834
1835 Lisp_Object rehash_size;
1836
1837
1838
1839 Lisp_Object rehash_threshold;
1840
1841
1842
1843 Lisp_Object hash;
1844
1845
1846
1847
1848 Lisp_Object next;
1849
1850
1851 Lisp_Object next_free;
1852
1853
1854
1855
1856 Lisp_Object index;
1857
1858
1859
1860
1861
1862
1863 ptrdiff_t count;
1864
1865
1866
1867
1868 Lisp_Object key_and_value;
1869
1870
1871 struct hash_table_test test;
1872
1873
1874
1875 struct Lisp_Hash_Table *next_weak;
1876 };
1877
1878
1879 INLINE struct Lisp_Hash_Table *
1880 XHASH_TABLE (Lisp_Object a)
1881 {
1882 return XUNTAG (a, Lisp_Vectorlike);
1883 }
1884
1885 #define XSET_HASH_TABLE(VAR, PTR) \
1886 (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
1887
1888 INLINE bool
1889 HASH_TABLE_P (Lisp_Object a)
1890 {
1891 return PSEUDOVECTORP (a, PVEC_HASH_TABLE);
1892 }
1893
1894
1895 INLINE Lisp_Object
1896 HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx)
1897 {
1898 return AREF (h->key_and_value, 2 * idx);
1899 }
1900
1901
1902 INLINE Lisp_Object
1903 HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t idx)
1904 {
1905 return AREF (h->key_and_value, 2 * idx + 1);
1906 }
1907
1908
1909
1910 INLINE Lisp_Object
1911 HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t idx)
1912 {
1913 return AREF (h->next, idx);
1914 }
1915
1916
1917 INLINE Lisp_Object
1918 HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t idx)
1919 {
1920 return AREF (h->hash, idx);
1921 }
1922
1923
1924
1925 INLINE Lisp_Object
1926 HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx)
1927 {
1928 return AREF (h->index, idx);
1929 }
1930
1931
1932 INLINE ptrdiff_t
1933 HASH_TABLE_SIZE (struct Lisp_Hash_Table *h)
1934 {
1935 return ASIZE (h->next);
1936 }
1937
1938
1939
1940 enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE = 65 };
1941
1942
1943
1944
1945
1946 static double const DEFAULT_REHASH_THRESHOLD = 0.8;
1947
1948
1949
1950 static double const DEFAULT_REHASH_SIZE = 1.5;
1951
1952
1953
1954
1955 INLINE EMACS_UINT
1956 sxhash_combine (EMACS_UINT x, EMACS_UINT y)
1957 {
1958 return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y;
1959 }
1960
1961
1962
1963 INLINE EMACS_UINT
1964 SXHASH_REDUCE (EMACS_UINT x)
1965 {
1966 return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK;
1967 }
1968
1969
1970
1971 struct Lisp_Misc_Any
1972 {
1973 ENUM_BF (Lisp_Misc_Type) type : 16;
1974 bool_bf gcmarkbit : 1;
1975 unsigned spacer : 15;
1976 };
1977
1978 struct Lisp_Marker
1979 {
1980 ENUM_BF (Lisp_Misc_Type) type : 16;
1981 bool_bf gcmarkbit : 1;
1982 unsigned spacer : 13;
1983
1984
1985
1986 bool_bf need_adjustment : 1;
1987
1988
1989 bool_bf insertion_type : 1;
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000 struct buffer *buffer;
2001
2002
2003
2004
2005
2006
2007
2008
2009 struct Lisp_Marker *next;
2010
2011 ptrdiff_t charpos;
2012
2013
2014
2015
2016 ptrdiff_t bytepos;
2017 };
2018
2019
2020
2021 struct Lisp_Overlay
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033 {
2034 ENUM_BF (Lisp_Misc_Type) type : 16;
2035 bool_bf gcmarkbit : 1;
2036 unsigned spacer : 15;
2037 struct Lisp_Overlay *next;
2038 Lisp_Object start;
2039 Lisp_Object end;
2040 Lisp_Object plist;
2041 };
2042
2043
2044
2045 enum
2046 {
2047 SAVE_UNUSED,
2048 SAVE_INTEGER,
2049 SAVE_FUNCPOINTER,
2050 SAVE_POINTER,
2051 SAVE_OBJECT
2052 };
2053
2054
2055 enum { SAVE_SLOT_BITS = 3 };
2056
2057
2058 enum { SAVE_VALUE_SLOTS = 4 };
2059
2060
2061
2062 enum { SAVE_TYPE_BITS = SAVE_VALUE_SLOTS * SAVE_SLOT_BITS + 1 };
2063
2064 enum Lisp_Save_Type
2065 {
2066 SAVE_TYPE_INT_INT = SAVE_INTEGER + (SAVE_INTEGER << SAVE_SLOT_BITS),
2067 SAVE_TYPE_INT_INT_INT
2068 = (SAVE_INTEGER + (SAVE_TYPE_INT_INT << SAVE_SLOT_BITS)),
2069 SAVE_TYPE_OBJ_OBJ = SAVE_OBJECT + (SAVE_OBJECT << SAVE_SLOT_BITS),
2070 SAVE_TYPE_OBJ_OBJ_OBJ = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ << SAVE_SLOT_BITS),
2071 SAVE_TYPE_OBJ_OBJ_OBJ_OBJ
2072 = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ_OBJ << SAVE_SLOT_BITS),
2073 SAVE_TYPE_PTR_INT = SAVE_POINTER + (SAVE_INTEGER << SAVE_SLOT_BITS),
2074 SAVE_TYPE_PTR_OBJ = SAVE_POINTER + (SAVE_OBJECT << SAVE_SLOT_BITS),
2075 SAVE_TYPE_PTR_PTR = SAVE_POINTER + (SAVE_POINTER << SAVE_SLOT_BITS),
2076 SAVE_TYPE_FUNCPTR_PTR_OBJ
2077 = SAVE_FUNCPOINTER + (SAVE_TYPE_PTR_OBJ << SAVE_SLOT_BITS),
2078
2079
2080 SAVE_TYPE_MEMORY = SAVE_TYPE_PTR_INT + (1 << (SAVE_TYPE_BITS - 1))
2081 };
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108 typedef void (*voidfuncptr) (void);
2109
2110 struct Lisp_Save_Value
2111 {
2112 ENUM_BF (Lisp_Misc_Type) type : 16;
2113 bool_bf gcmarkbit : 1;
2114 unsigned spacer : 32 - (16 + 1 + SAVE_TYPE_BITS);
2115
2116
2117
2118
2119
2120
2121
2122
2123 ENUM_BF (Lisp_Save_Type) save_type : SAVE_TYPE_BITS;
2124 union {
2125 void *pointer;
2126 voidfuncptr funcpointer;
2127 ptrdiff_t integer;
2128 Lisp_Object object;
2129 } data[SAVE_VALUE_SLOTS];
2130 };
2131
2132
2133 INLINE int
2134 save_type (struct Lisp_Save_Value *v, int n)
2135 {
2136 eassert (0 <= n && n < SAVE_VALUE_SLOTS);
2137 return (v->save_type >> (SAVE_SLOT_BITS * n) & ((1 << SAVE_SLOT_BITS) - 1));
2138 }
2139
2140
2141
2142 INLINE void *
2143 XSAVE_POINTER (Lisp_Object obj, int n)
2144 {
2145 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
2146 return XSAVE_VALUE (obj)->data[n].pointer;
2147 }
2148 INLINE void
2149 set_save_pointer (Lisp_Object obj, int n, void *val)
2150 {
2151 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
2152 XSAVE_VALUE (obj)->data[n].pointer = val;
2153 }
2154 INLINE voidfuncptr
2155 XSAVE_FUNCPOINTER (Lisp_Object obj, int n)
2156 {
2157 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_FUNCPOINTER);
2158 return XSAVE_VALUE (obj)->data[n].funcpointer;
2159 }
2160
2161
2162
2163 INLINE ptrdiff_t
2164 XSAVE_INTEGER (Lisp_Object obj, int n)
2165 {
2166 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
2167 return XSAVE_VALUE (obj)->data[n].integer;
2168 }
2169 INLINE void
2170 set_save_integer (Lisp_Object obj, int n, ptrdiff_t val)
2171 {
2172 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
2173 XSAVE_VALUE (obj)->data[n].integer = val;
2174 }
2175
2176
2177
2178 INLINE Lisp_Object
2179 XSAVE_OBJECT (Lisp_Object obj, int n)
2180 {
2181 eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_OBJECT);
2182 return XSAVE_VALUE (obj)->data[n].object;
2183 }
2184
2185
2186 struct Lisp_Finalizer
2187 {
2188 struct Lisp_Misc_Any base;
2189
2190
2191 struct Lisp_Finalizer *prev;
2192 struct Lisp_Finalizer *next;
2193
2194
2195
2196
2197 Lisp_Object function;
2198 };
2199
2200
2201 struct Lisp_Free
2202 {
2203 ENUM_BF (Lisp_Misc_Type) type : 16;
2204 bool_bf gcmarkbit : 1;
2205 unsigned spacer : 15;
2206 union Lisp_Misc *chain;
2207 };
2208
2209
2210
2211
2212 union Lisp_Misc
2213 {
2214 struct Lisp_Misc_Any u_any;
2215 struct Lisp_Free u_free;
2216 struct Lisp_Marker u_marker;
2217 struct Lisp_Overlay u_overlay;
2218 struct Lisp_Save_Value u_save_value;
2219 struct Lisp_Finalizer u_finalizer;
2220 };
2221
2222 INLINE union Lisp_Misc *
2223 XMISC (Lisp_Object a)
2224 {
2225 return XUNTAG (a, Lisp_Misc);
2226 }
2227
2228 INLINE struct Lisp_Misc_Any *
2229 XMISCANY (Lisp_Object a)
2230 {
2231 eassert (MISCP (a));
2232 return & XMISC (a)->u_any;
2233 }
2234
2235 INLINE enum Lisp_Misc_Type
2236 XMISCTYPE (Lisp_Object a)
2237 {
2238 return XMISCANY (a)->type;
2239 }
2240
2241 INLINE struct Lisp_Marker *
2242 XMARKER (Lisp_Object a)
2243 {
2244 eassert (MARKERP (a));
2245 return & XMISC (a)->u_marker;
2246 }
2247
2248 INLINE struct Lisp_Overlay *
2249 XOVERLAY (Lisp_Object a)
2250 {
2251 eassert (OVERLAYP (a));
2252 return & XMISC (a)->u_overlay;
2253 }
2254
2255 INLINE struct Lisp_Save_Value *
2256 XSAVE_VALUE (Lisp_Object a)
2257 {
2258 eassert (SAVE_VALUEP (a));
2259 return & XMISC (a)->u_save_value;
2260 }
2261
2262 INLINE struct Lisp_Finalizer *
2263 XFINALIZER (Lisp_Object a)
2264 {
2265 eassert (FINALIZERP (a));
2266 return & XMISC (a)->u_finalizer;
2267 }
2268
2269
2270
2271
2272
2273
2274 struct Lisp_Intfwd
2275 {
2276 enum Lisp_Fwd_Type type;
2277 EMACS_INT *intvar;
2278 };
2279
2280
2281
2282
2283
2284 struct Lisp_Boolfwd
2285 {
2286 enum Lisp_Fwd_Type type;
2287 bool *boolvar;
2288 };
2289
2290
2291
2292
2293
2294 struct Lisp_Objfwd
2295 {
2296 enum Lisp_Fwd_Type type;
2297 Lisp_Object *objvar;
2298 };
2299
2300
2301
2302 struct Lisp_Buffer_Objfwd
2303 {
2304 enum Lisp_Fwd_Type type;
2305 int offset;
2306
2307 Lisp_Object predicate;
2308 };
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334 struct Lisp_Buffer_Local_Value
2335 {
2336
2337
2338 bool_bf local_if_set : 1;
2339
2340
2341 bool_bf frame_local : 1;
2342
2343
2344 bool_bf found : 1;
2345
2346 union Lisp_Fwd *fwd;
2347
2348 Lisp_Object where;
2349
2350
2351 Lisp_Object defcell;
2352
2353
2354
2355
2356
2357 Lisp_Object valcell;
2358 };
2359
2360
2361
2362 struct Lisp_Kboard_Objfwd
2363 {
2364 enum Lisp_Fwd_Type type;
2365 int offset;
2366 };
2367
2368 union Lisp_Fwd
2369 {
2370 struct Lisp_Intfwd u_intfwd;
2371 struct Lisp_Boolfwd u_boolfwd;
2372 struct Lisp_Objfwd u_objfwd;
2373 struct Lisp_Buffer_Objfwd u_buffer_objfwd;
2374 struct Lisp_Kboard_Objfwd u_kboard_objfwd;
2375 };
2376
2377 INLINE enum Lisp_Fwd_Type
2378 XFWDTYPE (union Lisp_Fwd *a)
2379 {
2380 return a->u_intfwd.type;
2381 }
2382
2383 INLINE struct Lisp_Buffer_Objfwd *
2384 XBUFFER_OBJFWD (union Lisp_Fwd *a)
2385 {
2386 eassert (BUFFER_OBJFWDP (a));
2387 return &a->u_buffer_objfwd;
2388 }
2389
2390
2391 struct Lisp_Float
2392 {
2393 union
2394 {
2395 double data;
2396 struct Lisp_Float *chain;
2397 } u;
2398 };
2399
2400 INLINE double
2401 XFLOAT_DATA (Lisp_Object f)
2402 {
2403 return XFLOAT (f)->u.data;
2404 }
2405
2406
2407
2408
2409
2410
2411
2412
2413 enum
2414 {
2415 IEEE_FLOATING_POINT
2416 = (FLT_RADIX == 2 && FLT_MANT_DIG == 24
2417 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
2418 };
2419
2420
2421
2422 #ifndef _UCHAR_T
2423 #define _UCHAR_T
2424 typedef unsigned char UCHAR;
2425 #endif
2426
2427
2428
2429 enum Lisp_Compiled
2430 {
2431 COMPILED_ARGLIST = 0,
2432 COMPILED_BYTECODE = 1,
2433 COMPILED_CONSTANTS = 2,
2434 COMPILED_STACK_DEPTH = 3,
2435 COMPILED_DOC_STRING = 4,
2436 COMPILED_INTERACTIVE = 5
2437 };
2438
2439
2440
2441
2442
2443 enum char_bits
2444 {
2445 CHAR_ALT = 0x0400000,
2446 CHAR_SUPER = 0x0800000,
2447 CHAR_HYPER = 0x1000000,
2448 CHAR_SHIFT = 0x2000000,
2449 CHAR_CTL = 0x4000000,
2450 CHAR_META = 0x8000000,
2451
2452 CHAR_MODIFIER_MASK =
2453 CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META,
2454
2455
2456
2457 CHARACTERBITS = 22
2458 };
2459
2460
2461
2462 LISP_MACRO_DEFUN (NILP, bool, (Lisp_Object x), (x))
2463
2464 INLINE bool
2465 NUMBERP (Lisp_Object x)
2466 {
2467 return INTEGERP (x) || FLOATP (x);
2468 }
2469 INLINE bool
2470 NATNUMP (Lisp_Object x)
2471 {
2472 return INTEGERP (x) && 0 <= XINT (x);
2473 }
2474
2475 INLINE bool
2476 RANGED_INTEGERP (intmax_t lo, Lisp_Object x, intmax_t hi)
2477 {
2478 return INTEGERP (x) && lo <= XINT (x) && XINT (x) <= hi;
2479 }
2480
2481 #define TYPE_RANGED_INTEGERP(type, x) \
2482 (INTEGERP (x) \
2483 && (TYPE_SIGNED (type) ? TYPE_MINIMUM (type) <= XINT (x) : 0 <= XINT (x)) \
2484 && XINT (x) <= TYPE_MAXIMUM (type))
2485
2486 LISP_MACRO_DEFUN (CONSP, bool, (Lisp_Object x), (x))
2487 LISP_MACRO_DEFUN (FLOATP, bool, (Lisp_Object x), (x))
2488 LISP_MACRO_DEFUN (MISCP, bool, (Lisp_Object x), (x))
2489 LISP_MACRO_DEFUN (SYMBOLP, bool, (Lisp_Object x), (x))
2490 LISP_MACRO_DEFUN (INTEGERP, bool, (Lisp_Object x), (x))
2491 LISP_MACRO_DEFUN (VECTORLIKEP, bool, (Lisp_Object x), (x))
2492 LISP_MACRO_DEFUN (MARKERP, bool, (Lisp_Object x), (x))
2493
2494 INLINE bool
2495 STRINGP (Lisp_Object x)
2496 {
2497 return XTYPE (x) == Lisp_String;
2498 }
2499 INLINE bool
2500 VECTORP (Lisp_Object x)
2501 {
2502 return VECTORLIKEP (x) && ! (ASIZE (x) & PSEUDOVECTOR_FLAG);
2503 }
2504 INLINE bool
2505 OVERLAYP (Lisp_Object x)
2506 {
2507 return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay;
2508 }
2509 INLINE bool
2510 SAVE_VALUEP (Lisp_Object x)
2511 {
2512 return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value;
2513 }
2514
2515 INLINE bool
2516 FINALIZERP (Lisp_Object x)
2517 {
2518 return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Finalizer;
2519 }
2520
2521 INLINE bool
2522 AUTOLOADP (Lisp_Object x)
2523 {
2524 return CONSP (x) && EQ (Qautoload, XCAR (x));
2525 }
2526
2527 INLINE bool
2528 BUFFER_OBJFWDP (union Lisp_Fwd *a)
2529 {
2530 return XFWDTYPE (a) == Lisp_Fwd_Buffer_Obj;
2531 }
2532
2533 INLINE bool
2534 PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, int code)
2535 {
2536 return ((a->size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK))
2537 == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS)));
2538 }
2539
2540
2541 INLINE bool
2542 PSEUDOVECTORP (Lisp_Object a, int code)
2543 {
2544 if (! VECTORLIKEP (a))
2545 return false;
2546 else
2547 {
2548
2549 struct vectorlike_header *h = XUNTAG (a, Lisp_Vectorlike);
2550 return PSEUDOVECTOR_TYPEP (h, code);
2551 }
2552 }
2553
2554
2555
2556
2557 INLINE bool
2558 WINDOW_CONFIGURATIONP (Lisp_Object a)
2559 {
2560 return PSEUDOVECTORP (a, PVEC_WINDOW_CONFIGURATION);
2561 }
2562
2563 INLINE bool
2564 PROCESSP (Lisp_Object a)
2565 {
2566 return PSEUDOVECTORP (a, PVEC_PROCESS);
2567 }
2568
2569 INLINE bool
2570 WINDOWP (Lisp_Object a)
2571 {
2572 return PSEUDOVECTORP (a, PVEC_WINDOW);
2573 }
2574
2575 INLINE bool
2576 TERMINALP (Lisp_Object a)
2577 {
2578 return PSEUDOVECTORP (a, PVEC_TERMINAL);
2579 }
2580
2581 INLINE bool
2582 SUBRP (Lisp_Object a)
2583 {
2584 return PSEUDOVECTORP (a, PVEC_SUBR);
2585 }
2586
2587 INLINE bool
2588 COMPILEDP (Lisp_Object a)
2589 {
2590 return PSEUDOVECTORP (a, PVEC_COMPILED);
2591 }
2592
2593 INLINE bool
2594 BUFFERP (Lisp_Object a)
2595 {
2596 return PSEUDOVECTORP (a, PVEC_BUFFER);
2597 }
2598
2599 INLINE bool
2600 CHAR_TABLE_P (Lisp_Object a)
2601 {
2602 return PSEUDOVECTORP (a, PVEC_CHAR_TABLE);
2603 }
2604
2605 INLINE bool
2606 SUB_CHAR_TABLE_P (Lisp_Object a)
2607 {
2608 return PSEUDOVECTORP (a, PVEC_SUB_CHAR_TABLE);
2609 }
2610
2611 INLINE bool
2612 BOOL_VECTOR_P (Lisp_Object a)
2613 {
2614 return PSEUDOVECTORP (a, PVEC_BOOL_VECTOR);
2615 }
2616
2617 INLINE bool
2618 FRAMEP (Lisp_Object a)
2619 {
2620 return PSEUDOVECTORP (a, PVEC_FRAME);
2621 }
2622
2623
2624 INLINE bool
2625 IMAGEP (Lisp_Object x)
2626 {
2627 return CONSP (x) && EQ (XCAR (x), Qimage);
2628 }
2629
2630
2631 INLINE bool
2632 ARRAYP (Lisp_Object x)
2633 {
2634 return VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x);
2635 }
2636
2637 INLINE void
2638 CHECK_LIST (Lisp_Object x)
2639 {
2640 CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x);
2641 }
2642
2643 LISP_MACRO_DEFUN_VOID (CHECK_LIST_CONS, (Lisp_Object x, Lisp_Object y), (x, y))
2644 LISP_MACRO_DEFUN_VOID (CHECK_SYMBOL, (Lisp_Object x), (x))
2645 LISP_MACRO_DEFUN_VOID (CHECK_NUMBER, (Lisp_Object x), (x))
2646
2647 INLINE void
2648 CHECK_STRING (Lisp_Object x)
2649 {
2650 CHECK_TYPE (STRINGP (x), Qstringp, x);
2651 }
2652 INLINE void
2653 CHECK_STRING_CAR (Lisp_Object x)
2654 {
2655 CHECK_TYPE (STRINGP (XCAR (x)), Qstringp, XCAR (x));
2656 }
2657 INLINE void
2658 CHECK_CONS (Lisp_Object x)
2659 {
2660 CHECK_TYPE (CONSP (x), Qconsp, x);
2661 }
2662 INLINE void
2663 CHECK_VECTOR (Lisp_Object x)
2664 {
2665 CHECK_TYPE (VECTORP (x), Qvectorp, x);
2666 }
2667 INLINE void
2668 CHECK_BOOL_VECTOR (Lisp_Object x)
2669 {
2670 CHECK_TYPE (BOOL_VECTOR_P (x), Qbool_vector_p, x);
2671 }
2672
2673 INLINE ptrdiff_t
2674 CHECK_VECTOR_OR_STRING (Lisp_Object x)
2675 {
2676 if (VECTORP (x))
2677 return ASIZE (x);
2678 if (STRINGP (x))
2679 return SCHARS (x);
2680 wrong_type_argument (Qarrayp, x);
2681 }
2682 INLINE void
2683 CHECK_ARRAY (Lisp_Object x, Lisp_Object predicate)
2684 {
2685 CHECK_TYPE (ARRAYP (x), predicate, x);
2686 }
2687 INLINE void
2688 CHECK_BUFFER (Lisp_Object x)
2689 {
2690 CHECK_TYPE (BUFFERP (x), Qbufferp, x);
2691 }
2692 INLINE void
2693 CHECK_WINDOW (Lisp_Object x)
2694 {
2695 CHECK_TYPE (WINDOWP (x), Qwindowp, x);
2696 }
2697 #ifdef subprocesses
2698 INLINE void
2699 CHECK_PROCESS (Lisp_Object x)
2700 {
2701 CHECK_TYPE (PROCESSP (x), Qprocessp, x);
2702 }
2703 #endif
2704 INLINE void
2705 CHECK_NATNUM (Lisp_Object x)
2706 {
2707 CHECK_TYPE (NATNUMP (x), Qwholenump, x);
2708 }
2709
2710 #define CHECK_RANGED_INTEGER(x, lo, hi) \
2711 do { \
2712 CHECK_NUMBER (x); \
2713 if (! ((lo) <= XINT (x) && XINT (x) <= (hi))) \
2714 args_out_of_range_3 \
2715 (x, \
2716 make_number ((lo) < 0 && (lo) < MOST_NEGATIVE_FIXNUM \
2717 ? MOST_NEGATIVE_FIXNUM \
2718 : (lo)), \
2719 make_number (min (hi, MOST_POSITIVE_FIXNUM))); \
2720 } while (false)
2721 #define CHECK_TYPE_RANGED_INTEGER(type, x) \
2722 do { \
2723 if (TYPE_SIGNED (type)) \
2724 CHECK_RANGED_INTEGER (x, TYPE_MINIMUM (type), TYPE_MAXIMUM (type)); \
2725 else \
2726 CHECK_RANGED_INTEGER (x, 0, TYPE_MAXIMUM (type)); \
2727 } while (false)
2728
2729 #define CHECK_NUMBER_COERCE_MARKER(x) \
2730 do { \
2731 if (MARKERP ((x))) \
2732 XSETFASTINT (x, marker_position (x)); \
2733 else \
2734 CHECK_TYPE (INTEGERP (x), Qinteger_or_marker_p, x); \
2735 } while (false)
2736
2737 INLINE double
2738 XFLOATINT (Lisp_Object n)
2739 {
2740 return extract_float (n);
2741 }
2742
2743 INLINE void
2744 CHECK_NUMBER_OR_FLOAT (Lisp_Object x)
2745 {
2746 CHECK_TYPE (FLOATP (x) || INTEGERP (x), Qnumberp, x);
2747 }
2748
2749 #define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x) \
2750 do { \
2751 if (MARKERP (x)) \
2752 XSETFASTINT (x, marker_position (x)); \
2753 else \
2754 CHECK_TYPE (INTEGERP (x) || FLOATP (x), Qnumber_or_marker_p, x); \
2755 } while (false)
2756
2757
2758
2759 INLINE void
2760 CHECK_NUMBER_CAR (Lisp_Object x)
2761 {
2762 Lisp_Object tmp = XCAR (x);
2763 CHECK_NUMBER (tmp);
2764 XSETCAR (x, tmp);
2765 }
2766
2767 INLINE void
2768 CHECK_NUMBER_CDR (Lisp_Object x)
2769 {
2770 Lisp_Object tmp = XCDR (x);
2771 CHECK_NUMBER (tmp);
2772 XSETCDR (x, tmp);
2773 }
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802 #ifdef _MSC_VER
2803 #define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
2804 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
2805 static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
2806 { { (PVEC_SUBR << PSEUDOVECTOR_AREA_BITS) \
2807 | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)) }, \
2808 { (Lisp_Object (__cdecl *)(void))fnname }, \
2809 minargs, maxargs, lname, intspec, 0}; \
2810 Lisp_Object fnname
2811 #else
2812 #define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
2813 static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
2814 { { PVEC_SUBR << PSEUDOVECTOR_AREA_BITS }, \
2815 { .a ## maxargs = fnname }, \
2816 minargs, maxargs, lname, intspec, 0}; \
2817 Lisp_Object fnname
2818 #endif
2819
2820
2821 INLINE bool
2822 FUNCTIONP (Lisp_Object obj)
2823 {
2824 return functionp (obj);
2825 }
2826
2827
2828
2829 extern void defsubr (struct Lisp_Subr *);
2830
2831 enum maxargs
2832 {
2833 MANY = -2,
2834 UNEVALLED = -1
2835 };
2836
2837
2838 #define CALLMANY(f, array) (f) (ARRAYELTS (array), array)
2839
2840
2841
2842
2843
2844 #define CALLN(f, ...) CALLMANY (f, ((Lisp_Object []) {__VA_ARGS__}))
2845
2846 extern void defvar_lisp (struct Lisp_Objfwd *, const char *, Lisp_Object *);
2847 extern void defvar_lisp_nopro (struct Lisp_Objfwd *, const char *, Lisp_Object *);
2848 extern void defvar_bool (struct Lisp_Boolfwd *, const char *, bool *);
2849 extern void defvar_int (struct Lisp_Intfwd *, const char *, EMACS_INT *);
2850 extern void defvar_kboard (struct Lisp_Kboard_Objfwd *, const char *, int);
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869 #define DEFVAR_LISP(lname, vname, doc) \
2870 do { \
2871 static struct Lisp_Objfwd o_fwd; \
2872 defvar_lisp (&o_fwd, lname, &globals.f_ ## vname); \
2873 } while (false)
2874 #define DEFVAR_LISP_NOPRO(lname, vname, doc) \
2875 do { \
2876 static struct Lisp_Objfwd o_fwd; \
2877 defvar_lisp_nopro (&o_fwd, lname, &globals.f_ ## vname); \
2878 } while (false)
2879 #define DEFVAR_BOOL(lname, vname, doc) \
2880 do { \
2881 static struct Lisp_Boolfwd b_fwd; \
2882 defvar_bool (&b_fwd, lname, &globals.f_ ## vname); \
2883 } while (false)
2884 #define DEFVAR_INT(lname, vname, doc) \
2885 do { \
2886 static struct Lisp_Intfwd i_fwd; \
2887 defvar_int (&i_fwd, lname, &globals.f_ ## vname); \
2888 } while (false)
2889
2890 #define DEFVAR_BUFFER_DEFAULTS(lname, vname, doc) \
2891 do { \
2892 static struct Lisp_Objfwd o_fwd; \
2893 defvar_lisp_nopro (&o_fwd, lname, &BVAR (&buffer_defaults, vname)); \
2894 } while (false)
2895
2896 #define DEFVAR_KBOARD(lname, vname, doc) \
2897 do { \
2898 static struct Lisp_Kboard_Objfwd ko_fwd; \
2899 defvar_kboard (&ko_fwd, lname, offsetof (KBOARD, vname ## _)); \
2900 } while (false)
2901
2902
2903
2904
2905 #ifdef HAVE__SETJMP
2906 typedef jmp_buf sys_jmp_buf;
2907 # define sys_setjmp(j) _setjmp (j)
2908 # define sys_longjmp(j, v) _longjmp (j, v)
2909 #elif defined HAVE_SIGSETJMP
2910 typedef sigjmp_buf sys_jmp_buf;
2911 # define sys_setjmp(j) sigsetjmp (j, 0)
2912 # define sys_longjmp(j, v) siglongjmp (j, v)
2913 #else
2914
2915
2916 typedef jmp_buf sys_jmp_buf;
2917 # define sys_setjmp(j) setjmp (j)
2918 # define sys_longjmp(j, v) longjmp (j, v)
2919 #endif
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943 enum specbind_tag {
2944 SPECPDL_UNWIND,
2945 SPECPDL_UNWIND_PTR,
2946 SPECPDL_UNWIND_INT,
2947 SPECPDL_UNWIND_VOID,
2948 SPECPDL_BACKTRACE,
2949 SPECPDL_LET,
2950
2951 SPECPDL_LET_LOCAL,
2952 SPECPDL_LET_DEFAULT
2953 };
2954
2955 union specbinding
2956 {
2957 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2958 struct {
2959 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2960 void (*func) (Lisp_Object);
2961 Lisp_Object arg;
2962 } unwind;
2963 struct {
2964 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2965 void (*func) (void *);
2966 void *arg;
2967 } unwind_ptr;
2968 struct {
2969 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2970 void (*func) (int);
2971 int arg;
2972 } unwind_int;
2973 struct {
2974 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2975 void (*func) (void);
2976 } unwind_void;
2977 struct {
2978 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2979
2980 Lisp_Object symbol, old_value, where;
2981 } let;
2982 struct {
2983 ENUM_BF (specbind_tag) kind : CHAR_BIT;
2984 bool_bf debug_on_exit : 1;
2985 Lisp_Object function;
2986 Lisp_Object *args;
2987 ptrdiff_t nargs;
2988 } bt;
2989 };
2990
2991 extern union specbinding *specpdl;
2992 extern union specbinding *specpdl_ptr;
2993 extern ptrdiff_t specpdl_size;
2994
2995 INLINE ptrdiff_t
2996 SPECPDL_INDEX (void)
2997 {
2998 return specpdl_ptr - specpdl;
2999 }
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021 enum handlertype { CATCHER, CONDITION_CASE };
3022
3023 struct handler
3024 {
3025 enum handlertype type;
3026 Lisp_Object tag_or_ch;
3027 Lisp_Object val;
3028 struct handler *next;
3029 struct handler *nextfree;
3030
3031
3032
3033
3034
3035
3036 Lisp_Object *bytecode_top;
3037 int bytecode_dest;
3038
3039
3040
3041 #if true
3042 struct gcpro *gcpro;
3043 #endif
3044 sys_jmp_buf jmp;
3045 EMACS_INT lisp_eval_depth;
3046 ptrdiff_t pdlcount;
3047 int poll_suppress_count;
3048 int interrupt_input_blocked;
3049 struct byte_stack *byte_stack;
3050 };
3051
3052
3053 #define PUSH_HANDLER(c, tag_ch_val, handlertype) \
3054 if (handlerlist->nextfree) \
3055 (c) = handlerlist->nextfree; \
3056 else \
3057 { \
3058 (c) = xmalloc (sizeof (struct handler)); \
3059 (c)->nextfree = NULL; \
3060 handlerlist->nextfree = (c); \
3061 } \
3062 (c)->type = (handlertype); \
3063 (c)->tag_or_ch = (tag_ch_val); \
3064 (c)->val = Qnil; \
3065 (c)->next = handlerlist; \
3066 (c)->lisp_eval_depth = lisp_eval_depth; \
3067 (c)->pdlcount = SPECPDL_INDEX (); \
3068 (c)->poll_suppress_count = poll_suppress_count; \
3069 (c)->interrupt_input_blocked = interrupt_input_blocked;\
3070 (c)->gcpro = gcprolist; \
3071 (c)->byte_stack = byte_stack_list; \
3072 handlerlist = (c);
3073
3074
3075 extern Lisp_Object memory_signal_data;
3076
3077
3078
3079 extern char *stack_bottom;
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097 extern void process_pending_signals (void);
3098 extern bool volatile pending_signals;
3099
3100 extern void process_quit_flag (void);
3101 #define QUIT \
3102 do { \
3103 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
3104 process_quit_flag (); \
3105 else if (pending_signals) \
3106 process_pending_signals (); \
3107 } while (false)
3108
3109
3110
3111
3112 #define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
3113
3114 extern Lisp_Object Vascii_downcase_table;
3115 extern Lisp_Object Vascii_canon_table;
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130 extern struct gcpro *gcprolist;
3131
3132 struct gcpro
3133 {
3134 struct gcpro *next;
3135
3136
3137 volatile Lisp_Object *var;
3138
3139
3140 ptrdiff_t nvars;
3141
3142 #ifdef DEBUG_GCPRO
3143
3144 const char *name;
3145
3146
3147 int lineno;
3148
3149
3150 int idx;
3151
3152
3153 int level;
3154 #endif
3155 };
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171 #define GC_USE_GCPROS_AS_BEFORE 0
3172 #define GC_MAKE_GCPROS_NOOPS 1
3173 #define GC_MARK_STACK_CHECK_GCPROS 2
3174 #define GC_USE_GCPROS_CHECK_ZOMBIES 3
3175
3176 #ifndef GC_MARK_STACK
3177 #define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
3178 #endif
3179
3180
3181 #define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
3182 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
3183
3184
3185 #if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
3186
3187
3188
3189
3190 #define GCPRO1(varname) ((void) gcpro1)
3191 #define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
3192 #define GCPRO3(varname1, varname2, varname3) \
3193 ((void) gcpro3, (void) gcpro2, (void) gcpro1)
3194 #define GCPRO4(varname1, varname2, varname3, varname4) \
3195 ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
3196 #define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
3197 ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
3198 #define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
3199 ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
3200 (void) gcpro1)
3201 #define GCPRO7(a, b, c, d, e, f, g) (GCPRO6 (a, b, c, d, e, f), (void) gcpro7)
3202 #define UNGCPRO ((void) 0)
3203
3204 #else
3205
3206 #ifndef DEBUG_GCPRO
3207
3208 #define GCPRO1(a) \
3209 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3210 gcprolist = &gcpro1; }
3211
3212 #define GCPRO2(a, b) \
3213 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3214 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3215 gcprolist = &gcpro2; }
3216
3217 #define GCPRO3(a, b, c) \
3218 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3219 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3220 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3221 gcprolist = &gcpro3; }
3222
3223 #define GCPRO4(a, b, c, d) \
3224 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3225 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3226 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3227 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3228 gcprolist = &gcpro4; }
3229
3230 #define GCPRO5(a, b, c, d, e) \
3231 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3232 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3233 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3234 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3235 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3236 gcprolist = &gcpro5; }
3237
3238 #define GCPRO6(a, b, c, d, e, f) \
3239 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3240 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3241 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3242 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3243 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3244 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3245 gcprolist = &gcpro6; }
3246
3247 #define GCPRO7(a, b, c, d, e, f, g) \
3248 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3249 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3250 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3251 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3252 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3253 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3254 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
3255 gcprolist = &gcpro7; }
3256
3257 #define UNGCPRO (gcprolist = gcpro1.next)
3258
3259 #else
3260
3261 extern int gcpro_level;
3262
3263 #define GCPRO1(a) \
3264 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3265 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3266 gcpro1.level = gcpro_level++; \
3267 gcprolist = &gcpro1; }
3268
3269 #define GCPRO2(a, b) \
3270 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3271 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3272 gcpro1.level = gcpro_level; \
3273 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3274 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3275 gcpro2.level = gcpro_level++; \
3276 gcprolist = &gcpro2; }
3277
3278 #define GCPRO3(a, b, c) \
3279 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3280 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3281 gcpro1.level = gcpro_level; \
3282 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3283 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3284 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3285 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3286 gcpro3.level = gcpro_level++; \
3287 gcprolist = &gcpro3; }
3288
3289 #define GCPRO4(a, b, c, d) \
3290 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3291 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3292 gcpro1.level = gcpro_level; \
3293 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3294 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3295 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3296 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3297 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3298 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3299 gcpro4.level = gcpro_level++; \
3300 gcprolist = &gcpro4; }
3301
3302 #define GCPRO5(a, b, c, d, e) \
3303 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3304 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3305 gcpro1.level = gcpro_level; \
3306 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3307 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3308 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3309 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3310 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3311 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3312 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3313 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3314 gcpro5.level = gcpro_level++; \
3315 gcprolist = &gcpro5; }
3316
3317 #define GCPRO6(a, b, c, d, e, f) \
3318 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3319 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3320 gcpro1.level = gcpro_level; \
3321 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3322 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3323 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3324 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3325 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3326 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3327 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3328 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3329 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3330 gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
3331 gcpro6.level = gcpro_level++; \
3332 gcprolist = &gcpro6; }
3333
3334 #define GCPRO7(a, b, c, d, e, f, g) \
3335 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3336 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3337 gcpro1.level = gcpro_level; \
3338 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3339 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3340 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3341 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3342 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3343 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3344 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3345 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3346 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3347 gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
3348 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
3349 gcpro7.name = __FILE__; gcpro7.lineno = __LINE__; gcpro7.idx = 7; \
3350 gcpro7.level = gcpro_level++; \
3351 gcprolist = &gcpro7; }
3352
3353 #define UNGCPRO \
3354 (--gcpro_level != gcpro1.level \
3355 ? emacs_abort () \
3356 : (void) (gcprolist = gcpro1.next))
3357
3358 #endif
3359 #endif
3360
3361
3362
3363 #define RETURN_UNGCPRO(expr) \
3364 do \
3365 { \
3366 Lisp_Object ret_ungc_val; \
3367 ret_ungc_val = (expr); \
3368 UNGCPRO; \
3369 return ret_ungc_val; \
3370 } \
3371 while (false)
3372
3373
3374
3375 void staticpro (Lisp_Object *);
3376
3377
3378 struct window;
3379 struct frame;
3380
3381
3382
3383 INLINE void
3384 vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Object *args, ptrdiff_t count)
3385 {
3386 eassert (0 <= offset && 0 <= count && offset + count <= ASIZE (v));
3387 memcpy (XVECTOR (v)->contents + offset, args, count * sizeof *args);
3388 }
3389
3390
3391
3392 INLINE void
3393 set_hash_key_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3394 {
3395 gc_aset (h->key_and_value, 2 * idx, val);
3396 }
3397
3398 INLINE void
3399 set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3400 {
3401 gc_aset (h->key_and_value, 2 * idx + 1, val);
3402 }
3403
3404
3405
3406
3407 INLINE void
3408 set_symbol_function (Lisp_Object sym, Lisp_Object function)
3409 {
3410 XSYMBOL (sym)->function = function;
3411 }
3412
3413 INLINE void
3414 set_symbol_plist (Lisp_Object sym, Lisp_Object plist)
3415 {
3416 XSYMBOL (sym)->plist = plist;
3417 }
3418
3419 INLINE void
3420 set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next)
3421 {
3422 XSYMBOL (sym)->next = next;
3423 }
3424
3425
3426
3427 INLINE int
3428 blv_found (struct Lisp_Buffer_Local_Value *blv)
3429 {
3430 eassert (blv->found == !EQ (blv->defcell, blv->valcell));
3431 return blv->found;
3432 }
3433
3434
3435
3436 INLINE void
3437 set_overlay_plist (Lisp_Object overlay, Lisp_Object plist)
3438 {
3439 XOVERLAY (overlay)->plist = plist;
3440 }
3441
3442
3443
3444 INLINE INTERVAL
3445 string_intervals (Lisp_Object s)
3446 {
3447 return XSTRING (s)->intervals;
3448 }
3449
3450
3451
3452 INLINE void
3453 set_string_intervals (Lisp_Object s, INTERVAL i)
3454 {
3455 XSTRING (s)->intervals = i;
3456 }
3457
3458
3459
3460
3461 INLINE void
3462 set_char_table_defalt (Lisp_Object table, Lisp_Object val)
3463 {
3464 XCHAR_TABLE (table)->defalt = val;
3465 }
3466 INLINE void
3467 set_char_table_purpose (Lisp_Object table, Lisp_Object val)
3468 {
3469 XCHAR_TABLE (table)->purpose = val;
3470 }
3471
3472
3473
3474 INLINE void
3475 set_char_table_extras (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
3476 {
3477 eassert (0 <= idx && idx < CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (table)));
3478 XCHAR_TABLE (table)->extras[idx] = val;
3479 }
3480
3481 INLINE void
3482 set_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
3483 {
3484 eassert (0 <= idx && idx < (1 << CHARTAB_SIZE_BITS_0));
3485 XCHAR_TABLE (table)->contents[idx] = val;
3486 }
3487
3488 INLINE void
3489 set_sub_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
3490 {
3491 XSUB_CHAR_TABLE (table)->contents[idx] = val;
3492 }
3493
3494
3495 extern Lisp_Object indirect_function (Lisp_Object);
3496 extern Lisp_Object find_symbol_value (Lisp_Object);
3497 enum Arith_Comparison {
3498 ARITH_EQUAL,
3499 ARITH_NOTEQUAL,
3500 ARITH_LESS,
3501 ARITH_GRTR,
3502 ARITH_LESS_OR_EQUAL,
3503 ARITH_GRTR_OR_EQUAL
3504 };
3505 extern Lisp_Object arithcompare (Lisp_Object num1, Lisp_Object num2,
3506 enum Arith_Comparison comparison);
3507
3508
3509
3510
3511 #define INTEGER_TO_CONS(i) \
3512 (! FIXNUM_OVERFLOW_P (i) \
3513 ? make_number (i) \
3514 : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16) \
3515 || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16)) \
3516 && FIXNUM_OVERFLOW_P ((i) >> 16)) \
3517 ? Fcons (make_number ((i) >> 16), make_number ((i) & 0xffff)) \
3518 : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16 >> 24) \
3519 || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16 >> 24)) \
3520 && FIXNUM_OVERFLOW_P ((i) >> 16 >> 24)) \
3521 ? Fcons (make_number ((i) >> 16 >> 24), \
3522 Fcons (make_number ((i) >> 16 & 0xffffff), \
3523 make_number ((i) & 0xffff))) \
3524 : make_float (i))
3525
3526
3527
3528
3529 #define CONS_TO_INTEGER(cons, type, var) \
3530 (TYPE_SIGNED (type) \
3531 ? ((var) = cons_to_signed (cons, TYPE_MINIMUM (type), TYPE_MAXIMUM (type))) \
3532 : ((var) = cons_to_unsigned (cons, TYPE_MAXIMUM (type))))
3533 extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
3534 extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
3535
3536 extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
3537 extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object);
3538 extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object,
3539 Lisp_Object);
3540 extern Lisp_Object do_symval_forwarding (union Lisp_Fwd *);
3541 extern void set_internal (Lisp_Object, Lisp_Object, Lisp_Object, bool);
3542 extern void syms_of_data (void);
3543 extern void swap_in_global_binding (struct Lisp_Symbol *);
3544
3545
3546 extern void syms_of_cmds (void);
3547 extern void keys_of_cmds (void);
3548
3549
3550 extern Lisp_Object detect_coding_system (const unsigned char *, ptrdiff_t,
3551 ptrdiff_t, bool, bool, Lisp_Object);
3552 extern void init_coding (void);
3553 extern void init_coding_once (void);
3554 extern void syms_of_coding (void);
3555
3556
3557 extern ptrdiff_t chars_in_text (const unsigned char *, ptrdiff_t);
3558 extern ptrdiff_t multibyte_chars_in_text (const unsigned char *, ptrdiff_t);
3559 extern void syms_of_character (void);
3560
3561
3562 extern void init_charset (void);
3563 extern void init_charset_once (void);
3564 extern void syms_of_charset (void);
3565
3566 struct charset;
3567
3568
3569 extern void init_syntax_once (void);
3570 extern void syms_of_syntax (void);
3571
3572
3573 enum { NEXT_ALMOST_PRIME_LIMIT = 11 };
3574 extern EMACS_INT next_almost_prime (EMACS_INT) ATTRIBUTE_CONST;
3575 extern Lisp_Object larger_vector (Lisp_Object, ptrdiff_t, ptrdiff_t);
3576 extern void sweep_weak_hash_tables (void);
3577 EMACS_UINT hash_string (char const *, ptrdiff_t);
3578 EMACS_UINT sxhash (Lisp_Object, int);
3579 Lisp_Object make_hash_table (struct hash_table_test, Lisp_Object, Lisp_Object,
3580 Lisp_Object, Lisp_Object);
3581 ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *);
3582 ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
3583 EMACS_UINT);
3584 extern struct hash_table_test hashtest_eql, hashtest_equal;
3585 extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object,
3586 ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
3587 extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t,
3588 ptrdiff_t, ptrdiff_t);
3589 extern Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
3590 extern Lisp_Object do_yes_or_no_p (Lisp_Object);
3591 extern Lisp_Object concat2 (Lisp_Object, Lisp_Object);
3592 extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
3593 extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
3594 extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
3595 extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
3596 extern void clear_string_char_byte_cache (void);
3597 extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
3598 extern ptrdiff_t string_byte_to_char (Lisp_Object, ptrdiff_t);
3599 extern Lisp_Object string_to_multibyte (Lisp_Object);
3600 extern Lisp_Object string_make_unibyte (Lisp_Object);
3601 extern void syms_of_fns (void);
3602
3603
3604 extern void syms_of_floatfns (void);
3605 extern Lisp_Object fmod_float (Lisp_Object x, Lisp_Object y);
3606
3607
3608 extern void syms_of_fringe (void);
3609 extern void init_fringe (void);
3610 #ifdef HAVE_WINDOW_SYSTEM
3611 extern void mark_fringe_data (void);
3612 extern void init_fringe_once (void);
3613 #endif
3614
3615
3616 extern int x_bitmap_mask (struct frame *, ptrdiff_t);
3617 extern void reset_image_types (void);
3618 extern void syms_of_image (void);
3619
3620
3621 extern void move_gap_both (ptrdiff_t, ptrdiff_t);
3622 extern _Noreturn void buffer_overflow (void);
3623 extern void make_gap (ptrdiff_t);
3624 extern void make_gap_1 (struct buffer *, ptrdiff_t);
3625 extern ptrdiff_t copy_text (const unsigned char *, unsigned char *,
3626 ptrdiff_t, bool, bool);
3627 extern int count_combining_before (const unsigned char *,
3628 ptrdiff_t, ptrdiff_t, ptrdiff_t);
3629 extern int count_combining_after (const unsigned char *,
3630 ptrdiff_t, ptrdiff_t, ptrdiff_t);
3631 extern void insert (const char *, ptrdiff_t);
3632 extern void insert_and_inherit (const char *, ptrdiff_t);
3633 extern void insert_1_both (const char *, ptrdiff_t, ptrdiff_t,
3634 bool, bool, bool);
3635 extern void insert_from_gap (ptrdiff_t, ptrdiff_t, bool text_at_gap_tail);
3636 extern void insert_from_string (Lisp_Object, ptrdiff_t, ptrdiff_t,
3637 ptrdiff_t, ptrdiff_t, bool);
3638 extern void insert_from_buffer (struct buffer *, ptrdiff_t, ptrdiff_t, bool);
3639 extern void insert_char (int);
3640 extern void insert_string (const char *);
3641 extern void insert_before_markers (const char *, ptrdiff_t);
3642 extern void insert_before_markers_and_inherit (const char *, ptrdiff_t);
3643 extern void insert_from_string_before_markers (Lisp_Object, ptrdiff_t,
3644 ptrdiff_t, ptrdiff_t,
3645 ptrdiff_t, bool);
3646 extern void del_range (ptrdiff_t, ptrdiff_t);
3647 extern Lisp_Object del_range_1 (ptrdiff_t, ptrdiff_t, bool, bool);
3648 extern void del_range_byte (ptrdiff_t, ptrdiff_t, bool);
3649 extern void del_range_both (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, bool);
3650 extern Lisp_Object del_range_2 (ptrdiff_t, ptrdiff_t,
3651 ptrdiff_t, ptrdiff_t, bool);
3652 extern void modify_text (ptrdiff_t, ptrdiff_t);
3653 extern void prepare_to_modify_buffer (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
3654 extern void prepare_to_modify_buffer_1 (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
3655 extern void invalidate_buffer_caches (struct buffer *, ptrdiff_t, ptrdiff_t);
3656 extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
3657 extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
3658 ptrdiff_t, ptrdiff_t);
3659 extern void adjust_markers_for_delete (ptrdiff_t, ptrdiff_t,
3660 ptrdiff_t, ptrdiff_t);
3661 extern void replace_range (ptrdiff_t, ptrdiff_t, Lisp_Object, bool, bool, bool);
3662 extern void replace_range_2 (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
3663 const char *, ptrdiff_t, ptrdiff_t, bool);
3664 extern void syms_of_insdel (void);
3665
3666
3667 #if (defined PROFILING \
3668 && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
3669 _Noreturn void __executable_start (void);
3670 #endif
3671 extern Lisp_Object Vwindow_system;
3672 extern Lisp_Object sit_for (Lisp_Object, bool, int);
3673
3674
3675 extern bool noninteractive_need_newline;
3676 extern Lisp_Object echo_area_buffer[2];
3677 extern void add_to_log (const char *, Lisp_Object, Lisp_Object);
3678 extern void check_message_stack (void);
3679 extern void setup_echo_area_for_printing (bool);
3680 extern bool push_message (void);
3681 extern void pop_message_unwind (void);
3682 extern Lisp_Object restore_message_unwind (Lisp_Object);
3683 extern void restore_message (void);
3684 extern Lisp_Object current_message (void);
3685 extern void clear_message (bool, bool);
3686 extern void message (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
3687 extern void message1 (const char *);
3688 extern void message1_nolog (const char *);
3689 extern void message3 (Lisp_Object);
3690 extern void message3_nolog (Lisp_Object);
3691 extern void message_dolog (const char *, ptrdiff_t, bool, bool);
3692 extern void message_with_string (const char *, Lisp_Object, bool);
3693 extern void message_log_maybe_newline (void);
3694 extern void update_echo_area (void);
3695 extern void truncate_echo_area (ptrdiff_t);
3696 extern void redisplay (void);
3697
3698 void set_frame_cursor_types (struct frame *, Lisp_Object);
3699 extern void syms_of_xdisp (void);
3700 extern void init_xdisp (void);
3701 extern Lisp_Object safe_eval (Lisp_Object);
3702 extern bool pos_visible_p (struct window *, ptrdiff_t, int *,
3703 int *, int *, int *, int *, int *);
3704
3705
3706 extern void syms_of_xsettings (void);
3707
3708
3709 extern void memory_warnings (void *, void (*warnfun) (const char *));
3710
3711
3712 extern void parse_str_as_multibyte (const unsigned char *, ptrdiff_t,
3713 ptrdiff_t *, ptrdiff_t *);
3714
3715
3716 extern void check_pure_size (void);
3717 extern void free_misc (Lisp_Object);
3718 extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
3719 extern void malloc_warning (const char *);
3720 extern _Noreturn void memory_full (size_t);
3721 extern _Noreturn void buffer_memory_full (ptrdiff_t);
3722 extern bool survives_gc_p (Lisp_Object);
3723 extern void mark_object (Lisp_Object);
3724 #if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
3725 extern void refill_memory_reserve (void);
3726 #endif
3727 extern const char *pending_malloc_warning;
3728 extern Lisp_Object zero_vector;
3729 extern Lisp_Object *stack_base;
3730 extern EMACS_INT consing_since_gc;
3731 extern EMACS_INT gc_relative_threshold;
3732 extern EMACS_INT memory_full_cons_threshold;
3733 extern Lisp_Object list1 (Lisp_Object);
3734 extern Lisp_Object list2 (Lisp_Object, Lisp_Object);
3735 extern Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
3736 extern Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3737 extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
3738 Lisp_Object);
3739 enum constype {CONSTYPE_HEAP, CONSTYPE_PURE};
3740 extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...);
3741
3742
3743
3744 INLINE Lisp_Object
3745 list2i (EMACS_INT x, EMACS_INT y)
3746 {
3747 return list2 (make_number (x), make_number (y));
3748 }
3749
3750 INLINE Lisp_Object
3751 list3i (EMACS_INT x, EMACS_INT y, EMACS_INT w)
3752 {
3753 return list3 (make_number (x), make_number (y), make_number (w));
3754 }
3755
3756 INLINE Lisp_Object
3757 list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h)
3758 {
3759 return list4 (make_number (x), make_number (y),
3760 make_number (w), make_number (h));
3761 }
3762
3763 extern Lisp_Object make_uninit_bool_vector (EMACS_INT);
3764 extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object);
3765 extern _Noreturn void string_overflow (void);
3766 extern Lisp_Object make_string (const char *, ptrdiff_t);
3767 extern Lisp_Object make_formatted_string (char *, const char *, ...)
3768 ATTRIBUTE_FORMAT_PRINTF (2, 3);
3769 extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t);
3770
3771
3772
3773 INLINE Lisp_Object
3774 build_unibyte_string (const char *str)
3775 {
3776 return make_unibyte_string (str, strlen (str));
3777 }
3778
3779 extern Lisp_Object make_multibyte_string (const char *, ptrdiff_t, ptrdiff_t);
3780 extern Lisp_Object make_event_array (ptrdiff_t, Lisp_Object *);
3781 extern Lisp_Object make_uninit_string (EMACS_INT);
3782 extern Lisp_Object make_uninit_multibyte_string (EMACS_INT, EMACS_INT);
3783 extern Lisp_Object make_string_from_bytes (const char *, ptrdiff_t, ptrdiff_t);
3784 extern Lisp_Object make_specified_string (const char *,
3785 ptrdiff_t, ptrdiff_t, bool);
3786 extern Lisp_Object make_pure_string (const char *, ptrdiff_t, ptrdiff_t, bool);
3787 extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t);
3788
3789
3790
3791 INLINE Lisp_Object
3792 build_pure_c_string (const char *str)
3793 {
3794 return make_pure_c_string (str, strlen (str));
3795 }
3796
3797
3798
3799
3800 INLINE Lisp_Object
3801 build_string (const char *str)
3802 {
3803 return make_string (str, strlen (str));
3804 }
3805
3806 extern Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
3807 extern void make_byte_code (struct Lisp_Vector *);
3808 extern struct Lisp_Vector *allocate_vector (EMACS_INT);
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819 INLINE Lisp_Object
3820 make_uninit_vector (ptrdiff_t size)
3821 {
3822 Lisp_Object v;
3823 struct Lisp_Vector *p;
3824
3825 p = allocate_vector (size);
3826 XSETVECTOR (v, p);
3827 return v;
3828 }
3829
3830
3831
3832 INLINE Lisp_Object
3833 make_uninit_sub_char_table (int depth, int min_char)
3834 {
3835 int slots = SUB_CHAR_TABLE_OFFSET + chartab_size[depth];
3836 Lisp_Object v = make_uninit_vector (slots);
3837
3838 XSETPVECTYPE (XVECTOR (v), PVEC_SUB_CHAR_TABLE);
3839 XSUB_CHAR_TABLE (v)->depth = depth;
3840 XSUB_CHAR_TABLE (v)->min_char = min_char;
3841 return v;
3842 }
3843
3844 extern struct Lisp_Vector *allocate_pseudovector (int, int, int,
3845 enum pvec_type);
3846
3847
3848
3849
3850 #define ALLOCATE_PSEUDOVECTOR(type, field, tag) \
3851 ((type *) allocate_pseudovector (VECSIZE (type), \
3852 PSEUDOVECSIZE (type, field), \
3853 PSEUDOVECSIZE (type, field), tag))
3854
3855
3856
3857
3858 #define ALLOCATE_ZEROED_PSEUDOVECTOR(type, field, tag) \
3859 ((type *) allocate_pseudovector (VECSIZE (type), \
3860 PSEUDOVECSIZE (type, field), \
3861 VECSIZE (type), tag))
3862
3863 extern bool gc_in_progress;
3864 extern bool abort_on_gc;
3865 extern Lisp_Object make_float (double);
3866 extern void display_malloc_warning (void);
3867 extern ptrdiff_t inhibit_garbage_collection (void);
3868 extern Lisp_Object make_save_int_int_int (ptrdiff_t, ptrdiff_t, ptrdiff_t);
3869 extern Lisp_Object make_save_obj_obj_obj_obj (Lisp_Object, Lisp_Object,
3870 Lisp_Object, Lisp_Object);
3871 extern Lisp_Object make_save_ptr (void *);
3872 extern Lisp_Object make_save_ptr_int (void *, ptrdiff_t);
3873 extern Lisp_Object make_save_ptr_ptr (void *, void *);
3874 extern Lisp_Object make_save_funcptr_ptr_obj (void (*) (void), void *,
3875 Lisp_Object);
3876 extern Lisp_Object make_save_memory (Lisp_Object *, ptrdiff_t);
3877 extern void free_save_value (Lisp_Object);
3878 extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object);
3879 extern void free_marker (Lisp_Object);
3880 extern void free_cons (struct Lisp_Cons *);
3881 extern void init_alloc_once (void);
3882 extern void init_alloc (void);
3883 extern void syms_of_alloc (void);
3884 extern struct buffer * allocate_buffer (void);
3885 extern int valid_lisp_object_p (Lisp_Object);
3886 extern int relocatable_string_data_p (const char *);
3887 #ifdef GC_CHECK_CONS_LIST
3888 extern void check_cons_list (void);
3889 #else
3890 INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); }
3891 #endif
3892
3893 #ifdef REL_ALLOC
3894
3895 extern void *r_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
3896 extern void r_alloc_free (void **);
3897 extern void *r_re_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
3898 extern void r_alloc_reset_variable (void **, void **);
3899 extern void r_alloc_inhibit_buffer_relocation (int);
3900 #endif
3901
3902
3903 extern Lisp_Object copy_char_table (Lisp_Object);
3904 extern Lisp_Object char_table_ref_and_range (Lisp_Object, int,
3905 int *, int *);
3906 extern void char_table_set_range (Lisp_Object, int, int, Lisp_Object);
3907 extern void map_char_table (void (*) (Lisp_Object, Lisp_Object,
3908 Lisp_Object),
3909 Lisp_Object, Lisp_Object, Lisp_Object);
3910 extern void map_char_table_for_charset (void (*c_function) (Lisp_Object, Lisp_Object),
3911 Lisp_Object, Lisp_Object,
3912 Lisp_Object, struct charset *,
3913 unsigned, unsigned);
3914 extern Lisp_Object uniprop_table (Lisp_Object);
3915 extern void syms_of_chartab (void);
3916
3917
3918 extern Lisp_Object Vprin1_to_string_buffer;
3919 extern void debug_print (Lisp_Object) EXTERNALLY_VISIBLE;
3920 extern void temp_output_buffer_setup (const char *);
3921 extern int print_level;
3922 extern void write_string (const char *);
3923 extern void print_error_message (Lisp_Object, Lisp_Object, const char *,
3924 Lisp_Object);
3925 extern Lisp_Object internal_with_output_to_temp_buffer
3926 (const char *, Lisp_Object (*) (Lisp_Object), Lisp_Object);
3927 #define FLOAT_TO_STRING_BUFSIZE 350
3928 extern int float_to_string (char *, double);
3929 extern void init_print_once (void);
3930 extern void syms_of_print (void);
3931
3932
3933 extern ptrdiff_t doprnt (char *, ptrdiff_t, const char *, const char *,
3934 va_list);
3935 extern ptrdiff_t esprintf (char *, char const *, ...)
3936 ATTRIBUTE_FORMAT_PRINTF (2, 3);
3937 extern ptrdiff_t exprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
3938 char const *, ...)
3939 ATTRIBUTE_FORMAT_PRINTF (5, 6);
3940 extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
3941 char const *, va_list)
3942 ATTRIBUTE_FORMAT_PRINTF (5, 0);
3943
3944
3945 extern Lisp_Object check_obarray (Lisp_Object);
3946 extern Lisp_Object intern_1 (const char *, ptrdiff_t);
3947 extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t);
3948 extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, Lisp_Object);
3949 extern void init_symbol (Lisp_Object, Lisp_Object);
3950 extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t);
3951 INLINE void
3952 LOADHIST_ATTACH (Lisp_Object x)
3953 {
3954 if (initialized)
3955 Vcurrent_load_list = Fcons (x, Vcurrent_load_list);
3956 }
3957 extern int openp (Lisp_Object, Lisp_Object, Lisp_Object,
3958 Lisp_Object *, Lisp_Object, bool);
3959 extern Lisp_Object string_to_number (char const *, int, bool);
3960 extern void map_obarray (Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
3961 Lisp_Object);
3962 extern void dir_warning (const char *, Lisp_Object);
3963 extern void init_obarray (void);
3964 extern void init_lread (void);
3965 extern void syms_of_lread (void);
3966
3967 INLINE Lisp_Object
3968 intern (const char *str)
3969 {
3970 return intern_1 (str, strlen (str));
3971 }
3972
3973 INLINE Lisp_Object
3974 intern_c_string (const char *str)
3975 {
3976 return intern_c_string_1 (str, strlen (str));
3977 }
3978
3979
3980 extern EMACS_INT lisp_eval_depth;
3981 extern Lisp_Object Vautoload_queue;
3982 extern Lisp_Object Vrun_hooks;
3983 extern Lisp_Object Vsignaling_function;
3984 extern Lisp_Object inhibit_lisp_code;
3985 extern struct handler *handlerlist;
3986
3987
3988
3989
3990
3991
3992
3993
3994 extern void run_hook (Lisp_Object);
3995 extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object);
3996 extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
3997 Lisp_Object (*funcall)
3998 (ptrdiff_t nargs, Lisp_Object *args));
3999 extern _Noreturn void xsignal (Lisp_Object, Lisp_Object);
4000 extern _Noreturn void xsignal0 (Lisp_Object);
4001 extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object);
4002 extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object);
4003 extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object,
4004 Lisp_Object);
4005 extern _Noreturn void signal_error (const char *, Lisp_Object);
4006 extern Lisp_Object eval_sub (Lisp_Object form);
4007 extern Lisp_Object apply1 (Lisp_Object, Lisp_Object);
4008 extern Lisp_Object call0 (Lisp_Object);
4009 extern Lisp_Object call1 (Lisp_Object, Lisp_Object);
4010 extern Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object);
4011 extern Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4012 extern Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4013 extern Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4014 extern Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4015 extern Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4016 extern Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), Lisp_Object);
4017 extern Lisp_Object internal_lisp_condition_case (Lisp_Object, Lisp_Object, Lisp_Object);
4018 extern Lisp_Object internal_condition_case (Lisp_Object (*) (void), Lisp_Object, Lisp_Object (*) (Lisp_Object));
4019 extern Lisp_Object internal_condition_case_1 (Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
4020 extern Lisp_Object internal_condition_case_2 (Lisp_Object (*) (Lisp_Object, Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
4021 extern Lisp_Object internal_condition_case_n
4022 (Lisp_Object (*) (ptrdiff_t, Lisp_Object *), ptrdiff_t, Lisp_Object *,
4023 Lisp_Object, Lisp_Object (*) (Lisp_Object, ptrdiff_t, Lisp_Object *));
4024 extern void specbind (Lisp_Object, Lisp_Object);
4025 extern void record_unwind_protect (void (*) (Lisp_Object), Lisp_Object);
4026 extern void record_unwind_protect_ptr (void (*) (void *), void *);
4027 extern void record_unwind_protect_int (void (*) (int), int);
4028 extern void record_unwind_protect_void (void (*) (void));
4029 extern void record_unwind_protect_nothing (void);
4030 extern void clear_unwind_protect (ptrdiff_t);
4031 extern void set_unwind_protect (ptrdiff_t, void (*) (Lisp_Object), Lisp_Object);
4032 extern void set_unwind_protect_ptr (ptrdiff_t, void (*) (void *), void *);
4033 extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object);
4034 extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
4035 extern _Noreturn void verror (const char *, va_list)
4036 ATTRIBUTE_FORMAT_PRINTF (1, 0);
4037 extern void un_autoload (Lisp_Object);
4038 extern Lisp_Object call_debugger (Lisp_Object arg);
4039 extern void init_eval_once (void);
4040 extern Lisp_Object safe_call (ptrdiff_t, Lisp_Object, ...);
4041 extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
4042 extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
4043 extern void init_eval (void);
4044 extern void syms_of_eval (void);
4045 extern void unwind_body (Lisp_Object);
4046 extern ptrdiff_t record_in_backtrace (Lisp_Object, Lisp_Object *, ptrdiff_t);
4047 extern void mark_specpdl (void);
4048 extern void get_backtrace (Lisp_Object array);
4049 Lisp_Object backtrace_top_function (void);
4050 extern bool let_shadows_buffer_binding_p (struct Lisp_Symbol *symbol);
4051 extern bool let_shadows_global_binding_p (Lisp_Object symbol);
4052
4053
4054
4055 extern void insert1 (Lisp_Object);
4056 extern Lisp_Object format2 (const char *, Lisp_Object, Lisp_Object);
4057 extern Lisp_Object save_excursion_save (void);
4058 extern Lisp_Object save_restriction_save (void);
4059 extern void save_excursion_restore (Lisp_Object);
4060 extern void save_restriction_restore (Lisp_Object);
4061 extern _Noreturn void time_overflow (void);
4062 extern Lisp_Object make_buffer_string (ptrdiff_t, ptrdiff_t, bool);
4063 extern Lisp_Object make_buffer_string_both (ptrdiff_t, ptrdiff_t, ptrdiff_t,
4064 ptrdiff_t, bool);
4065 extern void init_editfns (void);
4066 extern void syms_of_editfns (void);
4067
4068
4069 extern bool mouse_face_overlay_overlaps (Lisp_Object);
4070 extern _Noreturn void nsberror (Lisp_Object);
4071 extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t);
4072 extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t);
4073 extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t);
4074 extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool,
4075 Lisp_Object, Lisp_Object, Lisp_Object);
4076 extern bool overlay_touches_p (ptrdiff_t);
4077 extern Lisp_Object other_buffer_safely (Lisp_Object);
4078 extern Lisp_Object get_truename_buffer (Lisp_Object);
4079 extern void init_buffer_once (void);
4080 extern void init_buffer (int);
4081 extern void syms_of_buffer (void);
4082 extern void keys_of_buffer (void);
4083
4084
4085
4086 extern ptrdiff_t marker_position (Lisp_Object);
4087 extern ptrdiff_t marker_byte_position (Lisp_Object);
4088 extern void clear_charpos_cache (struct buffer *);
4089 extern ptrdiff_t buf_charpos_to_bytepos (struct buffer *, ptrdiff_t);
4090 extern ptrdiff_t buf_bytepos_to_charpos (struct buffer *, ptrdiff_t);
4091 extern void unchain_marker (struct Lisp_Marker *marker);
4092 extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
4093 extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, ptrdiff_t, ptrdiff_t);
4094 extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,
4095 ptrdiff_t, ptrdiff_t);
4096 extern Lisp_Object build_marker (struct buffer *, ptrdiff_t, ptrdiff_t);
4097 extern void syms_of_marker (void);
4098
4099
4100
4101 extern Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object);
4102 extern Lisp_Object write_region (Lisp_Object, Lisp_Object, Lisp_Object,
4103 Lisp_Object, Lisp_Object, Lisp_Object,
4104 Lisp_Object, int);
4105 extern void close_file_unwind (int);
4106 extern void fclose_unwind (void *);
4107 extern void restore_point_unwind (Lisp_Object);
4108 extern _Noreturn void report_file_errno (const char *, Lisp_Object, int);
4109 extern _Noreturn void report_file_error (const char *, Lisp_Object);
4110 extern bool internal_delete_file (Lisp_Object);
4111 extern Lisp_Object emacs_readlinkat (int, const char *);
4112 extern bool file_directory_p (const char *);
4113 extern bool file_accessible_directory_p (Lisp_Object);
4114 extern void init_fileio (void);
4115 extern void syms_of_fileio (void);
4116 extern Lisp_Object make_temp_name (Lisp_Object, bool);
4117
4118
4119 extern void shrink_regexp_cache (void);
4120 extern void restore_search_regs (void);
4121 extern void record_unwind_save_match_data (void);
4122 struct re_registers;
4123 extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
4124 struct re_registers *,
4125 Lisp_Object, bool, bool);
4126 extern ptrdiff_t fast_string_match_internal (Lisp_Object, Lisp_Object,
4127 Lisp_Object);
4128
4129 INLINE ptrdiff_t
4130 fast_string_match (Lisp_Object regexp, Lisp_Object string)
4131 {
4132 return fast_string_match_internal (regexp, string, Qnil);
4133 }
4134
4135 INLINE ptrdiff_t
4136 fast_string_match_ignore_case (Lisp_Object regexp, Lisp_Object string)
4137 {
4138 return fast_string_match_internal (regexp, string, Vascii_canon_table);
4139 }
4140
4141 extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
4142 ptrdiff_t);
4143 extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
4144 ptrdiff_t, ptrdiff_t, Lisp_Object);
4145 extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
4146 ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
4147 extern ptrdiff_t scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
4148 ptrdiff_t, bool);
4149 extern ptrdiff_t scan_newline_from_point (ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
4150 extern ptrdiff_t find_newline_no_quit (ptrdiff_t, ptrdiff_t,
4151 ptrdiff_t, ptrdiff_t *);
4152 extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t,
4153 ptrdiff_t, ptrdiff_t *);
4154 extern void syms_of_search (void);
4155 extern void clear_regexp_cache (void);
4156
4157
4158
4159 extern Lisp_Object Vminibuffer_list;
4160 extern Lisp_Object last_minibuf_string;
4161 extern Lisp_Object get_minibuffer (EMACS_INT);
4162 extern void init_minibuf_once (void);
4163 extern void syms_of_minibuf (void);
4164
4165
4166
4167 extern void syms_of_callint (void);
4168
4169
4170
4171 extern void syms_of_casefiddle (void);
4172 extern void keys_of_casefiddle (void);
4173
4174
4175
4176 extern void init_casetab_once (void);
4177 extern void syms_of_casetab (void);
4178
4179
4180
4181 extern Lisp_Object echo_message_buffer;
4182 extern struct kboard *echo_kboard;
4183 extern void cancel_echoing (void);
4184 extern Lisp_Object last_undo_boundary;
4185 extern bool input_pending;
4186 #ifdef HAVE_STACK_OVERFLOW_HANDLING
4187 extern sigjmp_buf return_to_command_loop;
4188 #endif
4189 extern Lisp_Object menu_bar_items (Lisp_Object);
4190 extern Lisp_Object tool_bar_items (Lisp_Object, int *);
4191 extern void discard_mouse_events (void);
4192 #ifdef USABLE_SIGIO
4193 void handle_input_available_signal (int);
4194 #endif
4195 extern Lisp_Object pending_funcalls;
4196 extern bool detect_input_pending (void);
4197 extern bool detect_input_pending_ignore_squeezables (void);
4198 extern bool detect_input_pending_run_timers (bool);
4199 extern void safe_run_hooks (Lisp_Object);
4200 extern void cmd_error_internal (Lisp_Object, const char *);
4201 extern Lisp_Object command_loop_1 (void);
4202 extern Lisp_Object read_menu_command (void);
4203 extern Lisp_Object recursive_edit_1 (void);
4204 extern void record_auto_save (void);
4205 extern void force_auto_save_soon (void);
4206 extern void init_keyboard (void);
4207 extern void syms_of_keyboard (void);
4208 extern void keys_of_keyboard (void);
4209
4210
4211 extern ptrdiff_t current_column (void);
4212 extern void invalidate_current_column (void);
4213 extern bool indented_beyond_p (ptrdiff_t, ptrdiff_t, EMACS_INT);
4214 extern void syms_of_indent (void);
4215
4216
4217 extern void store_frame_param (struct frame *, Lisp_Object, Lisp_Object);
4218 extern void store_in_alist (Lisp_Object *, Lisp_Object, Lisp_Object);
4219 extern Lisp_Object do_switch_frame (Lisp_Object, int, int, Lisp_Object);
4220 extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
4221 extern void frames_discard_buffer (Lisp_Object);
4222 extern void syms_of_frame (void);
4223
4224
4225 extern char **initial_argv;
4226 extern int initial_argc;
4227 #if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
4228 extern bool display_arg;
4229 #endif
4230 extern Lisp_Object decode_env_path (const char *, const char *, bool);
4231 extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
4232 extern _Noreturn void terminate_due_to_signal (int, int);
4233 #ifdef WINDOWSNT
4234 extern Lisp_Object Vlibrary_cache;
4235 #endif
4236 #if HAVE_SETLOCALE
4237 void fixup_locale (void);
4238 void synchronize_system_messages_locale (void);
4239 void synchronize_system_time_locale (void);
4240 #else
4241 INLINE void fixup_locale (void) {}
4242 INLINE void synchronize_system_messages_locale (void) {}
4243 INLINE void synchronize_system_time_locale (void) {}
4244 #endif
4245 extern void shut_down_emacs (int, Lisp_Object);
4246
4247
4248 extern bool noninteractive;
4249
4250
4251 extern bool no_site_lisp;
4252
4253
4254
4255 #ifndef WINDOWSNT
4256 extern int daemon_pipe[2];
4257 #define IS_DAEMON (daemon_pipe[1] != 0)
4258 #define DAEMON_RUNNING (daemon_pipe[1] >= 0)
4259 #else
4260 extern void *w32_daemon_event;
4261 #define IS_DAEMON (w32_daemon_event != NULL)
4262 #define DAEMON_RUNNING (w32_daemon_event != INVALID_HANDLE_VALUE)
4263 #endif
4264
4265
4266 extern bool fatal_error_in_progress;
4267
4268
4269 extern bool inhibit_window_system;
4270
4271 extern bool running_asynch_code;
4272
4273
4274 extern void kill_buffer_processes (Lisp_Object);
4275 extern int wait_reading_process_output (intmax_t, int, int, bool, Lisp_Object,
4276 struct Lisp_Process *, int);
4277
4278 #if __GNUC__ == 3 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 5)
4279
4280
4281 # define WAIT_READING_MAX min (TYPE_MAXIMUM (time_t), INTMAX_MAX)
4282 #else
4283 # define WAIT_READING_MAX INTMAX_MAX
4284 #endif
4285 #ifdef HAVE_TIMERFD
4286 extern void add_timer_wait_descriptor (int);
4287 #endif
4288 extern void add_keyboard_wait_descriptor (int);
4289 extern void delete_keyboard_wait_descriptor (int);
4290 #ifdef HAVE_GPM
4291 extern void add_gpm_wait_descriptor (int);
4292 extern void delete_gpm_wait_descriptor (int);
4293 #endif
4294 extern void init_process_emacs (void);
4295 extern void syms_of_process (void);
4296 extern void setup_process_coding_systems (Lisp_Object);
4297
4298
4299 #ifndef DOS_NT
4300 _Noreturn
4301 #endif
4302 extern int child_setup (int, int, int, char **, bool, Lisp_Object);
4303 extern void init_callproc_1 (void);
4304 extern void init_callproc (void);
4305 extern void set_initial_environment (void);
4306 extern void syms_of_callproc (void);
4307
4308
4309 extern Lisp_Object read_doc_string (Lisp_Object);
4310 extern Lisp_Object get_doc_string (Lisp_Object, bool, bool);
4311 extern void syms_of_doc (void);
4312 extern int read_bytecode_char (bool);
4313
4314
4315 extern void syms_of_bytecode (void);
4316 extern struct byte_stack *byte_stack_list;
4317 #if BYTE_MARK_STACK
4318 extern void mark_byte_stack (void);
4319 #endif
4320 extern void unmark_byte_stack (void);
4321 extern Lisp_Object exec_byte_code (Lisp_Object, Lisp_Object, Lisp_Object,
4322 Lisp_Object, ptrdiff_t, Lisp_Object *);
4323
4324
4325 extern void init_macros (void);
4326 extern void syms_of_macros (void);
4327
4328
4329 extern void truncate_undo_list (struct buffer *);
4330 extern void record_insert (ptrdiff_t, ptrdiff_t);
4331 extern void record_delete (ptrdiff_t, Lisp_Object, bool);
4332 extern void record_first_change (void);
4333 extern void record_change (ptrdiff_t, ptrdiff_t);
4334 extern void record_property_change (ptrdiff_t, ptrdiff_t,
4335 Lisp_Object, Lisp_Object,
4336 Lisp_Object);
4337 extern void syms_of_undo (void);
4338
4339
4340 extern void report_interval_modification (Lisp_Object, Lisp_Object);
4341
4342
4343 extern void syms_of_menu (void);
4344
4345
4346 extern void syms_of_xmenu (void);
4347
4348
4349 struct tty_display_info;
4350
4351
4352 struct terminal;
4353
4354
4355 #ifndef HAVE_GET_CURRENT_DIR_NAME
4356 extern char *get_current_dir_name (void);
4357 #endif
4358 extern void stuff_char (char c);
4359 extern void init_foreground_group (void);
4360 extern void sys_subshell (void);
4361 extern void sys_suspend (void);
4362 extern void discard_tty_input (void);
4363 extern void init_sys_modes (struct tty_display_info *);
4364 extern void reset_sys_modes (struct tty_display_info *);
4365 extern void init_all_sys_modes (void);
4366 extern void reset_all_sys_modes (void);
4367 extern void child_setup_tty (int);
4368 extern void setup_pty (int);
4369 extern int set_window_size (int, int, int);
4370 extern EMACS_INT get_random (void);
4371 extern void seed_random (void *, ptrdiff_t);
4372 extern void init_random (void);
4373 extern void emacs_backtrace (int);
4374 extern _Noreturn void emacs_abort (void) NO_INLINE;
4375 extern int emacs_open (const char *, int, int);
4376 extern int emacs_pipe (int[2]);
4377 extern int emacs_close (int);
4378 extern ptrdiff_t emacs_read (int, void *, ptrdiff_t);
4379 extern ptrdiff_t emacs_write (int, void const *, ptrdiff_t);
4380 extern ptrdiff_t emacs_write_sig (int, void const *, ptrdiff_t);
4381 extern void emacs_perror (char const *);
4382
4383 extern void unlock_all_files (void);
4384 extern void lock_file (Lisp_Object);
4385 extern void unlock_file (Lisp_Object);
4386 extern void unlock_buffer (struct buffer *);
4387 extern void syms_of_filelock (void);
4388 extern int str_collate (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4389
4390
4391 extern void syms_of_sound (void);
4392
4393
4394 extern void init_category_once (void);
4395 extern Lisp_Object char_category_set (int);
4396 extern void syms_of_category (void);
4397
4398
4399 extern void syms_of_ccl (void);
4400
4401
4402 extern void syms_of_dired (void);
4403 extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
4404 Lisp_Object, Lisp_Object,
4405 bool, Lisp_Object);
4406
4407
4408 extern int *char_ins_del_vector;
4409 extern void syms_of_term (void);
4410 extern _Noreturn void fatal (const char *msgid, ...)
4411 ATTRIBUTE_FORMAT_PRINTF (1, 2);
4412
4413
4414 extern void syms_of_terminal (void);
4415
4416
4417 extern void syms_of_font (void);
4418 extern void init_font (void);
4419
4420 #ifdef HAVE_WINDOW_SYSTEM
4421
4422 extern void syms_of_fontset (void);
4423 #endif
4424
4425
4426 #ifdef HAVE_GFILENOTIFY
4427 extern void globals_of_gfilenotify (void);
4428 extern void syms_of_gfilenotify (void);
4429 #endif
4430
4431
4432 #ifdef HAVE_INOTIFY
4433 extern void syms_of_inotify (void);
4434 #endif
4435
4436 #ifdef HAVE_W32NOTIFY
4437
4438 extern void syms_of_w32notify (void);
4439 #endif
4440
4441
4442 extern Lisp_Object Vface_alternative_font_family_alist;
4443 extern Lisp_Object Vface_alternative_font_registry_alist;
4444 extern void syms_of_xfaces (void);
4445
4446 #ifdef HAVE_X_WINDOWS
4447
4448 extern void syms_of_xfns (void);
4449
4450
4451 extern void syms_of_xsmfns (void);
4452
4453
4454 extern void syms_of_xselect (void);
4455
4456
4457 extern void init_xterm (void);
4458 extern void syms_of_xterm (void);
4459 #endif
4460
4461 #ifdef HAVE_WINDOW_SYSTEM
4462
4463 extern char *x_get_keysym_name (int);
4464 #endif
4465
4466 #ifdef HAVE_LIBXML2
4467
4468 extern void syms_of_xml (void);
4469 extern void xml_cleanup_parser (void);
4470 #endif
4471
4472 #ifdef HAVE_ZLIB
4473
4474 extern void syms_of_decompress (void);
4475 #endif
4476
4477 #ifdef HAVE_DBUS
4478
4479 void init_dbusbind (void);
4480 void syms_of_dbusbind (void);
4481 #endif
4482
4483
4484
4485 extern bool profiler_memory_running;
4486 extern void malloc_probe (size_t);
4487 extern void syms_of_profiler (void);
4488
4489
4490 #ifdef DOS_NT
4491
4492 extern char *emacs_root_dir (void);
4493 #endif
4494
4495
4496 extern char my_edata[];
4497 extern char my_endbss[];
4498 extern char *my_endbss_static;
4499
4500
4501 extern bool immediate_quit;
4502
4503 extern void *xmalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
4504 extern void *xzalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
4505 extern void *xrealloc (void *, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
4506 extern void xfree (void *);
4507 extern void *xnmalloc (ptrdiff_t, ptrdiff_t) ATTRIBUTE_MALLOC_SIZE ((1,2));
4508 extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t)
4509 ATTRIBUTE_ALLOC_SIZE ((2,3));
4510 extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
4511
4512 extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
4513 extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
4514 extern void dupstring (char **, char const *);
4515
4516
4517
4518
4519 INLINE char *
4520 lispstpcpy (char *dest, Lisp_Object string)
4521 {
4522 ptrdiff_t len = SBYTES (string);
4523 memcpy (dest, SDATA (string), len + 1);
4524 return dest + len;
4525 }
4526
4527 extern void xputenv (const char *);
4528
4529 extern char *egetenv_internal (const char *, ptrdiff_t);
4530
4531 INLINE char *
4532 egetenv (const char *var)
4533 {
4534
4535 return egetenv_internal (var, strlen (var));
4536 }
4537
4538
4539 extern void init_system_name (void);
4540
4541
4542
4543
4544
4545 #define eabs(x) ((x) < 0 ? -(x) : (x))
4546
4547
4548
4549
4550 #define make_fixnum_or_float(val) \
4551 (FIXNUM_OVERFLOW_P (val) ? make_float (val) : make_number (val))
4552
4553
4554
4555
4556 enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
4557
4558 extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
4559
4560 #define USE_SAFE_ALLOCA \
4561 ptrdiff_t sa_avail = MAX_ALLOCA; \
4562 ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false
4563
4564 #define AVAIL_ALLOCA(size) (sa_avail -= (size), alloca (size))
4565
4566
4567
4568 #define SAFE_ALLOCA(size) ((size) <= sa_avail \
4569 ? AVAIL_ALLOCA (size) \
4570 : (sa_must_free = true, record_xmalloc (size)))
4571
4572
4573
4574
4575
4576 #define SAFE_NALLOCA(buf, multiplier, nitems) \
4577 do { \
4578 if ((nitems) <= sa_avail / sizeof *(buf) / (multiplier)) \
4579 (buf) = AVAIL_ALLOCA (sizeof *(buf) * (multiplier) * (nitems)); \
4580 else \
4581 { \
4582 (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \
4583 sa_must_free = true; \
4584 record_unwind_protect_ptr (xfree, buf); \
4585 } \
4586 } while (false)
4587
4588
4589
4590 #define SAFE_ALLOCA_STRING(ptr, string) \
4591 do { \
4592 (ptr) = SAFE_ALLOCA (SBYTES (string) + 1); \
4593 memcpy (ptr, SDATA (string), SBYTES (string) + 1); \
4594 } while (false)
4595
4596
4597
4598 #define SAFE_FREE() \
4599 do { \
4600 if (sa_must_free) { \
4601 sa_must_free = false; \
4602 unbind_to (sa_count, Qnil); \
4603 } \
4604 } while (false)
4605
4606
4607
4608
4609 INLINE ptrdiff_t
4610 lisp_word_count (ptrdiff_t nbytes)
4611 {
4612 if (-1 >> 1 == -1)
4613 switch (word_size)
4614 {
4615 case 2: return nbytes >> 1;
4616 case 4: return nbytes >> 2;
4617 case 8: return nbytes >> 3;
4618 case 16: return nbytes >> 4;
4619 }
4620 return nbytes / word_size - (nbytes % word_size < 0);
4621 }
4622
4623
4624
4625 #define SAFE_ALLOCA_LISP(buf, nelt) \
4626 do { \
4627 if ((nelt) <= lisp_word_count (sa_avail)) \
4628 (buf) = AVAIL_ALLOCA ((nelt) * word_size); \
4629 else if ((nelt) <= min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
4630 { \
4631 Lisp_Object arg_; \
4632 (buf) = xmalloc ((nelt) * word_size); \
4633 arg_ = make_save_memory (buf, nelt); \
4634 sa_must_free = true; \
4635 record_unwind_protect (free_save_value, arg_); \
4636 } \
4637 else \
4638 memory_full (SIZE_MAX); \
4639 } while (false)
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651 #ifndef USE_STACK_LISP_OBJECTS
4652 # define USE_STACK_LISP_OBJECTS true
4653 #endif
4654
4655
4656
4657 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
4658 # undef USE_STACK_LISP_OBJECTS
4659 # define USE_STACK_LISP_OBJECTS false
4660 #endif
4661
4662 #ifdef GC_CHECK_STRING_BYTES
4663 enum { defined_GC_CHECK_STRING_BYTES = true };
4664 #else
4665 enum { defined_GC_CHECK_STRING_BYTES = false };
4666 #endif
4667
4668
4669
4670 union Aligned_Cons
4671 {
4672 struct Lisp_Cons s;
4673 double d; intmax_t i; void *p;
4674 };
4675
4676 union Aligned_String
4677 {
4678 struct Lisp_String s;
4679 double d; intmax_t i; void *p;
4680 };
4681
4682
4683
4684
4685
4686
4687 enum
4688 {
4689 USE_STACK_CONS = (USE_STACK_LISP_OBJECTS
4690 && alignof (union Aligned_Cons) % GCALIGNMENT == 0),
4691 USE_STACK_STRING = (USE_STACK_CONS
4692 && !defined_GC_CHECK_STRING_BYTES
4693 && alignof (union Aligned_String) % GCALIGNMENT == 0)
4694 };
4695
4696
4697
4698
4699 #define STACK_CONS(a, b) \
4700 make_lisp_ptr (&(union Aligned_Cons) { { a, { b } } }.s, Lisp_Cons)
4701 #define AUTO_CONS_EXPR(a, b) \
4702 (USE_STACK_CONS ? STACK_CONS (a, b) : Fcons (a, b))
4703
4704
4705
4706
4707
4708
4709 #define AUTO_CONS(name, a, b) Lisp_Object name = AUTO_CONS_EXPR (a, b)
4710 #define AUTO_LIST1(name, a) \
4711 Lisp_Object name = (USE_STACK_CONS ? STACK_CONS (a, Qnil) : list1 (a))
4712 #define AUTO_LIST2(name, a, b) \
4713 Lisp_Object name = (USE_STACK_CONS \
4714 ? STACK_CONS (a, STACK_CONS (b, Qnil)) \
4715 : list2 (a, b))
4716 #define AUTO_LIST3(name, a, b, c) \
4717 Lisp_Object name = (USE_STACK_CONS \
4718 ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c, Qnil))) \
4719 : list3 (a, b, c))
4720 #define AUTO_LIST4(name, a, b, c, d) \
4721 Lisp_Object name \
4722 = (USE_STACK_CONS \
4723 ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c, \
4724 STACK_CONS (d, Qnil)))) \
4725 : list4 (a, b, c, d))
4726
4727
4728
4729 #if defined (ENABLE_CHECKING) && USE_STACK_LISP_OBJECTS
4730 extern const char *verify_ascii (const char *);
4731 #else
4732 # define verify_ascii(str) (str)
4733 #endif
4734
4735
4736
4737
4738
4739
4740 #define AUTO_STRING(name, str) \
4741 Lisp_Object name = \
4742 (USE_STACK_STRING \
4743 ? (make_lisp_ptr \
4744 ((&(union Aligned_String) \
4745 {{strlen (str), -1, 0, (unsigned char *) verify_ascii (str)}}.s), \
4746 Lisp_String)) \
4747 : build_string (verify_ascii (str)))
4748
4749
4750
4751
4752 #define FOR_EACH_TAIL(hare, list, tortoise, n) \
4753 for ((tortoise) = (hare) = (list), (n) = true; \
4754 CONSP (hare); \
4755 (hare = XCDR (hare), (n) = !(n), \
4756 ((n) \
4757 ? (EQ (hare, tortoise) \
4758 ? xsignal1 (Qcircular_list, list) \
4759 : (void) 0) \
4760 \
4761 \
4762 : (void) ((tortoise) = XCDR (tortoise)))))
4763
4764
4765
4766 #define FOR_EACH_ALIST_VALUE(head_var, list_var, value_var) \
4767 for ((list_var) = (head_var); \
4768 (CONSP (list_var) && ((value_var) = XCDR (XCAR (list_var)), true)); \
4769 (list_var) = XCDR (list_var))
4770
4771
4772
4773 INLINE void
4774 maybe_gc (void)
4775 {
4776 if ((consing_since_gc > gc_cons_threshold
4777 && consing_since_gc > gc_relative_threshold)
4778 || (!NILP (Vmemory_full)
4779 && consing_since_gc > memory_full_cons_threshold))
4780 Fgarbage_collect ();
4781 }
4782
4783 INLINE bool
4784 functionp (Lisp_Object object)
4785 {
4786 if (SYMBOLP (object) && !NILP (Ffboundp (object)))
4787 {
4788 object = Findirect_function (object, Qt);
4789
4790 if (CONSP (object) && EQ (XCAR (object), Qautoload))
4791 {
4792
4793
4794 int i;
4795 for (i = 0; i < 4 && CONSP (object); i++)
4796 object = XCDR (object);
4797
4798 return ! (CONSP (object) && !NILP (XCAR (object)));
4799 }
4800 }
4801
4802 if (SUBRP (object))
4803 return XSUBR (object)->max_args != UNEVALLED;
4804 else if (COMPILEDP (object))
4805 return true;
4806 else if (CONSP (object))
4807 {
4808 Lisp_Object car = XCAR (object);
4809 return EQ (car, Qlambda) || EQ (car, Qclosure);
4810 }
4811 else
4812 return false;
4813 }
4814
4815 INLINE_HEADER_END
4816
4817 #endif