From b985ea2fbc4a256e550b60d4102a1beb3ba35eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Sun, 13 May 2012 10:17:30 +0100 Subject: [PATCH] fix bug in stack overflow. --- C/globals.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/C/globals.c b/C/globals.c index a41135716..24f479e00 100644 --- a/C/globals.c +++ b/C/globals.c @@ -879,7 +879,7 @@ static Int p_nb_setarg( USES_REGS1 ) { Term wheret = Deref(ARG1); - Term dest = Deref(ARG2); + Term dest; Term to; UInt arity, pos; CELL *destp; @@ -893,32 +893,30 @@ p_nb_setarg( USES_REGS1 ) return FALSE; } pos = IntegerOfTerm(wheret); + dest = Deref(ARG2); if (IsVarTerm(dest)) { Yap_Error(INSTANTIATION_ERROR,dest,"nb_setarg"); return FALSE; } else if (IsPrimitiveTerm(dest)) { arity = 0; - destp = NULL; } else if (IsPairTerm(dest)) { arity = 2; - destp = RepPair(dest)-1; } else { arity = ArityOfFunctor(FunctorOfTerm(dest)); - destp = RepAppl(dest); } if (pos < 1 || pos > arity) return FALSE; 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) return FALSE; dest = Deref(ARG2); if (IsPairTerm(dest)) { - arity = 2; + destp = RepPair(dest)-1; } else { - arity = ArityOfFunctor(FunctorOfTerm(dest)); + destp = RepAppl(dest); } destp[pos] = to; return TRUE; @@ -947,19 +945,21 @@ p_nb_set_shared_arg( USES_REGS1 ) return FALSE; } else if (IsPrimitiveTerm(dest)) { arity = 0; - destp = NULL; } else if (IsPairTerm(dest)) { arity = 2; - destp = RepPair(dest)-1; } else { arity = ArityOfFunctor(FunctorOfTerm(dest)); - destp = RepAppl(dest); } if (pos < 1 || pos > arity) return FALSE; to = CopyTermToArena(ARG3, LOCAL_GlobalArena, TRUE, TRUE, 3, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS); if (to == 0L) return FALSE; + if (IsPairTerm(dest)) { + destp = RepPair(dest)-1; + } else { + destp = RepAppl(dest); + } destp[pos] = to; return TRUE; }