From d2a6f16e4ae5a5bf6cd46b8109fd01a73ab04ba9 Mon Sep 17 00:00:00 2001 From: vsc Date: Tue, 7 May 2002 21:19:52 +0000 Subject: [PATCH] handle stack overflow within =.. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@466 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/heapgc.c | 1 + C/stdpreds.c | 18 ++++++++++++++++-- pl/debug.yap | 8 ++++---- 3 files changed, 21 insertions(+), 6 deletions(-) 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,_,_,_,_,_) :- !, %