(unexec): Add casts for some comparisons.
[bpt/emacs.git] / src / alloc.c
1 /* Storage allocation and gc for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include <signal.h>
21
22 #include "config.h"
23 #include "lisp.h"
24 #include "intervals.h"
25 #include "puresize.h"
26 #ifndef standalone
27 #include "buffer.h"
28 #include "window.h"
29 #include "frame.h"
30 #include "blockinput.h"
31 #endif
32
33 #include "syssignal.h"
34
35 #define max(A,B) ((A) > (B) ? (A) : (B))
36
37 /* Macro to verify that storage intended for Lisp objects is not
38 out of range to fit in the space for a pointer.
39 ADDRESS is the start of the block, and SIZE
40 is the amount of space within which objects can start. */
41 #define VALIDATE_LISP_STORAGE(address, size) \
42 do \
43 { \
44 Lisp_Object val; \
45 XSET (val, Lisp_Cons, (char *) address + size); \
46 if ((char *) XCONS (val) != (char *) address + size) \
47 { \
48 xfree (address); \
49 memory_full (); \
50 } \
51 } while (0)
52
53 /* Number of bytes of consing done since the last gc */
54 int consing_since_gc;
55
56 /* Number of bytes of consing since gc before another gc should be done. */
57 int gc_cons_threshold;
58
59 /* Nonzero during gc */
60 int gc_in_progress;
61
62 #ifndef VIRT_ADDR_VARIES
63 extern
64 #endif /* VIRT_ADDR_VARIES */
65 int malloc_sbrk_used;
66
67 #ifndef VIRT_ADDR_VARIES
68 extern
69 #endif /* VIRT_ADDR_VARIES */
70 int malloc_sbrk_unused;
71
72 /* Two limits controlling how much undo information to keep. */
73 int undo_limit;
74 int undo_strong_limit;
75
76 /* Non-nil means defun should do purecopy on the function definition */
77 Lisp_Object Vpurify_flag;
78
79 #ifndef HAVE_SHM
80 int pure[PURESIZE / sizeof (int)] = {0,}; /* Force it into data space! */
81 #define PUREBEG (char *) pure
82 #else
83 #define pure PURE_SEG_BITS /* Use shared memory segment */
84 #define PUREBEG (char *)PURE_SEG_BITS
85
86 /* This variable is used only by the XPNTR macro when HAVE_SHM is
87 defined. If we used the PURESIZE macro directly there, that would
88 make most of emacs dependent on puresize.h, which we don't want -
89 you should be able to change that without too much recompilation.
90 So map_in_data initializes pure_size, and the dependencies work
91 out. */
92 int pure_size;
93 #endif /* not HAVE_SHM */
94
95 /* Index in pure at which next pure object will be allocated. */
96 int pureptr;
97
98 /* If nonzero, this is a warning delivered by malloc and not yet displayed. */
99 char *pending_malloc_warning;
100
101 /* Maximum amount of C stack to save when a GC happens. */
102
103 #ifndef MAX_SAVE_STACK
104 #define MAX_SAVE_STACK 16000
105 #endif
106
107 /* Buffer in which we save a copy of the C stack at each GC. */
108
109 char *stack_copy;
110 int stack_copy_size;
111
112 /* Non-zero means ignore malloc warnings. Set during initialization. */
113 int ignore_warnings;
114
115 static void mark_object (), mark_buffer ();
116 static void clear_marks (), gc_sweep ();
117 static void compact_strings ();
118 \f
119 /* Versions of malloc and realloc that print warnings as memory gets full. */
120
121 Lisp_Object
122 malloc_warning_1 (str)
123 Lisp_Object str;
124 {
125 Fprinc (str, Vstandard_output);
126 write_string ("\nKilling some buffers may delay running out of memory.\n", -1);
127 write_string ("However, certainly by the time you receive the 95% warning,\n", -1);
128 write_string ("you should clean up, kill this Emacs, and start a new one.", -1);
129 return Qnil;
130 }
131
132 /* malloc calls this if it finds we are near exhausting storage */
133 malloc_warning (str)
134 char *str;
135 {
136 pending_malloc_warning = str;
137 }
138
139 display_malloc_warning ()
140 {
141 register Lisp_Object val;
142
143 val = build_string (pending_malloc_warning);
144 pending_malloc_warning = 0;
145 internal_with_output_to_temp_buffer (" *Danger*", malloc_warning_1, val);
146 }
147
148 /* Called if malloc returns zero */
149 memory_full ()
150 {
151 error ("Memory exhausted");
152 }
153
154 /* like malloc routines but check for no memory and block interrupt input. */
155
156 long *
157 xmalloc (size)
158 int size;
159 {
160 register long *val;
161
162 BLOCK_INPUT;
163 val = (long *) malloc (size);
164 UNBLOCK_INPUT;
165
166 if (!val && size) memory_full ();
167 return val;
168 }
169
170 long *
171 xrealloc (block, size)
172 long *block;
173 int size;
174 {
175 register long *val;
176
177 BLOCK_INPUT;
178 /* We must call malloc explicitly when BLOCK is 0, since some
179 reallocs don't do this. */
180 if (! block)
181 val = (long *) malloc (size);
182 else
183 val = (long *) realloc (block, size);
184 UNBLOCK_INPUT;
185
186 if (!val && size) memory_full ();
187 return val;
188 }
189
190 void
191 xfree (block)
192 long *block;
193 {
194 BLOCK_INPUT;
195 free (block);
196 UNBLOCK_INPUT;
197 }
198
199 \f
200 /* Arranging to disable input signals while we're in malloc.
201
202 This only works with GNU malloc. To help out systems which can't
203 use GNU malloc, all the calls to malloc, realloc, and free
204 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
205 pairs; unfortunately, we have no idea what C library functions
206 might call malloc, so we can't really protect them unless you're
207 using GNU malloc. Fortunately, most of the major operating can use
208 GNU malloc. */
209
210 #ifndef SYSTEM_MALLOC
211 extern void * (*__malloc_hook) ();
212 static void * (*old_malloc_hook) ();
213 extern void * (*__realloc_hook) ();
214 static void * (*old_realloc_hook) ();
215 extern void (*__free_hook) ();
216 static void (*old_free_hook) ();
217
218 static void
219 emacs_blocked_free (ptr)
220 void *ptr;
221 {
222 BLOCK_INPUT;
223 __free_hook = old_free_hook;
224 free (ptr);
225 __free_hook = emacs_blocked_free;
226 UNBLOCK_INPUT;
227 }
228
229 static void *
230 emacs_blocked_malloc (size)
231 unsigned size;
232 {
233 void *value;
234
235 BLOCK_INPUT;
236 __malloc_hook = old_malloc_hook;
237 value = (void *) malloc (size);
238 __malloc_hook = emacs_blocked_malloc;
239 UNBLOCK_INPUT;
240
241 return value;
242 }
243
244 static void *
245 emacs_blocked_realloc (ptr, size)
246 void *ptr;
247 unsigned size;
248 {
249 void *value;
250
251 BLOCK_INPUT;
252 __realloc_hook = old_realloc_hook;
253 value = (void *) realloc (ptr, size);
254 __realloc_hook = emacs_blocked_realloc;
255 UNBLOCK_INPUT;
256
257 return value;
258 }
259
260 void
261 uninterrupt_malloc ()
262 {
263 old_free_hook = __free_hook;
264 __free_hook = emacs_blocked_free;
265
266 old_malloc_hook = __malloc_hook;
267 __malloc_hook = emacs_blocked_malloc;
268
269 old_realloc_hook = __realloc_hook;
270 __realloc_hook = emacs_blocked_realloc;
271 }
272 #endif
273 \f
274 /* Interval allocation. */
275
276 #ifdef USE_TEXT_PROPERTIES
277 #define INTERVAL_BLOCK_SIZE \
278 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
279
280 struct interval_block
281 {
282 struct interval_block *next;
283 struct interval intervals[INTERVAL_BLOCK_SIZE];
284 };
285
286 struct interval_block *interval_block;
287 static int interval_block_index;
288
289 INTERVAL interval_free_list;
290
291 static void
292 init_intervals ()
293 {
294 interval_block
295 = (struct interval_block *) malloc (sizeof (struct interval_block));
296 interval_block->next = 0;
297 bzero (interval_block->intervals, sizeof interval_block->intervals);
298 interval_block_index = 0;
299 interval_free_list = 0;
300 }
301
302 #define INIT_INTERVALS init_intervals ()
303
304 INTERVAL
305 make_interval ()
306 {
307 INTERVAL val;
308
309 if (interval_free_list)
310 {
311 val = interval_free_list;
312 interval_free_list = interval_free_list->parent;
313 }
314 else
315 {
316 if (interval_block_index == INTERVAL_BLOCK_SIZE)
317 {
318 register struct interval_block *newi
319 = (struct interval_block *) xmalloc (sizeof (struct interval_block));
320
321 VALIDATE_LISP_STORAGE (newi, sizeof *newi);
322 newi->next = interval_block;
323 interval_block = newi;
324 interval_block_index = 0;
325 }
326 val = &interval_block->intervals[interval_block_index++];
327 }
328 consing_since_gc += sizeof (struct interval);
329 RESET_INTERVAL (val);
330 return val;
331 }
332
333 static int total_free_intervals, total_intervals;
334
335 /* Mark the pointers of one interval. */
336
337 static void
338 mark_interval (i, dummy)
339 register INTERVAL i;
340 Lisp_Object dummy;
341 {
342 if (XMARKBIT (i->plist))
343 abort ();
344 mark_object (&i->plist);
345 XMARK (i->plist);
346 }
347
348 static void
349 mark_interval_tree (tree)
350 register INTERVAL tree;
351 {
352 /* No need to test if this tree has been marked already; this
353 function is always called through the MARK_INTERVAL_TREE macro,
354 which takes care of that. */
355
356 /* XMARK expands to an assignment; the LHS of an assignment can't be
357 a cast. */
358 XMARK (* (Lisp_Object *) &tree->parent);
359
360 traverse_intervals (tree, 1, 0, mark_interval, Qnil);
361 }
362
363 #define MARK_INTERVAL_TREE(i) \
364 do { \
365 if (!NULL_INTERVAL_P (i) \
366 && ! XMARKBIT ((Lisp_Object) i->parent)) \
367 mark_interval_tree (i); \
368 } while (0)
369
370 /* The oddity in the call to XUNMARK is necessary because XUNMARK
371 expands to an assignment to its argument, and most C compilers don't
372 support casts on the left operand of `='. */
373 #define UNMARK_BALANCE_INTERVALS(i) \
374 { \
375 if (! NULL_INTERVAL_P (i)) \
376 { \
377 XUNMARK (* (Lisp_Object *) (&(i)->parent)); \
378 (i) = balance_intervals (i); \
379 } \
380 }
381
382 #else /* no interval use */
383
384 #define INIT_INTERVALS
385
386 #define UNMARK_BALANCE_INTERVALS(i)
387 #define MARK_INTERVAL_TREE(i)
388
389 #endif /* no interval use */
390 \f
391 /* Floating point allocation. */
392
393 #ifdef LISP_FLOAT_TYPE
394 /* Allocation of float cells, just like conses */
395 /* We store float cells inside of float_blocks, allocating a new
396 float_block with malloc whenever necessary. Float cells reclaimed by
397 GC are put on a free list to be reallocated before allocating
398 any new float cells from the latest float_block.
399
400 Each float_block is just under 1020 bytes long,
401 since malloc really allocates in units of powers of two
402 and uses 4 bytes for its own overhead. */
403
404 #define FLOAT_BLOCK_SIZE \
405 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float))
406
407 struct float_block
408 {
409 struct float_block *next;
410 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
411 };
412
413 struct float_block *float_block;
414 int float_block_index;
415
416 struct Lisp_Float *float_free_list;
417
418 void
419 init_float ()
420 {
421 float_block = (struct float_block *) malloc (sizeof (struct float_block));
422 float_block->next = 0;
423 bzero (float_block->floats, sizeof float_block->floats);
424 float_block_index = 0;
425 float_free_list = 0;
426 }
427
428 /* Explicitly free a float cell. */
429 free_float (ptr)
430 struct Lisp_Float *ptr;
431 {
432 XFASTINT (ptr->type) = (int) float_free_list;
433 float_free_list = ptr;
434 }
435
436 Lisp_Object
437 make_float (float_value)
438 double float_value;
439 {
440 register Lisp_Object val;
441
442 if (float_free_list)
443 {
444 XSET (val, Lisp_Float, float_free_list);
445 float_free_list = (struct Lisp_Float *) XFASTINT (float_free_list->type);
446 }
447 else
448 {
449 if (float_block_index == FLOAT_BLOCK_SIZE)
450 {
451 register struct float_block *new = (struct float_block *) xmalloc (sizeof (struct float_block));
452 VALIDATE_LISP_STORAGE (new, sizeof *new);
453 new->next = float_block;
454 float_block = new;
455 float_block_index = 0;
456 }
457 XSET (val, Lisp_Float, &float_block->floats[float_block_index++]);
458 }
459 XFLOAT (val)->data = float_value;
460 XFLOAT (val)->type = 0; /* bug chasing -wsr */
461 consing_since_gc += sizeof (struct Lisp_Float);
462 return val;
463 }
464
465 #endif /* LISP_FLOAT_TYPE */
466 \f
467 /* Allocation of cons cells */
468 /* We store cons cells inside of cons_blocks, allocating a new
469 cons_block with malloc whenever necessary. Cons cells reclaimed by
470 GC are put on a free list to be reallocated before allocating
471 any new cons cells from the latest cons_block.
472
473 Each cons_block is just under 1020 bytes long,
474 since malloc really allocates in units of powers of two
475 and uses 4 bytes for its own overhead. */
476
477 #define CONS_BLOCK_SIZE \
478 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons))
479
480 struct cons_block
481 {
482 struct cons_block *next;
483 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
484 };
485
486 struct cons_block *cons_block;
487 int cons_block_index;
488
489 struct Lisp_Cons *cons_free_list;
490
491 void
492 init_cons ()
493 {
494 cons_block = (struct cons_block *) malloc (sizeof (struct cons_block));
495 cons_block->next = 0;
496 bzero (cons_block->conses, sizeof cons_block->conses);
497 cons_block_index = 0;
498 cons_free_list = 0;
499 }
500
501 /* Explicitly free a cons cell. */
502 free_cons (ptr)
503 struct Lisp_Cons *ptr;
504 {
505 XFASTINT (ptr->car) = (int) cons_free_list;
506 cons_free_list = ptr;
507 }
508
509 DEFUN ("cons", Fcons, Scons, 2, 2, 0,
510 "Create a new cons, give it CAR and CDR as components, and return it.")
511 (car, cdr)
512 Lisp_Object car, cdr;
513 {
514 register Lisp_Object val;
515
516 if (cons_free_list)
517 {
518 XSET (val, Lisp_Cons, cons_free_list);
519 cons_free_list = (struct Lisp_Cons *) XFASTINT (cons_free_list->car);
520 }
521 else
522 {
523 if (cons_block_index == CONS_BLOCK_SIZE)
524 {
525 register struct cons_block *new = (struct cons_block *) xmalloc (sizeof (struct cons_block));
526 VALIDATE_LISP_STORAGE (new, sizeof *new);
527 new->next = cons_block;
528 cons_block = new;
529 cons_block_index = 0;
530 }
531 XSET (val, Lisp_Cons, &cons_block->conses[cons_block_index++]);
532 }
533 XCONS (val)->car = car;
534 XCONS (val)->cdr = cdr;
535 consing_since_gc += sizeof (struct Lisp_Cons);
536 return val;
537 }
538
539 DEFUN ("list", Flist, Slist, 0, MANY, 0,
540 "Return a newly created list with specified arguments as elements.\n\
541 Any number of arguments, even zero arguments, are allowed.")
542 (nargs, args)
543 int nargs;
544 register Lisp_Object *args;
545 {
546 register Lisp_Object len, val, val_tail;
547
548 XFASTINT (len) = nargs;
549 val = Fmake_list (len, Qnil);
550 val_tail = val;
551 while (!NILP (val_tail))
552 {
553 XCONS (val_tail)->car = *args++;
554 val_tail = XCONS (val_tail)->cdr;
555 }
556 return val;
557 }
558
559 DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
560 "Return a newly created list of length LENGTH, with each element being INIT.")
561 (length, init)
562 register Lisp_Object length, init;
563 {
564 register Lisp_Object val;
565 register int size;
566
567 if (XTYPE (length) != Lisp_Int || XINT (length) < 0)
568 length = wrong_type_argument (Qnatnump, length);
569 size = XINT (length);
570
571 val = Qnil;
572 while (size-- > 0)
573 val = Fcons (init, val);
574 return val;
575 }
576 \f
577 /* Allocation of vectors */
578
579 struct Lisp_Vector *all_vectors;
580
581 DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
582 "Return a newly created vector of length LENGTH, with each element being INIT.\n\
583 See also the function `vector'.")
584 (length, init)
585 register Lisp_Object length, init;
586 {
587 register int sizei, index;
588 register Lisp_Object vector;
589 register struct Lisp_Vector *p;
590
591 if (XTYPE (length) != Lisp_Int || XINT (length) < 0)
592 length = wrong_type_argument (Qnatnump, length);
593 sizei = XINT (length);
594
595 p = (struct Lisp_Vector *) xmalloc (sizeof (struct Lisp_Vector) + (sizei - 1) * sizeof (Lisp_Object));
596 VALIDATE_LISP_STORAGE (p, 0);
597
598 XSET (vector, Lisp_Vector, p);
599 consing_since_gc += sizeof (struct Lisp_Vector) + (sizei - 1) * sizeof (Lisp_Object);
600
601 p->size = sizei;
602 p->next = all_vectors;
603 all_vectors = p;
604
605 for (index = 0; index < sizei; index++)
606 p->contents[index] = init;
607
608 return vector;
609 }
610
611 DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
612 "Return a newly created vector with specified arguments as elements.\n\
613 Any number of arguments, even zero arguments, are allowed.")
614 (nargs, args)
615 register int nargs;
616 Lisp_Object *args;
617 {
618 register Lisp_Object len, val;
619 register int index;
620 register struct Lisp_Vector *p;
621
622 XFASTINT (len) = nargs;
623 val = Fmake_vector (len, Qnil);
624 p = XVECTOR (val);
625 for (index = 0; index < nargs; index++)
626 p->contents[index] = args[index];
627 return val;
628 }
629
630 DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
631 "Create a byte-code object with specified arguments as elements.\n\
632 The arguments should be the arglist, bytecode-string, constant vector,\n\
633 stack size, (optional) doc string, and (optional) interactive spec.\n\
634 The first four arguments are required; at most six have any\n\
635 significance.")
636 (nargs, args)
637 register int nargs;
638 Lisp_Object *args;
639 {
640 register Lisp_Object len, val;
641 register int index;
642 register struct Lisp_Vector *p;
643
644 XFASTINT (len) = nargs;
645 if (!NILP (Vpurify_flag))
646 val = make_pure_vector (len);
647 else
648 val = Fmake_vector (len, Qnil);
649 p = XVECTOR (val);
650 for (index = 0; index < nargs; index++)
651 {
652 if (!NILP (Vpurify_flag))
653 args[index] = Fpurecopy (args[index]);
654 p->contents[index] = args[index];
655 }
656 XSETTYPE (val, Lisp_Compiled);
657 return val;
658 }
659 \f
660 /* Allocation of symbols.
661 Just like allocation of conses!
662
663 Each symbol_block is just under 1020 bytes long,
664 since malloc really allocates in units of powers of two
665 and uses 4 bytes for its own overhead. */
666
667 #define SYMBOL_BLOCK_SIZE \
668 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
669
670 struct symbol_block
671 {
672 struct symbol_block *next;
673 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
674 };
675
676 struct symbol_block *symbol_block;
677 int symbol_block_index;
678
679 struct Lisp_Symbol *symbol_free_list;
680
681 void
682 init_symbol ()
683 {
684 symbol_block = (struct symbol_block *) malloc (sizeof (struct symbol_block));
685 symbol_block->next = 0;
686 bzero (symbol_block->symbols, sizeof symbol_block->symbols);
687 symbol_block_index = 0;
688 symbol_free_list = 0;
689 }
690
691 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
692 "Return a newly allocated uninterned symbol whose name is NAME.\n\
693 Its value and function definition are void, and its property list is nil.")
694 (str)
695 Lisp_Object str;
696 {
697 register Lisp_Object val;
698 register struct Lisp_Symbol *p;
699
700 CHECK_STRING (str, 0);
701
702 if (symbol_free_list)
703 {
704 XSET (val, Lisp_Symbol, symbol_free_list);
705 symbol_free_list
706 = (struct Lisp_Symbol *) XFASTINT (symbol_free_list->value);
707 }
708 else
709 {
710 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
711 {
712 struct symbol_block *new = (struct symbol_block *) xmalloc (sizeof (struct symbol_block));
713 VALIDATE_LISP_STORAGE (new, sizeof *new);
714 new->next = symbol_block;
715 symbol_block = new;
716 symbol_block_index = 0;
717 }
718 XSET (val, Lisp_Symbol, &symbol_block->symbols[symbol_block_index++]);
719 }
720 p = XSYMBOL (val);
721 p->name = XSTRING (str);
722 p->plist = Qnil;
723 p->value = Qunbound;
724 p->function = Qunbound;
725 p->next = 0;
726 consing_since_gc += sizeof (struct Lisp_Symbol);
727 return val;
728 }
729 \f
730 /* Allocation of markers.
731 Works like allocation of conses. */
732
733 #define MARKER_BLOCK_SIZE \
734 ((1020 - sizeof (struct marker_block *)) / sizeof (struct Lisp_Marker))
735
736 struct marker_block
737 {
738 struct marker_block *next;
739 struct Lisp_Marker markers[MARKER_BLOCK_SIZE];
740 };
741
742 struct marker_block *marker_block;
743 int marker_block_index;
744
745 struct Lisp_Marker *marker_free_list;
746
747 void
748 init_marker ()
749 {
750 marker_block = (struct marker_block *) malloc (sizeof (struct marker_block));
751 marker_block->next = 0;
752 bzero (marker_block->markers, sizeof marker_block->markers);
753 marker_block_index = 0;
754 marker_free_list = 0;
755 }
756
757 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
758 "Return a newly allocated marker which does not point at any place.")
759 ()
760 {
761 register Lisp_Object val;
762 register struct Lisp_Marker *p;
763
764 if (marker_free_list)
765 {
766 XSET (val, Lisp_Marker, marker_free_list);
767 marker_free_list
768 = (struct Lisp_Marker *) XFASTINT (marker_free_list->chain);
769 }
770 else
771 {
772 if (marker_block_index == MARKER_BLOCK_SIZE)
773 {
774 struct marker_block *new = (struct marker_block *) xmalloc (sizeof (struct marker_block));
775 VALIDATE_LISP_STORAGE (new, sizeof *new);
776 new->next = marker_block;
777 marker_block = new;
778 marker_block_index = 0;
779 }
780 XSET (val, Lisp_Marker, &marker_block->markers[marker_block_index++]);
781 }
782 p = XMARKER (val);
783 p->buffer = 0;
784 p->bufpos = 0;
785 p->chain = Qnil;
786 consing_since_gc += sizeof (struct Lisp_Marker);
787 return val;
788 }
789 \f
790 /* Allocation of strings */
791
792 /* Strings reside inside of string_blocks. The entire data of the string,
793 both the size and the contents, live in part of the `chars' component of a string_block.
794 The `pos' component is the index within `chars' of the first free byte.
795
796 first_string_block points to the first string_block ever allocated.
797 Each block points to the next one with its `next' field.
798 The `prev' fields chain in reverse order.
799 The last one allocated is the one currently being filled.
800 current_string_block points to it.
801
802 The string_blocks that hold individual large strings
803 go in a separate chain, started by large_string_blocks. */
804
805
806 /* String blocks contain this many useful bytes.
807 8188 is power of 2, minus 4 for malloc overhead. */
808 #define STRING_BLOCK_SIZE (8188 - sizeof (struct string_block_head))
809
810 /* A string bigger than this gets its own specially-made string block
811 if it doesn't fit in the current one. */
812 #define STRING_BLOCK_OUTSIZE 1024
813
814 struct string_block_head
815 {
816 struct string_block *next, *prev;
817 int pos;
818 };
819
820 struct string_block
821 {
822 struct string_block *next, *prev;
823 int pos;
824 char chars[STRING_BLOCK_SIZE];
825 };
826
827 /* This points to the string block we are now allocating strings. */
828
829 struct string_block *current_string_block;
830
831 /* This points to the oldest string block, the one that starts the chain. */
832
833 struct string_block *first_string_block;
834
835 /* Last string block in chain of those made for individual large strings. */
836
837 struct string_block *large_string_blocks;
838
839 /* If SIZE is the length of a string, this returns how many bytes
840 the string occupies in a string_block (including padding). */
841
842 #define STRING_FULLSIZE(size) (((size) + sizeof (struct Lisp_String) + PAD) \
843 & ~(PAD - 1))
844 #define PAD (sizeof (int))
845
846 #if 0
847 #define STRING_FULLSIZE(SIZE) \
848 (((SIZE) + 2 * sizeof (int)) & ~(sizeof (int) - 1))
849 #endif
850
851 void
852 init_strings ()
853 {
854 current_string_block = (struct string_block *) malloc (sizeof (struct string_block));
855 first_string_block = current_string_block;
856 consing_since_gc += sizeof (struct string_block);
857 current_string_block->next = 0;
858 current_string_block->prev = 0;
859 current_string_block->pos = 0;
860 large_string_blocks = 0;
861 }
862
863 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
864 "Return a newly created string of length LENGTH, with each element being INIT.\n\
865 Both LENGTH and INIT must be numbers.")
866 (length, init)
867 Lisp_Object length, init;
868 {
869 register Lisp_Object val;
870 register unsigned char *p, *end, c;
871
872 if (XTYPE (length) != Lisp_Int || XINT (length) < 0)
873 length = wrong_type_argument (Qnatnump, length);
874 CHECK_NUMBER (init, 1);
875 val = make_uninit_string (XINT (length));
876 c = XINT (init);
877 p = XSTRING (val)->data;
878 end = p + XSTRING (val)->size;
879 while (p != end)
880 *p++ = c;
881 *p = 0;
882 return val;
883 }
884
885 Lisp_Object
886 make_string (contents, length)
887 char *contents;
888 int length;
889 {
890 register Lisp_Object val;
891 val = make_uninit_string (length);
892 bcopy (contents, XSTRING (val)->data, length);
893 return val;
894 }
895
896 Lisp_Object
897 build_string (str)
898 char *str;
899 {
900 return make_string (str, strlen (str));
901 }
902
903 Lisp_Object
904 make_uninit_string (length)
905 int length;
906 {
907 register Lisp_Object val;
908 register int fullsize = STRING_FULLSIZE (length);
909
910 if (length < 0) abort ();
911
912 if (fullsize <= STRING_BLOCK_SIZE - current_string_block->pos)
913 /* This string can fit in the current string block */
914 {
915 XSET (val, Lisp_String,
916 (struct Lisp_String *) (current_string_block->chars + current_string_block->pos));
917 current_string_block->pos += fullsize;
918 }
919 else if (fullsize > STRING_BLOCK_OUTSIZE)
920 /* This string gets its own string block */
921 {
922 register struct string_block *new
923 = (struct string_block *) xmalloc (sizeof (struct string_block_head) + fullsize);
924 VALIDATE_LISP_STORAGE (new, 0);
925 consing_since_gc += sizeof (struct string_block_head) + fullsize;
926 new->pos = fullsize;
927 new->next = large_string_blocks;
928 large_string_blocks = new;
929 XSET (val, Lisp_String,
930 (struct Lisp_String *) ((struct string_block_head *)new + 1));
931 }
932 else
933 /* Make a new current string block and start it off with this string */
934 {
935 register struct string_block *new
936 = (struct string_block *) xmalloc (sizeof (struct string_block));
937 VALIDATE_LISP_STORAGE (new, sizeof *new);
938 consing_since_gc += sizeof (struct string_block);
939 current_string_block->next = new;
940 new->prev = current_string_block;
941 new->next = 0;
942 current_string_block = new;
943 new->pos = fullsize;
944 XSET (val, Lisp_String,
945 (struct Lisp_String *) current_string_block->chars);
946 }
947
948 XSTRING (val)->size = length;
949 XSTRING (val)->data[length] = 0;
950 INITIALIZE_INTERVAL (XSTRING (val), NULL_INTERVAL);
951
952 return val;
953 }
954
955 /* Return a newly created vector or string with specified arguments as
956 elements. If all the arguments are characters that can fit
957 in a string of events, make a string; otherwise, make a vector.
958
959 Any number of arguments, even zero arguments, are allowed. */
960
961 Lisp_Object
962 make_event_array (nargs, args)
963 register int nargs;
964 Lisp_Object *args;
965 {
966 int i;
967
968 for (i = 0; i < nargs; i++)
969 /* The things that fit in a string
970 are characters that are in 0...127,
971 after discarding the meta bit and all the bits above it. */
972 if (XTYPE (args[i]) != Lisp_Int
973 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
974 return Fvector (nargs, args);
975
976 /* Since the loop exited, we know that all the things in it are
977 characters, so we can make a string. */
978 {
979 Lisp_Object result = Fmake_string (nargs, make_number (0));
980
981 for (i = 0; i < nargs; i++)
982 {
983 XSTRING (result)->data[i] = XINT (args[i]);
984 /* Move the meta bit to the right place for a string char. */
985 if (XINT (args[i]) & CHAR_META)
986 XSTRING (result)->data[i] |= 0x80;
987 }
988
989 return result;
990 }
991 }
992 \f
993 /* Pure storage management. */
994
995 /* Must get an error if pure storage is full,
996 since if it cannot hold a large string
997 it may be able to hold conses that point to that string;
998 then the string is not protected from gc. */
999
1000 Lisp_Object
1001 make_pure_string (data, length)
1002 char *data;
1003 int length;
1004 {
1005 register Lisp_Object new;
1006 register int size = sizeof (int) + INTERVAL_PTR_SIZE + length + 1;
1007
1008 if (pureptr + size > PURESIZE)
1009 error ("Pure Lisp storage exhausted");
1010 XSET (new, Lisp_String, PUREBEG + pureptr);
1011 XSTRING (new)->size = length;
1012 bcopy (data, XSTRING (new)->data, length);
1013 XSTRING (new)->data[length] = 0;
1014 pureptr += (size + sizeof (int) - 1)
1015 / sizeof (int) * sizeof (int);
1016 return new;
1017 }
1018
1019 Lisp_Object
1020 pure_cons (car, cdr)
1021 Lisp_Object car, cdr;
1022 {
1023 register Lisp_Object new;
1024
1025 if (pureptr + sizeof (struct Lisp_Cons) > PURESIZE)
1026 error ("Pure Lisp storage exhausted");
1027 XSET (new, Lisp_Cons, PUREBEG + pureptr);
1028 pureptr += sizeof (struct Lisp_Cons);
1029 XCONS (new)->car = Fpurecopy (car);
1030 XCONS (new)->cdr = Fpurecopy (cdr);
1031 return new;
1032 }
1033
1034 #ifdef LISP_FLOAT_TYPE
1035
1036 Lisp_Object
1037 make_pure_float (num)
1038 double num;
1039 {
1040 register Lisp_Object new;
1041
1042 /* Make sure that PUREBEG + pureptr is aligned on at least a sizeof
1043 (double) boundary. Some architectures (like the sparc) require
1044 this, and I suspect that floats are rare enough that it's no
1045 tragedy for those that do. */
1046 {
1047 int alignment;
1048 char *p = PUREBEG + pureptr;
1049
1050 #ifdef __GNUC__
1051 #if __GNUC__ >= 2
1052 alignment = __alignof (struct Lisp_Float);
1053 #else
1054 alignment = sizeof (struct Lisp_Float);
1055 #endif
1056 #else
1057 alignment = sizeof (struct Lisp_Float);
1058 #endif
1059 p = (char *) (((unsigned long) p + alignment - 1) & - alignment);
1060 pureptr = p - PUREBEG;
1061 }
1062
1063 if (pureptr + sizeof (struct Lisp_Float) > PURESIZE)
1064 error ("Pure Lisp storage exhausted");
1065 XSET (new, Lisp_Float, PUREBEG + pureptr);
1066 pureptr += sizeof (struct Lisp_Float);
1067 XFLOAT (new)->data = num;
1068 XFLOAT (new)->type = 0; /* bug chasing -wsr */
1069 return new;
1070 }
1071
1072 #endif /* LISP_FLOAT_TYPE */
1073
1074 Lisp_Object
1075 make_pure_vector (len)
1076 int len;
1077 {
1078 register Lisp_Object new;
1079 register int size = sizeof (struct Lisp_Vector) + (len - 1) * sizeof (Lisp_Object);
1080
1081 if (pureptr + size > PURESIZE)
1082 error ("Pure Lisp storage exhausted");
1083
1084 XSET (new, Lisp_Vector, PUREBEG + pureptr);
1085 pureptr += size;
1086 XVECTOR (new)->size = len;
1087 return new;
1088 }
1089
1090 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
1091 "Make a copy of OBJECT in pure storage.\n\
1092 Recursively copies contents of vectors and cons cells.\n\
1093 Does not copy symbols.")
1094 (obj)
1095 register Lisp_Object obj;
1096 {
1097 register Lisp_Object new, tem;
1098 register int i;
1099
1100 if (NILP (Vpurify_flag))
1101 return obj;
1102
1103 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1104 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1105 return obj;
1106
1107 #ifdef SWITCH_ENUM_BUG
1108 switch ((int) XTYPE (obj))
1109 #else
1110 switch (XTYPE (obj))
1111 #endif
1112 {
1113 case Lisp_Marker:
1114 error ("Attempt to copy a marker to pure storage");
1115
1116 case Lisp_Cons:
1117 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr);
1118
1119 #ifdef LISP_FLOAT_TYPE
1120 case Lisp_Float:
1121 return make_pure_float (XFLOAT (obj)->data);
1122 #endif /* LISP_FLOAT_TYPE */
1123
1124 case Lisp_String:
1125 return make_pure_string (XSTRING (obj)->data, XSTRING (obj)->size);
1126
1127 case Lisp_Compiled:
1128 case Lisp_Vector:
1129 new = make_pure_vector (XVECTOR (obj)->size);
1130 for (i = 0; i < XVECTOR (obj)->size; i++)
1131 {
1132 tem = XVECTOR (obj)->contents[i];
1133 XVECTOR (new)->contents[i] = Fpurecopy (tem);
1134 }
1135 XSETTYPE (new, XTYPE (obj));
1136 return new;
1137
1138 default:
1139 return obj;
1140 }
1141 }
1142 \f
1143 /* Recording what needs to be marked for gc. */
1144
1145 struct gcpro *gcprolist;
1146
1147 #define NSTATICS 512
1148
1149 Lisp_Object *staticvec[NSTATICS] = {0};
1150
1151 int staticidx = 0;
1152
1153 /* Put an entry in staticvec, pointing at the variable whose address is given */
1154
1155 void
1156 staticpro (varaddress)
1157 Lisp_Object *varaddress;
1158 {
1159 staticvec[staticidx++] = varaddress;
1160 if (staticidx >= NSTATICS)
1161 abort ();
1162 }
1163
1164 struct catchtag
1165 {
1166 Lisp_Object tag;
1167 Lisp_Object val;
1168 struct catchtag *next;
1169 /* jmp_buf jmp; /* We don't need this for GC purposes */
1170 };
1171
1172 struct backtrace
1173 {
1174 struct backtrace *next;
1175 Lisp_Object *function;
1176 Lisp_Object *args; /* Points to vector of args. */
1177 int nargs; /* length of vector */
1178 /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */
1179 char evalargs;
1180 };
1181
1182 /* Two flags that are set during GC in the `size' component
1183 of a string or vector. On some machines, these flags
1184 are defined by the m- file to be different bits. */
1185
1186 /* On vector, means it has been marked.
1187 On string size field or a reference to a string,
1188 means not the last reference in the chain. */
1189
1190 #ifndef ARRAY_MARK_FLAG
1191 #define ARRAY_MARK_FLAG ((MARKBIT >> 1) & ~MARKBIT)
1192 #endif /* no ARRAY_MARK_FLAG */
1193
1194 /* Any slot that is a Lisp_Object can point to a string
1195 and thus can be put on a string's reference-chain
1196 and thus may need to have its ARRAY_MARK_FLAG set.
1197 This includes the slots whose markbits are used to mark
1198 the containing objects. */
1199
1200 #if ARRAY_MARK_FLAG == MARKBIT
1201 you lose
1202 #endif
1203 \f
1204 /* Garbage collection! */
1205
1206 int total_conses, total_markers, total_symbols, total_string_size, total_vector_size;
1207 int total_free_conses, total_free_markers, total_free_symbols;
1208 #ifdef LISP_FLOAT_TYPE
1209 int total_free_floats, total_floats;
1210 #endif /* LISP_FLOAT_TYPE */
1211
1212 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
1213 "Reclaim storage for Lisp objects no longer needed.\n\
1214 Returns info on amount of space in use:\n\
1215 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\
1216 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\
1217 (USED-FLOATS . FREE-FLOATS))\n\
1218 Garbage collection happens automatically if you cons more than\n\
1219 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.")
1220 ()
1221 {
1222 register struct gcpro *tail;
1223 register struct specbinding *bind;
1224 struct catchtag *catch;
1225 struct handler *handler;
1226 register struct backtrace *backlist;
1227 register Lisp_Object tem;
1228 char *omessage = echo_area_glyphs;
1229 char stack_top_variable;
1230 register int i;
1231
1232 /* Save a copy of the contents of the stack, for debugging. */
1233 #if MAX_SAVE_STACK > 0
1234 if (NILP (Vpurify_flag))
1235 {
1236 i = &stack_top_variable - stack_bottom;
1237 if (i < 0) i = -i;
1238 if (i < MAX_SAVE_STACK)
1239 {
1240 if (stack_copy == 0)
1241 stack_copy = (char *) xmalloc (stack_copy_size = i);
1242 else if (stack_copy_size < i)
1243 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
1244 if (stack_copy)
1245 {
1246 if ((int) (&stack_top_variable - stack_bottom) > 0)
1247 bcopy (stack_bottom, stack_copy, i);
1248 else
1249 bcopy (&stack_top_variable, stack_copy, i);
1250 }
1251 }
1252 }
1253 #endif /* MAX_SAVE_STACK > 0 */
1254
1255 if (!noninteractive)
1256 message1 ("Garbage collecting...");
1257
1258 /* Don't keep command history around forever */
1259 tem = Fnthcdr (make_number (30), Vcommand_history);
1260 if (CONSP (tem))
1261 XCONS (tem)->cdr = Qnil;
1262
1263 /* Likewise for undo information. */
1264 {
1265 register struct buffer *nextb = all_buffers;
1266
1267 while (nextb)
1268 {
1269 /* If a buffer's undo list is Qt, that means that undo is
1270 turned off in that buffer. Calling truncate_undo_list on
1271 Qt tends to return NULL, which effectively turns undo back on.
1272 So don't call truncate_undo_list if undo_list is Qt. */
1273 if (! EQ (nextb->undo_list, Qt))
1274 nextb->undo_list
1275 = truncate_undo_list (nextb->undo_list, undo_limit,
1276 undo_strong_limit);
1277 nextb = nextb->next;
1278 }
1279 }
1280
1281 gc_in_progress = 1;
1282
1283 /* clear_marks (); */
1284
1285 /* In each "large string", set the MARKBIT of the size field.
1286 That enables mark_object to recognize them. */
1287 {
1288 register struct string_block *b;
1289 for (b = large_string_blocks; b; b = b->next)
1290 ((struct Lisp_String *)(&b->chars[0]))->size |= MARKBIT;
1291 }
1292
1293 /* Mark all the special slots that serve as the roots of accessibility.
1294
1295 Usually the special slots to mark are contained in particular structures.
1296 Then we know no slot is marked twice because the structures don't overlap.
1297 In some cases, the structures point to the slots to be marked.
1298 For these, we use MARKBIT to avoid double marking of the slot. */
1299
1300 for (i = 0; i < staticidx; i++)
1301 mark_object (staticvec[i]);
1302 for (tail = gcprolist; tail; tail = tail->next)
1303 for (i = 0; i < tail->nvars; i++)
1304 if (!XMARKBIT (tail->var[i]))
1305 {
1306 mark_object (&tail->var[i]);
1307 XMARK (tail->var[i]);
1308 }
1309 for (bind = specpdl; bind != specpdl_ptr; bind++)
1310 {
1311 mark_object (&bind->symbol);
1312 mark_object (&bind->old_value);
1313 }
1314 for (catch = catchlist; catch; catch = catch->next)
1315 {
1316 mark_object (&catch->tag);
1317 mark_object (&catch->val);
1318 }
1319 for (handler = handlerlist; handler; handler = handler->next)
1320 {
1321 mark_object (&handler->handler);
1322 mark_object (&handler->var);
1323 }
1324 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1325 {
1326 if (!XMARKBIT (*backlist->function))
1327 {
1328 mark_object (backlist->function);
1329 XMARK (*backlist->function);
1330 }
1331 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1332 i = 0;
1333 else
1334 i = backlist->nargs - 1;
1335 for (; i >= 0; i--)
1336 if (!XMARKBIT (backlist->args[i]))
1337 {
1338 mark_object (&backlist->args[i]);
1339 XMARK (backlist->args[i]);
1340 }
1341 }
1342
1343 gc_sweep ();
1344
1345 /* Clear the mark bits that we set in certain root slots. */
1346
1347 for (tail = gcprolist; tail; tail = tail->next)
1348 for (i = 0; i < tail->nvars; i++)
1349 XUNMARK (tail->var[i]);
1350 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1351 {
1352 XUNMARK (*backlist->function);
1353 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1354 i = 0;
1355 else
1356 i = backlist->nargs - 1;
1357 for (; i >= 0; i--)
1358 XUNMARK (backlist->args[i]);
1359 }
1360 XUNMARK (buffer_defaults.name);
1361 XUNMARK (buffer_local_symbols.name);
1362
1363 /* clear_marks (); */
1364 gc_in_progress = 0;
1365
1366 consing_since_gc = 0;
1367 if (gc_cons_threshold < 10000)
1368 gc_cons_threshold = 10000;
1369
1370 if (omessage || minibuf_level > 0)
1371 message1 (omessage);
1372 else if (!noninteractive)
1373 message1 ("Garbage collecting...done");
1374
1375 return Fcons (Fcons (make_number (total_conses),
1376 make_number (total_free_conses)),
1377 Fcons (Fcons (make_number (total_symbols),
1378 make_number (total_free_symbols)),
1379 Fcons (Fcons (make_number (total_markers),
1380 make_number (total_free_markers)),
1381 Fcons (make_number (total_string_size),
1382 Fcons (make_number (total_vector_size),
1383
1384 #ifdef LISP_FLOAT_TYPE
1385 Fcons (Fcons (make_number (total_floats),
1386 make_number (total_free_floats)),
1387 Qnil)
1388 #else /* not LISP_FLOAT_TYPE */
1389 Qnil
1390 #endif /* not LISP_FLOAT_TYPE */
1391 )))));
1392 }
1393 \f
1394 #if 0
1395 static void
1396 clear_marks ()
1397 {
1398 /* Clear marks on all conses */
1399 {
1400 register struct cons_block *cblk;
1401 register int lim = cons_block_index;
1402
1403 for (cblk = cons_block; cblk; cblk = cblk->next)
1404 {
1405 register int i;
1406 for (i = 0; i < lim; i++)
1407 XUNMARK (cblk->conses[i].car);
1408 lim = CONS_BLOCK_SIZE;
1409 }
1410 }
1411 /* Clear marks on all symbols */
1412 {
1413 register struct symbol_block *sblk;
1414 register int lim = symbol_block_index;
1415
1416 for (sblk = symbol_block; sblk; sblk = sblk->next)
1417 {
1418 register int i;
1419 for (i = 0; i < lim; i++)
1420 {
1421 XUNMARK (sblk->symbols[i].plist);
1422 }
1423 lim = SYMBOL_BLOCK_SIZE;
1424 }
1425 }
1426 /* Clear marks on all markers */
1427 {
1428 register struct marker_block *sblk;
1429 register int lim = marker_block_index;
1430
1431 for (sblk = marker_block; sblk; sblk = sblk->next)
1432 {
1433 register int i;
1434 for (i = 0; i < lim; i++)
1435 XUNMARK (sblk->markers[i].chain);
1436 lim = MARKER_BLOCK_SIZE;
1437 }
1438 }
1439 /* Clear mark bits on all buffers */
1440 {
1441 register struct buffer *nextb = all_buffers;
1442
1443 while (nextb)
1444 {
1445 XUNMARK (nextb->name);
1446 nextb = nextb->next;
1447 }
1448 }
1449 }
1450 #endif
1451 \f
1452 /* Mark reference to a Lisp_Object.
1453 If the object referred to has not been seen yet, recursively mark
1454 all the references contained in it.
1455
1456 If the object referenced is a short string, the referencing slot
1457 is threaded into a chain of such slots, pointed to from
1458 the `size' field of the string. The actual string size
1459 lives in the last slot in the chain. We recognize the end
1460 because it is < (unsigned) STRING_BLOCK_SIZE. */
1461
1462 #define LAST_MARKED_SIZE 500
1463 Lisp_Object *last_marked[LAST_MARKED_SIZE];
1464 int last_marked_index;
1465
1466 static void
1467 mark_object (objptr)
1468 Lisp_Object *objptr;
1469 {
1470 register Lisp_Object obj;
1471
1472 obj = *objptr;
1473 XUNMARK (obj);
1474
1475 loop:
1476
1477 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1478 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1479 return;
1480
1481 last_marked[last_marked_index++] = objptr;
1482 if (last_marked_index == LAST_MARKED_SIZE)
1483 last_marked_index = 0;
1484
1485 #ifdef SWITCH_ENUM_BUG
1486 switch ((int) XGCTYPE (obj))
1487 #else
1488 switch (XGCTYPE (obj))
1489 #endif
1490 {
1491 case Lisp_String:
1492 {
1493 register struct Lisp_String *ptr = XSTRING (obj);
1494
1495 MARK_INTERVAL_TREE (ptr->intervals);
1496 if (ptr->size & MARKBIT)
1497 /* A large string. Just set ARRAY_MARK_FLAG. */
1498 ptr->size |= ARRAY_MARK_FLAG;
1499 else
1500 {
1501 /* A small string. Put this reference
1502 into the chain of references to it.
1503 The address OBJPTR is even, so if the address
1504 includes MARKBIT, put it in the low bit
1505 when we store OBJPTR into the size field. */
1506
1507 if (XMARKBIT (*objptr))
1508 {
1509 XFASTINT (*objptr) = ptr->size;
1510 XMARK (*objptr);
1511 }
1512 else
1513 XFASTINT (*objptr) = ptr->size;
1514 if ((int)objptr & 1) abort ();
1515 ptr->size = (int) objptr & ~MARKBIT;
1516 if ((int) objptr & MARKBIT)
1517 ptr->size ++;
1518 }
1519 }
1520 break;
1521
1522 case Lisp_Vector:
1523 case Lisp_Window:
1524 case Lisp_Process:
1525 case Lisp_Window_Configuration:
1526 {
1527 register struct Lisp_Vector *ptr = XVECTOR (obj);
1528 register int size = ptr->size;
1529 /* The reason we use ptr1 is to avoid an apparent hardware bug
1530 that happens occasionally on the FSF's HP 300s.
1531 The bug is that a2 gets clobbered by recursive calls to mark_object.
1532 The clobberage seems to happen during function entry,
1533 perhaps in the moveml instruction.
1534 Yes, this is a crock, but we have to do it. */
1535 struct Lisp_Vector *volatile ptr1 = ptr;
1536 register int i;
1537
1538 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1539 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1540 for (i = 0; i < size; i++) /* and then mark its elements */
1541 mark_object (&ptr1->contents[i]);
1542 }
1543 break;
1544
1545 case Lisp_Compiled:
1546 /* We could treat this just like a vector, but it is better
1547 to save the COMPILED_CONSTANTS element for last and avoid recursion
1548 there. */
1549 {
1550 register struct Lisp_Vector *ptr = XVECTOR (obj);
1551 register int size = ptr->size;
1552 /* See comment above under Lisp_Vector. */
1553 struct Lisp_Vector *volatile ptr1 = ptr;
1554 register int i;
1555
1556 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1557 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1558 for (i = 0; i < size; i++) /* and then mark its elements */
1559 {
1560 if (i != COMPILED_CONSTANTS)
1561 mark_object (&ptr1->contents[i]);
1562 }
1563 objptr = &ptr1->contents[COMPILED_CONSTANTS];
1564 obj = *objptr;
1565 goto loop;
1566 }
1567
1568 #ifdef MULTI_FRAME
1569 case Lisp_Frame:
1570 {
1571 /* See comment above under Lisp_Vector for why this is volatile. */
1572 register struct frame *volatile ptr = XFRAME (obj);
1573 register int size = ptr->size;
1574
1575 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1576 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1577
1578 mark_object (&ptr->name);
1579 mark_object (&ptr->focus_frame);
1580 mark_object (&ptr->width);
1581 mark_object (&ptr->height);
1582 mark_object (&ptr->selected_window);
1583 mark_object (&ptr->minibuffer_window);
1584 mark_object (&ptr->param_alist);
1585 mark_object (&ptr->scroll_bars);
1586 mark_object (&ptr->condemned_scroll_bars);
1587 mark_object (&ptr->menu_bar_items);
1588 mark_object (&ptr->face_alist);
1589 }
1590 break;
1591 #endif /* MULTI_FRAME */
1592
1593 case Lisp_Symbol:
1594 {
1595 /* See comment above under Lisp_Vector for why this is volatile. */
1596 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj);
1597 struct Lisp_Symbol *ptrx;
1598
1599 if (XMARKBIT (ptr->plist)) break;
1600 XMARK (ptr->plist);
1601 mark_object ((Lisp_Object *) &ptr->value);
1602 mark_object (&ptr->function);
1603 mark_object (&ptr->plist);
1604 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
1605 mark_object (&ptr->name);
1606 ptr = ptr->next;
1607 if (ptr)
1608 {
1609 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
1610 XSETSYMBOL (obj, ptrx);
1611 goto loop;
1612 }
1613 }
1614 break;
1615
1616 case Lisp_Marker:
1617 XMARK (XMARKER (obj)->chain);
1618 /* DO NOT mark thru the marker's chain.
1619 The buffer's markers chain does not preserve markers from gc;
1620 instead, markers are removed from the chain when freed by gc. */
1621 break;
1622
1623 case Lisp_Cons:
1624 case Lisp_Buffer_Local_Value:
1625 case Lisp_Some_Buffer_Local_Value:
1626 case Lisp_Overlay:
1627 {
1628 register struct Lisp_Cons *ptr = XCONS (obj);
1629 if (XMARKBIT (ptr->car)) break;
1630 XMARK (ptr->car);
1631 /* If the cdr is nil, avoid recursion for the car. */
1632 if (EQ (ptr->cdr, Qnil))
1633 {
1634 objptr = &ptr->car;
1635 obj = ptr->car;
1636 XUNMARK (obj);
1637 goto loop;
1638 }
1639 mark_object (&ptr->car);
1640 /* See comment above under Lisp_Vector for why not use ptr here. */
1641 objptr = &XCONS (obj)->cdr;
1642 obj = ptr->cdr;
1643 goto loop;
1644 }
1645
1646 #ifdef LISP_FLOAT_TYPE
1647 case Lisp_Float:
1648 XMARK (XFLOAT (obj)->type);
1649 break;
1650 #endif /* LISP_FLOAT_TYPE */
1651
1652 case Lisp_Buffer:
1653 if (!XMARKBIT (XBUFFER (obj)->name))
1654 mark_buffer (obj);
1655 break;
1656
1657 case Lisp_Int:
1658 case Lisp_Void:
1659 case Lisp_Subr:
1660 case Lisp_Intfwd:
1661 case Lisp_Boolfwd:
1662 case Lisp_Objfwd:
1663 case Lisp_Buffer_Objfwd:
1664 case Lisp_Internal_Stream:
1665 /* Don't bother with Lisp_Buffer_Objfwd,
1666 since all markable slots in current buffer marked anyway. */
1667 /* Don't need to do Lisp_Objfwd, since the places they point
1668 are protected with staticpro. */
1669 break;
1670
1671 default:
1672 abort ();
1673 }
1674 }
1675
1676 /* Mark the pointers in a buffer structure. */
1677
1678 static void
1679 mark_buffer (buf)
1680 Lisp_Object buf;
1681 {
1682 register struct buffer *buffer = XBUFFER (buf);
1683 register Lisp_Object *ptr;
1684
1685 /* This is the buffer's markbit */
1686 mark_object (&buffer->name);
1687 XMARK (buffer->name);
1688
1689 MARK_INTERVAL_TREE (buffer->intervals);
1690
1691 #if 0
1692 mark_object (buffer->syntax_table);
1693
1694 /* Mark the various string-pointers in the buffer object.
1695 Since the strings may be relocated, we must mark them
1696 in their actual slots. So gc_sweep must convert each slot
1697 back to an ordinary C pointer. */
1698 XSET (*(Lisp_Object *)&buffer->upcase_table,
1699 Lisp_String, buffer->upcase_table);
1700 mark_object ((Lisp_Object *)&buffer->upcase_table);
1701 XSET (*(Lisp_Object *)&buffer->downcase_table,
1702 Lisp_String, buffer->downcase_table);
1703 mark_object ((Lisp_Object *)&buffer->downcase_table);
1704
1705 XSET (*(Lisp_Object *)&buffer->sort_table,
1706 Lisp_String, buffer->sort_table);
1707 mark_object ((Lisp_Object *)&buffer->sort_table);
1708 XSET (*(Lisp_Object *)&buffer->folding_sort_table,
1709 Lisp_String, buffer->folding_sort_table);
1710 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
1711 #endif
1712
1713 for (ptr = &buffer->name + 1;
1714 (char *)ptr < (char *)buffer + sizeof (struct buffer);
1715 ptr++)
1716 mark_object (ptr);
1717 }
1718 \f
1719 /* Sweep: find all structures not marked, and free them. */
1720
1721 static void
1722 gc_sweep ()
1723 {
1724 total_string_size = 0;
1725 compact_strings ();
1726
1727 /* Put all unmarked conses on free list */
1728 {
1729 register struct cons_block *cblk;
1730 register int lim = cons_block_index;
1731 register int num_free = 0, num_used = 0;
1732
1733 cons_free_list = 0;
1734
1735 for (cblk = cons_block; cblk; cblk = cblk->next)
1736 {
1737 register int i;
1738 for (i = 0; i < lim; i++)
1739 if (!XMARKBIT (cblk->conses[i].car))
1740 {
1741 XFASTINT (cblk->conses[i].car) = (int) cons_free_list;
1742 num_free++;
1743 cons_free_list = &cblk->conses[i];
1744 }
1745 else
1746 {
1747 num_used++;
1748 XUNMARK (cblk->conses[i].car);
1749 }
1750 lim = CONS_BLOCK_SIZE;
1751 }
1752 total_conses = num_used;
1753 total_free_conses = num_free;
1754 }
1755
1756 #ifdef LISP_FLOAT_TYPE
1757 /* Put all unmarked floats on free list */
1758 {
1759 register struct float_block *fblk;
1760 register int lim = float_block_index;
1761 register int num_free = 0, num_used = 0;
1762
1763 float_free_list = 0;
1764
1765 for (fblk = float_block; fblk; fblk = fblk->next)
1766 {
1767 register int i;
1768 for (i = 0; i < lim; i++)
1769 if (!XMARKBIT (fblk->floats[i].type))
1770 {
1771 XFASTINT (fblk->floats[i].type) = (int) float_free_list;
1772 num_free++;
1773 float_free_list = &fblk->floats[i];
1774 }
1775 else
1776 {
1777 num_used++;
1778 XUNMARK (fblk->floats[i].type);
1779 }
1780 lim = FLOAT_BLOCK_SIZE;
1781 }
1782 total_floats = num_used;
1783 total_free_floats = num_free;
1784 }
1785 #endif /* LISP_FLOAT_TYPE */
1786
1787 #ifdef USE_TEXT_PROPERTIES
1788 /* Put all unmarked intervals on free list */
1789 {
1790 register struct interval_block *iblk;
1791 register int lim = interval_block_index;
1792 register int num_free = 0, num_used = 0;
1793
1794 interval_free_list = 0;
1795
1796 for (iblk = interval_block; iblk; iblk = iblk->next)
1797 {
1798 register int i;
1799
1800 for (i = 0; i < lim; i++)
1801 {
1802 if (! XMARKBIT (iblk->intervals[i].plist))
1803 {
1804 iblk->intervals[i].parent = interval_free_list;
1805 interval_free_list = &iblk->intervals[i];
1806 num_free++;
1807 }
1808 else
1809 {
1810 num_used++;
1811 XUNMARK (iblk->intervals[i].plist);
1812 }
1813 }
1814 lim = INTERVAL_BLOCK_SIZE;
1815 }
1816 total_intervals = num_used;
1817 total_free_intervals = num_free;
1818 }
1819 #endif /* USE_TEXT_PROPERTIES */
1820
1821 /* Put all unmarked symbols on free list */
1822 {
1823 register struct symbol_block *sblk;
1824 register int lim = symbol_block_index;
1825 register int num_free = 0, num_used = 0;
1826
1827 symbol_free_list = 0;
1828
1829 for (sblk = symbol_block; sblk; sblk = sblk->next)
1830 {
1831 register int i;
1832 for (i = 0; i < lim; i++)
1833 if (!XMARKBIT (sblk->symbols[i].plist))
1834 {
1835 XFASTINT (sblk->symbols[i].value) = (int) symbol_free_list;
1836 symbol_free_list = &sblk->symbols[i];
1837 num_free++;
1838 }
1839 else
1840 {
1841 num_used++;
1842 sblk->symbols[i].name
1843 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
1844 XUNMARK (sblk->symbols[i].plist);
1845 }
1846 lim = SYMBOL_BLOCK_SIZE;
1847 }
1848 total_symbols = num_used;
1849 total_free_symbols = num_free;
1850 }
1851
1852 #ifndef standalone
1853 /* Put all unmarked markers on free list.
1854 Dechain each one first from the buffer it points into. */
1855 {
1856 register struct marker_block *mblk;
1857 struct Lisp_Marker *tem1;
1858 register int lim = marker_block_index;
1859 register int num_free = 0, num_used = 0;
1860
1861 marker_free_list = 0;
1862
1863 for (mblk = marker_block; mblk; mblk = mblk->next)
1864 {
1865 register int i;
1866 for (i = 0; i < lim; i++)
1867 if (!XMARKBIT (mblk->markers[i].chain))
1868 {
1869 Lisp_Object tem;
1870 tem1 = &mblk->markers[i]; /* tem1 avoids Sun compiler bug */
1871 XSET (tem, Lisp_Marker, tem1);
1872 unchain_marker (tem);
1873 XFASTINT (mblk->markers[i].chain) = (int) marker_free_list;
1874 marker_free_list = &mblk->markers[i];
1875 num_free++;
1876 }
1877 else
1878 {
1879 num_used++;
1880 XUNMARK (mblk->markers[i].chain);
1881 }
1882 lim = MARKER_BLOCK_SIZE;
1883 }
1884
1885 total_markers = num_used;
1886 total_free_markers = num_free;
1887 }
1888
1889 /* Free all unmarked buffers */
1890 {
1891 register struct buffer *buffer = all_buffers, *prev = 0, *next;
1892
1893 while (buffer)
1894 if (!XMARKBIT (buffer->name))
1895 {
1896 if (prev)
1897 prev->next = buffer->next;
1898 else
1899 all_buffers = buffer->next;
1900 next = buffer->next;
1901 xfree (buffer);
1902 buffer = next;
1903 }
1904 else
1905 {
1906 XUNMARK (buffer->name);
1907 UNMARK_BALANCE_INTERVALS (buffer->intervals);
1908
1909 #if 0
1910 /* Each `struct Lisp_String *' was turned into a Lisp_Object
1911 for purposes of marking and relocation.
1912 Turn them back into C pointers now. */
1913 buffer->upcase_table
1914 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
1915 buffer->downcase_table
1916 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
1917 buffer->sort_table
1918 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
1919 buffer->folding_sort_table
1920 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
1921 #endif
1922
1923 prev = buffer, buffer = buffer->next;
1924 }
1925 }
1926
1927 #endif /* standalone */
1928
1929 /* Free all unmarked vectors */
1930 {
1931 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
1932 total_vector_size = 0;
1933
1934 while (vector)
1935 if (!(vector->size & ARRAY_MARK_FLAG))
1936 {
1937 if (prev)
1938 prev->next = vector->next;
1939 else
1940 all_vectors = vector->next;
1941 next = vector->next;
1942 xfree (vector);
1943 vector = next;
1944 }
1945 else
1946 {
1947 vector->size &= ~ARRAY_MARK_FLAG;
1948 total_vector_size += vector->size;
1949 prev = vector, vector = vector->next;
1950 }
1951 }
1952
1953 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */
1954 {
1955 register struct string_block *sb = large_string_blocks, *prev = 0, *next;
1956 struct Lisp_String *s;
1957
1958 while (sb)
1959 {
1960 s = (struct Lisp_String *) &sb->chars[0];
1961 if (s->size & ARRAY_MARK_FLAG)
1962 {
1963 ((struct Lisp_String *)(&sb->chars[0]))->size
1964 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
1965 UNMARK_BALANCE_INTERVALS (s->intervals);
1966 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
1967 prev = sb, sb = sb->next;
1968 }
1969 else
1970 {
1971 if (prev)
1972 prev->next = sb->next;
1973 else
1974 large_string_blocks = sb->next;
1975 next = sb->next;
1976 xfree (sb);
1977 sb = next;
1978 }
1979 }
1980 }
1981 }
1982 \f
1983 /* Compactify strings, relocate references, and free empty string blocks. */
1984
1985 static void
1986 compact_strings ()
1987 {
1988 /* String block of old strings we are scanning. */
1989 register struct string_block *from_sb;
1990 /* A preceding string block (or maybe the same one)
1991 where we are copying the still-live strings to. */
1992 register struct string_block *to_sb;
1993 int pos;
1994 int to_pos;
1995
1996 to_sb = first_string_block;
1997 to_pos = 0;
1998
1999 /* Scan each existing string block sequentially, string by string. */
2000 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
2001 {
2002 pos = 0;
2003 /* POS is the index of the next string in the block. */
2004 while (pos < from_sb->pos)
2005 {
2006 register struct Lisp_String *nextstr
2007 = (struct Lisp_String *) &from_sb->chars[pos];
2008
2009 register struct Lisp_String *newaddr;
2010 register int size = nextstr->size;
2011
2012 /* NEXTSTR is the old address of the next string.
2013 Just skip it if it isn't marked. */
2014 if ((unsigned) size > STRING_BLOCK_SIZE)
2015 {
2016 /* It is marked, so its size field is really a chain of refs.
2017 Find the end of the chain, where the actual size lives. */
2018 while ((unsigned) size > STRING_BLOCK_SIZE)
2019 {
2020 if (size & 1) size ^= MARKBIT | 1;
2021 size = *(int *)size & ~MARKBIT;
2022 }
2023
2024 total_string_size += size;
2025
2026 /* If it won't fit in TO_SB, close it out,
2027 and move to the next sb. Keep doing so until
2028 TO_SB reaches a large enough, empty enough string block.
2029 We know that TO_SB cannot advance past FROM_SB here
2030 since FROM_SB is large enough to contain this string.
2031 Any string blocks skipped here
2032 will be patched out and freed later. */
2033 while (to_pos + STRING_FULLSIZE (size)
2034 > max (to_sb->pos, STRING_BLOCK_SIZE))
2035 {
2036 to_sb->pos = to_pos;
2037 to_sb = to_sb->next;
2038 to_pos = 0;
2039 }
2040 /* Compute new address of this string
2041 and update TO_POS for the space being used. */
2042 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
2043 to_pos += STRING_FULLSIZE (size);
2044
2045 /* Copy the string itself to the new place. */
2046 if (nextstr != newaddr)
2047 bcopy (nextstr, newaddr, size + 1 + sizeof (int)
2048 + INTERVAL_PTR_SIZE);
2049
2050 /* Go through NEXTSTR's chain of references
2051 and make each slot in the chain point to
2052 the new address of this string. */
2053 size = newaddr->size;
2054 while ((unsigned) size > STRING_BLOCK_SIZE)
2055 {
2056 register Lisp_Object *objptr;
2057 if (size & 1) size ^= MARKBIT | 1;
2058 objptr = (Lisp_Object *)size;
2059
2060 size = XFASTINT (*objptr) & ~MARKBIT;
2061 if (XMARKBIT (*objptr))
2062 {
2063 XSET (*objptr, Lisp_String, newaddr);
2064 XMARK (*objptr);
2065 }
2066 else
2067 XSET (*objptr, Lisp_String, newaddr);
2068 }
2069 /* Store the actual size in the size field. */
2070 newaddr->size = size;
2071
2072 #ifdef USE_TEXT_PROPERTIES
2073 /* Now that the string has been relocated, rebalance its
2074 interval tree, and update the tree's parent pointer. */
2075 if (! NULL_INTERVAL_P (newaddr->intervals))
2076 {
2077 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
2078 XSET (* (Lisp_Object *) &newaddr->intervals->parent,
2079 Lisp_String,
2080 newaddr);
2081 }
2082 #endif /* USE_TEXT_PROPERTIES */
2083 }
2084 pos += STRING_FULLSIZE (size);
2085 }
2086 }
2087
2088 /* Close out the last string block still used and free any that follow. */
2089 to_sb->pos = to_pos;
2090 current_string_block = to_sb;
2091
2092 from_sb = to_sb->next;
2093 to_sb->next = 0;
2094 while (from_sb)
2095 {
2096 to_sb = from_sb->next;
2097 xfree (from_sb);
2098 from_sb = to_sb;
2099 }
2100
2101 /* Free any empty string blocks further back in the chain.
2102 This loop will never free first_string_block, but it is very
2103 unlikely that that one will become empty, so why bother checking? */
2104
2105 from_sb = first_string_block;
2106 while (to_sb = from_sb->next)
2107 {
2108 if (to_sb->pos == 0)
2109 {
2110 if (from_sb->next = to_sb->next)
2111 from_sb->next->prev = from_sb;
2112 xfree (to_sb);
2113 }
2114 else
2115 from_sb = to_sb;
2116 }
2117 }
2118 \f
2119 /* Debugging aids. */
2120
2121 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, "",
2122 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
2123 This may be helpful in debugging Emacs's memory usage.\n\
2124 We divide the value by 1024 to make sure it fits in a Lisp integer.")
2125 ()
2126 {
2127 Lisp_Object end;
2128
2129 XSET (end, Lisp_Int, (int) sbrk (0) / 1024);
2130
2131 return end;
2132 }
2133
2134 \f
2135 /* Initialization */
2136
2137 init_alloc_once ()
2138 {
2139 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
2140 pureptr = 0;
2141 #ifdef HAVE_SHM
2142 pure_size = PURESIZE;
2143 #endif
2144 all_vectors = 0;
2145 ignore_warnings = 1;
2146 init_strings ();
2147 init_cons ();
2148 init_symbol ();
2149 init_marker ();
2150 #ifdef LISP_FLOAT_TYPE
2151 init_float ();
2152 #endif /* LISP_FLOAT_TYPE */
2153 INIT_INTERVALS;
2154
2155 ignore_warnings = 0;
2156 gcprolist = 0;
2157 staticidx = 0;
2158 consing_since_gc = 0;
2159 gc_cons_threshold = 100000;
2160 #ifdef VIRT_ADDR_VARIES
2161 malloc_sbrk_unused = 1<<22; /* A large number */
2162 malloc_sbrk_used = 100000; /* as reasonable as any number */
2163 #endif /* VIRT_ADDR_VARIES */
2164 }
2165
2166 init_alloc ()
2167 {
2168 gcprolist = 0;
2169 }
2170
2171 void
2172 syms_of_alloc ()
2173 {
2174 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
2175 "*Number of bytes of consing between garbage collections.\n\
2176 Garbage collection can happen automatically once this many bytes have been\n\
2177 allocated since the last garbage collection. All data types count.\n\n\
2178 Garbage collection happens automatically only when `eval' is called.\n\n\
2179 By binding this temporarily to a large number, you can effectively\n\
2180 prevent garbage collection during a part of the program.");
2181
2182 DEFVAR_INT ("pure-bytes-used", &pureptr,
2183 "Number of bytes of sharable Lisp data allocated so far.");
2184
2185 #if 0
2186 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
2187 "Number of bytes of unshared memory allocated in this session.");
2188
2189 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,
2190 "Number of bytes of unshared memory remaining available in this session.");
2191 #endif
2192
2193 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
2194 "Non-nil means loading Lisp code in order to dump an executable.\n\
2195 This means that certain objects should be allocated in shared (pure) space.");
2196
2197 DEFVAR_INT ("undo-limit", &undo_limit,
2198 "Keep no more undo information once it exceeds this size.\n\
2199 This limit is applied when garbage collection happens.\n\
2200 The size is counted as the number of bytes occupied,\n\
2201 which includes both saved text and other data.");
2202 undo_limit = 20000;
2203
2204 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
2205 "Don't keep more than this much size of undo information.\n\
2206 A command which pushes past this size is itself forgotten.\n\
2207 This limit is applied when garbage collection happens.\n\
2208 The size is counted as the number of bytes occupied,\n\
2209 which includes both saved text and other data.");
2210 undo_strong_limit = 30000;
2211
2212 defsubr (&Scons);
2213 defsubr (&Slist);
2214 defsubr (&Svector);
2215 defsubr (&Smake_byte_code);
2216 defsubr (&Smake_list);
2217 defsubr (&Smake_vector);
2218 defsubr (&Smake_string);
2219 defsubr (&Smake_symbol);
2220 defsubr (&Smake_marker);
2221 defsubr (&Spurecopy);
2222 defsubr (&Sgarbage_collect);
2223 defsubr (&Smemory_limit);
2224 }