diff --git a/C/attvar.c b/C/attvar.c index d883ea86e..7d76840fa 100644 --- a/C/attvar.c +++ b/C/attvar.c @@ -111,16 +111,23 @@ CopyAttVar(CELL *orig, CELL ***to_visit_ptr, CELL *res) newv->Atts[2*j] = time; if (IsVarTerm(t)) { - RESET_VARIABLE(newv->Atts+(2*j+1)); - } else if (IsAtomicTerm(t)) { + CELL *vt = VarOfTerm(t); + if (vt == attv->Atts+(2*j+1)) { + RESET_VARIABLE(newv->Atts+(2*j+1)); + } else { + to_visit[0] = vt-1; + to_visit[1] = vt; + to_visit[2] = newv->Atts+2*j+1; + to_visit[3] = vt; + to_visit += 4; + } + } else if (IsVarTerm(t) && IsAtomicTerm(t)) { newv->Atts[2*j+1] = t; } else { to_visit[0] = attv->Atts+2*j; to_visit[1] = attv->Atts+2*j+1; to_visit[2] = newv->Atts+2*j+1; to_visit[3] = (CELL *)(attv->Atts[2*j]); - /* fool the system into thinking we had a variable there */ - attv->Atts[2*j+1] = AbsAppl(H); to_visit += 4; } } @@ -345,6 +352,8 @@ BuildNewAttVar(Term t, Int i, Term tatt) H -= 2; t = H[0]; tatt = H[1]; + printf("attv is %p\n", attv); + attv = (attvar_record *)Yap_ReadTimedVar(DelayedVars); } time = InitVarTime(); RESET_VARIABLE(&(attv->Value)); @@ -352,7 +361,7 @@ BuildNewAttVar(Term t, Int i, Term tatt) attv->sus_id = attvars_ext; for (j = 0; j < NUM_OF_ATTS; j++) { attv->Atts[2*j] = time; - RESET_VARIABLE(attv->Atts+2*j+1); + RESET_VARIABLE(attv->Atts+(2*j+1)); } attv->NS = Yap_UpdateTimedVar(AttsMutableList, (CELL)&(attv->Done)); Bind((CELL *)t,(CELL)attv); diff --git a/C/index.c b/C/index.c index ff9986d87..a6b44539d 100644 --- a/C/index.c +++ b/C/index.c @@ -11,8 +11,11 @@ * File: index.c * * comments: Indexing a Prolog predicate * * * -* Last rev: $Date: 2004-04-16 19:27:31 $,$Author: vsc $ * +* Last rev: $Date: 2004-04-20 22:08:23 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.85 2004/04/16 19:27:31 vsc +* more bug fixes +* * Revision 1.84 2004/04/14 19:10:38 vsc * expand_clauses: keep a list of clauses to expand * fix new trail scheme for multi-assignment variables @@ -81,6 +84,7 @@ UInt STATIC_PROTO(do_index, (ClauseDef *,ClauseDef *,struct intermediates *,UInt UInt STATIC_PROTO(do_compound_index, (ClauseDef *,ClauseDef *,Term *t,struct intermediates *,UInt,UInt,UInt,UInt,int,int,int,CELL *,int)); UInt STATIC_PROTO(do_dbref_index, (ClauseDef *,ClauseDef *,Term,struct intermediates *,UInt,UInt,int,int,CELL *)); UInt STATIC_PROTO(do_blob_index, (ClauseDef *,ClauseDef *,Term,struct intermediates *,UInt,UInt,int,int,CELL *)); +/*path_stack_entry *STATIC_PROTO(kill_unsafe_block, (path_stack_entry *,op_numbers,PredEntry *,int,int,ClauseDef *));*/ static UInt labelno; @@ -6087,6 +6091,11 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause case _unlock_lu: ipc = NEXTOP(ipc,e); break; + case _op_fail: + while ((--sp)->flag != block_entry); + *sp->u.cle.entry_code = cls->Code; + ipc = pop_path(&sp, cls, ap); + break; default: sp = kill_unsafe_block(sp, op, ap, first, FALSE, cls); ipc = pop_path(&sp, cls, ap); diff --git a/C/tracer.c b/C/tracer.c index 09193e2cc..96ac6e6cd 100644 --- a/C/tracer.c +++ b/C/tracer.c @@ -130,7 +130,7 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args) #ifdef COMMENTED // if (vsc_count == 218280) // vsc_xstop = 1; - if (vsc_count < 218200) { + if (vsc_count < 1468068888) { UNLOCK(heap_regs->low_level_trace_lock); return; } diff --git a/C/utilpreds.c b/C/utilpreds.c index b691d82a7..6a51f3660 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -49,7 +49,7 @@ clean_tr(tr_fr_ptr TR0) { if (TR != TR0) { do { Term p = TrailTerm(--TR); - RESET_VARIABLE(p); + RESET_VARIABLE(p); } while (TR != TR0); } } @@ -65,7 +65,6 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H CELL *dvars = NULL; #endif HB = HLow; - to_visit0 = to_visit; loop: while (pt0 < pt0_end) { @@ -120,7 +119,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H register CELL *ap2; /* store the terms to visit */ ap2 = RepAppl(d0); - if (ap2 >= HB && ap2 < H) { + if (ap2 >= HB && ap2 <= H) { /* If this is newer than the current term, just reuse */ *ptf++ = d0; continue; @@ -185,13 +184,16 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H if (IsAttachedTerm((CELL)ptd0)) { /* if unbound, call the standard copy term routine */ CELL **bp[1]; - + if (dvars == NULL) { dvars = (CELL *)Yap_ReadTimedVar(DelayedVars); } if (ptd0 >= dvars) { *ptf++ = (CELL) ptd0; } else { + tr_fr_ptr CurTR; + + CurTR = TR; bp[0] = to_visit; HB = HB0; if (!attas[ExtFromCell(ptd0)].copy_term_op(ptd0, bp, ptf)) { @@ -199,6 +201,43 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H } to_visit = bp[0]; HB = HLow; + if (CurTR != TR) { + /* Problem here is that the attached routine might + * have changed the list of suspended goals and stored + * new entries in the trail. This should be quite + * rare, so for simplicity we just swap cells from + * bottom and top of Trail, not nice but not worth + * complicating everything else. + */ + CELL *pt1 = (CELL *)TR0; + CELL *pt2 = (CELL *)CurTR; + CELL *pt3 = (CELL *)TR; + if (pt1 == pt2) { + TR0 = TR; + } else { + /* make a backup copy */ + while (pt2 < pt3) + *((CELL *)TR)++ = *pt2++; + /* reset pointers */ + TR = (tr_fr_ptr)pt3; + pt2 = (CELL *)CurTR; + /* now go to old trail */ + pt3 = pt1+(pt2-pt1); + /* copy old trail above */ + if (pt3 != pt1) { + while (pt3 < pt2) { + *pt3++ = *pt1++; + } + } + pt1 = (CELL *)TR0; + pt2 = pt1 + (pt3-(CELL *)CurTR); + /* copy new trail below */ + while (pt1 < pt2) { + *pt1++ = *pt3++; + } + TR0 = (tr_fr_ptr)pt1; + } + } ptf++; Bind_Global(ptd0, ptf[-1]); } diff --git a/pl/boot.yap b/pl/boot.yap index 66d51ce5f..6370ed42c 100644 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -224,7 +224,7 @@ repeat :- '$repeat'. '$execute_commands'(V,_,_) :- var(V), !, '$do_error'(instantiation_error,meta_call(V)). '$execute_commands'([],_,_) :- !, fail. -'$execute_commands'([C|_],VL,Con) :- !, +'$execute_commands'([C|Cs],VL,Con) :- !, ( '$execute_command'(C,VL,Con) ; diff --git a/pl/modules.yap b/pl/modules.yap index 0944b8d75..4cb358d92 100644 --- a/pl/modules.yap +++ b/pl/modules.yap @@ -318,10 +318,12 @@ module(N) :- % a meta-call. % '$expand_goal'(G0, GoalMod, CurMod, G, NM) :- - '$meta_expansion'(GoalMod, CurMod, G0, GF, []), !, - '$expand_goal2'(GF,GoalMod,G,NM). -'$expand_goal'(G, GoalMod, _, NG, NM) :- - '$expand_goal2'(G, GoalMod, NG, NM). + '$expand_goal2'(G0,GoalMod,G1,NM), + ( '$meta_expansion'(GoalMod, CurMod, G1, GF, []) -> + G = GF + ; + G = G1 + ). '$expand_goal2'(G, M, NG, NM) :- '$undefined'(G,M),