From 64dded4a536df00d5603c6e233e5d91a4a9ecabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Fri, 4 Nov 2011 09:28:33 +0000 Subject: [PATCH] iunnumbervars may be copying terms from outside the stacks, so don't share unless we know we share. --- C/c_interface.c | 3 ++- C/utilpreds.c | 28 +++++++++++++++------------- H/Yapproto.h | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 59a10d15f..cac674149 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -3898,7 +3898,8 @@ YAP_NumberVars(Term t, Int nbv) { Term YAP_UnNumberVars(Term t) { - return Yap_UnNumberTerm(t); + /* don't allow sharing of ground terms */ + return Yap_UnNumberTerm(t, FALSE); } int diff --git a/C/utilpreds.c b/C/utilpreds.c index 981c81eb7..b5f4dfee4 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -4406,7 +4406,7 @@ Yap_NumberVars( Term inp, Int numbv ) /* numbervariables in term t */ } static Int -p_numbervars(void) +p_numbervars( USES_REGS1 ) { Term t2 = Deref(ARG2); Int out; @@ -4425,13 +4425,13 @@ p_numbervars(void) } static int -unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow USES_REGS) +unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share USES_REGS) { struct cp_frame *to_visit0, *to_visit = (struct cp_frame *)Yap_PreAllocCodeSpace(); CELL *HB0 = HB; tr_fr_ptr TR0 = TR; - int ground = TRUE; + int ground = share; Int max = -1; HB = HLow; @@ -4479,7 +4479,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow USES_REGS) to_visit ++; } #endif - ground = TRUE; + ground = share; pt0 = ap2 - 1; pt0_end = ap2 + 1; ptf = H; @@ -4555,7 +4555,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow USES_REGS) to_visit ++; } #endif - ground = (f != FunctorMutable); + ground = (f != FunctorMutable) && share; d0 = ArityOfFunctor(f); pt0 = ap2; pt0_end = ap2 + d0; @@ -4574,6 +4574,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow USES_REGS) } derefa_body(d0, ptd0, unnumber_term_unk, unnumber_term_nvar); + /* this should never happen ? */ ground = FALSE; *ptf++ = (CELL) ptd0; } @@ -4647,7 +4648,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow USES_REGS) static Term -UnnumberTerm(Term inp, UInt arity USES_REGS) { +UnnumberTerm(Term inp, UInt arity, int share USES_REGS) { Term t = Deref(inp); tr_fr_ptr TR0 = TR; @@ -4667,7 +4668,7 @@ UnnumberTerm(Term inp, UInt arity USES_REGS) { H += 2; { int res; - if ((res = unnumber_complex_term(ap-1, ap+1, Hi, Hi PASS_REGS)) < 0) { + if ((res = unnumber_complex_term(ap-1, ap+1, Hi, Hi, share PASS_REGS)) < 0) { H = Hi; if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L) return FALSE; @@ -4699,7 +4700,7 @@ UnnumberTerm(Term inp, UInt arity USES_REGS) { } else { int res; - if ((res = unnumber_complex_term(ap, ap+ArityOfFunctor(f), HB0+1, HB0 PASS_REGS)) < 0) { + if ((res = unnumber_complex_term(ap, ap+ArityOfFunctor(f), HB0+1, HB0, share PASS_REGS)) < 0) { H = HB0; if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L) return FALSE; @@ -4714,14 +4715,15 @@ UnnumberTerm(Term inp, UInt arity USES_REGS) { } Term -Yap_UnNumberTerm(Term inp) { +Yap_UnNumberTerm(Term inp, int share) { CACHE_REGS - return UnnumberTerm(inp, 0 PASS_REGS); + return UnnumberTerm(inp, 0, share PASS_REGS); } -static int -p_unnumbervars(void) { - return Yap_unify(Yap_UnNumberTerm(ARG1), ARG2); +static Int +p_unnumbervars( USES_REGS1 ) { + /* this should be a standard Prolog term, so we allow sharing? */ + return Yap_unify(Yap_UnNumberTerm(ARG1, FALSE PASS_REGS), ARG2); } void Yap_InitUtilCPreds(void) diff --git a/H/Yapproto.h b/H/Yapproto.h index d61c5813a..34af15026 100644 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -398,7 +398,7 @@ int STD_PROTO(Yap_IsGroundTerm,(Term)); void STD_PROTO(Yap_InitUtilCPreds,(void)); Int STD_PROTO(Yap_TermHash,(Term, Int, Int, int)); Int STD_PROTO(Yap_NumberVars,(Term, Int)); -Term STD_PROTO(Yap_UnNumberTerm,(Term)); +Term STD_PROTO(Yap_UnNumberTerm,(Term, int)); /* yap.c */