1 /* -*-comment-start: "//";comment-end:""-*-
2 * Mes --- Maxwell Equations of Software
3 * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
5 * This file is part of Mes.
7 * Mes is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or (at
10 * your option) any later version.
12 * Mes is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Mes. If not, see <http://www.gnu.org/licenses/>.
24 gc_up_arena () ///((internal))
27 void *p = realloc (g_cells-1, 2*ARENA_SIZE*sizeof(struct scm));
30 eputs ("realloc failed, g_free=");
31 eputs (itoa (g_free));
33 eputs (itoa (ARENA_SIZE - g_free));
38 g_cells = (struct scm*)p;
46 gc_flip () ///((internal))
48 struct scm *cells = g_cells;
53 eputs (";;; => jam[");
54 eputs (itoa (g_free));
61 gc_copy (SCM old) ///((internal))
63 if (TYPE (old) == TBROKEN_HEART)
64 return g_cells[old].car;
66 g_news[new] = g_cells[old];
67 if (NTYPE (new) == TVECTOR)
69 NVECTOR (new) = g_free;
70 for (int i=0; i<LENGTH (old); i++)
71 g_news[g_free++] = g_cells[VECTOR (old)+i];
73 TYPE (old) = TBROKEN_HEART;
79 gc_relocate_car (SCM new, SCM car) ///((internal))
81 g_news[new].car = car;
82 return cell_unspecified;
86 gc_relocate_cdr (SCM new, SCM cdr) ///((internal))
88 g_news[new].cdr = cdr;
89 return cell_unspecified;
93 gc_loop (SCM scan) ///((internal))
99 if (NTYPE (scan) == TCLOSURE
100 || NTYPE (scan) == TCONTINUATION
101 || NTYPE (scan) == TFUNCTION
102 || NTYPE (scan) == TKEYWORD
103 || NTYPE (scan) == TMACRO
104 || NTYPE (scan) == TPAIR
105 || NTYPE (scan) == TREF
107 || NTYPE (scan) == TSPECIAL
108 || NTYPE (scan) == TSTRING
109 || NTYPE (scan) == TSYMBOL
110 || NTYPE (scan) == TVARIABLE)
112 car = gc_copy (g_news[scan].car);
113 gc_relocate_car (scan, car);
115 if ((NTYPE (scan) == TCLOSURE
116 || NTYPE (scan) == TCONTINUATION
117 || NTYPE (scan) == TMACRO
118 || NTYPE (scan) == TPAIR
119 || NTYPE (scan) == TVALUES)
120 && g_news[scan].cdr) // allow for 0 terminated list of symbols
122 cdr = gc_copy (g_news[scan].cdr);
123 gc_relocate_cdr (scan, cdr);
133 if (g_free + GC_SAFETY > ARENA_SIZE)
135 return cell_unspecified;
139 gc_ () ///((internal))
146 eputs (itoa (g_free));
148 eputs (itoa (ARENA_SIZE - g_free));
154 //&& g_free > ARENA_SIZE >> 2
155 && ARENA_SIZE < MAX_ARENA_SIZE)
162 eputs (itoa (g_cells));
164 eputs (itoa (g_news));
166 eputs (itoa (ARENA_SIZE));
168 eputs (itoa (MAX_ARENA_SIZE));
174 for (int i=g_free; i<g_symbol_max; i++)
176 g_symbols = gc_copy (g_symbols);
177 g_macros = gc_copy (g_macros);
178 SCM new = gc_copy (g_stack);
195 write_error_ (g_symbols);
207 write_error_ (g_symbols);