diff --git a/C/heapgc.c b/C/heapgc.c index 42ea848cc..7d6e4e9b6 100644 --- a/C/heapgc.c +++ b/C/heapgc.c @@ -21,6 +21,7 @@ static char SccsId[] = "%W% %G%"; #include "absmi.h" #include "yapio.h" + #define EARLY_RESET 1 #if !defined(TABLING) #define EASY_SHUNTING 1 diff --git a/C/stdpreds.c b/C/stdpreds.c index 7f556c7d3..6786c5899 100644 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -1152,12 +1152,20 @@ p_univ(void) } return (unify_constant(ARG1, MkAtomTerm(at))); } + build_compound: /* build the term directly on the heap */ Ar = H; H++; while (!IsVarTerm(twork) && IsPairTerm(twork)) { *H++ = HeadOfTerm(twork); + if (H > ASP - 1024) { + /* restore space */ + H = Ar; + gc(2, ENV, P); + twork = TailOfTerm(Deref(ARG2)); + goto build_compound; + } twork = TailOfTerm(twork); } if (IsVarTerm(twork)) { @@ -1217,7 +1225,13 @@ p_univ(void) twork = ArrayToList(CellPtr(TR), argno - 1); } else #endif - twork = ArrayToList(RepAppl(tin) + 1, arity); + { + if (H+arity*2 > ASP-1024) { + gc(2, ENV, P); + tin = Deref(ARG1); + } + twork = ArrayToList(RepAppl(tin) + 1, arity); + } } else { /* We found a list */ at = AtomDot; @@ -2133,7 +2147,7 @@ InitCPreds(void) InitCPred("number_atom", 2, p_number_atom, SafePredFlag); InitCPred("number_codes", 2, p_number_codes, SafePredFlag); InitCPred("atom_concat", 2, p_atom_concat, SafePredFlag); - InitCPred("=..", 2, p_univ, SafePredFlag); + InitCPred("=..", 2, p_univ, 0); InitCPred("$statistics_trail_max", 1, p_statistics_trail_max, SafePredFlag|SyncPredFlag); InitCPred("$statistics_heap_max", 1, p_statistics_heap_max, SafePredFlag|SyncPredFlag); InitCPred("$statistics_global_max", 1, p_statistics_global_max, SafePredFlag|SyncPredFlag); diff --git a/pl/debug.yap b/pl/debug.yap index 7d1dcad40..80a40202d 100644 --- a/pl/debug.yap +++ b/pl/debug.yap @@ -861,10 +861,10 @@ debugging :- '$action'(60,_,_,_,_,_) :- !, %