improve error handling.
This commit is contained in:
parent
5e68d5e7e8
commit
2f17b25885
73
C/exec.c
73
C/exec.c
@ -83,9 +83,10 @@ CallPredicate(PredEntry *pen, choiceptr cut_pt, yamop *code USES_REGS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline static Int
|
inline static Int
|
||||||
CallMetaCall(Term mod USES_REGS) {
|
CallMetaCall(Term t, Term mod USES_REGS) {
|
||||||
|
ARG1 = t;
|
||||||
ARG2 = cp_as_integer(B PASS_REGS); /* p_save_cp */
|
ARG2 = cp_as_integer(B PASS_REGS); /* p_save_cp */
|
||||||
ARG3 = ARG1;
|
ARG3 = t;
|
||||||
if (mod) {
|
if (mod) {
|
||||||
ARG4 = mod;
|
ARG4 = mod;
|
||||||
} else {
|
} else {
|
||||||
@ -106,12 +107,12 @@ Yap_ExecuteCallMetaCall(Term mod) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
CallError(yap_error_number err, Term mod USES_REGS)
|
CallError(yap_error_number err, Term t, Term mod USES_REGS)
|
||||||
{
|
{
|
||||||
if (yap_flags[LANGUAGE_MODE_FLAG] == 1) {
|
if (yap_flags[LANGUAGE_MODE_FLAG] == 1) {
|
||||||
return(CallMetaCall(mod PASS_REGS));
|
return(CallMetaCall(t, mod PASS_REGS));
|
||||||
} else {
|
} else {
|
||||||
Yap_Error(err, ARG1, "call/1");
|
Yap_Error(err, t, "call/1");
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -157,6 +158,7 @@ p_trail_suspension_marker( USES_REGS1 )
|
|||||||
inline static Int
|
inline static Int
|
||||||
do_execute(Term t, Term mod USES_REGS)
|
do_execute(Term t, Term mod USES_REGS)
|
||||||
{
|
{
|
||||||
|
Term t0 = t;
|
||||||
/* first do predicate expansion, even before you process signals.
|
/* first do predicate expansion, even before you process signals.
|
||||||
This way you don't get to spy goal_expansion(). */
|
This way you don't get to spy goal_expansion(). */
|
||||||
if (PRED_GOAL_EXPANSION_ALL) {
|
if (PRED_GOAL_EXPANSION_ALL) {
|
||||||
@ -167,13 +169,13 @@ do_execute(Term t, Term mod USES_REGS)
|
|||||||
CreepFlag = CalculateStackGap();
|
CreepFlag = CalculateStackGap();
|
||||||
}
|
}
|
||||||
UNLOCK(LOCAL_SignalLock);
|
UNLOCK(LOCAL_SignalLock);
|
||||||
return CallMetaCall(mod PASS_REGS);
|
return CallMetaCall(ARG1, mod PASS_REGS);
|
||||||
} else if (LOCAL_ActiveSignals && !LOCAL_InterruptsDisabled) {
|
} else if (LOCAL_ActiveSignals && !LOCAL_InterruptsDisabled) {
|
||||||
return EnterCreepMode(t, mod PASS_REGS);
|
return EnterCreepMode(t, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
restart_exec:
|
restart_exec:
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
return CallError(INSTANTIATION_ERROR, mod PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
|
||||||
} else if (IsApplTerm(t)) {
|
} else if (IsApplTerm(t)) {
|
||||||
register Functor f = FunctorOfTerm(t);
|
register Functor f = FunctorOfTerm(t);
|
||||||
register CELL *pt;
|
register CELL *pt;
|
||||||
@ -182,11 +184,11 @@ do_execute(Term t, Term mod USES_REGS)
|
|||||||
|
|
||||||
f = FunctorOfTerm(t);
|
f = FunctorOfTerm(t);
|
||||||
if (IsExtensionFunctor(f)) {
|
if (IsExtensionFunctor(f)) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
if (arity > MaxTemps) {
|
if (arity > MaxTemps) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
pen = RepPredProp(PredPropByFunc(f, mod));
|
pen = RepPredProp(PredPropByFunc(f, mod));
|
||||||
/* You thought we would be over by now */
|
/* You thought we would be over by now */
|
||||||
@ -200,13 +202,13 @@ do_execute(Term t, Term mod USES_REGS)
|
|||||||
goto restart_exec;
|
goto restart_exec;
|
||||||
} else {
|
} else {
|
||||||
if (IsVarTerm(tmod)) {
|
if (IsVarTerm(tmod)) {
|
||||||
return CallError(INSTANTIATION_ERROR,t PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
|
||||||
} else {
|
} else {
|
||||||
return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
|
return CallError(TYPE_ERROR_ATOM, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return CallMetaCall(mod PASS_REGS);
|
return CallMetaCall(t, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* now let us do what we wanted to do from the beginning !! */
|
/* now let us do what we wanted to do from the beginning !! */
|
||||||
@ -240,10 +242,10 @@ do_execute(Term t, Term mod USES_REGS)
|
|||||||
pe = RepPredProp(PredPropByAtom(a, mod));
|
pe = RepPredProp(PredPropByAtom(a, mod));
|
||||||
return (CallPredicate(pe, B, pe->CodeOfPred PASS_REGS));
|
return (CallPredicate(pe, B, pe->CodeOfPred PASS_REGS));
|
||||||
} else if (IsIntTerm(t)) {
|
} else if (IsIntTerm(t)) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, mod PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
} else {
|
} else {
|
||||||
/* Is Pair Term */
|
/* Is Pair Term */
|
||||||
return(CallMetaCall(mod PASS_REGS));
|
return(CallMetaCall(t, mod PASS_REGS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,16 +294,17 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
|
|||||||
PredEntry *pen;
|
PredEntry *pen;
|
||||||
unsigned int i, arity;
|
unsigned int i, arity;
|
||||||
int j = -n;
|
int j = -n;
|
||||||
|
Term t0 = t;
|
||||||
|
|
||||||
restart_exec:
|
restart_exec:
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
return CallError(INSTANTIATION_ERROR, mod PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
|
||||||
} else if (IsAtomTerm(t)) {
|
} else if (IsAtomTerm(t)) {
|
||||||
arity = n;
|
arity = n;
|
||||||
Name = AtomOfTerm(t);
|
Name = AtomOfTerm(t);
|
||||||
pt = NULL;
|
pt = NULL;
|
||||||
} else if (IsIntTerm(t)) {
|
} else if (IsIntTerm(t)) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, mod PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
} else if (IsPairTerm(t)) {
|
} else if (IsPairTerm(t)) {
|
||||||
arity = n+2;
|
arity = n+2;
|
||||||
pt = RepPair(t);
|
pt = RepPair(t);
|
||||||
@ -316,9 +319,9 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
|
|||||||
goto restart_exec;
|
goto restart_exec;
|
||||||
} else {
|
} else {
|
||||||
if (IsVarTerm(tmod)) {
|
if (IsVarTerm(tmod)) {
|
||||||
return CallError(INSTANTIATION_ERROR,t PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, tmod PASS_REGS);
|
||||||
} else {
|
} else {
|
||||||
return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
|
return CallError(TYPE_ERROR_ATOM, t0, tmod PASS_REGS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -328,7 +331,7 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
|
|||||||
}
|
}
|
||||||
f = Yap_MkFunctor(Name,arity);
|
f = Yap_MkFunctor(Name,arity);
|
||||||
if (IsExtensionFunctor(f)) {
|
if (IsExtensionFunctor(f)) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, mod PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
if (PRED_GOAL_EXPANSION_ALL) {
|
if (PRED_GOAL_EXPANSION_ALL) {
|
||||||
LOCK(LOCAL_SignalLock);
|
LOCK(LOCAL_SignalLock);
|
||||||
@ -338,20 +341,20 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
|
|||||||
CreepFlag = CalculateStackGap();
|
CreepFlag = CalculateStackGap();
|
||||||
}
|
}
|
||||||
UNLOCK(LOCAL_SignalLock);
|
UNLOCK(LOCAL_SignalLock);
|
||||||
ARG1 = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
|
t = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
|
||||||
return CallMetaCall(mod PASS_REGS);
|
return CallMetaCall(t, mod PASS_REGS);
|
||||||
} else if (LOCAL_ActiveSignals && !LOCAL_InterruptsDisabled) {
|
} else if (LOCAL_ActiveSignals && !LOCAL_InterruptsDisabled) {
|
||||||
return EnterCreepMode(copy_execn_to_heap(f, pt, n, arity, CurrentModule PASS_REGS), mod PASS_REGS);
|
return EnterCreepMode(copy_execn_to_heap(f, pt, n, arity, CurrentModule PASS_REGS), mod PASS_REGS);
|
||||||
}
|
}
|
||||||
if (arity > MaxTemps) {
|
if (arity > MaxTemps) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
pen = RepPredProp(PredPropByFunc(f, mod));
|
pen = RepPredProp(PredPropByFunc(f, mod));
|
||||||
/* You thought we would be over by now */
|
/* You thought we would be over by now */
|
||||||
/* but no meta calls require special preprocessing */
|
/* but no meta calls require special preprocessing */
|
||||||
if (pen->PredFlags & (GoalExPredFlag|MetaPredFlag)) {
|
if (pen->PredFlags & (GoalExPredFlag|MetaPredFlag)) {
|
||||||
ARG1 = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
|
Term t = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
|
||||||
return(CallMetaCall(mod PASS_REGS));
|
return(CallMetaCall(t, mod PASS_REGS));
|
||||||
}
|
}
|
||||||
/* now let us do what we wanted to do from the beginning !! */
|
/* now let us do what we wanted to do from the beginning !! */
|
||||||
/* I cannot use the standard macro here because
|
/* I cannot use the standard macro here because
|
||||||
@ -570,7 +573,7 @@ p_execute12( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_execute_clause( USES_REGS1 )
|
p_execute_clause( USES_REGS1 )
|
||||||
{ /* '$execute_clause'(Goal) */
|
{ /* '$execute_clause'(Goal) */
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1), t0 = t;
|
||||||
Term mod = Deref(ARG2);
|
Term mod = Deref(ARG2);
|
||||||
choiceptr cut_cp = cp_from_integer(Deref(ARG4) PASS_REGS);
|
choiceptr cut_cp = cp_from_integer(Deref(ARG4) PASS_REGS);
|
||||||
unsigned int arity;
|
unsigned int arity;
|
||||||
@ -603,7 +606,7 @@ p_execute_clause( USES_REGS1 )
|
|||||||
pe = PredPropByFunc(f, mod);
|
pe = PredPropByFunc(f, mod);
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
if (arity > MaxTemps) {
|
if (arity > MaxTemps) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
/* I cannot use the standard macro here because
|
/* I cannot use the standard macro here because
|
||||||
otherwise I would dereference the argument and
|
otherwise I would dereference the argument and
|
||||||
@ -646,7 +649,7 @@ p_execute_in_mod( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_execute0( USES_REGS1 )
|
p_execute0( USES_REGS1 )
|
||||||
{ /* '$execute0'(Goal,Mod) */
|
{ /* '$execute0'(Goal,Mod) */
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1), t0 = t;
|
||||||
Term mod = Deref(ARG2);
|
Term mod = Deref(ARG2);
|
||||||
unsigned int arity;
|
unsigned int arity;
|
||||||
Prop pe;
|
Prop pe;
|
||||||
@ -676,9 +679,9 @@ p_execute0( USES_REGS1 )
|
|||||||
goto restart_exec;
|
goto restart_exec;
|
||||||
} else {
|
} else {
|
||||||
if (IsVarTerm(tmod)) {
|
if (IsVarTerm(tmod)) {
|
||||||
return CallError(INSTANTIATION_ERROR,t PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
|
||||||
} else {
|
} else {
|
||||||
return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
|
return CallError(TYPE_ERROR_ATOM, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -686,7 +689,7 @@ p_execute0( USES_REGS1 )
|
|||||||
// Yap_DebugPlWrite(mod);fprintf(stderr,"\n");
|
// Yap_DebugPlWrite(mod);fprintf(stderr,"\n");
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
if (arity > MaxTemps) {
|
if (arity > MaxTemps) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
/* I cannot use the standard macro here because
|
/* I cannot use the standard macro here because
|
||||||
otherwise I would dereference the argument and
|
otherwise I would dereference the argument and
|
||||||
@ -715,7 +718,7 @@ p_execute0( USES_REGS1 )
|
|||||||
static Int
|
static Int
|
||||||
p_execute_nonstop( USES_REGS1 )
|
p_execute_nonstop( USES_REGS1 )
|
||||||
{ /* '$execute_nonstop'(Goal,Mod) */
|
{ /* '$execute_nonstop'(Goal,Mod) */
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1), t0 = t;
|
||||||
Term mod = Deref(ARG2);
|
Term mod = Deref(ARG2);
|
||||||
unsigned int arity;
|
unsigned int arity;
|
||||||
Prop pe;
|
Prop pe;
|
||||||
@ -748,16 +751,16 @@ p_execute_nonstop( USES_REGS1 )
|
|||||||
goto restart_exec;
|
goto restart_exec;
|
||||||
} else {
|
} else {
|
||||||
if (IsVarTerm(tmod)) {
|
if (IsVarTerm(tmod)) {
|
||||||
return CallError(INSTANTIATION_ERROR,t PASS_REGS);
|
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
|
||||||
} else {
|
} else {
|
||||||
return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
|
return CallError(TYPE_ERROR_ATOM, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pe = PredPropByFunc(f, mod);
|
pe = PredPropByFunc(f, mod);
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
if (arity > MaxTemps) {
|
if (arity > MaxTemps) {
|
||||||
return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
|
return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
/* I cannot use the standard macro here because
|
/* I cannot use the standard macro here because
|
||||||
otherwise I would dereference the argument and
|
otherwise I would dereference the argument and
|
||||||
@ -1118,7 +1121,7 @@ Yap_execute_goal(Term t, int nargs, Term mod)
|
|||||||
}
|
}
|
||||||
ppe = RepPredProp(pe);
|
ppe = RepPredProp(pe);
|
||||||
if (pe == NIL) {
|
if (pe == NIL) {
|
||||||
return(CallMetaCall(mod PASS_REGS));
|
return CallMetaCall(t, mod PASS_REGS);
|
||||||
}
|
}
|
||||||
PELOCK(81,RepPredProp(pe));
|
PELOCK(81,RepPredProp(pe));
|
||||||
if (IsAtomTerm(t)) {
|
if (IsAtomTerm(t)) {
|
||||||
|
Reference in New Issue
Block a user