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