fix copy term when the same constrained term appears several times.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@455 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2002-04-24 02:52:34 +00:00
parent 376d26f93f
commit b63425bf5c

View File

@ -61,6 +61,9 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H
CELL **to_visit = (CELL **)(HeapTop + sizeof(CELL)); CELL **to_visit = (CELL **)(HeapTop + sizeof(CELL));
tr_fr_ptr TR0 = TR; tr_fr_ptr TR0 = TR;
CELL *HB0 = HB; CELL *HB0 = HB;
#ifdef COROUTINING
CELL *dvars = NULL;
#endif
HB = HLow; HB = HLow;
loop: loop:
@ -182,36 +185,42 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H
/* if unbound, call the standard copy term routine */ /* if unbound, call the standard copy term routine */
CELL **bp[1]; CELL **bp[1];
tr_fr_ptr CurTR; tr_fr_ptr CurTR;
if (ptd0 >= dvars) {
bp[0] = to_visit; *ptf++ = (CELL) ptd0;
Bind_Global(ptd0,(CELL)ptf); } else {
CurTR = TR; if (dvars == NULL) {
HB = HB0; dvars = (CELL *)ReadTimedVar(DelayedVars);
if (!attas[ExtFromCell(ptd0)].copy_term_op(ptd0, bp, ptf)) { }
goto overflow; bp[0] = to_visit;
} CurTR = TR;
to_visit = bp[0]; HB = HB0;
HB = HLow; if (!attas[ExtFromCell(ptd0)].copy_term_op(ptd0, bp, ptf)) {
ptf++; goto overflow;
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;
while (pt2 < (CELL *)TR) {
CELL o = *pt1;
pt1++;
pt2++;
pt1[-1] = pt2[-1];
pt2[-1] = o;
} }
TR0 = (tr_fr_ptr)pt1; 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;
while (pt2 < (CELL *)TR) {
CELL o = *pt1;
pt1++;
pt2++;
pt1[-1] = pt2[-1];
pt2[-1] = o;
}
TR0 = (tr_fr_ptr)pt1;
}
ptf++;
Bind_Global(ptd0, ptf[-1]);
} }
} else { } else {
#endif #endif