fix backtrackable C-interface (patch from Christophe Billard).
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@526 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
7176752a68
commit
0f027df00c
@ -5760,7 +5760,7 @@ absmi(int inp)
|
|||||||
saveregs();
|
saveregs();
|
||||||
save_machine_regs();
|
save_machine_regs();
|
||||||
|
|
||||||
SREG = (CELL *) YapExecute(p);
|
SREG = (CELL *) YapExecute(p, (CPredicate)(p->TrueCodeOfPred));
|
||||||
}
|
}
|
||||||
|
|
||||||
restore_machine_regs();
|
restore_machine_regs();
|
||||||
@ -5888,7 +5888,7 @@ absmi(int inp)
|
|||||||
ASP = YENV;
|
ASP = YENV;
|
||||||
saveregs();
|
saveregs();
|
||||||
save_machine_regs();
|
save_machine_regs();
|
||||||
SREG = (CELL *) YapExecute(PREG->u.lds.p);
|
SREG = (CELL *) YapExecute(PREG->u.lds.p, (CPredicate)(PREG->u.lds.d));
|
||||||
restore_machine_regs();
|
restore_machine_regs();
|
||||||
setregs();
|
setregs();
|
||||||
if (!SREG) {
|
if (!SREG) {
|
||||||
|
@ -74,7 +74,6 @@ X_API Int STD_PROTO(Yapcut_fail,(void));
|
|||||||
X_API Int STD_PROTO(Yapcut_succeed,(void));
|
X_API Int STD_PROTO(Yapcut_succeed,(void));
|
||||||
X_API Int STD_PROTO(YapUnify,(Term,Term));
|
X_API Int STD_PROTO(YapUnify,(Term,Term));
|
||||||
X_API Int STD_PROTO(YapUnify,(Term,Term));
|
X_API Int STD_PROTO(YapUnify,(Term,Term));
|
||||||
Int STD_PROTO(YapExecute,(PredEntry *));
|
|
||||||
X_API int STD_PROTO(YapReset,(void));
|
X_API int STD_PROTO(YapReset,(void));
|
||||||
X_API Int STD_PROTO(YapInit,(yap_init_args *));
|
X_API Int STD_PROTO(YapInit,(yap_init_args *));
|
||||||
X_API Int STD_PROTO(YapFastInit,(char *));
|
X_API Int STD_PROTO(YapFastInit,(char *));
|
||||||
@ -482,37 +481,36 @@ typedef Int (*CPredicate7)(long,long,long,long,long,long,long);
|
|||||||
typedef Int (*CPredicate8)(long,long,long,long,long,long,long,long);
|
typedef Int (*CPredicate8)(long,long,long,long,long,long,long,long);
|
||||||
|
|
||||||
Int
|
Int
|
||||||
YapExecute(PredEntry *pe)
|
YapExecute(PredEntry *pe, CPredicate exec_code)
|
||||||
{
|
{
|
||||||
if (pe->PredFlags & CArgsPredFlag) {
|
if (pe->PredFlags & CArgsPredFlag) {
|
||||||
CODEADDR code = pe->TrueCodeOfPred;
|
|
||||||
switch (pe->ArityOfPE) {
|
switch (pe->ArityOfPE) {
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
CPredicate code0 = (CPredicate)code;
|
CPredicate code0 = exec_code;
|
||||||
return ((code0)());
|
return ((code0)());
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
CPredicate1 code1 = (CPredicate1)code;
|
CPredicate1 code1 = (CPredicate1)exec_code;
|
||||||
return ((code1)(YapInitSlot(Deref(ARG1))));
|
return ((code1)(YapInitSlot(Deref(ARG1))));
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
CPredicate2 code2 = (CPredicate2)code;
|
CPredicate2 code2 = (CPredicate2)exec_code;
|
||||||
return ((code2)(YapInitSlot(Deref(ARG1)),
|
return ((code2)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2))));
|
YapInitSlot(Deref(ARG2))));
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
CPredicate3 code3 = (CPredicate3)code;
|
CPredicate3 code3 = (CPredicate3)exec_code;
|
||||||
return ((code3)(YapInitSlot(Deref(ARG1)),
|
return ((code3)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3))));
|
YapInitSlot(Deref(ARG3))));
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
CPredicate4 code4 = (CPredicate4)code;
|
CPredicate4 code4 = (CPredicate4)exec_code;
|
||||||
return ((code4)(YapInitSlot(Deref(ARG1)),
|
return ((code4)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3)),
|
YapInitSlot(Deref(ARG3)),
|
||||||
@ -520,7 +518,7 @@ YapExecute(PredEntry *pe)
|
|||||||
}
|
}
|
||||||
case 5:
|
case 5:
|
||||||
{
|
{
|
||||||
CPredicate5 code5 = (CPredicate5)code;
|
CPredicate5 code5 = (CPredicate5)exec_code;
|
||||||
return ((code5)(YapInitSlot(Deref(ARG1)),
|
return ((code5)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3)),
|
YapInitSlot(Deref(ARG3)),
|
||||||
@ -528,7 +526,7 @@ YapExecute(PredEntry *pe)
|
|||||||
}
|
}
|
||||||
case 6:
|
case 6:
|
||||||
{
|
{
|
||||||
CPredicate6 code6 = (CPredicate6)code;
|
CPredicate6 code6 = (CPredicate6)exec_code;
|
||||||
return ((code6)(YapInitSlot(Deref(ARG1)),
|
return ((code6)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3)),
|
YapInitSlot(Deref(ARG3)),
|
||||||
@ -538,7 +536,7 @@ YapExecute(PredEntry *pe)
|
|||||||
}
|
}
|
||||||
case 7:
|
case 7:
|
||||||
{
|
{
|
||||||
CPredicate7 code7 = (CPredicate7)code;
|
CPredicate7 code7 = (CPredicate7)exec_code;
|
||||||
return ((code7)(YapInitSlot(Deref(ARG1)),
|
return ((code7)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3)),
|
YapInitSlot(Deref(ARG3)),
|
||||||
@ -549,7 +547,7 @@ YapExecute(PredEntry *pe)
|
|||||||
}
|
}
|
||||||
case 8:
|
case 8:
|
||||||
{
|
{
|
||||||
CPredicate8 code8 = (CPredicate8)code;
|
CPredicate8 code8 = (CPredicate8)exec_code;
|
||||||
return ((code8)(YapInitSlot(Deref(ARG1)),
|
return ((code8)(YapInitSlot(Deref(ARG1)),
|
||||||
YapInitSlot(Deref(ARG2)),
|
YapInitSlot(Deref(ARG2)),
|
||||||
YapInitSlot(Deref(ARG3)),
|
YapInitSlot(Deref(ARG3)),
|
||||||
@ -563,8 +561,7 @@ YapExecute(PredEntry *pe)
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CPredicate code = (CPredicate)(pe->TrueCodeOfPred);
|
return((exec_code)());
|
||||||
return((code)());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.20 2002-06-05 03:59:50 vsc Exp $ *
|
* version: $Id: Yapproto.h,v 1.21 2002-06-11 05:43:01 vsc Exp $ *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
/* prototype file for Yap */
|
/* prototype file for Yap */
|
||||||
@ -104,7 +104,7 @@ void STD_PROTO(InitBBPreds,(void));
|
|||||||
void STD_PROTO(InitBigNums,(void));
|
void STD_PROTO(InitBigNums,(void));
|
||||||
|
|
||||||
/* c_interface.c */
|
/* c_interface.c */
|
||||||
Int STD_PROTO(YapExecute,(struct pred_entry *));
|
Int STD_PROTO(YapExecute,(struct pred_entry *, CPredicate));
|
||||||
|
|
||||||
/* cdmgr.c */
|
/* cdmgr.c */
|
||||||
void STD_PROTO(mark_as_fast,(Term));
|
void STD_PROTO(mark_as_fast,(Term));
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
<h2>Yap-4.3.23:</h2>
|
<h2>Yap-4.3.23:</h2>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>FIXED: backtrackable C-predicates (thanks to Christophe
|
||||||
|
Billard for sending the file).</li>
|
||||||
<li>FIXED: new options for file_property (Nicos).</li>
|
<li>FIXED: new options for file_property (Nicos).</li>
|
||||||
<li>FIXED: check unification result in file_property (Nicos).</li>
|
<li>FIXED: check unification result in file_property (Nicos).</li>
|
||||||
<li>FIXED: yap_flag(fileerrors) (Nicos).</li>
|
<li>FIXED: yap_flag(fileerrors) (Nicos).</li>
|
||||||
|
@ -276,9 +276,11 @@ file_property(void)
|
|||||||
#if HAVE_READLINK
|
#if HAVE_READLINK
|
||||||
{
|
{
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
if (readlink(fd,tmp,256) == -1) {
|
int n;
|
||||||
|
if ((n = readlink(fd,tmp,256)) == -1) {
|
||||||
return(unify(ARG7, MkIntTerm(errno)));
|
return(unify(ARG7, MkIntTerm(errno)));
|
||||||
}
|
}
|
||||||
|
tmp[n] = '\0';
|
||||||
if(!unify(ARG6,MkAtomTerm(LookupAtom(tmp)))) {
|
if(!unify(ARG6,MkAtomTerm(LookupAtom(tmp)))) {
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user