fix bug in stack overflow.
This commit is contained in:
parent
63616b94a7
commit
b985ea2fbc
20
C/globals.c
20
C/globals.c
@ -879,7 +879,7 @@ static Int
|
|||||||
p_nb_setarg( USES_REGS1 )
|
p_nb_setarg( USES_REGS1 )
|
||||||
{
|
{
|
||||||
Term wheret = Deref(ARG1);
|
Term wheret = Deref(ARG1);
|
||||||
Term dest = Deref(ARG2);
|
Term dest;
|
||||||
Term to;
|
Term to;
|
||||||
UInt arity, pos;
|
UInt arity, pos;
|
||||||
CELL *destp;
|
CELL *destp;
|
||||||
@ -893,32 +893,30 @@ p_nb_setarg( USES_REGS1 )
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
pos = IntegerOfTerm(wheret);
|
pos = IntegerOfTerm(wheret);
|
||||||
|
dest = Deref(ARG2);
|
||||||
if (IsVarTerm(dest)) {
|
if (IsVarTerm(dest)) {
|
||||||
Yap_Error(INSTANTIATION_ERROR,dest,"nb_setarg");
|
Yap_Error(INSTANTIATION_ERROR,dest,"nb_setarg");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else if (IsPrimitiveTerm(dest)) {
|
} else if (IsPrimitiveTerm(dest)) {
|
||||||
arity = 0;
|
arity = 0;
|
||||||
destp = NULL;
|
|
||||||
} else if (IsPairTerm(dest)) {
|
} else if (IsPairTerm(dest)) {
|
||||||
arity = 2;
|
arity = 2;
|
||||||
destp = RepPair(dest)-1;
|
|
||||||
} else {
|
} else {
|
||||||
arity = ArityOfFunctor(FunctorOfTerm(dest));
|
arity = ArityOfFunctor(FunctorOfTerm(dest));
|
||||||
destp = RepAppl(dest);
|
|
||||||
}
|
}
|
||||||
if (pos < 1 || pos > arity)
|
if (pos < 1 || pos > arity)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
to = Deref(ARG3);
|
to = Deref(ARG3);
|
||||||
to = CopyTermToArena(ARG3, LOCAL_GlobalArena, FALSE, TRUE, 2, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS);
|
to = CopyTermToArena(ARG3, LOCAL_GlobalArena, FALSE, TRUE, 3, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS);
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
dest = Deref(ARG2);
|
dest = Deref(ARG2);
|
||||||
if (IsPairTerm(dest)) {
|
if (IsPairTerm(dest)) {
|
||||||
arity = 2;
|
destp = RepPair(dest)-1;
|
||||||
} else {
|
} else {
|
||||||
arity = ArityOfFunctor(FunctorOfTerm(dest));
|
destp = RepAppl(dest);
|
||||||
}
|
}
|
||||||
destp[pos] = to;
|
destp[pos] = to;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -947,19 +945,21 @@ p_nb_set_shared_arg( USES_REGS1 )
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
} else if (IsPrimitiveTerm(dest)) {
|
} else if (IsPrimitiveTerm(dest)) {
|
||||||
arity = 0;
|
arity = 0;
|
||||||
destp = NULL;
|
|
||||||
} else if (IsPairTerm(dest)) {
|
} else if (IsPairTerm(dest)) {
|
||||||
arity = 2;
|
arity = 2;
|
||||||
destp = RepPair(dest)-1;
|
|
||||||
} else {
|
} else {
|
||||||
arity = ArityOfFunctor(FunctorOfTerm(dest));
|
arity = ArityOfFunctor(FunctorOfTerm(dest));
|
||||||
destp = RepAppl(dest);
|
|
||||||
}
|
}
|
||||||
if (pos < 1 || pos > arity)
|
if (pos < 1 || pos > arity)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
to = CopyTermToArena(ARG3, LOCAL_GlobalArena, TRUE, TRUE, 3, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS);
|
to = CopyTermToArena(ARG3, LOCAL_GlobalArena, TRUE, TRUE, 3, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS);
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (IsPairTerm(dest)) {
|
||||||
|
destp = RepPair(dest)-1;
|
||||||
|
} else {
|
||||||
|
destp = RepAppl(dest);
|
||||||
|
}
|
||||||
destp[pos] = to;
|
destp[pos] = to;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user