compile ground terms away.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1975 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2007-11-06 17:02:13 +00:00
parent 025dd6214f
commit a5f5f4c237
24 changed files with 855 additions and 157 deletions

103
C/absmi.c
View File

@ -10,8 +10,11 @@
* * * *
* File: absmi.c * * File: absmi.c *
* comments: Portable abstract machine interpreter * * comments: Portable abstract machine interpreter *
* Last rev: $Date: 2007-10-28 11:23:39 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:08 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.227 2007/10/28 11:23:39 vsc
* fix overflow
*
* Revision 1.226 2007/10/28 00:54:09 vsc * Revision 1.226 2007/10/28 00:54:09 vsc
* new version of viterbi implementation * new version of viterbi implementation
* fix all:atvars reporting bad info * fix all:atvars reporting bad info
@ -4311,6 +4314,42 @@ Yap_absmi(int inp)
FAIL(); FAIL();
#endif #endif
ENDOp(); ENDOp();
Op(get_dbterm, xc);
BEGD(d0);
d0 = XREG(PREG->u.xc.x);
deref_head(d0, gdbterm_unk);
gdbterm_nonvar:
BEGD(d1);
/* we have met a preexisting dbterm */
d1 = XREG(PREG->u.xc.c);
PREG = NEXTOP(PREG, xc);
UnifyBound(d0,d1);
ENDD(d1);
BEGP(pt0);
deref_body(d0, pt0, gdbterm_unk, gdbterm_nonvar);
/* Enter Write mode */
/* set d1 to be the new structure we are going to create */
START_PREFETCH(xc);
BEGD(d1);
d1 = PREG->u.xc.c;
PREG = NEXTOP(PREG, xc);
BIND(pt0, d1, bind_gdbterm);
#ifdef COROUTINING
DO_TRAIL(pt0, d1);
if (pt0 < H0) Yap_WakeUp(pt0);
bind_gdbterm:
#endif
GONext();
ENDD(d1);
END_PREFETCH();
ENDP(pt0);
ENDD(d0);
ENDOp();
/************************************************************************\ /************************************************************************\
* Optimised Get List Instructions * * Optimised Get List Instructions *
@ -6340,7 +6379,7 @@ Yap_absmi(int inp)
derefa_body(d0, pt0, ubigint_unk, ubigint_nonvar); derefa_body(d0, pt0, ubigint_unk, ubigint_nonvar);
BEGD(d1); BEGD(d1);
d1 = AbsAppl(PREG->u.oi.i); d1 = PREG->u.oc.c;
PREG = NEXTOP(PREG, oi); PREG = NEXTOP(PREG, oi);
BIND_GLOBAL(pt0, d1, bind_ubigint); BIND_GLOBAL(pt0, d1, bind_ubigint);
#ifdef COROUTINING #ifdef COROUTINING
@ -6402,6 +6441,66 @@ Yap_absmi(int inp)
#endif #endif
ENDOp(); ENDOp();
Op(unify_dbterm, oc);
BEGD(d0);
BEGP(pt0);
pt0 = SREG++;
d0 = *pt0;
deref_head(d0, udbterm_unk);
udbterm_nonvar:
BEGD(d1);
/* we have met a preexisting dbterm */
d1 = XREG(PREG->u.oc.c);
PREG = NEXTOP(PREG, oc);
UnifyBound(d0,d1);
ENDD(d1);
derefa_body(d0, pt0, udbterm_unk, udbterm_nonvar);
BEGD(d1);
d1 = AbsAppl(PREG->u.oi.i);
PREG = NEXTOP(PREG, oi);
BIND_GLOBAL(pt0, d1, bind_udbterm);
#ifdef COROUTINING
DO_TRAIL(pt0, d1);
if (pt0 < H0) Yap_WakeUp(pt0);
bind_udbterm:
#endif
GONext();
ENDD(d1);
ENDP(pt0);
ENDD(d0);
ENDOp();
Op(unify_l_dbterm, oc);
BEGD(d0);
CACHE_S();
READ_IN_S();
d0 = *S_SREG;
deref_head(d0, uldbterm_unk);
uldbterm_nonvar:
BEGD(d1);
/* we have met a preexisting dbterm */
d1 = XREG(PREG->u.oc.c);
PREG = NEXTOP(PREG, oc);
UnifyBound(d0,d1);
ENDD(d1);
derefa_body(d0, S_SREG, uldbterm_unk, uldbterm_nonvar);
BEGD(d1);
d1 = PREG->u.oc.c;
PREG = NEXTOP(PREG, oc);
BIND_GLOBAL(S_SREG, d1, bind_uldbterm);
#ifdef COROUTINING
DO_TRAIL(S_SREG, d1);
if (S_SREG < H0) Yap_WakeUp(S_SREG);
bind_uldbterm:
#endif
GONext();
ENDD(d1);
ENDCACHE_S();
ENDD(d0);
ENDOp();
OpW(unify_list_write, o); OpW(unify_list_write, o);
PREG = NEXTOP(PREG, o); PREG = NEXTOP(PREG, o);
BEGD(d0); BEGD(d0);

View File

@ -558,7 +558,7 @@ Yap_GetExpPropHavingLock(AtomEntry *ae, unsigned int arity)
return (p0); return (p0);
} }
static void static int
ExpandPredHash(void) ExpandPredHash(void)
{ {
UInt new_size = PredHashTableSize+PredHashIncrement; UInt new_size = PredHashTableSize+PredHashIncrement;
@ -567,7 +567,7 @@ ExpandPredHash(void)
UInt i; UInt i;
if (!np) { if (!np) {
Yap_Error(FATAL_ERROR,TermNil,"Could not allocate space for pred table"); return FALSE;
} }
for (i = 0; i < new_size; i++) { for (i = 0; i < new_size; i++) {
np[i] = NULL; np[i] = NULL;
@ -586,6 +586,7 @@ ExpandPredHash(void)
PredHashTableSize = new_size; PredHashTableSize = new_size;
PredHash = np; PredHash = np;
Yap_FreeAtomSpace((ADDR)oldp); Yap_FreeAtomSpace((ADDR)oldp);
return TRUE;
} }
/* fe is supposed to be locked */ /* fe is supposed to be locked */
@ -594,6 +595,44 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod)
{ {
PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p));
if (p == NULL) {
WRITE_UNLOCK(fe->FRWLock);
return NULL;
}
if (fe->PropsOfFE) {
UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize);
WRITE_LOCK(PredHashRWLock);
if (10*(PredsInHashTable+1) > 6*PredHashTableSize) {
if (!ExpandPredHash()) {
Yap_FreeCodeSpace((ADDR)p);
WRITE_UNLOCK(PredHashRWLock);
WRITE_UNLOCK(fe->FRWLock);
return NULL;
}
/* retry hashing */
hsh = PRED_HASH(fe, cur_mod, PredHashTableSize);
}
PredsInHashTable++;
if (p->ModuleOfPred == 0L) {
PredEntry *pe = RepPredProp(fe->PropsOfFE);
hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize);
/* should be the first one */
pe->NextOfPE = AbsPredProp(PredHash[hsh]);
PredHash[hsh] = pe;
fe->PropsOfFE = AbsPredProp(p);
} else {
p->NextOfPE = AbsPredProp(PredHash[hsh]);
PredHash[hsh] = p;
}
WRITE_UNLOCK(PredHashRWLock);
/* make sure that we have something here */
RepPredProp(fe->PropsOfFE)->NextOfPE = fe->PropsOfFE;
} else {
fe->PropsOfFE = AbsPredProp(p);
p->NextOfPE = NIL;
}
INIT_RWLOCK(p->PRWLock); INIT_RWLOCK(p->PRWLock);
INIT_LOCK(p->PELock); INIT_LOCK(p->PELock);
p->KindOfPE = PEProp; p->KindOfPE = PEProp;
@ -630,33 +669,6 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod)
} }
} }
p->FunctorOfPred = fe; p->FunctorOfPred = fe;
if (fe->PropsOfFE) {
UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize);
WRITE_LOCK(PredHashRWLock);
if (p->ModuleOfPred == 0L) {
PredEntry *pe = RepPredProp(fe->PropsOfFE);
hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize);
/* should be the first one */
pe->NextOfPE = AbsPredProp(PredHash[hsh]);
PredHash[hsh] = pe;
fe->PropsOfFE = AbsPredProp(p);
} else {
p->NextOfPE = AbsPredProp(PredHash[hsh]);
PredHash[hsh] = p;
}
PredsInHashTable++;
if (10*PredsInHashTable > 6*PredHashTableSize) {
ExpandPredHash();
}
WRITE_UNLOCK(PredHashRWLock);
/* make sure that we have something here */
RepPredProp(fe->PropsOfFE)->NextOfPE = fe->PropsOfFE;
} else {
fe->PropsOfFE = AbsPredProp(p);
p->NextOfPE = NIL;
}
WRITE_UNLOCK(fe->FRWLock); WRITE_UNLOCK(fe->FRWLock);
#ifdef LOW_PROF #ifdef LOW_PROF
if (ProfilerOn && if (ProfilerOn &&

View File

@ -147,6 +147,7 @@ AtomAdjust(Atom a)
#define PtoOpAdjust(P) (P) #define PtoOpAdjust(P) (P)
#define PtoLUClauseAdjust(P) (P) #define PtoLUClauseAdjust(P) (P)
#define PtoLUIndexAdjust(P) (P) #define PtoLUIndexAdjust(P) (P)
#define PtoDBTLAdjust(P) (P)
#define PtoPredAdjust(P) (P) #define PtoPredAdjust(P) (P)
#define PropAdjust(P) (P) #define PropAdjust(P) (P)
#define TrailAddrAdjust(P) (P) #define TrailAddrAdjust(P) (P)

113
C/amasm.c
View File

@ -11,8 +11,11 @@
* File: amasm.c * * File: amasm.c *
* comments: abstract machine assembler * * comments: abstract machine assembler *
* * * *
* Last rev: $Date: 2007-06-23 17:31:50 $ * * Last rev: $Date: 2007-11-06 17:02:09 $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.95 2007/06/23 17:31:50 vsc
* pin cluses with floats.
*
* Revision 1.94 2006/12/27 01:32:37 vsc * Revision 1.94 2006/12/27 01:32:37 vsc
* diverse fixes * diverse fixes
* *
@ -237,7 +240,7 @@ STATIC_PROTO(yamop *a_xigl, (op_numbers, yamop *, int, struct PSEUDO *));
STATIC_PROTO(yamop *a_ucons, (int *, compiler_vm_op, yamop *, int, struct intermediates *)); STATIC_PROTO(yamop *a_ucons, (int *, compiler_vm_op, yamop *, int, struct intermediates *));
STATIC_PROTO(yamop *a_uvar, (yamop *, int, struct intermediates *)); STATIC_PROTO(yamop *a_uvar, (yamop *, int, struct intermediates *));
STATIC_PROTO(yamop *a_wvar, (yamop *, int, struct intermediates *)); STATIC_PROTO(yamop *a_wvar, (yamop *, int, struct intermediates *));
STATIC_PROTO(yamop *do_pass, (int, yamop **, int, int *, struct intermediates *, UInt)); STATIC_PROTO(yamop *do_pass, (int, yamop **, int, int *, int *,struct intermediates *, UInt));
#ifdef DEBUG_OPCODES #ifdef DEBUG_OPCODES
STATIC_PROTO(void DumpOpCodes, (void)); STATIC_PROTO(void DumpOpCodes, (void));
#endif #endif
@ -439,6 +442,14 @@ add_clref(CELL clause_code, int pass_no)
} }
} }
static void
add_to_dbtermsl(struct intermediates *cip, Term t)
{
DBTerm *dbt = TermToDBTerm(t);
dbt->ag.NextDBT = cip->dbterml->dbterms;
cip->dbterml->dbterms = dbt;
}
static yamop * static yamop *
a_lucl(op_numbers opcode, yamop *code_p, int pass_no, struct intermediates *cip, clause_info *cla) a_lucl(op_numbers opcode, yamop *code_p, int pass_no, struct intermediates *cip, clause_info *cla)
{ {
@ -809,6 +820,19 @@ a_blob(CELL rnd1, op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int
return code_p; return code_p;
} }
inline static yamop *
a_wdbt(CELL rnd1, op_numbers opcode, int *clause_has_dbtermp, yamop *code_p, int pass_no, struct intermediates *cip)
{
if (pass_no) {
code_p->opc = emit_op(opcode);
code_p->u.c.c = rnd1;
add_to_dbtermsl(cip, cip->cpc->rnd1);
}
*clause_has_dbtermp = TRUE;
GONEXT(c);
return code_p;
}
inline static yamop * inline static yamop *
a_ublob(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip) a_ublob(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip)
{ {
@ -824,6 +848,20 @@ a_ublob(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_blobs
return code_p; return code_p;
} }
inline static yamop *
a_udbt(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_dbtermp, yamop *code_p, int pass_no, struct intermediates *cip)
{
if (pass_no) {
code_p->opc = emit_op(opcode);
code_p->u.oc.opcw = emit_op(opcode_w);
code_p->u.oc.c = cip->cpc->rnd1;
add_to_dbtermsl(cip, cip->cpc->rnd1);
}
*clause_has_dbtermp = TRUE;
GONEXT(oc);
return code_p;
}
inline static yamop * inline static yamop *
a_ud(op_numbers opcode, op_numbers opcode_w, yamop *code_p, int pass_no, struct PSEUDO *cpc) a_ud(op_numbers opcode, op_numbers opcode_w, yamop *code_p, int pass_no, struct PSEUDO *cpc)
{ {
@ -1050,6 +1088,20 @@ a_rb(op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int pass_no, stru
return code_p; return code_p;
} }
inline static yamop *
a_dbt(op_numbers opcode, int *clause_has_dbtermp, yamop *code_p, int pass_no, struct intermediates *cip)
{
if (pass_no) {
code_p->opc = emit_op(opcode);
code_p->u.xc.x = emit_x(cip->cpc->rnd2);
code_p->u.xc.c = cip->cpc->rnd1;
add_to_dbtermsl(cip, cip->cpc->rnd1);
}
*clause_has_dbtermp = TRUE;
GONEXT(xc);
return code_p;
}
inline static yamop * inline static yamop *
a_rli(op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip) a_rli(op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip)
{ {
@ -2631,7 +2683,7 @@ a_f2(int var, cmp_op_info *cmp_info, yamop *code_p, int pass_no, struct intermed
#endif /* YAPOR */ #endif /* YAPOR */
static yamop * static yamop *
do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp, struct intermediates *cip, UInt size) do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp, int *clause_has_dbtermp, struct intermediates *cip, UInt size)
{ {
#ifdef YAPOR #ifdef YAPOR
#define EITHER_INST 50 #define EITHER_INST 50
@ -2687,6 +2739,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
if (*clause_has_blobsp) { if (*clause_has_blobsp) {
cl_u->luc.ClFlags |= HasBlobsMask; cl_u->luc.ClFlags |= HasBlobsMask;
} }
if (*clause_has_dbtermp) {
cl_u->luc.ClFlags |= HasDBTMask;
}
cl_u->luc.ClExt = NULL; cl_u->luc.ClExt = NULL;
cl_u->luc.ClPrev = cl_u->luc.ClNext = NULL; cl_u->luc.ClPrev = cl_u->luc.ClNext = NULL;
#if defined(YAPOR) || defined(THREADS) #if defined(YAPOR) || defined(THREADS)
@ -2701,6 +2756,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
if (*clause_has_blobsp) { if (*clause_has_blobsp) {
cl_u->ic.ClFlags |= HasBlobsMask; cl_u->ic.ClFlags |= HasBlobsMask;
} }
if (*clause_has_dbtermp) {
cl_u->ic.ClFlags |= HasDBTMask;
}
cl_u->ic.ClSize = size; cl_u->ic.ClSize = size;
cl_u->ic.ClRefCount = 0; cl_u->ic.ClRefCount = 0;
#if defined(YAPOR) || defined(THREADS) #if defined(YAPOR) || defined(THREADS)
@ -2719,6 +2777,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
if (*clause_has_blobsp) { if (*clause_has_blobsp) {
cl_u->sc.ClFlags |= HasBlobsMask; cl_u->sc.ClFlags |= HasBlobsMask;
} }
if (*clause_has_dbtermp) {
cl_u->sc.ClFlags |= HasDBTMask;
}
} }
code_p = cl_u->sc.ClCode; code_p = cl_u->sc.ClCode;
} }
@ -2869,6 +2930,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case get_bigint_op: case get_bigint_op:
code_p = a_rb(_get_bigint, clause_has_blobsp, code_p, pass_no, cip); code_p = a_rb(_get_bigint, clause_has_blobsp, code_p, pass_no, cip);
break; break;
case get_dbterm_op:
code_p = a_dbt(_get_dbterm, clause_has_dbtermp, code_p, pass_no, cip);
break;
case put_num_op: case put_num_op:
case put_atom_op: case put_atom_op:
code_p = a_rc(_put_atom, code_p, pass_no, cip); code_p = a_rc(_put_atom, code_p, pass_no, cip);
@ -2884,6 +2948,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case put_bigint_op: case put_bigint_op:
code_p = a_rb(_put_atom, clause_has_blobsp, code_p, pass_no, cip); code_p = a_rb(_put_atom, clause_has_blobsp, code_p, pass_no, cip);
break; break;
case put_dbterm_op:
code_p = a_dbt(_put_atom, clause_has_dbtermp, code_p, pass_no, cip);
break;
case get_list_op: case get_list_op:
code_p = a_glist(&do_not_optimise_uatom, code_p, pass_no, cip); code_p = a_glist(&do_not_optimise_uatom, code_p, pass_no, cip);
break; break;
@ -2941,6 +3008,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case unify_bigint_op: case unify_bigint_op:
code_p = a_ublob(cip->cpc->rnd1, _unify_bigint, _unify_atom_write, clause_has_blobsp, code_p, pass_no, cip); code_p = a_ublob(cip->cpc->rnd1, _unify_bigint, _unify_atom_write, clause_has_blobsp, code_p, pass_no, cip);
break; break;
case unify_dbterm_op:
code_p = a_udbt(cip->cpc->rnd1, _unify_dbterm, _unify_atom_write, clause_has_dbtermp, code_p, pass_no, cip);
break;
case unify_last_num_op: case unify_last_num_op:
case unify_last_atom_op: case unify_last_atom_op:
code_p = a_uc(cip->cpc->rnd1, _unify_l_atom, _unify_l_atom_write, code_p, pass_no); code_p = a_uc(cip->cpc->rnd1, _unify_l_atom, _unify_l_atom_write, code_p, pass_no);
@ -2956,6 +3026,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case unify_last_bigint_op: case unify_last_bigint_op:
code_p = a_ublob(cip->cpc->rnd1, _unify_l_bigint, _unify_l_atom_write, clause_has_blobsp, code_p, pass_no, cip); code_p = a_ublob(cip->cpc->rnd1, _unify_l_bigint, _unify_l_atom_write, clause_has_blobsp, code_p, pass_no, cip);
break; break;
case unify_last_dbterm_op:
code_p = a_udbt(cip->cpc->rnd1, _unify_l_dbterm, _unify_l_atom_write, clause_has_dbtermp, code_p, pass_no, cip);
break;
case write_num_op: case write_num_op:
case write_atom_op: case write_atom_op:
code_p = a_ucons(&do_not_optimise_uatom, write_atom_op, code_p, pass_no, cip); code_p = a_ucons(&do_not_optimise_uatom, write_atom_op, code_p, pass_no, cip);
@ -2971,6 +3044,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case write_bigint_op: case write_bigint_op:
code_p = a_blob(cip->cpc->rnd1, _write_atom, clause_has_blobsp, code_p, pass_no, cip); code_p = a_blob(cip->cpc->rnd1, _write_atom, clause_has_blobsp, code_p, pass_no, cip);
break; break;
case write_dbterm_op:
code_p = a_wdbt(cip->cpc->rnd1, _write_atom, clause_has_dbtermp, code_p, pass_no, cip);
break;
case unify_list_op: case unify_list_op:
code_p = a_ue(_unify_list, _unify_list_write, code_p, pass_no); code_p = a_ue(_unify_list, _unify_list_write, code_p, pass_no);
break; break;
@ -3026,7 +3102,7 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
case cutexit_op: case cutexit_op:
code_p = a_cut(&clinfo, code_p, pass_no, cip); code_p = a_cut(&clinfo, code_p, pass_no, cip);
if (cip->CurrentPred->PredFlags & LogUpdatePredFlag && if (cip->CurrentPred->PredFlags & LogUpdatePredFlag &&
*clause_has_blobsp && (*clause_has_blobsp || *clause_has_dbtermp) &&
!clinfo.alloc_found) !clinfo.alloc_found)
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip); code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
#if THREADS #if THREADS
@ -3129,7 +3205,7 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp
break; break;
case procceed_op: case procceed_op:
if (cip->CurrentPred->PredFlags & LogUpdatePredFlag && if (cip->CurrentPred->PredFlags & LogUpdatePredFlag &&
*clause_has_blobsp && (*clause_has_blobsp || *clause_has_dbtermp) &&
!clinfo.alloc_found) !clinfo.alloc_found)
code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip); code_p = a_cle(_alloc_for_logical_pred, code_p, pass_no, cip);
#if THREADS #if THREADS
@ -3425,6 +3501,23 @@ fetch_clause_space(Term* tp, UInt size, struct intermediates *cip, UInt *osizep)
return x; return x;
} }
static DBTermList *
init_dbterms_list(yamop *code_p, PredEntry *ap)
{
DBTermList *new;
if ((new = (DBTermList *)Yap_AllocCodeSpace(sizeof(DBTermList))) == NULL) {
return NULL;
}
new->dbterms = NULL;
new->clause_code = code_p;
new->p = ap;
LOCK(DBTermsListLock);
new->next_dbl = DBTermsList;
DBTermsList = new;
UNLOCK(DBTermsListLock);
return new;
}
yamop * yamop *
Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates *cip) Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates *cip)
@ -3438,10 +3531,14 @@ Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates
yamop *entry_code; yamop *entry_code;
yamop *code_p; yamop *code_p;
int clause_has_blobs = FALSE; int clause_has_blobs = FALSE;
int clause_has_dbterm = FALSE;
cip->label_offset = (int *)cip->freep; cip->label_offset = (int *)cip->freep;
cip->code_addr = NULL; cip->code_addr = NULL;
code_p = do_pass(0, &entry_code, mode, &clause_has_blobs, cip, size); code_p = do_pass(0, &entry_code, mode, &clause_has_blobs, &clause_has_dbterm, cip, size);
if (clause_has_dbterm) {
cip->dbterml = init_dbterms_list(code_p, ap);
}
if (ap->PredFlags & DynamicPredFlag) { if (ap->PredFlags & DynamicPredFlag) {
size = size =
(CELL)NEXTOP(NEXTOP(NEXTOP((yamop *)(((DynamicClause *)NULL)->ClCode),ld),sla),e); (CELL)NEXTOP(NEXTOP(NEXTOP((yamop *)(((DynamicClause *)NULL)->ClCode),ld),sla),e);
@ -3475,7 +3572,7 @@ Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates
} }
cl = (StaticClause *)((CODEADDR)x-(UInt)size); cl = (StaticClause *)((CODEADDR)x-(UInt)size);
cip->code_addr = (yamop *)cl; cip->code_addr = (yamop *)cl;
code_p = do_pass(1, &entry_code, mode, &clause_has_blobs, cip, size); code_p = do_pass(1, &entry_code, mode, &clause_has_blobs, &clause_has_dbterm, cip, size);
/* make sure we copy after second pass */ /* make sure we copy after second pass */
cl->usc.ClSource = x; cl->usc.ClSource = x;
cl->ClSize = osize; cl->ClSize = osize;
@ -3502,7 +3599,7 @@ Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates
Yap_IndexSpace_Tree += size; Yap_IndexSpace_Tree += size;
} }
} }
code_p = do_pass(1, &entry_code, mode, &clause_has_blobs, cip, size); code_p = do_pass(1, &entry_code, mode, &clause_has_blobs, &clause_has_dbterm, cip, size);
ProfEnd=code_p; ProfEnd=code_p;
#ifdef LOW_PROF #ifdef LOW_PROF
if (ProfilerOn && if (ProfilerOn &&

View File

@ -11,8 +11,11 @@
* File: cdmgr.c * * File: cdmgr.c *
* comments: Code manager * * comments: Code manager *
* * * *
* Last rev: $Date: 2007-11-01 10:01:35 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:11 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.208 2007/11/01 10:01:35 vsc
* fix uninitalised lock and reconsult test.
*
* Revision 1.207 2007/10/29 22:48:54 vsc * Revision 1.207 2007/10/29 22:48:54 vsc
* small fixes * small fixes
* *
@ -619,6 +622,11 @@ static Term BlobTermAdjust(Term t)
#endif #endif
} }
static void
RestoreDBTerm(DBTerm *dbr)
{
}
#include "rclause.h" #include "rclause.h"
#ifdef DEBUG #ifdef DEBUG
@ -4048,6 +4056,7 @@ ClauseInfoForCode(yamop *codeptr, CODEADDR *startp, CODEADDR *endp) {
case _get_atom: case _get_atom:
case _put_atom: case _put_atom:
case _get_bigint: case _get_bigint:
case _get_dbterm:
pc = NEXTOP(pc,xc); pc = NEXTOP(pc,xc);
break; break;
/* instructions type cc */ /* instructions type cc */
@ -4164,6 +4173,8 @@ ClauseInfoForCode(yamop *codeptr, CODEADDR *startp, CODEADDR *endp) {
case _unify_l_atom: case _unify_l_atom:
case _unify_bigint: case _unify_bigint:
case _unify_l_bigint: case _unify_l_bigint:
case _unify_dbterm:
case _unify_l_dbterm:
pc = NEXTOP(pc,oc); pc = NEXTOP(pc,oc);
break; break;
/* instructions type osc */ /* instructions type osc */

View File

@ -11,8 +11,11 @@
* File: compiler.c * * File: compiler.c *
* comments: Clause compiler * * comments: Clause compiler *
* * * *
* Last rev: $Date: 2007-03-27 13:48:51 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:11 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.84 2007/03/27 13:48:51 vsc
* fix number of overflows (comments by Bart Demoen).
*
* Revision 1.83 2007/03/26 15:18:43 vsc * Revision 1.83 2007/03/26 15:18:43 vsc
* debugging and clause/3 over tabled predicates would kill YAP. * debugging and clause/3 over tabled predicates would kill YAP.
* *
@ -481,8 +484,9 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl
return (p->VarOfCE); return (p->VarOfCE);
} }
/* first occurrence */ /* first occurrence */
if (cglobs->onbranch || level > 1) if (cglobs->onbranch || level > 1) {
return t; return t;
}
++(cglobs->n_common_exps); ++(cglobs->n_common_exps);
p = (CExpEntry *) Yap_AllocCMem(sizeof(CExpEntry), &cglobs->cint); p = (CExpEntry *) Yap_AllocCMem(sizeof(CExpEntry), &cglobs->cint);
@ -491,7 +495,7 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl
if (H >= (CELL *)cglobs->cint.freep0) { if (H >= (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
p->NextCE = cglobs->common_exps; p->NextCE = cglobs->common_exps;
cglobs->common_exps = p; cglobs->common_exps = p;
@ -526,7 +530,7 @@ compile_sf_term(Term t, int argno, int level)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "illegal argument of soft functor"; Yap_ErrorMessage = "illegal argument of soft functor";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
else else
c_var(t, -argno, arity, level, cglobs); c_var(t, -argno, arity, level, cglobs);
@ -553,7 +557,7 @@ c_args(Term app, unsigned int level, compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "exceed maximum arity of compiled goal"; Yap_ErrorMessage = "exceed maximum arity of compiled goal";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
if (Arity > cglobs->max_args) if (Arity > cglobs->max_args)
cglobs->max_args = Arity; cglobs->max_args = Arity;
@ -562,6 +566,52 @@ c_args(Term app, unsigned int level, compiler_struct *cglobs)
c_arg(i, ArgOfTerm(i, app), Arity, level, cglobs); c_arg(i, ArgOfTerm(i, app), Arity, level, cglobs);
} }
static int
try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, compiler_struct *cglobs)
{
DBTerm *dbt;
int g;
CELL *h0 = H;
while ((g=Yap_SizeGroundTerm(t,TRUE)) < 0) {
/* oops, too deep a term */
save_machine_regs();
Yap_Error_Size = 0;
longjmp(cglobs->cint.CompilerBotch, OUT_OF_AUX_BOTCH);
}
if (g < 16)
return FALSE;
/* store ground term away */
H = CellPtr(cglobs->cint.freep);
if ((dbt = Yap_StoreTermInDB(t, -1)) == NULL) {
H = h0;
switch(Yap_Error_TYPE) {
case OUT_OF_STACK_ERROR:
Yap_Error_TYPE = YAP_NO_ERROR;
longjmp(cglobs->cint.CompilerBotch,OUT_OF_STACK_BOTCH);
case OUT_OF_TRAIL_ERROR:
Yap_Error_TYPE = YAP_NO_ERROR;
longjmp(cglobs->cint.CompilerBotch,OUT_OF_TRAIL_BOTCH);
case OUT_OF_HEAP_ERROR:
Yap_Error_TYPE = YAP_NO_ERROR;
longjmp(cglobs->cint.CompilerBotch,OUT_OF_HEAP_BOTCH);
case OUT_OF_AUXSPACE_ERROR:
Yap_Error_TYPE = YAP_NO_ERROR;
longjmp(cglobs->cint.CompilerBotch,OUT_OF_AUX_BOTCH);
default:
longjmp(cglobs->cint.CompilerBotch,COMPILER_ERR_BOTCH);
}
}
H = h0;
if (level == 0)
Yap_emit((cglobs->onhead ? get_dbterm_op : put_dbterm_op), dbt->Entry, argno, &cglobs->cint);
else
Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_dbterm_op
: unify_dbterm_op) :
write_dbterm_op), dbt->Entry, Zero, &cglobs->cint);
return TRUE;
}
static void static void
c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct *cglobs) c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct *cglobs)
{ {
@ -641,6 +691,12 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct
write_num_op), (CELL) t, Zero, &cglobs->cint); write_num_op), (CELL) t, Zero, &cglobs->cint);
} else if (IsPairTerm(t)) { } else if (IsPairTerm(t)) {
if (optimizer_on && level < 6) { if (optimizer_on && level < 6) {
if (!(cglobs->cint.CurrentPred->PredFlags & (DynamicPredFlag|LogUpdatePredFlag))) {
if (try_store_as_dbterm(t, argno, arity, level, cglobs))
return;
}
if (try_store_as_dbterm(t, argno, arity, level, cglobs))
return;
t = optimize_ce(t, arity, level, cglobs); t = optimize_ce(t, arity, level, cglobs);
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
c_var(t, argno, arity, level, cglobs); c_var(t, argno, arity, level, cglobs);
@ -656,7 +712,7 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct
++level; ++level;
c_arg(1, HeadOfTerm(t), 2, level, cglobs); c_arg(1, HeadOfTerm(t), 2, level, cglobs);
if (argno == (Int)arity) { if (argno == (Int)arity) {
/* optimise for tail recursion */ /* optimise for tail recursion */
t = TailOfTerm(t); t = TailOfTerm(t);
goto restart; goto restart;
} }
@ -690,11 +746,14 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct
#endif #endif
if (optimizer_on) { if (optimizer_on) {
if (!(cglobs->cint.CurrentPred->PredFlags & (DynamicPredFlag|LogUpdatePredFlag))) {
if (try_store_as_dbterm(t, argno, arity, level, cglobs))
return;
}
t = optimize_ce(t, arity, level, cglobs); t = optimize_ce(t, arity, level, cglobs);
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
c_var(t, argno, arity, level, cglobs); c_var(t, argno, arity, level, cglobs);
return; return;
} }
} }
if (level == 0) if (level == 0)
@ -803,7 +862,7 @@ c_test(Int Op, Term t1, compiler_struct *cglobs) {
Yap_bip_name(Op, s); Yap_bip_name(Op, s);
sprintf(Yap_ErrorMessage, "when compiling %s/1", s); sprintf(Yap_ErrorMessage, "when compiling %s/1", s);
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 1); longjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH);
} }
if (IsNewVar(t)) { if (IsNewVar(t)) {
/* in this case, var trivially succeeds and the others trivially fail */ /* in this case, var trivially succeeds and the others trivially fail */
@ -858,7 +917,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
Yap_bip_name(Op, s); Yap_bip_name(Op, s);
sprintf(Yap_ErrorMessage, "when compiling %s/2", s); sprintf(Yap_ErrorMessage, "when compiling %s/2", s);
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 1); longjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH);
} else if (IsVarTerm(t2)) { } else if (IsVarTerm(t2)) {
if (IsNewVar(t2)) { if (IsNewVar(t2)) {
char s[32]; char s[32];
@ -869,7 +928,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
Yap_bip_name(Op, s); Yap_bip_name(Op, s);
sprintf(Yap_ErrorMessage, "when compiling %s/2", s); sprintf(Yap_ErrorMessage, "when compiling %s/2", s);
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 1); longjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH);
} else { } else {
/* first temp */ /* first temp */
Int v1 = --cglobs->tmpreg; Int v1 = --cglobs->tmpreg;
@ -987,7 +1046,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
if (H+2 >= (CELL *)cglobs->cint.freep0) { if (H+2 >= (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
RESET_VARIABLE(H); RESET_VARIABLE(H);
RESET_VARIABLE(H+1); RESET_VARIABLE(H+1);
@ -999,7 +1058,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
if (H >= (CELL *)cglobs->cint.freep0) { if (H >= (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
RESET_VARIABLE(H); RESET_VARIABLE(H);
H++; H++;
@ -1128,7 +1187,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
if (H+1+arity >= (CELL *)cglobs->cint.freep0) { if (H+1+arity >= (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
tnew = AbsAppl(H); tnew = AbsAppl(H);
*H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),arity); *H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),arity);
@ -1177,7 +1236,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
c_var(tmpvar,f_flag,(unsigned int)Op, 0, cglobs); c_var(tmpvar,f_flag,(unsigned int)Op, 0, cglobs);
c_eq(tmpvar,t3, cglobs); c_eq(tmpvar,t3, cglobs);
@ -1204,7 +1263,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, Term Goal, int mod, compiler_struct *
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
c_var(tmpvar,f_flag,(unsigned int)Op, 0, cglobs); c_var(tmpvar,f_flag,(unsigned int)Op, 0, cglobs);
/* I have to dit here, before I do the unification */ /* I have to dit here, before I do the unification */
@ -1298,7 +1357,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
Yap_Error_Term = M; Yap_Error_Term = M;
Yap_ErrorMessage = "in module name"; Yap_ErrorMessage = "in module name";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 1); longjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH);
} }
Goal = ArgOfTerm(2, Goal); Goal = ArgOfTerm(2, Goal);
mod = M; mod = M;
@ -1495,7 +1554,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
savecpc = cglobs->cint.cpc; savecpc = cglobs->cint.cpc;
savencpc = FirstP->nextInst; savencpc = FirstP->nextInst;
@ -1574,7 +1633,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
push_branch(cglobs->onbranch, commitvar, cglobs); push_branch(cglobs->onbranch, commitvar, cglobs);
++cglobs->curbranch; ++cglobs->curbranch;
@ -1609,7 +1668,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
cglobs->onlast = FALSE; cglobs->onlast = FALSE;
c_var(commitvar, save_b_flag, 1, 0, cglobs); c_var(commitvar, save_b_flag, 1, 0, cglobs);
@ -1723,7 +1782,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
c_eq(t2, a2, cglobs); c_eq(t2, a2, cglobs);
c_var(a1, bt1_flag, 2, 0, cglobs); c_var(a1, bt1_flag, 2, 0, cglobs);
@ -1736,7 +1795,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
c_eq(t1, a1, cglobs); c_eq(t1, a1, cglobs);
@ -1750,7 +1809,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs)
if (H == (CELL *)cglobs->cint.freep0) { if (H == (CELL *)cglobs->cint.freep0) {
/* oops, too many new variables */ /* oops, too many new variables */
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch,4); longjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH);
} }
c_eq(t2, a2, cglobs); c_eq(t2, a2, cglobs);
c_var(t1, bt1_flag, 2, 0, cglobs); c_var(t1, bt1_flag, 2, 0, cglobs);
@ -2110,7 +2169,7 @@ clear_bvarray(int var, CELL *bvarray
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "compiler internal error: variable initialised twice"; Yap_ErrorMessage = "compiler internal error: variable initialised twice";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
cglobs->pbvars++; cglobs->pbvars++;
#endif #endif
@ -2151,7 +2210,7 @@ push_bvmap(int label, PInstr *pcpc, compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "Too many embedded disjunctions"; Yap_ErrorMessage = "Too many embedded disjunctions";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
/* the label instruction */ /* the label instruction */
bvstack[bvindex].lab = label; bvstack[bvindex].lab = label;
@ -2174,7 +2233,7 @@ reset_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "No embedding in disjunctions"; Yap_ErrorMessage = "No embedding in disjunctions";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
env_size = (bvstack[bvindex-1].pc)->rnd1; env_size = (bvstack[bvindex-1].pc)->rnd1;
size = env_size/(8*sizeof(CELL)); size = env_size/(8*sizeof(CELL));
@ -2194,7 +2253,7 @@ pop_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "Too few embedded disjunctions"; Yap_ErrorMessage = "Too few embedded disjunctions";
/* save_machine_regs(); /* save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); */ longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); */
} }
reset_bvmap(bvarray, nperm, cglobs); reset_bvmap(bvarray, nperm, cglobs);
bvindex--; bvindex--;
@ -2462,7 +2521,7 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "too many temporaries"; Yap_ErrorMessage = "too many temporaries";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 1); longjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH);
} }
v->NoOfVE = cglobs->vadr = vadr = TempVar | target1; v->NoOfVE = cglobs->vadr = vadr = TempVar | target1;
v->KindOfVE = TempVar; v->KindOfVE = TempVar;
@ -2591,7 +2650,7 @@ c_layout(compiler_struct *cglobs)
Yap_Error_Term = TermNil; Yap_Error_Term = TermNil;
Yap_ErrorMessage = "wrong number of variables found in bitmap"; Yap_ErrorMessage = "wrong number of variables found in bitmap";
save_machine_regs(); save_machine_regs();
longjmp(cglobs->cint.CompilerBotch, 2); longjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH);
} }
#endif #endif
} }
@ -3034,56 +3093,91 @@ Yap_cclause(volatile Term inp_clause, int NOfArgs, int mod, volatile Term src)
int botch_why; int botch_why;
/* may botch while doing a different module */ /* may botch while doing a different module */
/* first, initialise cglobs->cint.CompilerBotch to handle all cases of interruptions */ /* first, initialise cglobs->cint.CompilerBotch to handle all cases of interruptions */
compiler_struct cglobs; compiler_struct cglobs;
/* make sure we know there was no error yet */ /* make sure we know there was no error yet */
Yap_ErrorMessage = NULL; Yap_ErrorMessage = NULL;
if ((botch_why = setjmp(cglobs.cint.CompilerBotch)) == 3) { if ((botch_why = setjmp(cglobs.cint.CompilerBotch))) {
/* out of local stack, just duplicate the stack */
restore_machine_regs(); restore_machine_regs();
reset_vars(cglobs.vtable); reset_vars(cglobs.vtable);
{ switch(botch_why) {
Int osize = 2*sizeof(CELL)*(ASP-H); case OUT_OF_STACK_BOTCH:
ARG1 = inp_clause; /* out of local stack, just duplicate the stack */
ARG3 = src; {
Int osize = 2*sizeof(CELL)*(ASP-H);
ARG1 = inp_clause;
ARG3 = src;
YAPLeaveCriticalSection(); YAPLeaveCriticalSection();
if (!Yap_gcl(Yap_Error_Size, NOfArgs, ENV, P)) { if (!Yap_gcl(Yap_Error_Size, NOfArgs, ENV, P)) {
Yap_Error_TYPE = OUT_OF_STACK_ERROR;
Yap_Error_Term = inp_clause;
}
if (osize > ASP-H) {
if (!Yap_growstack(2*sizeof(CELL)*(ASP-H))) {
Yap_Error_TYPE = OUT_OF_STACK_ERROR; Yap_Error_TYPE = OUT_OF_STACK_ERROR;
Yap_Error_Term = inp_clause; Yap_Error_Term = inp_clause;
} }
if (osize > ASP-H) {
if (!Yap_growstack(2*sizeof(CELL)*(ASP-H))) {
Yap_Error_TYPE = OUT_OF_STACK_ERROR;
Yap_Error_Term = inp_clause;
}
}
YAPEnterCriticalSection();
src = ARG3;
inp_clause = ARG1;
}
break;
case OUT_OF_AUX_BOTCH:
/* out of local stack, just duplicate the stack */
YAPLeaveCriticalSection();
ARG1 = inp_clause;
ARG3 = src;
if (!Yap_ExpandPreAllocCodeSpace(Yap_Error_Size, NULL)) {
Yap_Error_TYPE = OUT_OF_AUXSPACE_ERROR;
Yap_Error_Term = inp_clause;
} }
YAPEnterCriticalSection(); YAPEnterCriticalSection();
src = ARG3; src = ARG3;
inp_clause = ARG1; inp_clause = ARG1;
break;
case OUT_OF_TEMPS_BOTCH:
/* out of temporary cells */
if (maxvnum < 16*1024) {
maxvnum *= 2;
} else {
maxvnum += 4096;
}
break;
case OUT_OF_HEAP_BOTCH:
/* not enough heap */
ARG1 = inp_clause;
ARG3 = src;
YAPLeaveCriticalSection();
if (!Yap_growheap(FALSE, Yap_Error_Size, NULL)) {
Yap_Error_TYPE = OUT_OF_HEAP_ERROR;
Yap_Error_Term = inp_clause;
return NULL;
}
YAPEnterCriticalSection();
src = ARG3;
inp_clause = ARG1;
break;
case OUT_OF_TRAIL_BOTCH:
/* not enough trail */
ARG1 = inp_clause;
ARG3 = src;
YAPLeaveCriticalSection();
if (!Yap_growtrail(0L, FALSE)) {
Yap_Error_TYPE = OUT_OF_TRAIL_ERROR;
Yap_Error_Term = inp_clause;
return NULL;
}
YAPEnterCriticalSection();
src = ARG3;
inp_clause = ARG1;
break;
default:
return NULL;
} }
} else if (botch_why == 4) {
/* out of temporary cells */
restore_machine_regs();
reset_vars(cglobs.vtable);
if (maxvnum < 16*1024) {
maxvnum *= 2;
} else {
maxvnum += 4096;
}
} else if (botch_why == 2) {
/* not enough heap */
restore_machine_regs();
reset_vars(cglobs.vtable);
Yap_Error_TYPE = OUT_OF_HEAP_ERROR;
Yap_Error_Term = TermNil;
return 0;
} }
my_clause = inp_clause; my_clause = inp_clause;
if (Yap_ErrorMessage) {
reset_vars(cglobs.vtable);
return (0);
}
HB = H; HB = H;
Yap_ErrorMessage = NULL; Yap_ErrorMessage = NULL;
Yap_Error_Size = 0; Yap_Error_Size = 0;
@ -3092,6 +3186,7 @@ Yap_cclause(volatile Term inp_clause, int NOfArgs, int mod, volatile Term src)
cglobs.cint.CodeStart = cglobs.cint.cpc = NULL; cglobs.cint.CodeStart = cglobs.cint.cpc = NULL;
cglobs.cint.BlobsStart = cglobs.cint.icpc = NULL; cglobs.cint.BlobsStart = cglobs.cint.icpc = NULL;
cglobs.cint.dbterml = NULL;
cglobs.cint.freep = cglobs.cint.freep =
cglobs.cint.freep0 = cglobs.cint.freep0 =
(char *) (H + maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps+MaxTemps); (char *) (H + maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps+MaxTemps);

View File

@ -11,8 +11,12 @@
* File: computils.c * * File: computils.c *
* comments: some useful routines for YAP's compiler * * comments: some useful routines for YAP's compiler *
* * * *
* Last rev: $Date: 2006-09-20 20:03:51 $ * * Last rev: $Date: 2007-11-06 17:02:12 $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.30 2006/09/20 20:03:51 vsc
* improve indexing on floats
* fix sending large lists to DB
*
* Revision 1.29 2005/12/05 17:16:10 vsc * Revision 1.29 2005/12/05 17:16:10 vsc
* write_depth/3 * write_depth/3
* overflow handlings and garbage collection * overflow handlings and garbage collection
@ -89,7 +93,7 @@ AllocCMem (int size, struct intermediates *cip)
if (ASP <= CellPtr (cip->freep) + 256) { if (ASP <= CellPtr (cip->freep) + 256) {
Yap_Error_Size = 256+((char *)cip->freep - (char *)H); Yap_Error_Size = 256+((char *)cip->freep - (char *)H);
save_machine_regs(); save_machine_regs();
longjmp(cip->CompilerBotch,3); longjmp(cip->CompilerBotch, OUT_OF_STACK_BOTCH);
} }
return (p); return (p);
} }
@ -563,6 +567,8 @@ static char *opformat[] =
"put_num\t\t%n,%r", "put_num\t\t%n,%r",
"get_float\t\t%w,%r", "get_float\t\t%w,%r",
"put_float\t\t%w,%r", "put_float\t\t%w,%r",
"get_dbterm\t%w,%r",
"put_dbterm\t%w,%r",
"align_float", "align_float",
"get_longint\t\t%w,%r", "get_longint\t\t%w,%r",
"put_longint\t\t%w,%r", "put_longint\t\t%w,%r",
@ -583,6 +589,8 @@ static char *opformat[] =
"write_num\t%n", "write_num\t%n",
"unify_float\t%w", "unify_float\t%w",
"write_float\t%w", "write_float\t%w",
"unify_dbterm\t%w",
"write_dbterm\t%w",
"unify_longint\t%w", "unify_longint\t%w",
"write_longint\t%w", "write_longint\t%w",
"unify_bigint\t%l", "unify_bigint\t%l",
@ -649,7 +657,8 @@ static char *opformat[] =
"unify_last_local\t%v", "unify_last_local\t%v",
"unify_last_atom\t%a", "unify_last_atom\t%a",
"unify_last_num\t%n", "unify_last_num\t%n",
"unify_last_float\t%w", "unify_last_float\t%w",
"unify_last_dbterm\t%w",
"unify_last_longint\t%w", "unify_last_longint\t%w",
"unify_last_bigint\t%l", "unify_last_bigint\t%l",
"pvar_bitmap\t%l,%b", "pvar_bitmap\t%l,%b",

View File

@ -1258,7 +1258,7 @@ CreateDBWithDBRef(Term Tm, DBProp p, struct db_globs *dbg)
ppt->Contents[1] = (CELL)dbr; ppt->Contents[1] = (CELL)dbr;
ppt->DBRefs = (DBRef *)(ppt->Contents+2); ppt->DBRefs = (DBRef *)(ppt->Contents+2);
#ifdef COROUTINING #ifdef COROUTINING
ppt->attachments = 0L; ppt->ag.attachments = 0L;
#endif #endif
return pp; return pp;
} }
@ -1278,7 +1278,7 @@ CreateDBTermForAtom(Term Tm, UInt extra_size, struct db_globs *dbg) {
ppt->NOfCells = 0; ppt->NOfCells = 0;
ppt->DBRefs = NULL; ppt->DBRefs = NULL;
#ifdef COROUTINING #ifdef COROUTINING
ppt->attachments = 0; ppt->ag.attachments = 0;
#endif #endif
ppt->DBRefs = NULL; ppt->DBRefs = NULL;
ppt->Entry = Tm; ppt->Entry = Tm;
@ -1301,7 +1301,7 @@ CreateDBTermForVar(UInt extra_size, struct db_globs *dbg)
ppt->NOfCells = 0; ppt->NOfCells = 0;
ppt->DBRefs = NULL; ppt->DBRefs = NULL;
#ifdef COROUTINING #ifdef COROUTINING
ppt->attachments = 0; ppt->ag.attachments = 0;
#endif #endif
ppt->DBRefs = NULL; ppt->DBRefs = NULL;
ppt->Entry = (CELL)(&(ppt->Entry)); ppt->Entry = (CELL)(&(ppt->Entry));
@ -1331,7 +1331,7 @@ CreateDBRefForAtom(Term Tm, DBProp p, int InFlag, struct db_globs *dbg) {
pp->DBT.DBRefs = NULL; pp->DBT.DBRefs = NULL;
pp->DBT.NOfCells = 0; pp->DBT.NOfCells = 0;
#ifdef COROUTINING #ifdef COROUTINING
pp->DBT.attachments = 0; pp->DBT.ag.attachments = 0;
#endif #endif
return(pp); return(pp);
} }
@ -1355,7 +1355,7 @@ CreateDBRefForVar(Term Tm, DBProp p, int InFlag, struct db_globs *dbg) {
pp->DBT.NOfCells = 0; pp->DBT.NOfCells = 0;
pp->DBT.DBRefs = NULL; pp->DBT.DBRefs = NULL;
#ifdef COROUTINING #ifdef COROUTINING
pp->DBT.attachments = 0; pp->DBT.ag.attachments = 0;
#endif #endif
INIT_LOCK(pp->lock); INIT_LOCK(pp->lock);
INIT_DBREF_COUNT(pp); INIT_DBREF_COUNT(pp);
@ -1582,7 +1582,7 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc
ppt->NOfCells = NOfCells; ppt->NOfCells = NOfCells;
#ifdef COROUTINING #ifdef COROUTINING
ppt->attachments = attachments; ppt->ag.attachments = attachments;
#endif #endif
if (pp0 != pp) { if (pp0 != pp) {
nar = ppt->Contents; nar = ppt->Contents;
@ -1617,14 +1617,14 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc
ppt->Entry = AdjustIDBPtr(tt,(CELL)ppt-(CELL)ppt0); ppt->Entry = AdjustIDBPtr(tt,(CELL)ppt-(CELL)ppt0);
#ifdef COROUTINING #ifdef COROUTINING
if (attachments) if (attachments)
ppt->attachments = AdjustIDBPtr(attachments,(CELL)ppt-(CELL)ppt0); ppt->ag.attachments = AdjustIDBPtr(attachments,(CELL)ppt-(CELL)ppt0);
else else
ppt->attachments = 0L; ppt->ag.attachments = 0L;
#endif #endif
} else { } else {
ppt->Entry = tt; ppt->Entry = tt;
#ifdef COROUTINING #ifdef COROUTINING
ppt->attachments = attachments; ppt->ag.attachments = attachments;
#endif #endif
} }
if (flag & DBWithRefs) { if (flag & DBWithRefs) {
@ -2440,7 +2440,7 @@ GetDBTerm(DBTerm *DBSP)
if (IsVarTerm(t) if (IsVarTerm(t)
#if COROUTINING #if COROUTINING
&& !DBSP->attachments && !DBSP->ag.attachments
#endif #endif
) { ) {
return MkVarTerm(); return MkVarTerm();
@ -2475,8 +2475,8 @@ GetDBTerm(DBTerm *DBSP)
linkblk(lp, HOld-1, (CELL)HOld-(CELL)(DBSP->Contents)); linkblk(lp, HOld-1, (CELL)HOld-(CELL)(DBSP->Contents));
} }
#ifdef COROUTINING #ifdef COROUTINING
if (DBSP->attachments != 0L) { if (DBSP->ag.attachments != 0L) {
if (!copy_attachments((CELL *)AdjustIDBPtr(DBSP->attachments,(CELL)HOld-(CELL)(DBSP->Contents)))) { if (!copy_attachments((CELL *)AdjustIDBPtr(DBSP->ag.attachments,(CELL)HOld-(CELL)(DBSP->Contents)))) {
H = HOld; H = HOld;
Yap_Error_TYPE = OUT_OF_ATTVARS_ERROR; Yap_Error_TYPE = OUT_OF_ATTVARS_ERROR;
Yap_Error_Size = 0; Yap_Error_Size = 0;
@ -4949,16 +4949,18 @@ StoreTermInDB(Term t, int nargs)
InQueue, &needs_vars, 0, &dbg)) == NULL) { InQueue, &needs_vars, 0, &dbg)) == NULL) {
if (Yap_Error_TYPE == YAP_NO_ERROR) { if (Yap_Error_TYPE == YAP_NO_ERROR) {
break; break;
} else if (nargs == -1) {
return NULL;
} else { } else {
XREGS[nargs+1] = t; XREGS[nargs+1] = t;
if (recover_from_record_error(nargs+1)) { if (recover_from_record_error(nargs+1)) {
t = Deref(XREGS[nargs+1]); t = Deref(XREGS[nargs+1]);
} else { } else {
return FALSE; return NULL;
} }
} }
} }
return(x); return x;
} }
DBTerm * DBTerm *

View File

@ -891,6 +891,8 @@ fix_compiler_instructions(PInstr *pcpc)
case align_float_op: case align_float_op:
case get_bigint_op: case get_bigint_op:
case put_bigint_op: case put_bigint_op:
case get_dbterm_op:
case put_dbterm_op:
case get_list_op: case get_list_op:
case put_list_op: case put_list_op:
case get_struct_op: case get_struct_op:
@ -906,7 +908,10 @@ fix_compiler_instructions(PInstr *pcpc)
case write_longint_op: case write_longint_op:
case unify_bigint_op: case unify_bigint_op:
case unify_last_bigint_op: case unify_last_bigint_op:
case unify_dbterm_op:
case unify_last_dbterm_op:
case write_bigint_op: case write_bigint_op:
case write_dbterm_op:
case unify_list_op: case unify_list_op:
case write_list_op: case write_list_op:
case unify_struct_op: case unify_struct_op:

View File

@ -11,8 +11,11 @@
* File: index.c * * File: index.c *
* comments: Indexing a Prolog predicate * * comments: Indexing a Prolog predicate *
* * * *
* Last rev: $Date: 2007-10-28 11:23:40 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:12 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.188 2007/10/28 11:23:40 vsc
* fix overflow
*
* Revision 1.187 2007/09/22 08:38:05 vsc * Revision 1.187 2007/09/22 08:38:05 vsc
* nb_ extra stuff plus an indexing overflow fix. * nb_ extra stuff plus an indexing overflow fix.
* *
@ -1093,6 +1096,7 @@ has_cut(yamop *pc)
case _get_atom: case _get_atom:
case _put_atom: case _put_atom:
case _get_bigint: case _get_bigint:
case _get_dbterm:
pc = NEXTOP(pc,xc); pc = NEXTOP(pc,xc);
break; break;
/* instructions type cc */ /* instructions type cc */
@ -1218,6 +1222,8 @@ has_cut(yamop *pc)
case _unify_l_atom: case _unify_l_atom:
case _unify_bigint: case _unify_bigint:
case _unify_l_bigint: case _unify_l_bigint:
case _unify_dbterm:
case _unify_l_dbterm:
pc = NEXTOP(pc,oc); pc = NEXTOP(pc,oc);
break; break;
/* instructions type osc */ /* instructions type osc */
@ -1947,6 +1953,9 @@ add_info(ClauseDef *clause, UInt regno)
} }
break; break;
*/ */
case _get_dbterm:
clause->Tag = (CELL)NULL;
return;
case _copy_idb_term: case _copy_idb_term:
case _unify_idb_term: case _unify_idb_term:
if (regno == 2) { if (regno == 2) {
@ -2180,6 +2189,10 @@ add_info(ClauseDef *clause, UInt regno)
case _unify_l_bigint: case _unify_l_bigint:
cl = NEXTOP(cl,oc); cl = NEXTOP(cl,oc);
break; break;
case _unify_dbterm:
case _unify_l_dbterm:
cl = NEXTOP(cl,oc);
break;
case _unify_n_atoms_write: case _unify_n_atoms_write:
case _unify_n_atoms: case _unify_n_atoms:
cl = NEXTOP(cl,osc); cl = NEXTOP(cl,osc);
@ -2817,6 +2830,10 @@ add_head_info(ClauseDef *clause, UInt regno)
case _unify_l_bigint: case _unify_l_bigint:
cl = NEXTOP(cl,oc); cl = NEXTOP(cl,oc);
break; break;
case _unify_dbterm:
case _unify_l_dbterm:
cl = NEXTOP(cl,oc);
break;
case _unify_n_atoms_write: case _unify_n_atoms_write:
case _unify_n_atoms: case _unify_n_atoms:
cl = NEXTOP(cl,osc); cl = NEXTOP(cl,osc);
@ -2827,6 +2844,9 @@ add_head_info(ClauseDef *clause, UInt regno)
case _unify_l_struc: case _unify_l_struc:
cl = NEXTOP(cl,of); cl = NEXTOP(cl,of);
break; break;
case _get_dbterm:
clause->Tag = (CELL)NULL;
return;
case _unify_idb_term: case _unify_idb_term:
case _copy_idb_term: case _copy_idb_term:
if (regno != 2) { if (regno != 2) {
@ -3100,6 +3120,10 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno)
} }
argno--; argno--;
break; break;
case _unify_dbterm:
case _unify_l_dbterm:
clause->Tag = (CELL)NULL;
return;
case _unify_n_atoms: case _unify_n_atoms:
if (argno <= cl->u.osc.s) { if (argno <= cl->u.osc.s) {
clause->Tag = cl->u.osc.c; clause->Tag = cl->u.osc.c;
@ -3133,8 +3157,11 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno)
cl = NEXTOP(cl,os); cl = NEXTOP(cl,os);
break; break;
#endif #endif
case _get_dbterm:
case _unify_idb_term: case _unify_idb_term:
case _copy_idb_term: case _copy_idb_term:
clause->Tag = (CELL)NULL;
return;
{ {
Term t = clause->u.c_sreg[argno]; Term t = clause->u.c_sreg[argno];

View File

@ -11,8 +11,11 @@
* File: stdpreds.c * * File: stdpreds.c *
* comments: General-purpose C implemented system predicates * * comments: General-purpose C implemented system predicates *
* * * *
* Last rev: $Date: 2007-10-18 08:24:16 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:12 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.122 2007/10/18 08:24:16 vsc
* fix global variables
*
* Revision 1.121 2007/10/10 09:44:24 vsc * Revision 1.121 2007/10/10 09:44:24 vsc
* some more fixes to make YAP swi compatible * some more fixes to make YAP swi compatible
* fix absolute_file_name (again) * fix absolute_file_name (again)
@ -2884,10 +2887,24 @@ p_flags(void)
if (IsVarTerm(t1)) if (IsVarTerm(t1))
return (FALSE); return (FALSE);
if (IsAtomTerm(t1)) { if (IsAtomTerm(t1)) {
pe = RepPredProp(PredPropByAtom(AtomOfTerm(t1), mod)); while ((pe = RepPredProp(PredPropByAtom(AtomOfTerm(t1), mod)))== NULL) {
if (!Yap_growheap(FALSE, 0, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, ARG1, "while generating new predicate");
return FALSE;
}
t1 = Deref(ARG1);
mod = Deref(ARG2);
}
} else if (IsApplTerm(t1)) { } else if (IsApplTerm(t1)) {
Functor funt = FunctorOfTerm(t1); Functor funt = FunctorOfTerm(t1);
pe = RepPredProp(PredPropByFunc(funt, mod)); while ((pe = RepPredProp(PredPropByFunc(funt, mod)))== NULL) {
if (!Yap_growheap(FALSE, 0, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, ARG1, "while generating new predicate");
return FALSE;
}
t1 = Deref(ARG1);
mod = Deref(ARG2);
}
} else } else
return (FALSE); return (FALSE);
if (EndOfPAEntr(pe)) if (EndOfPAEntr(pe))
@ -3858,7 +3875,7 @@ Yap_InitCPreds(void)
Yap_InitCPred("$debug", 1, p_debug, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred("$debug", 1, p_debug, SafePredFlag|SyncPredFlag|HiddenPredFlag);
#endif #endif
/* Accessing and changing the flags for a predicate */ /* Accessing and changing the flags for a predicate */
Yap_InitCPred("$flags", 4, p_flags, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred("$flags", 4, p_flags, SyncPredFlag|HiddenPredFlag);
/* hiding and unhiding some predicates */ /* hiding and unhiding some predicates */
Yap_InitCPred("hide", 1, p_hide, SafePredFlag|SyncPredFlag); Yap_InitCPred("hide", 1, p_hide, SafePredFlag|SyncPredFlag);
Yap_InitCPred("unhide", 1, p_unhide, SafePredFlag|SyncPredFlag); Yap_InitCPred("unhide", 1, p_unhide, SafePredFlag|SyncPredFlag);

View File

@ -1044,7 +1044,7 @@ p_ground(void) /* ground(+T) */
Functor fun = FunctorOfTerm(t); Functor fun = FunctorOfTerm(t);
if (IsExtensionFunctor(fun)) if (IsExtensionFunctor(fun))
return(TRUE); return TRUE;
else if ((out = ground_complex_term(RepAppl(t), else if ((out = ground_complex_term(RepAppl(t),
RepAppl(t)+ RepAppl(t)+
ArityOfFunctor(fun))) >= 0) { ArityOfFunctor(fun))) >= 0) {
@ -1060,6 +1060,174 @@ p_ground(void) /* ground(+T) */
} }
} }
static int
SizeOfExtension(Term t)
{
Functor f = FunctorOfTerm(t);
if (f== FunctorDouble) {
return 2 + sizeof(Float)/sizeof(CELL);
}
if (f== FunctorLongInt) {
return 2 + sizeof(Float)/sizeof(CELL);
}
if (f== FunctorDBRef) {
return 0;
}
if (f== FunctorBigInt) {
CELL *pt = RepAppl(t)+1;
return 2+sizeof(MP_INT)+(((MP_INT *)(pt+1))->_mp_alloc*sizeof(mp_limb_t));
}
return 0;
}
static Int sz_ground_complex_term(register CELL *pt0, register CELL *pt0_end, int ground)
{
register CELL **to_visit0, **to_visit = (CELL **)Yap_PreAllocCodeSpace();
Int sz = 0;
to_visit0 = to_visit;
loop:
while (pt0 < pt0_end) {
register CELL d0;
register CELL *ptd0;
++pt0;
ptd0 = pt0;
d0 = *ptd0;
deref_head(d0, vars_in_term_unk);
vars_in_term_nvar:
{
if (IsPairTerm(d0)) {
sz += 2;
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
to_visit[2] = (CELL *)*pt0;
to_visit += 3;
*pt0 = TermNil;
#else
if (pt0 < pt0_end) {
to_visit[0] = pt0;
to_visit[1] = pt0_end;
to_visit += 2;
}
#endif
pt0 = RepPair(d0) - 1;
pt0_end = RepPair(d0) + 1;
} else if (IsApplTerm(d0)) {
register Functor f;
register CELL *ap2;
/* store the terms to visit */
ap2 = RepAppl(d0);
f = (Functor)(*ap2);
if (IsExtensionFunctor(f)) {
sz += SizeOfExtension(d0);
continue;
}
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
to_visit[2] = (CELL *)*pt0;
to_visit += 3;
*pt0 = TermNil;
#else
/* store the terms to visit */
if (pt0 < pt0_end) {
to_visit[0] = pt0;
to_visit[1] = pt0_end;
to_visit += 2;
}
#endif
d0 = ArityOfFunctor(f);
sz += (1+d0);
pt0 = ap2;
pt0_end = ap2 + d0;
}
continue;
}
derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar);
if (!ground)
continue;
#ifdef RATIONAL_TREES
while (to_visit > to_visit0) {
to_visit -= 3;
pt0 = to_visit[0];
pt0_end = to_visit[1];
*pt0 = (CELL)to_visit[2];
}
#endif
return 0;
}
/* Do we still have compound terms to visit */
if (to_visit > to_visit0) {
#ifdef RATIONAL_TREES
to_visit -= 3;
pt0 = to_visit[0];
pt0_end = to_visit[1];
*pt0 = (CELL)to_visit[2];
#else
to_visit -= 2;
pt0 = to_visit[0];
pt0_end = to_visit[1];
#endif
goto loop;
}
return sz;
aux_overflow:
/* unwind stack */
#ifdef RATIONAL_TREES
while (to_visit > to_visit0) {
to_visit -= 3;
pt0 = to_visit[0];
*pt0 = (CELL)to_visit[2];
}
#endif
return -1;
}
int
Yap_SizeGroundTerm(Term t, int ground)
{
if (IsVarTerm(t)) {
if (!ground)
return 1;
return 0;
} else if (IsPrimitiveTerm(t)) {
return 1;
} else if (IsPairTerm(t)) {
int sz = sz_ground_complex_term(RepPair(t)-1, RepPair(t)+1, ground);
if (sz <= 0)
return sz;
return sz+2;
} else {
int sz = 0;
Functor fun = FunctorOfTerm(t);
if (IsExtensionFunctor(fun))
return 1+ SizeOfExtension(t);
sz = sz_ground_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(fun),
ground);
if (sz <= 0)
return sz;
return 1+ArityOfFunctor(fun)+sz;
}
}
static Int var_in_complex_term(register CELL *pt0, static Int var_in_complex_term(register CELL *pt0,
register CELL *pt0_end, register CELL *pt0_end,
Term v) Term v)

View File

@ -10,7 +10,7 @@
* File: Heap.h * * File: Heap.h *
* mods: * * mods: *
* comments: Heap Init Structure * * comments: Heap Init Structure *
* version: $Id: Heap.h,v 1.118 2007-10-10 09:44:24 vsc Exp $ * * version: $Id: Heap.h,v 1.119 2007-11-06 17:02:12 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* information that can be stored in Code Space */ /* information that can be stored in Code Space */
@ -338,6 +338,7 @@ typedef struct various_codes {
lockvar dead_static_clauses_lock; /* protect DeadStaticClauses */ lockvar dead_static_clauses_lock; /* protect DeadStaticClauses */
lockvar dead_mega_clauses_lock; /* protect DeadMegaClauses */ lockvar dead_mega_clauses_lock; /* protect DeadMegaClauses */
lockvar dead_static_indices_lock; /* protect DeadStaticIndices */ lockvar dead_static_indices_lock; /* protect DeadStaticIndices */
lockvar dbterms_list_lock; /* protect DBTermList */
int heap_top_owner; int heap_top_owner;
#ifdef LOW_LEVEL_TRACER #ifdef LOW_LEVEL_TRACER
lockvar low_level_trace_lock; lockvar low_level_trace_lock;
@ -349,6 +350,7 @@ typedef struct various_codes {
struct static_clause *dead_static_clauses; struct static_clause *dead_static_clauses;
struct static_mega_clause *dead_mega_clauses; struct static_mega_clause *dead_mega_clauses;
struct static_index *dead_static_indices; struct static_index *dead_static_indices;
struct dbterm_list *dbterms_list;
Atom Atom
atom_abol, atom_abol,
atom_alarm, atom_alarm,
@ -945,6 +947,7 @@ struct various_codes *Yap_heap_regs;
#define ParserErrorStyle Yap_heap_regs->parser_error_style #define ParserErrorStyle Yap_heap_regs->parser_error_style
#define DeadStaticClauses Yap_heap_regs->dead_static_clauses #define DeadStaticClauses Yap_heap_regs->dead_static_clauses
#define DeadMegaClauses Yap_heap_regs->dead_mega_clauses #define DeadMegaClauses Yap_heap_regs->dead_mega_clauses
#define DBTermsList Yap_heap_regs->dbterms_list
#define DeadStaticIndices Yap_heap_regs->dead_static_indices #define DeadStaticIndices Yap_heap_regs->dead_static_indices
#define SizeOfOverflow Yap_heap_regs->size_of_overflow #define SizeOfOverflow Yap_heap_regs->size_of_overflow
#define LastWtimePtr Yap_heap_regs->last_wtime #define LastWtimePtr Yap_heap_regs->last_wtime
@ -959,6 +962,7 @@ struct various_codes *Yap_heap_regs;
#define ThreadsTotalTime Yap_heap_regs->threads_total_time #define ThreadsTotalTime Yap_heap_regs->threads_total_time
#define DeadStaticClausesLock Yap_heap_regs->dead_static_clauses_lock #define DeadStaticClausesLock Yap_heap_regs->dead_static_clauses_lock
#define DeadMegaClausesLock Yap_heap_regs->dead_mega_clauses_lock #define DeadMegaClausesLock Yap_heap_regs->dead_mega_clauses_lock
#define DBTermsListLock Yap_heap_regs->dbterms_list_lock
#define DeadStaticIndicesLock Yap_heap_regs->dead_static_indices_lock #define DeadStaticIndicesLock Yap_heap_regs->dead_static_indices_lock
#define ModulesLock Yap_heap_regs->modules_lock #define ModulesLock Yap_heap_regs->modules_lock
#endif #endif

View File

@ -11,8 +11,11 @@
* File: YapOpcodes.h * * File: YapOpcodes.h *
* comments: Central Table with all YAP opcodes * * comments: Central Table with all YAP opcodes *
* * * *
* Last rev: $Date: 2006-10-10 14:08:17 $ * * Last rev: $Date: 2007-11-06 17:02:12 $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.40 2006/10/10 14:08:17 vsc
* small fixes on threaded implementation.
*
* Revision 1.39 2006/09/20 20:03:51 vsc * Revision 1.39 2006/09/20 20:03:51 vsc
* improve indexing on floats * improve indexing on floats
* fix sending large lists to DB * fix sending large lists to DB
@ -182,6 +185,7 @@
OPCODE(get_float ,xd), OPCODE(get_float ,xd),
OPCODE(get_longint ,xi), OPCODE(get_longint ,xi),
OPCODE(get_bigint ,xc), OPCODE(get_bigint ,xc),
OPCODE(get_dbterm ,xc),
OPCODE(get_list ,x), OPCODE(get_list ,x),
OPCODE(get_struct ,xf), OPCODE(get_struct ,xf),
OPCODE(unify_x_var ,ox), OPCODE(unify_x_var ,ox),
@ -192,6 +196,7 @@
OPCODE(unify_float ,od), OPCODE(unify_float ,od),
OPCODE(unify_longint ,oc), OPCODE(unify_longint ,oc),
OPCODE(unify_bigint ,oc), OPCODE(unify_bigint ,oc),
OPCODE(unify_dbterm ,oc),
OPCODE(unify_list ,o), OPCODE(unify_list ,o),
OPCODE(unify_struct ,of), OPCODE(unify_struct ,of),
OPCODE(put_x_var ,xx), OPCODE(put_x_var ,xx),
@ -318,6 +323,7 @@
OPCODE(unify_l_float ,od), OPCODE(unify_l_float ,od),
OPCODE(unify_l_longint ,oi), OPCODE(unify_l_longint ,oi),
OPCODE(unify_l_bigint ,oc), OPCODE(unify_l_bigint ,oc),
OPCODE(unify_l_dbterm ,oc),
OPCODE(unify_l_void ,o), OPCODE(unify_l_void ,o),
OPCODE(unify_l_n_voids ,os), OPCODE(unify_l_n_voids ,os),
OPCODE(unify_l_x_loc ,ox), OPCODE(unify_l_x_loc ,ox),

View File

@ -10,7 +10,7 @@
* File: Yap.proto * * File: Yap.proto *
* mods: * * mods: *
* comments: Function declarations for YAP * * comments: Function declarations for YAP *
* version: $Id: Yapproto.h,v 1.80 2007-10-18 08:24:16 vsc Exp $ * * version: $Id: Yapproto.h,v 1.81 2007-11-06 17:02:12 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* prototype file for Yap */ /* prototype file for Yap */
@ -325,6 +325,7 @@ void STD_PROTO(Yap_InitUserBacks,(void));
/* utilpreds.c */ /* utilpreds.c */
Term STD_PROTO(Yap_CopyTerm,(Term)); Term STD_PROTO(Yap_CopyTerm,(Term));
int STD_PROTO(Yap_SizeGroundTerm,(Term, int));
void STD_PROTO(Yap_InitUtilCPreds,(void)); void STD_PROTO(Yap_InitUtilCPreds,(void));
/* yap.c */ /* yap.c */

View File

@ -798,6 +798,7 @@ IsPredProperty (int flags)
/* There are several flags for code and data base entries */ /* There are several flags for code and data base entries */
typedef enum typedef enum
{ {
HasDBTMask = 0x400000, /* includes a pointer to a DBTerm */
MegaMask = 0x200000, /* mega clause */ MegaMask = 0x200000, /* mega clause */
FactMask = 0x100000, /* a fact */ FactMask = 0x100000, /* a fact */
SwitchRootMask = 0x80000, /* root for the index tree */ SwitchRootMask = 0x80000, /* root for the index tree */
@ -821,7 +822,10 @@ typedef enum
typedef struct DB_TERM typedef struct DB_TERM
{ {
#ifdef COROUTINING #ifdef COROUTINING
CELL attachments; /* attached terms */ union {
CELL attachments; /* attached terms */
struct DB_TERM *NextDBT;
} ag;
#endif #endif
struct DB_STRUCT **DBRefs; /* pointer to other references */ struct DB_STRUCT **DBRefs; /* pointer to other references */
CELL NOfCells; /* Size of Term */ CELL NOfCells; /* Size of Term */
@ -829,6 +833,18 @@ typedef struct DB_TERM
Term Contents[MIN_ARRAY]; /* stored term */ Term Contents[MIN_ARRAY]; /* stored term */
} DBTerm; } DBTerm;
inline EXTERN DBTerm *TermToDBTerm(Term);
inline EXTERN DBTerm *TermToDBTerm(Term X)
{
if (IsPairTerm(X)) {
return(DBTerm *)((char *)RepPair(X) - (CELL) &(((DBTerm *) NULL)->Contents));
} else {
return(DBTerm *)((char *)RepAppl(X) - (CELL) &(((DBTerm *) NULL)->Contents));
}
}
/* The ordering of the first 3 fields should be compatible with lu_clauses */ /* The ordering of the first 3 fields should be compatible with lu_clauses */
typedef struct DB_STRUCT typedef struct DB_STRUCT
{ {

View File

@ -158,6 +158,14 @@ typedef union clause_ptr {
struct static_index *si; struct static_index *si;
} ClausePointer; } ClausePointer;
typedef struct dbterm_list {
/* a list of dbterms associated with a clause */
DBTerm *dbterms;
yamop *clause_code;
PredEntry *p;
struct dbterm_list *next_dbl;
} DBTermList;
#define ClauseCodeToDynamicClause(p) ((DynamicClause *)((CODEADDR)(p)-(CELL)(((DynamicClause *)NULL)->ClCode))) #define ClauseCodeToDynamicClause(p) ((DynamicClause *)((CODEADDR)(p)-(CELL)(((DynamicClause *)NULL)->ClCode)))
#define ClauseCodeToStaticClause(p) ((StaticClause *)((CODEADDR)(p)-(CELL)(((StaticClause *)NULL)->ClCode))) #define ClauseCodeToStaticClause(p) ((StaticClause *)((CODEADDR)(p)-(CELL)(((StaticClause *)NULL)->ClCode)))
#define ClauseCodeToLogUpdClause(p) ((LogUpdClause *)((CODEADDR)(p)-(CELL)(((LogUpdClause *)NULL)->ClCode))) #define ClauseCodeToLogUpdClause(p) ((LogUpdClause *)((CODEADDR)(p)-(CELL)(((LogUpdClause *)NULL)->ClCode)))

View File

@ -30,6 +30,8 @@ typedef enum compiler_op {
put_num_op, put_num_op,
get_float_op, get_float_op,
put_float_op, put_float_op,
get_dbterm_op,
put_dbterm_op,
align_float_op, align_float_op,
get_longint_op, get_longint_op,
put_longint_op, put_longint_op,
@ -50,6 +52,8 @@ typedef enum compiler_op {
write_num_op, write_num_op,
unify_float_op, unify_float_op,
write_float_op, write_float_op,
unify_dbterm_op,
write_dbterm_op,
unify_longint_op, unify_longint_op,
write_longint_op, write_longint_op,
unify_bigint_op, unify_bigint_op,
@ -117,6 +121,7 @@ typedef enum compiler_op {
unify_last_atom_op, unify_last_atom_op,
unify_last_num_op, unify_last_num_op,
unify_last_float_op, unify_last_float_op,
unify_last_dbterm_op,
unify_last_longint_op, unify_last_longint_op,
unify_last_bigint_op, unify_last_bigint_op,
mark_initialised_pvars_op, mark_initialised_pvars_op,
@ -231,6 +236,13 @@ typedef struct CEXPENTRY {
struct CEXPENTRY *NextCE; struct CEXPENTRY *NextCE;
} CExpEntry; } CExpEntry;
#define COMPILER_ERR_BOTCH 1
#define OUT_OF_HEAP_BOTCH 2
#define OUT_OF_STACK_BOTCH 3
#define OUT_OF_TEMPS_BOTCH 4
#define OUT_OF_AUX_BOTCH 5
#define OUT_OF_TRAIL_BOTCH 6
typedef struct intermediates { typedef struct intermediates {
char *freep; char *freep;
@ -239,6 +251,7 @@ typedef struct intermediates {
struct PSEUDO *CodeStart; struct PSEUDO *CodeStart;
struct PSEUDO *icpc; struct PSEUDO *icpc;
struct PSEUDO *BlobsStart; struct PSEUDO *BlobsStart;
struct dbterm_list *dbterml;
int *label_offset; int *label_offset;
Int *uses; Int *uses;
Term *contents; Term *contents;

View File

@ -12,8 +12,11 @@
* File: rclause.h * * File: rclause.h *
* comments: walk through a clause * * comments: walk through a clause *
* * * *
* Last rev: $Date: 2006-11-27 17:42:03 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:12 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.18 2006/11/27 17:42:03 vsc
* support for UNICODE, and other bug fixes.
*
* Revision 1.17 2006/10/10 14:08:17 vsc * Revision 1.17 2006/10/10 14:08:17 vsc
* small fixes on threaded implementation. * small fixes on threaded implementation.
* *
@ -464,6 +467,7 @@ restore_opcodes(yamop *pc)
case _get_atom: case _get_atom:
case _put_atom: case _put_atom:
case _get_bigint: case _get_bigint:
case _get_dbterm:
pc->u.xc.x = XAdjust(pc->u.xc.x); pc->u.xc.x = XAdjust(pc->u.xc.x);
{ {
Term t = pc->u.xc.c; Term t = pc->u.xc.c;
@ -474,7 +478,6 @@ restore_opcodes(yamop *pc)
} }
pc = NEXTOP(pc,xc); pc = NEXTOP(pc,xc);
break; break;
/* instructions type cc */
case _get_2atoms: case _get_2atoms:
{ {
Term t = pc->u.cc.c1; Term t = pc->u.cc.c1;
@ -744,6 +747,8 @@ restore_opcodes(yamop *pc)
case _unify_l_atom: case _unify_l_atom:
case _unify_bigint: case _unify_bigint:
case _unify_l_bigint: case _unify_l_bigint:
case _unify_dbterm:
case _unify_l_dbterm:
pc->u.oc.opcw = Yap_opcode(Yap_op_from_opcode(pc->u.oc.opcw)); pc->u.oc.opcw = Yap_opcode(Yap_op_from_opcode(pc->u.oc.opcw));
{ {
Term t = pc->u.oc.c; Term t = pc->u.oc.c;

View File

@ -11,8 +11,13 @@
* File: rheap.h * * File: rheap.h *
* comments: walk through heap code * * comments: walk through heap code *
* * * *
* Last rev: $Date: 2007-10-10 09:44:24 $,$Author: vsc $ * * Last rev: $Date: 2007-11-06 17:02:12 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.77 2007/10/10 09:44:24 vsc
* some more fixes to make YAP swi compatible
* fix absolute_file_name (again)
* fix setarg
*
* Revision 1.76 2007/09/28 23:18:17 vsc * Revision 1.76 2007/09/28 23:18:17 vsc
* handle learning from interpretations. * handle learning from interpretations.
* *
@ -188,8 +193,6 @@ do_clean_susp_clauses(yamop *ipc) {
#include "rclause.h" #include "rclause.h"
/* Restoring the heap */
/* adjusts terms stored in the data base, when they have no variables */ /* adjusts terms stored in the data base, when they have no variables */
static Term static Term
AdjustDBTerm(Term trm, Term *p_base) AdjustDBTerm(Term trm, Term *p_base)
@ -232,12 +235,16 @@ AdjustDBTerm(Term trm, Term *p_base)
} }
static void static void
RestoreDBTerm(DBTerm *dbr) RestoreDBTerm(DBTerm *dbr, int attachments)
{ {
if (attachments) {
#ifdef COROUTINING #ifdef COROUTINING
if (dbr->attachments) if (dbr->ag.attachments)
dbr->attachments = AdjustDBTerm(dbr->attachments, dbr->Contents); dbr->ag.attachments = AdjustDBTerm(dbr->ag.attachments, dbr->Contents);
#endif #endif
} else {
dbr->ag.NextDBT = DBTermAdjust(dbr->ag.NextDBT);
}
if (dbr->DBRefs != NULL) { if (dbr->DBRefs != NULL) {
DBRef *cp; DBRef *cp;
DBRef tm; DBRef tm;
@ -250,6 +257,8 @@ RestoreDBTerm(DBTerm *dbr)
dbr->Entry = AdjustDBTerm(dbr->Entry, dbr->Contents); dbr->Entry = AdjustDBTerm(dbr->Entry, dbr->Contents);
} }
/* Restoring the heap */
/* Restores a prolog clause, in its compiled form */ /* Restores a prolog clause, in its compiled form */
static void static void
RestoreStaticClause(StaticClause *cl) RestoreStaticClause(StaticClause *cl)
@ -313,7 +322,7 @@ RestoreLUClause(LogUpdClause *cl, PredEntry *pp)
} }
if (cl->ClSource) { if (cl->ClSource) {
cl->ClSource = DBTermAdjust(cl->ClSource); cl->ClSource = DBTermAdjust(cl->ClSource);
RestoreDBTerm(cl->ClSource); RestoreDBTerm(cl->ClSource, TRUE);
} }
if (cl->ClPrev) { if (cl->ClPrev) {
cl->ClPrev = PtoLUCAdjust(cl->ClPrev); cl->ClPrev = PtoLUCAdjust(cl->ClPrev);
@ -325,6 +334,20 @@ RestoreLUClause(LogUpdClause *cl, PredEntry *pp)
restore_opcodes(cl->ClCode); restore_opcodes(cl->ClCode);
} }
static void
RestoreDBTermEntry(struct dbterm_list *dbl) {
DBTerm *dbt;
dbl->dbterms = DBTermAdjust(dbl->dbterms);
dbl->clause_code = PtoOpAdjust(dbl->clause_code);
dbl->next_dbl = PtoDBTLAdjust(dbl->next_dbl);
dbl->p = PredEntryAdjust(dbl->p);
while (dbt) {
RestoreDBTerm(dbt, FALSE);
dbt = dbt->ag.NextDBT;
}
}
static void static void
CleanLUIndex(LogUpdIndex *idx) CleanLUIndex(LogUpdIndex *idx)
{ {
@ -503,6 +526,14 @@ restore_codes(void)
mc = mc->ClNext; mc = mc->ClNext;
} }
} }
if (Yap_heap_regs->dbterms_list) {
struct dbterm_list *dbl = PtoDBTLAdjust(Yap_heap_regs->dbterms_list);
Yap_heap_regs->dbterms_list = dbl;
while (dbl) {
RestoreDBTermEntry(dbl);
dbl = dbl->next_dbl;
}
}
if (Yap_heap_regs->dead_static_indices) { if (Yap_heap_regs->dead_static_indices) {
StaticIndex *si = (StaticIndex *)AddrAdjust((ADDR)(Yap_heap_regs->dead_static_indices)); StaticIndex *si = (StaticIndex *)AddrAdjust((ADDR)(Yap_heap_regs->dead_static_indices));
Yap_heap_regs->dead_static_indices = si; Yap_heap_regs->dead_static_indices = si;
@ -705,23 +736,23 @@ restore_codes(void)
Yap_heap_regs->yap_lib_dir = Yap_heap_regs->yap_lib_dir =
(char *)AddrAdjust((ADDR)Yap_heap_regs->yap_lib_dir); (char *)AddrAdjust((ADDR)Yap_heap_regs->yap_lib_dir);
Yap_heap_regs->pred_goal_expansion = Yap_heap_regs->pred_goal_expansion =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_goal_expansion); PredEntryAdjust(Yap_heap_regs->pred_goal_expansion);
Yap_heap_regs->pred_meta_call = Yap_heap_regs->pred_meta_call =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_meta_call); PredEntryAdjust(Yap_heap_regs->pred_meta_call);
Yap_heap_regs->pred_dollar_catch = Yap_heap_regs->pred_dollar_catch =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_dollar_catch); PredEntryAdjust(Yap_heap_regs->pred_dollar_catch);
Yap_heap_regs->pred_recorded_with_key = Yap_heap_regs->pred_recorded_with_key =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_recorded_with_key); PredEntryAdjust(Yap_heap_regs->pred_recorded_with_key);
Yap_heap_regs->pred_log_upd_clause = Yap_heap_regs->pred_log_upd_clause =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_log_upd_clause); PredEntryAdjust(Yap_heap_regs->pred_log_upd_clause);
Yap_heap_regs->pred_log_upd_clause0 = Yap_heap_regs->pred_log_upd_clause0 =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_log_upd_clause0); PredEntryAdjust(Yap_heap_regs->pred_log_upd_clause0);
Yap_heap_regs->pred_static_clause = Yap_heap_regs->pred_static_clause =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_static_clause); PredEntryAdjust(Yap_heap_regs->pred_static_clause);
Yap_heap_regs->pred_throw = Yap_heap_regs->pred_throw =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_throw); PredEntryAdjust(Yap_heap_regs->pred_throw);
Yap_heap_regs->pred_handle_throw = Yap_heap_regs->pred_handle_throw =
(PredEntry *)AddrAdjust((ADDR)Yap_heap_regs->pred_handle_throw); PredEntryAdjust(Yap_heap_regs->pred_handle_throw);
#if DEBUG #if DEBUG
if (Yap_heap_regs->db_erased_list) { if (Yap_heap_regs->db_erased_list) {
Yap_heap_regs->db_erased_list = Yap_heap_regs->db_erased_list =
@ -816,7 +847,7 @@ RestoreDBEntry(DBRef dbr)
else else
fprintf(stderr, " a var\n"); fprintf(stderr, " a var\n");
#endif #endif
RestoreDBTerm(&(dbr->DBT)); RestoreDBTerm(&(dbr->DBT), TRUE);
if (dbr->Parent) { if (dbr->Parent) {
dbr->Parent = (DBProp)AddrAdjust((ADDR)(dbr->Parent)); dbr->Parent = (DBProp)AddrAdjust((ADDR)(dbr->Parent));
} }
@ -1029,7 +1060,7 @@ restore_static_array(StaticArrayEntry *ae)
} else { } else {
DBTerm *db = (DBTerm *)RepAppl(reg); DBTerm *db = (DBTerm *)RepAppl(reg);
db = DBTermAdjust(db); db = DBTermAdjust(db);
RestoreDBTerm(db); RestoreDBTerm(db, TRUE);
base->tstore = AbsAppl((CELL *)db); base->tstore = AbsAppl((CELL *)db);
} }
} }
@ -1048,7 +1079,7 @@ restore_static_array(StaticArrayEntry *ae)
base++; base++;
} else { } else {
*base++ = reg = DBTermAdjust(reg); *base++ = reg = DBTermAdjust(reg);
RestoreDBTerm(reg); RestoreDBTerm(reg, TRUE);
} }
} }
} }

View File

@ -568,6 +568,15 @@ PtoStCAdjust (struct static_clause *ptr)
} }
inline EXTERN struct dbterm_list *PtoDBTLAdjust (struct dbterm_list *);
inline EXTERN struct dbterm_list *
PtoDBTLAdjust (struct dbterm_list * addr)
{
return (struct dbterm_list *) ((ADDR) (CharP (addr) + HDiff));
}
#if PRECOMPUTE_REGADDRESS #if PRECOMPUTE_REGADDRESS
inline EXTERN wamreg XAdjust (wamreg); inline EXTERN wamreg XAdjust (wamreg);

View File

@ -17,6 +17,10 @@
<h2>Yap-5.1.3:</h2> <h2>Yap-5.1.3:</h2>
<ul> <ul>
<li> FIXED: predicate table could not enough room while overflowing
(obs from Bernd Gutmann).</li>
<li> FIXED: compile large ground terms outside clauses (obs from Bernd
Gutmann).</li>
<li> FIXED: YAP_LeaveGoal should always backtrack, if asked for, for <li> FIXED: YAP_LeaveGoal should always backtrack, if asked for, for
deterministic computations (obs from Trevor Walker).</li> deterministic computations (obs from Trevor Walker).</li>
<li> FIXED: in_this_file_before should check predicate module, not <li> FIXED: in_this_file_before should check predicate module, not

View File

@ -1,4 +1,4 @@
\input texinfo @c -*- mode: texinfo; coding: latin-1; -*- a\input texinfo @c -*- mode: texinfo; coding: latin-1; -*-
@c %**start of header @c %**start of header
@setfilename yap.info @setfilename yap.info
@ -1594,6 +1594,64 @@ will consult @code{file1} @code{file4} and reconsult @code{file2} and
@noindent @noindent
In YAP, the same as @code{reconsult/1}. In YAP, the same as @code{reconsult/1}.
@item load_files(@var{+Files}, @var{+Options})
@findex load_files/2
@syindex load_files/2
@cnindex load_files/2
@noindent
General implementation of @code{consult}. Execution is controlled by the
following flags:
@table @code
@item autoload(+@var{Autoload})
SWI-compatible option where if @var{Autoload} is @code{true} predicates
are loaded on first call. Currently
not supported.
@item derived_from(+@var{File})
SWI-compatible option to control make. Currently
not supported.
@item encoding(+@var{Encoding})
Character encoding used in consulting files. Please @pxref{Encoding} for
supported encodings.
@item expand(+@var{Bool})
Not yet implemented. In SWI-Prolog, if @code{true}, run the
filenames through @code{expand_file_name/2} and load the returned
files. Default is false, except for @code{consult/1} which is
intended for interactive use.
@item if(+@var{Condition})
Load the file only if the specified @var{Condition} is
satisfied. The value @code{true} the file unconditionally,
@code{changed} loads the file if it was not loaded before, or has
been modified since it was loaded the last time, @code{not_loaded}
loads the file if it was not loaded before.
@item imports(+@var{ListOrAll})
If @code{all} and the file is a module file, import all public
predicates. Otherwise import only the named predicates. Each
predicate is referred to as @code{<name>/<arity>}. This option has
no effect if the file is not a module file.
@item must_be_module(+@var{Bool})
If true, raise an error if the file is not a module file. Used by
@code{use_module/[1,2]}.
@c qcompile(Bool)
@c If this call appears in a directive of a file that is compiled into Quick Load Format using qcompile/1 and this flag is true, the contents of the argument files are included in the .qlf file instead of the loading directive.
@item silent(+@var{Bool})
If true, load the file without printing a message. The specified value is the default for all files loaded as a result of loading the specified files.
@item stream(+@var{Input})
This SWI-Prolog extension compiles the data from the stream
@var{Input}. If this option is used, @var{Files} must be a single
atom which is used to identify the source-location of the loaded
clauses as well as remove all clauses if the data is re-consulted.
This option is added to allow compiling from non-file locations such as databases, the web, the user (see consult/1) or other servers.
@end table
@item ensure_loaded(@var{+F}) [ISO] @item ensure_loaded(@var{+F}) [ISO]
@findex ensure_loaded/1 @findex ensure_loaded/1
@syindex compile/1 @syindex compile/1

View File

@ -19,14 +19,14 @@
% SWI options % SWI options
% autoload(true,false) % autoload(true,false)
% derived_from(File) -> make % derived_from(File) -> make
% encoding(Encoding) % encoding(Encoding) => implemented
% expand({true,false) % expand({true,false)
% if(changed,true,not_loaded) % if(changed,true,not_loaded) => implemented
% imports(all,List) % imports(all,List) => implemented
% qcompile(true,false) % qcompile(true,false)
% silent(true,false) => implemented % silent(true,false) => implemented
% stream(Stream) => implemented % stream(Stream) => implemented
% consult(consult,reconsult) % consult(consult,reconsult) => implemented
% %
load_files(Files,Opts) :- load_files(Files,Opts) :-
'$load_files'(Files,Opts,load_files(Files,Opts)). '$load_files'(Files,Opts,load_files(Files,Opts)).