fix overflow when copying terms with attributes
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@430 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
8d579bb35d
commit
bd654f1e18
@ -1807,7 +1807,7 @@ absmi(int inp)
|
|||||||
/* find something to fool S */
|
/* find something to fool S */
|
||||||
if (CFREG == Unsigned(LCL0) && ReadTimedVar(WokenGoals) != TermNil) {
|
if (CFREG == Unsigned(LCL0) && ReadTimedVar(WokenGoals) != TermNil) {
|
||||||
SREG = (CELL *)RepPredProp(GetPredPropByFunc(MkFunctor(AtomRestoreRegs,2),0));
|
SREG = (CELL *)RepPredProp(GetPredPropByFunc(MkFunctor(AtomRestoreRegs,2),0));
|
||||||
XREGS[0] = XREG(PREG->u.y.y);
|
XREGS[0] = Y[PREG->u.y.y];
|
||||||
PREG = NEXTOP(PREG,y);
|
PREG = NEXTOP(PREG,y);
|
||||||
goto creep_either;
|
goto creep_either;
|
||||||
}
|
}
|
||||||
|
46
C/attvar.c
46
C/attvar.c
@ -158,26 +158,7 @@ AttVarToTerm(CELL *orig)
|
|||||||
static int
|
static int
|
||||||
TermToAttVar(Term attvar, Term to)
|
TermToAttVar(Term attvar, Term to)
|
||||||
{
|
{
|
||||||
int i = 0;
|
return(BuildNewAttVar(to, -1, attvar));
|
||||||
int open = FALSE;
|
|
||||||
|
|
||||||
while (IsPairTerm(attvar)) {
|
|
||||||
Term t = HeadOfTerm(attvar);
|
|
||||||
if (!IsVarTerm(t)) {
|
|
||||||
if (open) {
|
|
||||||
attvar_record *attv = (attvar_record *)VarOfTerm(Deref(to));
|
|
||||||
if (!PutAtt(attv, i, t))
|
|
||||||
return(FALSE);
|
|
||||||
} else {
|
|
||||||
if (!BuildNewAttVar(to, i, t))
|
|
||||||
return(FALSE);
|
|
||||||
open = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
attvar = TailOfTerm(attvar);
|
|
||||||
}
|
|
||||||
return(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -369,11 +350,13 @@ BuildNewAttVar(Term t, Int i, Term tatt)
|
|||||||
|
|
||||||
attvar_record *attv = (attvar_record *)ReadTimedVar(DelayedVars);
|
attvar_record *attv = (attvar_record *)ReadTimedVar(DelayedVars);
|
||||||
if (H0 - (CELL *)attv < 1024+(2*NUM_OF_ATTS)) {
|
if (H0 - (CELL *)attv < 1024+(2*NUM_OF_ATTS)) {
|
||||||
ARG1 = t;
|
H[0] = t;
|
||||||
ARG2 = tatt;
|
H[1] = tatt;
|
||||||
|
H += 2;
|
||||||
growglobal();
|
growglobal();
|
||||||
t = ARG1;
|
H -= 2;
|
||||||
tatt = ARG2;
|
t = H[0];
|
||||||
|
tatt = H[1];
|
||||||
}
|
}
|
||||||
time = InitVarTime();
|
time = InitVarTime();
|
||||||
RESET_VARIABLE(&(attv->Value));
|
RESET_VARIABLE(&(attv->Value));
|
||||||
@ -386,7 +369,22 @@ BuildNewAttVar(Term t, Int i, Term tatt)
|
|||||||
attv->NS = UpdateTimedVar(AttsMutableList, (CELL)&(attv->Done));
|
attv->NS = UpdateTimedVar(AttsMutableList, (CELL)&(attv->Done));
|
||||||
Bind((CELL *)t,(CELL)attv);
|
Bind((CELL *)t,(CELL)attv);
|
||||||
UpdateTimedVar(DelayedVars,(CELL)(attv->Atts+2*j));
|
UpdateTimedVar(DelayedVars,(CELL)(attv->Atts+2*j));
|
||||||
|
/* if i < 0 then we have the list of arguments */
|
||||||
|
if (i < 0) {
|
||||||
|
Int j = 0;
|
||||||
|
while (IsPairTerm(tatt)) {
|
||||||
|
Term t = HeadOfTerm(tatt);
|
||||||
|
/* I need to do this because BuildNewAttVar may shift the stacks */
|
||||||
|
if (!IsVarTerm(t)) {
|
||||||
|
attv->Atts[2*j+1] = t;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
tatt = TailOfTerm(tatt);
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
|
} else {
|
||||||
return(PutAtt(attv, i, tatt));
|
return(PutAtt(attv, i, tatt));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
|
2
C/exec.c
2
C/exec.c
@ -1224,7 +1224,7 @@ p_restore_regs2(void)
|
|||||||
if (pt0 > B) {
|
if (pt0 > B) {
|
||||||
/* Wow, we're gonna cut!!! */
|
/* Wow, we're gonna cut!!! */
|
||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
CUT_prune_to((choiceptr) d0);
|
CUT_prune_to(pt0);
|
||||||
#else
|
#else
|
||||||
B = pt0;
|
B = pt0;
|
||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
|
@ -113,7 +113,8 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args)
|
|||||||
|
|
||||||
vsc_count++;
|
vsc_count++;
|
||||||
/* if (vsc_count < 84600) return; */
|
/* if (vsc_count < 84600) return; */
|
||||||
/* if (vsc_count == 6469) {
|
/*
|
||||||
|
if (vsc_count == 4376) {
|
||||||
printf("Here I go\n");
|
printf("Here I go\n");
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user