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:
vsc 2002-06-11 05:43:01 +00:00
parent 7176752a68
commit 0f027df00c
5 changed files with 20 additions and 19 deletions

View File

@ -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) {

View File

@ -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)());
} }
} }

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.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));

View File

@ -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>

View File

@ -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);
} }