fix regress in style_check caused by bad argument to add clause
This commit is contained in:
parent
504734c879
commit
26013e2fb9
@ -2226,7 +2226,7 @@ X_API char *YAP_CompileClause(Term t) {
|
|||||||
codeaddr = Yap_cclause(t, 0, mod, t);
|
codeaddr = Yap_cclause(t, 0, mod, t);
|
||||||
if (codeaddr != NULL) {
|
if (codeaddr != NULL) {
|
||||||
t = Deref(ARG1); /* just in case there was an heap overflow */
|
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();
|
YAPLeaveCriticalSection();
|
||||||
return LOCAL_ErrorMessage;
|
return LOCAL_ErrorMessage;
|
||||||
}
|
}
|
||||||
|
49
C/cdmgr.c
49
C/cdmgr.c
@ -1530,7 +1530,7 @@ static Int
|
|||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Yap_multiple(PredEntry *ap, int mode USES_REGS) {
|
bool Yap_multiple(PredEntry *ap, Term mode USES_REGS) {
|
||||||
register consult_obj *fp;
|
register consult_obj *fp;
|
||||||
|
|
||||||
if ((ap->PredFlags & (MultiFileFlag | LogUpdatePredFlag | DynamicPredFlag)) ||
|
if ((ap->PredFlags & (MultiFileFlag | LogUpdatePredFlag | DynamicPredFlag)) ||
|
||||||
@ -1604,7 +1604,8 @@ bool Yap_constPred(PredEntry *p) {
|
|||||||
return false;
|
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
|
mode
|
||||||
@ -1620,7 +1621,21 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
|
|||||||
arity_t Arity;
|
arity_t Arity;
|
||||||
pred_flags_t pflags;
|
pred_flags_t pflags;
|
||||||
Term tf;
|
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)
|
if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorAssert)
|
||||||
tf = ArgOfTerm(1, t);
|
tf = ArgOfTerm(1, t);
|
||||||
else
|
else
|
||||||
@ -1656,7 +1671,7 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
|
|||||||
}
|
}
|
||||||
if (pflags & (SpiedPredFlag | CountPredFlag | ProfiledPredFlag))
|
if (pflags & (SpiedPredFlag | CountPredFlag | ProfiledPredFlag))
|
||||||
spy_flag = true;
|
spy_flag = true;
|
||||||
if (Yap_discontiguous(p, mode PASS_REGS)) {
|
if (Yap_discontiguous(p, tmode PASS_REGS)) {
|
||||||
Term disc[3], sc[4];
|
Term disc[3], sc[4];
|
||||||
if (p->ArityOfPE) {
|
if (p->ArityOfPE) {
|
||||||
disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred));
|
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[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 1), 1, &t);
|
||||||
sc[1] = MkAtomTerm(AtomWarning);
|
sc[1] = MkAtomTerm(AtomWarning);
|
||||||
Yap_PrintWarning(Yap_MkApplTerm(Yap_MkFunctor(AtomError, 2), 2, sc));
|
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];
|
Term disc[4], sc[4];
|
||||||
if (p->ArityOfPE) {
|
if (p->ArityOfPE) {
|
||||||
disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred));
|
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;
|
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) {
|
void Yap_EraseMegaClause(yamop *cl, PredEntry *ap) {
|
||||||
/* just make it fail */
|
/* just make it fail */
|
||||||
cl->opc = Yap_opcode(_op_fail);
|
cl->opc = Yap_opcode(_op_fail);
|
||||||
@ -1929,22 +1940,9 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */
|
|||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
if (IsVarTerm(t1) || !IsAtomicTerm(t1))
|
if (IsVarTerm(t1) || !IsAtomicTerm(t1))
|
||||||
return FALSE;
|
return false;
|
||||||
if (IsVarTerm(mod) || !IsAtomTerm(mod))
|
if (IsVarTerm(mod) || !IsAtomTerm(mod))
|
||||||
return FALSE;
|
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;
|
|
||||||
}
|
|
||||||
/* separate assert in current file from reconsult
|
/* separate assert in current file from reconsult
|
||||||
if (mode == assertz && LOCAL_consult_level && mod == CurrentModule)
|
if (mode == assertz && LOCAL_consult_level && mod == CurrentModule)
|
||||||
mode = consult;
|
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 */
|
t = Deref(ARG1); /* just in case there was an heap overflow */
|
||||||
if (!LOCAL_ErrorMessage) {
|
if (!LOCAL_ErrorMessage) {
|
||||||
YAPEnterCriticalSection();
|
YAPEnterCriticalSection();
|
||||||
addclause(t, code_adr, mode, mod, &ARG5);
|
Yap_addclause(t, code_adr, t1, mod, &ARG5);
|
||||||
YAPLeaveCriticalSection();
|
YAPLeaveCriticalSection();
|
||||||
}
|
}
|
||||||
if (LOCAL_ErrorMessage) {
|
if (LOCAL_ErrorMessage) {
|
||||||
@ -4486,8 +4484,7 @@ static bool pred_flag_clause(Functor f, Term mod, const char *name,
|
|||||||
if (LOCAL_ErrorMessage) {
|
if (LOCAL_ErrorMessage) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
addclause(tn, code_adr, assertz, mod, NULL);
|
return Yap_addclause(tn, code_adr, TermAssertz, mod, NULL);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pred_entry *Yap_MkLogPred(struct pred_entry *pe) {
|
struct pred_entry *Yap_MkLogPred(struct pred_entry *pe) {
|
||||||
|
@ -754,7 +754,7 @@ void *YAPPrologPredicate::assertClause( YAPTerm clause, bool last, YAPTerm sourc
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Term *tref = &ntt;
|
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();
|
RECOVER_MACHINE_REGS();
|
||||||
}
|
}
|
||||||
return tref;
|
return tref;
|
||||||
|
@ -125,7 +125,7 @@ struct pred_entry *Yap_PredForChoicePt(choiceptr bptr, op_numbers *op);
|
|||||||
void Yap_InitCdMgr(void);
|
void Yap_InitCdMgr(void);
|
||||||
struct pred_entry *Yap_PredFromClause(Term t USES_REGS);
|
struct pred_entry *Yap_PredFromClause(Term t USES_REGS);
|
||||||
bool Yap_discontiguous(struct pred_entry *ap, Term mode 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_init_consult(int, const char *);
|
||||||
void Yap_end_consult(void);
|
void Yap_end_consult(void);
|
||||||
void Yap_Abolish(struct pred_entry *);
|
void Yap_Abolish(struct pred_entry *);
|
||||||
|
@ -280,7 +280,7 @@ void Yap_InitComma(void);
|
|||||||
|
|
||||||
/* cdmgr.c */
|
/* cdmgr.c */
|
||||||
void Yap_IPred(PredEntry *, UInt, yamop *);
|
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_add_logupd_clause(PredEntry *, LogUpdClause *, int);
|
||||||
void Yap_kill_iblock(ClauseUnion *, ClauseUnion *, PredEntry *);
|
void Yap_kill_iblock(ClauseUnion *, ClauseUnion *, PredEntry *);
|
||||||
void Yap_EraseStaticClause(StaticClause *, PredEntry *, Term);
|
void Yap_EraseStaticClause(StaticClause *, PredEntry *, Term);
|
||||||
|
Reference in New Issue
Block a user