From 26013e2fb9de57c418003b676d3003a5c007197f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Sun, 21 Feb 2016 11:30:13 +0000 Subject: [PATCH] fix regress in style_check caused by bad argument to add clause --- C/c_interface.c | 2 +- C/cdmgr.c | 49 +++++++++++++++++++++++-------------------------- CXX/yapi.cpp | 2 +- H/Yapproto.h | 2 +- H/clause.h | 2 +- 5 files changed, 27 insertions(+), 30 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 54c6843b3..031258335 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -2226,7 +2226,7 @@ X_API char *YAP_CompileClause(Term t) { codeaddr = Yap_cclause(t, 0, mod, t); if (codeaddr != NULL) { t = Deref(ARG1); /* just in case there was an heap overflow */ - if (!Yap_addclause(t, codeaddr, TRUE, mod, &tn)) { + if (!Yap_addclause(t, codeaddr, TermAssertz, mod, &tn)) { YAPLeaveCriticalSection(); return LOCAL_ErrorMessage; } diff --git a/C/cdmgr.c b/C/cdmgr.c index 6d4f99fff..22ddefdab 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -1530,7 +1530,7 @@ static Int return (TRUE); } -bool Yap_multiple(PredEntry *ap, int mode USES_REGS) { +bool Yap_multiple(PredEntry *ap, Term mode USES_REGS) { register consult_obj *fp; if ((ap->PredFlags & (MultiFileFlag | LogUpdatePredFlag | DynamicPredFlag)) || @@ -1604,7 +1604,8 @@ bool Yap_constPred(PredEntry *p) { return false; } -static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) +bool +Yap_addclause(Term t, yamop *cp, Term tmode, Term mod, Term *t4ref) /* * mode @@ -1620,7 +1621,21 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) arity_t Arity; pred_flags_t pflags; Term tf; + int mode; + if (tmode == TermConsult) { + mode = consult; + } else if (tmode == TermReconsult) { + mode = consult; + } else if (tmode == TermAsserta) { + mode = asserta; + } else if (tmode == TermAssertz) { + mode = assertz; + } else if (tmode == TermAssertaStatic) { + mode = asserta; + } else if (tmode == TermAssertzStatic) { + mode = assertz; + } if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorAssert) tf = ArgOfTerm(1, t); else @@ -1656,7 +1671,7 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) } if (pflags & (SpiedPredFlag | CountPredFlag | ProfiledPredFlag)) spy_flag = true; - if (Yap_discontiguous(p, mode PASS_REGS)) { + if (Yap_discontiguous(p, tmode PASS_REGS)) { Term disc[3], sc[4]; if (p->ArityOfPE) { disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred)); @@ -1673,7 +1688,7 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) sc[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 1), 1, &t); sc[1] = MkAtomTerm(AtomWarning); Yap_PrintWarning(Yap_MkApplTerm(Yap_MkFunctor(AtomError, 2), 2, sc)); - } else if (Yap_multiple(p, mode PASS_REGS)) { + } else if (Yap_multiple(p, tmode PASS_REGS)) { Term disc[4], sc[4]; if (p->ArityOfPE) { disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred)); @@ -1804,10 +1819,6 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) return true; } -bool Yap_addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) { - return addclause(t, cp, mode, mod, t4ref); -} - void Yap_EraseMegaClause(yamop *cl, PredEntry *ap) { /* just make it fail */ cl->opc = Yap_opcode(_op_fail); @@ -1929,22 +1940,9 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */ int mode; if (IsVarTerm(t1) || !IsAtomicTerm(t1)) - return FALSE; + return false; if (IsVarTerm(mod) || !IsAtomTerm(mod)) - return FALSE; - if (t1 == TermConsult) { - mode = consult; - } else if (t1 == TermReconsult) { - mode = consult; - } else if (t1 == TermAsserta) { - mode = asserta; - } else if (t1 == TermAssertz) { - mode = assertz; - } else if (t1 == TermAssertaStatic) { - mode = asserta; - } else if (t1 == TermAssertzStatic) { - mode = assertz; - } + return false; /* separate assert in current file from reconsult if (mode == assertz && LOCAL_consult_level && mod == CurrentModule) mode = consult; @@ -1955,7 +1953,7 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */ t = Deref(ARG1); /* just in case there was an heap overflow */ if (!LOCAL_ErrorMessage) { YAPEnterCriticalSection(); - addclause(t, code_adr, mode, mod, &ARG5); + Yap_addclause(t, code_adr, t1, mod, &ARG5); YAPLeaveCriticalSection(); } if (LOCAL_ErrorMessage) { @@ -4486,8 +4484,7 @@ static bool pred_flag_clause(Functor f, Term mod, const char *name, if (LOCAL_ErrorMessage) { return false; } - addclause(tn, code_adr, assertz, mod, NULL); - return true; + return Yap_addclause(tn, code_adr, TermAssertz, mod, NULL); } struct pred_entry *Yap_MkLogPred(struct pred_entry *pe) { diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index 149f69827..7f0f4715d 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -754,7 +754,7 @@ void *YAPPrologPredicate::assertClause( YAPTerm clause, bool last, YAPTerm sourc return 0; } Term *tref = &ntt; - if (Yap_addclause(ntt, codeaddr, (last ? 0 : 2), Yap_CurrentModule(), tref)) { + if (Yap_addclause(ntt, codeaddr, (last ? TermAssertz : TermAsserta), Yap_CurrentModule(), tref)) { RECOVER_MACHINE_REGS(); } return tref; diff --git a/H/Yapproto.h b/H/Yapproto.h index c30ec0a18..0be7c53f5 100755 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -125,7 +125,7 @@ struct pred_entry *Yap_PredForChoicePt(choiceptr bptr, op_numbers *op); void Yap_InitCdMgr(void); struct pred_entry *Yap_PredFromClause(Term t USES_REGS); bool Yap_discontiguous(struct pred_entry *ap, Term mode USES_REGS); -bool Yap_multiple(struct pred_entry *ap, int mode USES_REGS); +bool Yap_multiple(struct pred_entry *ap, Term mode USES_REGS); void Yap_init_consult(int, const char *); void Yap_end_consult(void); void Yap_Abolish(struct pred_entry *); diff --git a/H/clause.h b/H/clause.h index a72be97d7..db1ede4cd 100644 --- a/H/clause.h +++ b/H/clause.h @@ -280,7 +280,7 @@ void Yap_InitComma(void); /* cdmgr.c */ void Yap_IPred(PredEntry *, UInt, yamop *); -bool Yap_addclause(Term, yamop *, int, Term, Term *); +bool Yap_addclause(Term, yamop *, Term, Term, Term *); void Yap_add_logupd_clause(PredEntry *, LogUpdClause *, int); void Yap_kill_iblock(ClauseUnion *, ClauseUnion *, PredEntry *); void Yap_EraseStaticClause(StaticClause *, PredEntry *, Term);