fix c_interface not to crash when people try to recover slots that are
not there. fix try_logical and friends to handle case where predicate has arity 0. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2278 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
e90f744e5e
commit
39c4a2e67f
33
C/absmi.c
33
C/absmi.c
@ -10,8 +10,11 @@
|
|||||||
* *
|
* *
|
||||||
* File: absmi.c *
|
* File: absmi.c *
|
||||||
* comments: Portable abstract machine interpreter *
|
* comments: Portable abstract machine interpreter *
|
||||||
* Last rev: $Date: 2008-06-04 14:47:18 $,$Author: vsc $ *
|
* Last rev: $Date: 2008-06-17 13:37:48 $,$Author: vsc $ *
|
||||||
* $Log: not supported by cvs2svn $
|
* $Log: not supported by cvs2svn $
|
||||||
|
* Revision 1.241 2008/06/04 14:47:18 vsc
|
||||||
|
* make sure we do trim_trail whenever we mess with B!
|
||||||
|
*
|
||||||
* Revision 1.240 2008/04/04 16:11:40 vsc
|
* Revision 1.240 2008/04/04 16:11:40 vsc
|
||||||
* yapor had gotten broken with recent thread changes
|
* yapor had gotten broken with recent thread changes
|
||||||
*
|
*
|
||||||
@ -832,7 +835,7 @@ Yap_absmi(int inp)
|
|||||||
ASP = (CELL *) PROTECT_FROZEN_B(B);
|
ASP = (CELL *) PROTECT_FROZEN_B(B);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASP = YREG;
|
ASP = YREG+E_CB;
|
||||||
}
|
}
|
||||||
saveregs();
|
saveregs();
|
||||||
#if PUSH_REGS
|
#if PUSH_REGS
|
||||||
@ -849,7 +852,7 @@ Yap_absmi(int inp)
|
|||||||
ASP = (CELL *) PROTECT_FROZEN_B(B);
|
ASP = (CELL *) PROTECT_FROZEN_B(B);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASP = YREG;
|
ASP = YREG+E_CB;
|
||||||
}
|
}
|
||||||
saveregs();
|
saveregs();
|
||||||
#if PUSH_REGS
|
#if PUSH_REGS
|
||||||
@ -858,7 +861,7 @@ Yap_absmi(int inp)
|
|||||||
#if BP_FREE
|
#if BP_FREE
|
||||||
P1REG = PCBACKUP;
|
P1REG = PCBACKUP;
|
||||||
#endif
|
#endif
|
||||||
return (0);
|
return 0;
|
||||||
ENDBOp();
|
ENDBOp();
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
@ -1042,7 +1045,7 @@ Yap_absmi(int inp)
|
|||||||
JMPNext();
|
JMPNext();
|
||||||
}
|
}
|
||||||
restore_yaam_regs(PREG->u.lld.n);
|
restore_yaam_regs(PREG->u.lld.n);
|
||||||
restore_at_least_one_arg(PREG->u.lld.t.s);
|
restore_args(PREG->u.lld.t.s);
|
||||||
LOCK(PREG->u.lld.d->ClPred->StatisticsForPred.lock);
|
LOCK(PREG->u.lld.d->ClPred->StatisticsForPred.lock);
|
||||||
PREG->u.lld.d->ClPred->StatisticsForPred.NOfRetries++;
|
PREG->u.lld.d->ClPred->StatisticsForPred.NOfRetries++;
|
||||||
UNLOCK(PREG->u.lld.d->ClPred->StatisticsForPred.lock);
|
UNLOCK(PREG->u.lld.d->ClPred->StatisticsForPred.lock);
|
||||||
@ -1139,7 +1142,7 @@ Yap_absmi(int inp)
|
|||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
if (SCH_top_shared_cp(B)) {
|
if (SCH_top_shared_cp(B)) {
|
||||||
SCH_last_alternative(PREG, B_YREG);
|
SCH_last_alternative(PREG, B_YREG);
|
||||||
restore_at_least_one_arg(ap->ArityOfPE);
|
restore_args(ap->ArityOfPE);
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
#else
|
#else
|
||||||
@ -1150,7 +1153,7 @@ Yap_absmi(int inp)
|
|||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
{
|
{
|
||||||
pop_yaam_regs();
|
pop_yaam_regs();
|
||||||
pop_at_least_one_arg(ap->ArityOfPE);
|
pop_args(ap->ArityOfPE);
|
||||||
S_YREG--;
|
S_YREG--;
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
@ -1335,7 +1338,7 @@ Yap_absmi(int inp)
|
|||||||
JMPNext();
|
JMPNext();
|
||||||
}
|
}
|
||||||
restore_yaam_regs(PREG->u.lld.n);
|
restore_yaam_regs(PREG->u.lld.n);
|
||||||
restore_at_least_one_arg(PREG->u.lld.t.s);
|
restore_args(PREG->u.lld.t.s);
|
||||||
RetriesCounter--;
|
RetriesCounter--;
|
||||||
if (RetriesCounter == 0) {
|
if (RetriesCounter == 0) {
|
||||||
saveregs();
|
saveregs();
|
||||||
@ -1459,7 +1462,7 @@ Yap_absmi(int inp)
|
|||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
if (SCH_top_shared_cp(B)) {
|
if (SCH_top_shared_cp(B)) {
|
||||||
SCH_last_alternative(PREG, B_YREG);
|
SCH_last_alternative(PREG, B_YREG);
|
||||||
restore_at_least_one_arg(ap->ArityOfPE);
|
restore_args(ap->ArityOfPE);
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
#else
|
#else
|
||||||
@ -1470,7 +1473,7 @@ Yap_absmi(int inp)
|
|||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
{
|
{
|
||||||
pop_yaam_regs();
|
pop_yaam_regs();
|
||||||
pop_at_least_one_arg(ap->ArityOfPE);
|
pop_args(ap->ArityOfPE);
|
||||||
S_YREG--;
|
S_YREG--;
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
@ -1554,7 +1557,7 @@ Yap_absmi(int inp)
|
|||||||
LogUpdClause *cl = ClauseCodeToLogUpdClause(PREG);
|
LogUpdClause *cl = ClauseCodeToLogUpdClause(PREG);
|
||||||
Term t;
|
Term t;
|
||||||
|
|
||||||
ASP = YREG;
|
ASP = YREG+E_CB;
|
||||||
saveregs();
|
saveregs();
|
||||||
while ((t = Yap_FetchTermFromDB(cl->ClSource)) == 0L) {
|
while ((t = Yap_FetchTermFromDB(cl->ClSource)) == 0L) {
|
||||||
if (Yap_Error_TYPE == OUT_OF_ATTVARS_ERROR) {
|
if (Yap_Error_TYPE == OUT_OF_ATTVARS_ERROR) {
|
||||||
@ -2677,7 +2680,7 @@ Yap_absmi(int inp)
|
|||||||
if (ActiveSignals & YAP_CREEP_SIGNAL) {
|
if (ActiveSignals & YAP_CREEP_SIGNAL) {
|
||||||
GONext();
|
GONext();
|
||||||
}
|
}
|
||||||
ASP = YREG;
|
ASP = YREG+E_CB;
|
||||||
/* cut_e */
|
/* cut_e */
|
||||||
if (SREG <= ASP) {
|
if (SREG <= ASP) {
|
||||||
ASP = SREG-EnvSizeInCells;
|
ASP = SREG-EnvSizeInCells;
|
||||||
@ -8171,7 +8174,7 @@ Yap_absmi(int inp)
|
|||||||
/* fprintf(stderr,"+ %p/%p %d %d %d--%u\n",PREG,PREG->u.lld.d->ClPred,timestamp,PREG->u.lld.d->ClPred->TimeStampOfPred,PREG->u.lld.d->ClTimeStart,PREG->u.lld.d->ClTimeEnd);*/
|
/* fprintf(stderr,"+ %p/%p %d %d %d--%u\n",PREG,PREG->u.lld.d->ClPred,timestamp,PREG->u.lld.d->ClPred->TimeStampOfPred,PREG->u.lld.d->ClTimeStart,PREG->u.lld.d->ClTimeEnd);*/
|
||||||
/* Point AP to the code that follows this instruction */
|
/* Point AP to the code that follows this instruction */
|
||||||
/* always do this, even if we are not going to use it */
|
/* always do this, even if we are not going to use it */
|
||||||
store_at_least_one_arg(PREG->u.lld.t.s);
|
store_args(PREG->u.lld.t.s);
|
||||||
store_yaam_regs(PREG->u.lld.n, 0);
|
store_yaam_regs(PREG->u.lld.n, 0);
|
||||||
set_cut(S_YREG, B);
|
set_cut(S_YREG, B);
|
||||||
B = B_YREG;
|
B = B_YREG;
|
||||||
@ -8304,7 +8307,7 @@ Yap_absmi(int inp)
|
|||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
if (SCH_top_shared_cp(B)) {
|
if (SCH_top_shared_cp(B)) {
|
||||||
SCH_last_alternative(PREG, B_YREG);
|
SCH_last_alternative(PREG, B_YREG);
|
||||||
restore_at_least_one_arg(ap->ArityOfPE);
|
restore_args(ap->ArityOfPE);
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
#else
|
#else
|
||||||
@ -8315,7 +8318,7 @@ Yap_absmi(int inp)
|
|||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
{
|
{
|
||||||
pop_yaam_regs();
|
pop_yaam_regs();
|
||||||
pop_at_least_one_arg(ap->ArityOfPE);
|
pop_args(ap->ArityOfPE);
|
||||||
S_YREG--;
|
S_YREG--;
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
||||||
|
@ -1165,12 +1165,16 @@ Yap_InitSlot(Term t)
|
|||||||
return((ASP+1)-LCL0);
|
return((ASP+1)-LCL0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
Yap_RecoverSlots(int n)
|
Yap_RecoverSlots(int n)
|
||||||
{
|
{
|
||||||
Int old_slots = IntOfTerm(ASP[0]);
|
Int old_slots = IntOfTerm(ASP[0]);
|
||||||
|
if (old_slots - n < 0) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
ASP += n;
|
ASP += n;
|
||||||
ASP[0] = MkIntTerm(old_slots-n);
|
ASP[0] = MkIntTerm(old_slots-n);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Term
|
Term
|
||||||
|
@ -10,8 +10,11 @@
|
|||||||
* File: c_interface.c *
|
* File: c_interface.c *
|
||||||
* comments: c_interface primitives definition *
|
* comments: c_interface primitives definition *
|
||||||
* *
|
* *
|
||||||
* Last rev: $Date: 2008-06-04 14:47:18 $,$Author: vsc $ *
|
* Last rev: $Date: 2008-06-17 13:37:48 $,$Author: vsc $ *
|
||||||
* $Log: not supported by cvs2svn $
|
* $Log: not supported by cvs2svn $
|
||||||
|
* Revision 1.118 2008/06/04 14:47:18 vsc
|
||||||
|
* make sure we do trim_trail whenever we mess with B!
|
||||||
|
*
|
||||||
* Revision 1.117 2008/06/04 13:58:36 vsc
|
* Revision 1.117 2008/06/04 13:58:36 vsc
|
||||||
* more fixes to C-interface
|
* more fixes to C-interface
|
||||||
*
|
*
|
||||||
@ -438,7 +441,7 @@ X_API long STD_PROTO(YAP_InitSlot,(Term));
|
|||||||
X_API Term STD_PROTO(YAP_GetFromSlot,(long));
|
X_API Term STD_PROTO(YAP_GetFromSlot,(long));
|
||||||
X_API Term *STD_PROTO(YAP_AddressFromSlot,(long));
|
X_API Term *STD_PROTO(YAP_AddressFromSlot,(long));
|
||||||
X_API void STD_PROTO(YAP_PutInSlot,(long, Term));
|
X_API void STD_PROTO(YAP_PutInSlot,(long, Term));
|
||||||
X_API void STD_PROTO(YAP_RecoverSlots,(int));
|
X_API int STD_PROTO(YAP_RecoverSlots,(int));
|
||||||
X_API void STD_PROTO(YAP_Throw,(Term));
|
X_API void STD_PROTO(YAP_Throw,(Term));
|
||||||
X_API void STD_PROTO(YAP_Halt,(int));
|
X_API void STD_PROTO(YAP_Halt,(int));
|
||||||
X_API Term *STD_PROTO(YAP_TopOfLocalStack,(void));
|
X_API Term *STD_PROTO(YAP_TopOfLocalStack,(void));
|
||||||
@ -1002,10 +1005,10 @@ YAP_InitSlot(Term t)
|
|||||||
return Yap_InitSlot(t);
|
return Yap_InitSlot(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
X_API void
|
X_API int
|
||||||
YAP_RecoverSlots(int n)
|
YAP_RecoverSlots(int n)
|
||||||
{
|
{
|
||||||
Yap_RecoverSlots(n);
|
return Yap_RecoverSlots(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
X_API Term
|
X_API Term
|
||||||
@ -1440,7 +1443,7 @@ YAP_RunGoal(Term t)
|
|||||||
CP = old_CP;
|
CP = old_CP;
|
||||||
Yap_AllowRestart = TRUE;
|
Yap_AllowRestart = TRUE;
|
||||||
} else {
|
} else {
|
||||||
ASP = B->cp_env;
|
ENV = B->cp_env;
|
||||||
B = B->cp_b;
|
B = B->cp_b;
|
||||||
Yap_AllowRestart = FALSE;
|
Yap_AllowRestart = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1566,7 +1566,7 @@ mark_environments(CELL_PTR gc_ENV, OPREG size, CELL *pvbmap)
|
|||||||
if (MARKED_PTR(gc_ENV+E_CB))
|
if (MARKED_PTR(gc_ENV+E_CB))
|
||||||
return;
|
return;
|
||||||
MARK(gc_ENV+E_CB);
|
MARK(gc_ENV+E_CB);
|
||||||
|
|
||||||
size = EnvSize((CELL_PTR) (gc_ENV[E_CP])); /* size = EnvSize(CP) */
|
size = EnvSize((CELL_PTR) (gc_ENV[E_CP])); /* size = EnvSize(CP) */
|
||||||
pvbmap = EnvBMap((CELL_PTR) (gc_ENV[E_CP]));
|
pvbmap = EnvBMap((CELL_PTR) (gc_ENV[E_CP]));
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -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.86 2008-06-04 14:47:18 vsc Exp $ *
|
* version: $Id: Yapproto.h,v 1.87 2008-06-17 13:37:49 vsc Exp $ *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
/* prototype file for Yap */
|
/* prototype file for Yap */
|
||||||
@ -52,7 +52,7 @@ int STD_PROTO(Yap_AtomReleaseHold,(Atom));
|
|||||||
long STD_PROTO(Yap_InitSlot,(Term));
|
long STD_PROTO(Yap_InitSlot,(Term));
|
||||||
long STD_PROTO(Yap_NewSlots,(int));
|
long STD_PROTO(Yap_NewSlots,(int));
|
||||||
Term STD_PROTO(Yap_GetFromSlot,(long));
|
Term STD_PROTO(Yap_GetFromSlot,(long));
|
||||||
void STD_PROTO(Yap_RecoverSlots,(int));
|
int STD_PROTO(Yap_RecoverSlots,(int));
|
||||||
Term STD_PROTO(Yap_GetFromSlot,(long));
|
Term STD_PROTO(Yap_GetFromSlot,(long));
|
||||||
Term *STD_PROTO(Yap_AddressFromSlot,(long));
|
Term *STD_PROTO(Yap_AddressFromSlot,(long));
|
||||||
void STD_PROTO(Yap_PutInSlot,(long, Term));
|
void STD_PROTO(Yap_PutInSlot,(long, Term));
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
<h2>Yap-5.1.3:</h2>
|
<h2>Yap-5.1.3:</h2>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li> FIXED: try,retry,trust_logical should handle 0 arguments correctly.</li>
|
||||||
|
<li> FIXED: RecoverSlots should check if there are slots to recover.</li>
|
||||||
<li> FIXED: syntax errors should know they are in an included file.</li>
|
<li> FIXED: syntax errors should know they are in an included file.</li>
|
||||||
<li> FIXED: ungetc should not mess with streams.</li>
|
<li> FIXED: ungetc should not mess with streams.</li>
|
||||||
<li> FIXED: LogTalk has its own distribution (Paulo Moura).</li>
|
<li> FIXED: LogTalk has its own distribution (Paulo Moura).</li>
|
||||||
|
@ -14150,10 +14150,10 @@ Return the address of slot @var{slot}: please use with care.
|
|||||||
@findex YAP_PutInSlot (C-Interface function)
|
@findex YAP_PutInSlot (C-Interface function)
|
||||||
Set the contents of slot @var{slot} to @var{t}.
|
Set the contents of slot @var{slot} to @var{t}.
|
||||||
|
|
||||||
@item void YAP_RecoverSlots(int @var{HowMany})
|
@item int YAP_RecoverSlots(int @var{HowMany})
|
||||||
@findex YAP_RecoverSlots (C-Interface function)
|
@findex YAP_RecoverSlots (C-Interface function)
|
||||||
Recover the space for @var{HowMany} slots: these will include the
|
Recover the space for @var{HowMany} slots: these will include the
|
||||||
current default slot.
|
current default slot. Fails if no such slots exist.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
The following functions complement @var{YAP_RunGoal}:
|
The following functions complement @var{YAP_RunGoal}:
|
||||||
|
@ -381,7 +381,7 @@ extern X_API YAP_Term *PROTO(YAP_AddressFromSlot,(long int));
|
|||||||
extern X_API void PROTO(YAP_PutInSlot,(long int, YAP_Term));
|
extern X_API void PROTO(YAP_PutInSlot,(long int, YAP_Term));
|
||||||
|
|
||||||
/* void YAP_RecoverSlots() */
|
/* void YAP_RecoverSlots() */
|
||||||
extern X_API void PROTO(YAP_RecoverSlots,(int));
|
extern X_API int PROTO(YAP_RecoverSlots,(int));
|
||||||
|
|
||||||
/* void YAP_Throw() */
|
/* void YAP_Throw() */
|
||||||
extern X_API void PROTO(YAP_Throw,(YAP_Term));
|
extern X_API void PROTO(YAP_Throw,(YAP_Term));
|
||||||
|
Reference in New Issue
Block a user