Merge ssh://ssh.dcc.fc.up.pt:31064//home/vsc/yap
This commit is contained in:
@@ -395,8 +395,9 @@ void Yap_InitHeap(void *heap_addr) {
|
||||
#if HAVE_MALLINFO
|
||||
struct mallinfo mi = mallinfo();
|
||||
return mi.uordblks - (LOCAL_TrailTop-LOCAL_GlobalBase);
|
||||
#endif
|
||||
#else
|
||||
return Yap_ClauseSpace+Yap_IndexSpace_Tree+Yap_LUClauseSpace+Yap_LUIndexSpace_CP;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void InitExStacks(int wid, int Trail, int Stack) {
|
||||
|
@@ -173,7 +173,9 @@ eval0(Int fi) {
|
||||
}
|
||||
case op_heapused:
|
||||
/// - heapused
|
||||
/// Heap (data-base) space used, in bytes.
|
||||
/// Heap (data-base) space used, in bytes. In fact YAP either reports
|
||||
/// the total memory malloced, or the amount of allocated space in
|
||||
/// predicates.
|
||||
///
|
||||
RINT(Yap_HeapUsed());
|
||||
case op_localsp:
|
||||
|
236
C/cdmgr.c
236
C/cdmgr.c
@@ -32,10 +32,10 @@ static char SccsId[] = "@(#)cdmgr.c 1.1 05/02/98";
|
||||
#if HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include <Yatom.h>
|
||||
#include <assert.h>
|
||||
#include <heapgc.h>
|
||||
#include <iopreds.h>
|
||||
#include <Yatom.h>
|
||||
|
||||
static void retract_all(PredEntry *, int);
|
||||
static void add_first_static(PredEntry *, yamop *, int);
|
||||
@@ -85,7 +85,7 @@ static void InitConsultStack(void) {
|
||||
LOCAL_ConsultCapacity = InitialConsultCapacity;
|
||||
LOCAL_ConsultBase = LOCAL_ConsultSp =
|
||||
LOCAL_ConsultLow + LOCAL_ConsultCapacity;
|
||||
}
|
||||
s
|
||||
|
||||
void Yap_ResetConsultStack(void) {
|
||||
CACHE_REGS
|
||||
@@ -1386,7 +1386,7 @@ static void expand_consult(void) {
|
||||
new_cs = new_cl + InitialConsultCapacity;
|
||||
/* start copying */
|
||||
memmove((void *)new_cs, (void *)LOCAL_ConsultLow,
|
||||
OldConsultCapacity * sizeof(consult_obj));
|
||||
OldConsultCapacity * sizeof(consult_obj));
|
||||
/* copying done, release old space */
|
||||
Yap_FreeCodeSpace((char *)LOCAL_ConsultLow);
|
||||
/* next, set up pointers correctly */
|
||||
@@ -1452,33 +1452,36 @@ static int not_was_reconsulted(PredEntry *p, Term t, int mode) {
|
||||
return TRUE; /* careful */
|
||||
}
|
||||
|
||||
static yamop * addcl_permission_error(const char *file, const char *function, int lineno, AtomEntry *ap, Int Arity, int in_use) {
|
||||
static yamop *addcl_permission_error(const char *file, const char *function,
|
||||
int lineno, AtomEntry *ap, Int Arity,
|
||||
int in_use) {
|
||||
CACHE_REGS
|
||||
Term culprit;
|
||||
if (Arity == 0)
|
||||
culprit = MkAtomTerm(AbsAtom(ap));
|
||||
else
|
||||
culprit = Yap_MkNewApplTerm(Yap_MkFunctor(AbsAtom(ap),Arity), Arity);
|
||||
return
|
||||
(in_use ?
|
||||
(Arity == 0 ?
|
||||
Yap_Error__(false, file, function, lineno, PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, culprit,
|
||||
"static predicate %s is in use", ap->StrOfAE)
|
||||
:
|
||||
Yap_Error__(false, file, function, lineno, PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, culprit,
|
||||
"static predicate %s/" Int_FORMAT " is in use", ap->StrOfAE, Arity)
|
||||
)
|
||||
:
|
||||
(Arity == 0 ?
|
||||
Yap_Error__(false, file, function, lineno, PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, culprit,
|
||||
"system predicate %s is in use", ap->StrOfAE)
|
||||
:
|
||||
Yap_Error__(false, file, function, lineno, PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, culprit,
|
||||
"system predicate %s/" Int_FORMAT, ap->StrOfAE, Arity)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Term culprit;
|
||||
if (Arity == 0)
|
||||
culprit = MkAtomTerm(AbsAtom(ap));
|
||||
else
|
||||
culprit = Yap_MkNewApplTerm(Yap_MkFunctor(AbsAtom(ap), Arity), Arity);
|
||||
return (in_use
|
||||
? (Arity == 0
|
||||
? Yap_Error__(false, file, function, lineno,
|
||||
PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE,
|
||||
culprit, "static predicate %s is in use",
|
||||
ap->StrOfAE)
|
||||
: Yap_Error__(
|
||||
false, file, function, lineno,
|
||||
PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, culprit,
|
||||
"static predicate %s/" Int_FORMAT " is in use",
|
||||
ap->StrOfAE, Arity))
|
||||
: (Arity == 0
|
||||
? Yap_Error__(false, file, function, lineno,
|
||||
PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE,
|
||||
culprit, "system predicate %s is in use",
|
||||
ap->StrOfAE)
|
||||
: Yap_Error__(false, file, function, lineno,
|
||||
PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE,
|
||||
culprit, "system predicate %s/" Int_FORMAT,
|
||||
ap->StrOfAE, Arity)));
|
||||
}
|
||||
|
||||
PredEntry *Yap_PredFromClause(Term t USES_REGS) {
|
||||
Term cmod = LOCAL_SourceModule;
|
||||
@@ -1649,7 +1652,7 @@ Atom Yap_source_file_name(void) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief we cannot add clauses to the proceduree
|
||||
* @brief we cannot add clauses to the procedure
|
||||
*
|
||||
* @param p predicate
|
||||
*
|
||||
@@ -1737,7 +1740,8 @@ bool Yap_addclause(Term t, yamop *cp, Term tmode, Term mod, Term *t4ref)
|
||||
PELOCK(20, p);
|
||||
/* we are redefining a prolog module predicate */
|
||||
if (Yap_constPred(p)) {
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), Arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), Arity,
|
||||
FALSE);
|
||||
UNLOCKPE(30, p);
|
||||
return false;
|
||||
}
|
||||
@@ -1767,7 +1771,8 @@ bool Yap_addclause(Term t, yamop *cp, Term tmode, Term mod, Term *t4ref)
|
||||
disc[2] = Yap_Module_Name(p);
|
||||
sc[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomDiscontiguous, 3), 3, disc);
|
||||
sc[1] = MkIntegerTerm(Yap_source_line_no());
|
||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "source %s ", RepAtom(LOCAL_SourceFileName)->StrOfAE);
|
||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "source %s ",
|
||||
RepAtom(LOCAL_SourceFileName)->StrOfAE);
|
||||
sc[2] = MkAtomTerm(LOCAL_SourceFileName);
|
||||
sc[3] = t;
|
||||
t = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 4), 4, sc);
|
||||
@@ -2043,7 +2048,7 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */
|
||||
Yap_addclause(t, code_adr, t1, mod, &ARG5);
|
||||
YAPLeaveCriticalSection();
|
||||
}
|
||||
if (LOCAL_ErrorMessage ) {
|
||||
if (LOCAL_ErrorMessage) {
|
||||
Yap_Error(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage);
|
||||
YAPLeaveCriticalSection();
|
||||
return false;
|
||||
@@ -2435,12 +2440,14 @@ static Int new_multifile(USES_REGS1) {
|
||||
}
|
||||
if (pe->PredFlags & (TabledPredFlag | ForeignPredFlags)) {
|
||||
UNLOCKPE(26, pe);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__,RepAtom(at), arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity,
|
||||
FALSE);
|
||||
return false;
|
||||
}
|
||||
if (pe->cs.p_code.NOfClauses) {
|
||||
UNLOCKPE(26, pe);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__,RepAtom(at), arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity,
|
||||
FALSE);
|
||||
return false;
|
||||
}
|
||||
pe->PredFlags &= ~UndefPredFlag;
|
||||
@@ -2674,7 +2681,8 @@ static Int mk_dynamic(USES_REGS1) { /* '$make_dynamic'(+P) */
|
||||
(UserCPredFlag | CArgsPredFlag | NumberDBPredFlag | AtomDBPredFlag |
|
||||
TestPredFlag | AsmPredFlag | CPredFlag | BinaryPredFlag)) {
|
||||
UNLOCKPE(30, pe);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__,RepAtom(at), arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity,
|
||||
FALSE);
|
||||
return false;
|
||||
}
|
||||
if (pe->PredFlags & LogUpdatePredFlag) {
|
||||
@@ -2687,7 +2695,8 @@ static Int mk_dynamic(USES_REGS1) { /* '$make_dynamic'(+P) */
|
||||
}
|
||||
if (pe->cs.p_code.NOfClauses != 0) {
|
||||
UNLOCKPE(26, pe);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity,
|
||||
FALSE);
|
||||
return false;
|
||||
}
|
||||
if (pe->OpcodeOfPred == UNDEF_OPCODE) {
|
||||
@@ -2737,7 +2746,8 @@ static Int new_meta_pred(USES_REGS1) {
|
||||
}
|
||||
if (pe->cs.p_code.NOfClauses) {
|
||||
UNLOCKPE(26, pe);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity, FALSE);
|
||||
addcl_permission_error(__FILE__, __FUNCTION__, __LINE__, RepAtom(at), arity,
|
||||
FALSE);
|
||||
return false;
|
||||
}
|
||||
pe->PredFlags |= MetaPredFlag;
|
||||
@@ -3081,75 +3091,101 @@ static Int p_clean_up_dead_clauses(USES_REGS1) {
|
||||
|
||||
void Yap_HidePred(PredEntry *pe) {
|
||||
|
||||
if (pe->PredFlags & HiddenPredFlag)
|
||||
return;
|
||||
pe->PredFlags |= (HiddenPredFlag | NoSpyPredFlag | NoTracePredFlag);
|
||||
char newMod[1024];
|
||||
strncpy(newMod, "$$$--hidden-module--",1023);
|
||||
Term cmod = pe->ModuleOfPred;
|
||||
if (cmod == PROLOG_MODULE)
|
||||
strncat(newMod, "prolog", 1023-strlen(newMod));
|
||||
else
|
||||
strncat(newMod, RepAtom(AtomOfTerm(cmod))->StrOfAE, 1023-strlen(newMod));
|
||||
pe->ModuleOfPred = MkAtomTerm(Yap_LookupAtom(newMod));
|
||||
}
|
||||
if (pe->NextOfPE) {
|
||||
UInt hash = PRED_HASH(pe->FunctorOfPred, CurrentModule, PredHashTableSize);
|
||||
READ_LOCK(PredHashRWLock);
|
||||
PredEntry *p, **op = PredHash+hash;
|
||||
p = *op;
|
||||
|
||||
static Int /* $system_predicate(P) */
|
||||
p_stash_predicate(USES_REGS1) {
|
||||
PredEntry *pe;
|
||||
while (p) {
|
||||
if (p == pe) {
|
||||
*op = p->NextPredOfHash;
|
||||
break;
|
||||
}
|
||||
op = &p->NextPredOfHash;
|
||||
p = p->NextPredOfHash;
|
||||
}
|
||||
pe->NextPredOfHash = NULL;
|
||||
}
|
||||
{
|
||||
Prop *op, p;
|
||||
if (pe->ArityOfPE == 0) {
|
||||
op = &RepAtom(AtomOfTerm((Term)(pe->FunctorOfPred)))->PropsOfAE;
|
||||
} else {
|
||||
op = &pe->FunctorOfPred->PropsOfFE;
|
||||
}
|
||||
p = *op;
|
||||
|
||||
pe = Yap_get_pred(Deref(ARG1), Deref(ARG2), "stash_predicate/1");
|
||||
while (p) {
|
||||
if (p == AbsPredProp(pe)) {
|
||||
*op = p->NextOfPE;
|
||||
break;
|
||||
}
|
||||
op = &p->NextOfPE;
|
||||
p = p->NextOfPE;
|
||||
}
|
||||
pe->NextOfPE = RepAtom(AtomFoundVar)->PropsOfAE;
|
||||
RepAtom(AtomFoundVar)->PropsOfAE = AbsPredProp(pe);
|
||||
}
|
||||
|
||||
if (pe && !(pe->PredFlags & SystemPredFlags)) Yap_HidePred(pe);
|
||||
return TRUE;
|
||||
}
|
||||
{
|
||||
PredEntry *p,
|
||||
**op = &Yap_GetModuleEntry(Yap_Module(pe->ModuleOfPred))->PredForME;
|
||||
p = *op;
|
||||
|
||||
static Int /* $system_predicate(P) */
|
||||
hide_predicate(USES_REGS1) {
|
||||
PredEntry *pe;
|
||||
|
||||
pe = Yap_get_pred(Deref(ARG1), Deref(ARG2), "hide_predicate/1");
|
||||
|
||||
if (pe) Yap_HidePred(pe);
|
||||
return TRUE;
|
||||
while (p) {
|
||||
if (p == pe) {
|
||||
*op = p->NextPredOfModule;
|
||||
break;
|
||||
}
|
||||
op = &p->NextPredOfModule;
|
||||
p = p->NextPredOfModule;
|
||||
}
|
||||
pe->NextPredOfModule = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static Int /* $hidden_predicate(P) */
|
||||
p_hidden_predicate(USES_REGS1) {
|
||||
PredEntry *pe;
|
||||
|
||||
Term t1 = Deref(ARG1);
|
||||
Term mod = Deref(ARG2);
|
||||
|
||||
restart_system_pred:
|
||||
if (IsVarTerm(t1))
|
||||
return (FALSE);
|
||||
if (IsAtomTerm(t1)) {
|
||||
pe = RepPredProp(Yap_GetPredPropByAtom(AtomOfTerm(t1), mod));
|
||||
} else if (IsApplTerm(t1)) {
|
||||
Functor funt = FunctorOfTerm(t1);
|
||||
if (IsExtensionFunctor(funt)) {
|
||||
return (FALSE);
|
||||
}
|
||||
if (funt == FunctorModule) {
|
||||
Term nmod = ArgOfTerm(1, t1);
|
||||
if (IsVarTerm(nmod)) {
|
||||
Yap_Error(INSTANTIATION_ERROR, ARG1, "hide_predicate/1");
|
||||
return (FALSE);
|
||||
}
|
||||
if (!IsAtomTerm(nmod)) {
|
||||
Yap_Error(TYPE_ERROR_ATOM, ARG1, "hide_predicate/1");
|
||||
return (FALSE);
|
||||
}
|
||||
t1 = ArgOfTerm(2, t1);
|
||||
goto restart_system_pred;
|
||||
}
|
||||
pe = RepPredProp(Yap_GetPredPropByFunc(funt, mod));
|
||||
} else if (IsPairTerm(t1)) {
|
||||
return (TRUE);
|
||||
hide_predicate(USES_REGS1) {
|
||||
PredEntry *pe =
|
||||
Yap_get_pred(Deref(ARG1), Deref(ARG2), "while checking for a procedure");
|
||||
if (pe) {
|
||||
Yap_HidePred(pe);
|
||||
return true;
|
||||
} else
|
||||
return (FALSE);
|
||||
if (EndOfPAEntr(pe))
|
||||
return (FALSE);
|
||||
return (pe->PredFlags & HiddenPredFlag);
|
||||
return false;
|
||||
}
|
||||
|
||||
static Int /* $hidden_predicate(P) */
|
||||
stash_predicate(USES_REGS1) {
|
||||
PredEntry *pe =
|
||||
Yap_get_pred(Deref(ARG1), Deref(ARG2), "while checking for a procedure");
|
||||
if (pe) {
|
||||
pe->PredFlags |= (HiddenPredFlag | NoSpyPredFlag | NoTracePredFlag);
|
||||
/*
|
||||
char ns[1024];
|
||||
const char *s = (pe->ModuleOfPred == PROLOG_MODULE ?
|
||||
"__prolog__stash__" :
|
||||
snprintf(sn,1023,"__%s__".RepAtom(AtomOfTerm( pe->ModuleOfPred ))));
|
||||
pe->ModuleOfPred = MkAtomTerm(Yap_LookupAtom(s));
|
||||
*/
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static Int /* $hidden_predicate(P) */
|
||||
hidden_predicate(USES_REGS1) {
|
||||
PredEntry *pe =
|
||||
Yap_get_pred(Deref(ARG1), Deref(ARG2), "while checking for a procedure");
|
||||
if (pe)
|
||||
return (pe->PredFlags & HiddenPredFlag);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static Int fetch_next_lu_clause(PredEntry *pe, yamop *i_code, Term th, Term tb,
|
||||
@@ -4740,8 +4776,8 @@ void Yap_InitCdMgr(void) {
|
||||
Yap_InitCPred("$set_pred_module", 2, p_set_pred_module, SafePredFlag);
|
||||
Yap_InitCPred("$set_pred_owner", 2, p_set_pred_owner, SafePredFlag);
|
||||
Yap_InitCPred("$hide_predicate", 2, hide_predicate, SafePredFlag);
|
||||
Yap_InitCPred("$stash_predicate", 2, p_stash_predicate, SafePredFlag);
|
||||
Yap_InitCPred("$hidden_predicate", 2, p_hidden_predicate, SafePredFlag);
|
||||
Yap_InitCPred("$stash_predicate", 2, stash_predicate, SafePredFlag);
|
||||
Yap_InitCPred("$hidden_predicate", 2, hidden_predicate, SafePredFlag);
|
||||
Yap_InitCPred("$log_update_clause", 4, p_log_update_clause, SyncPredFlag);
|
||||
Yap_InitCPred("$continue_log_update_clause", 5, p_continue_log_update_clause,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
|
Reference in New Issue
Block a user