return gc_flip ();
}
+SCM
+gc_check ()
+{
+ if (g_free + GC_SAFETY > ARENA_SIZE)
+ gc_pop_frame (gc (gc_push_frame ()));
+ return cell_unspecified;
+}
+
SCM
gc ()
{
#define FIXED_PRIMITIVES 1
int ARENA_SIZE = 100000;
-int MAX_ARENA_SIZE = 40000000;
-int GC_SAFETY = 10000;
+int MAX_ARENA_SIZE = 20000000;
+int GC_SAFETY = 20000;
typedef int SCM;
enum type_t {TCHAR, TCLOSURE, TCONTINUATION, TFUNCTION, TKEYWORD, TMACRO, TNUMBER, TPAIR, TREF, TSPECIAL, TSTRING, TSYMBOL, TVALUES, TVECTOR, TBROKEN_HEART};
eval_apply ()
{
eval_apply:
- if (g_free + GC_SAFETY > ARENA_SIZE)
- gc_pop_frame (gc (gc_push_frame ()));
-
+ gc_check ();
switch (r3)
{
case cell_vm_evlis: goto evlis;
SCM x = cell_nil;
SCM y = cell_nil;
evlis:
+ gc_check ();
if (r1 == cell_nil) goto vm_return;
if (TYPE (r1) != TPAIR) goto eval;
push_cc (car (r1), r1, r0, cell_vm_evlis2);
goto vm_return;
apply:
+ gc_check ();
switch (TYPE (car (r1)))
{
case TFUNCTION: {
goto apply;
eval:
+ gc_check ();
switch (TYPE (r1))
{
case TPAIR:
begin:
x = cell_unspecified;
while (r1 != cell_nil) {
+ gc_check ();
if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
{
if (CAAR (r1) == cell_symbol_begin)