fix nasty variable shunting bug in garbage collector :-(:wq
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1583 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
@@ -10,8 +10,12 @@
|
||||
* *
|
||||
* File: absmi.c *
|
||||
* comments: Portable abstract machine interpreter *
|
||||
* Last rev: $Date: 2006-03-24 17:13:41 $,$Author: rslopes $ *
|
||||
* Last rev: $Date: 2006-03-30 01:11:09 $,$Author: vsc $ *
|
||||
* $Log: not supported by cvs2svn $
|
||||
* Revision 1.197 2006/03/24 17:13:41 rslopes
|
||||
* New update to BEAM engine.
|
||||
* BEAM now uses YAP Indexing (JITI)
|
||||
*
|
||||
* Revision 1.196 2006/03/03 23:10:47 vsc
|
||||
* fix MacOSX interrupt handling
|
||||
* fix using Yap files as Yap scripts.
|
||||
@@ -6865,7 +6869,7 @@ Yap_absmi(int inp)
|
||||
BOp(call_cpred, sla);
|
||||
|
||||
|
||||
if (!(PREG->u.sla.sla_u.p->PredFlags & ( SafePredFlag|HiddenPredFlag))) {
|
||||
if (!(PREG->u.sla.sla_u.p->PredFlags & (SafePredFlag|HiddenPredFlag))) {
|
||||
CACHE_Y_AS_ENV(YREG);
|
||||
check_stack(NoStackCall, H);
|
||||
ENDCACHE_Y_AS_ENV();
|
||||
|
||||
14
C/heapgc.c
14
C/heapgc.c
@@ -424,7 +424,7 @@ push_registers(Int num_regs, yamop *nextop)
|
||||
for (i=0; i < arity; i++) {
|
||||
Term tlive = sal->ValueOfVE.lterms[i].tlive;
|
||||
if (!IsVarTerm(tlive) || !IsUnboundVar(&sal->ValueOfVE.lterms[i].tlive)) {
|
||||
TrailTerm(TR++) = tlive;
|
||||
TrailTerm(TR++) = tlive;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1747,10 +1747,6 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose)
|
||||
dep_fr_ptr depfr = LOCAL_top_dep_fr;
|
||||
#endif /* TABLING */
|
||||
|
||||
#ifdef EASY_SHUNTING
|
||||
HB = H;
|
||||
#endif
|
||||
|
||||
#ifdef TABLING
|
||||
if (depfr != NULL && gc_B >= DepFr_cons_cp(depfr)) {
|
||||
gc_B = DepFr_cons_cp(depfr);
|
||||
@@ -3407,6 +3403,8 @@ marking_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp, CELL *max)
|
||||
#ifdef EASY_SHUNTING
|
||||
sTR0 = (tr_fr_ptr)db_vec;
|
||||
sTR = (tr_fr_ptr)db_vec;
|
||||
/* make sure we set HB before we do any variable shunting!!! */
|
||||
HB = H;
|
||||
#else
|
||||
cont_top0 = (cont *)db_vec;
|
||||
#endif
|
||||
@@ -3806,12 +3804,6 @@ call_gc(UInt gc_lim, Int predarity, CELL *current_env, yamop *nextop)
|
||||
Int effectiveness = 0;
|
||||
int gc_on = FALSE;
|
||||
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
if (NOfThreads != 1) {
|
||||
Yap_Error(SYSTEM_ERROR,TermNil,"cannot perform garbage collection: more than a worker/thread running");
|
||||
return(FALSE);
|
||||
}
|
||||
#endif
|
||||
if (Yap_GetValue(AtomGc) != TermNil)
|
||||
gc_on = TRUE;
|
||||
if (IsIntegerTerm(Tgc_margin = Yap_GetValue(AtomGcMargin)) &&
|
||||
|
||||
15
C/tracer.c
15
C/tracer.c
@@ -38,6 +38,8 @@ TracePutchar(int sno, int ch)
|
||||
static void
|
||||
send_tracer_message(char *start, char *name, Int arity, char *mname, CELL *args)
|
||||
{
|
||||
UInt omax_depth, omax_list, omax_write_args;
|
||||
|
||||
if (name == NULL) {
|
||||
#ifdef YAPOR
|
||||
fprintf(Yap_stderr, "(%d)%s", worker_id, start);
|
||||
@@ -59,7 +61,16 @@ send_tracer_message(char *start, char *name, Int arity, char *mname, CELL *args)
|
||||
/* Yap_Portray_delays = TRUE; */
|
||||
#endif
|
||||
#endif
|
||||
Yap_plwrite(args[i], TracePutchar, Handle_vars_f);
|
||||
omax_depth = max_depth;
|
||||
omax_list = max_list;
|
||||
omax_write_args = max_write_args;
|
||||
max_depth = 5;
|
||||
max_list = 5;
|
||||
max_write_args = 5;
|
||||
Yap_plwrite(args[i], TracePutchar, Handle_vars_f);
|
||||
max_depth = omax_depth;
|
||||
max_list = omax_list;
|
||||
max_write_args = omax_write_args;
|
||||
#if DEBUG
|
||||
#if COROUTINING
|
||||
Yap_Portray_delays = FALSE;
|
||||
@@ -126,8 +137,6 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args)
|
||||
|
||||
sc = Yap_heap_regs;
|
||||
vsc_count++;
|
||||
if (vsc_count < 183400)
|
||||
return;
|
||||
#ifdef COMMENTED
|
||||
// if (vsc_count == 218280)
|
||||
// vsc_xstop = 1;
|
||||
|
||||
140
C/utilpreds.c
140
C/utilpreds.c
@@ -766,6 +766,9 @@ static Term vars_in_complex_term(register CELL *pt0, register CELL *pt0_end, Ter
|
||||
/* do or pt2 are unbound */
|
||||
*ptd0 = TermNil;
|
||||
/* leave an empty slot to fill in later */
|
||||
if (H+1024 > ASP) {
|
||||
goto global_overflow;
|
||||
}
|
||||
H[1] = AbsPair(H+2);
|
||||
H += 2;
|
||||
H[-2] = (CELL)ptd0;
|
||||
@@ -802,79 +805,110 @@ static Term vars_in_complex_term(register CELL *pt0, register CELL *pt0_end, Ter
|
||||
} else {
|
||||
return(inp);
|
||||
}
|
||||
global_overflow:
|
||||
clean_tr(TR0);
|
||||
Yap_ReleasePreAllocCodeSpace((ADDR)to_visit0);
|
||||
H = InitialH;
|
||||
return 0L;
|
||||
|
||||
}
|
||||
|
||||
static Int
|
||||
p_variables_in_term(void) /* variables in term t */
|
||||
{
|
||||
Term t = Deref(ARG1);
|
||||
Term out;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
out = AbsPair(H);
|
||||
H += 2;
|
||||
RESET_VARIABLE(H-2);
|
||||
RESET_VARIABLE(H-1);
|
||||
Yap_unify((CELL)(H-2),ARG1);
|
||||
Yap_unify((CELL)(H-1),ARG2);
|
||||
} else if (IsPrimitiveTerm(t))
|
||||
out = ARG2;
|
||||
else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, ARG2);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), ARG2);
|
||||
}
|
||||
do {
|
||||
Term t = Deref(ARG1);
|
||||
if (IsVarTerm(t)) {
|
||||
out = AbsPair(H);
|
||||
H += 2;
|
||||
RESET_VARIABLE(H-2);
|
||||
RESET_VARIABLE(H-1);
|
||||
Yap_unify((CELL)(H-2),ARG1);
|
||||
Yap_unify((CELL)(H-1),ARG2);
|
||||
} else if (IsPrimitiveTerm(t))
|
||||
out = ARG2;
|
||||
else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, ARG2);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), ARG2);
|
||||
}
|
||||
if (out == 0L) {
|
||||
if (!Yap_gc(3, ENV, P)) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, "in term_variables");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} while (out == 0L);
|
||||
return(Yap_unify(ARG3,out));
|
||||
}
|
||||
|
||||
static Int
|
||||
p_term_variables(void) /* variables in term t */
|
||||
{
|
||||
Term t = Deref(ARG1);
|
||||
Term out;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
return Yap_unify(MkPairTerm(t,TermNil), ARG2);
|
||||
} else if (IsPrimitiveTerm(t)) {
|
||||
return Yap_unify(TermNil, ARG2);
|
||||
} else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, TermNil);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), TermNil);
|
||||
}
|
||||
do {
|
||||
Term t = Deref(ARG1);
|
||||
if (IsVarTerm(t)) {
|
||||
return Yap_unify(MkPairTerm(t,TermNil), ARG2);
|
||||
} else if (IsPrimitiveTerm(t)) {
|
||||
return Yap_unify(TermNil, ARG2);
|
||||
} else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, TermNil);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), TermNil);
|
||||
}
|
||||
if (out == 0L) {
|
||||
if (!Yap_gc(2, ENV, P)) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, "in term_variables");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} while (out == 0L);
|
||||
return Yap_unify(ARG2,out);
|
||||
}
|
||||
|
||||
static Int
|
||||
p_term_variables3(void) /* variables in term t */
|
||||
{
|
||||
Term t = Deref(ARG1);
|
||||
Term out;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
return Yap_unify(MkPairTerm(t,ARG3), ARG2);
|
||||
} else if (IsPrimitiveTerm(t)) {
|
||||
return Yap_unify(ARG2, ARG3);
|
||||
} else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, ARG3);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), ARG3);
|
||||
}
|
||||
do {
|
||||
Term t = Deref(ARG1);
|
||||
if (IsVarTerm(t)) {
|
||||
return Yap_unify(MkPairTerm(t,ARG3), ARG2);
|
||||
} else if (IsPrimitiveTerm(t)) {
|
||||
return Yap_unify(ARG2, ARG3);
|
||||
} else if (IsPairTerm(t)) {
|
||||
out = vars_in_complex_term(RepPair(t)-1,
|
||||
RepPair(t)+1, ARG3);
|
||||
}
|
||||
else {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
out = vars_in_complex_term(RepAppl(t),
|
||||
RepAppl(t)+
|
||||
ArityOfFunctor(f), ARG3);
|
||||
}
|
||||
if (out == 0L) {
|
||||
if (!Yap_gc(3, ENV, P)) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, "in term_variables");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} while (out == 0L);
|
||||
|
||||
return Yap_unify(ARG2,out);
|
||||
}
|
||||
|
||||
@@ -1942,11 +1976,11 @@ void Yap_InitUtilCPreds(void)
|
||||
Yap_InitCPred("copy_term", 2, p_copy_term, 0);
|
||||
Yap_InitCPred("copy_term_nat", 2, p_copy_term_no_delays, 0);
|
||||
Yap_InitCPred("ground", 1, p_ground, SafePredFlag);
|
||||
Yap_InitCPred("$variables_in_term", 3, p_variables_in_term, SafePredFlag|HiddenPredFlag);
|
||||
Yap_InitCPred("$variables_in_term", 3, p_variables_in_term, HiddenPredFlag);
|
||||
Yap_InitCPred("$non_singletons_in_term", 3, p_non_singletons_in_term, SafePredFlag|HiddenPredFlag);
|
||||
CurrentModule = TERMS_MODULE;
|
||||
Yap_InitCPred("term_variables", 2, p_term_variables, SafePredFlag);
|
||||
Yap_InitCPred("term_variables", 3, p_term_variables3, SafePredFlag);
|
||||
Yap_InitCPred("term_variables", 2, p_term_variables, 0);
|
||||
Yap_InitCPred("term_variables", 3, p_term_variables3, 0);
|
||||
Yap_InitCPred("variable_in_term", 2, p_var_in_term, SafePredFlag);
|
||||
Yap_InitCPred("term_hash", 4, GvNTermHash, SafePredFlag);
|
||||
Yap_InitCPred("variant", 2, p_variant, 0);
|
||||
|
||||
Reference in New Issue
Block a user