From 2f17b25885a4834f4018c3d8279d1995c80e9f14 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= <vsc@dcc.fc.up.pt>
Date: Mon, 6 Feb 2012 11:41:58 +0000
Subject: [PATCH] improve error handling.

---
 C/exec.c | 73 +++++++++++++++++++++++++++++---------------------------
 1 file changed, 38 insertions(+), 35 deletions(-)

diff --git a/C/exec.c b/C/exec.c
index 71560d324..4627ca8dc 100644
--- a/C/exec.c
+++ b/C/exec.c
@@ -83,9 +83,10 @@ CallPredicate(PredEntry *pen, choiceptr cut_pt, yamop *code USES_REGS) {
 }
 
 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 */
-  ARG3 = ARG1;
+  ARG3 = t;
   if (mod) {
     ARG4 = mod;
   } else {
@@ -106,12 +107,12 @@ Yap_ExecuteCallMetaCall(Term mod) {
 }
 
 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) {
-    return(CallMetaCall(mod PASS_REGS));
+    return(CallMetaCall(t, mod PASS_REGS));
   } else {
-    Yap_Error(err, ARG1, "call/1");
+    Yap_Error(err, t, "call/1");
     return(FALSE);
   }
 }
@@ -157,6 +158,7 @@ p_trail_suspension_marker( USES_REGS1 )
 inline static Int
 do_execute(Term t, Term mod USES_REGS)
 {
+  Term t0 = t;
   /* first do predicate expansion, even before you process signals.
      This way you don't get to spy goal_expansion(). */
   if (PRED_GOAL_EXPANSION_ALL) {
@@ -167,13 +169,13 @@ do_execute(Term t, Term mod USES_REGS)
       CreepFlag = CalculateStackGap();
     }
     UNLOCK(LOCAL_SignalLock);
-    return CallMetaCall(mod PASS_REGS);
+    return CallMetaCall(ARG1, mod PASS_REGS);
   } else if (LOCAL_ActiveSignals  && !LOCAL_InterruptsDisabled) {
     return EnterCreepMode(t, mod PASS_REGS);
   }
  restart_exec:
   if (IsVarTerm(t)) {
-    return CallError(INSTANTIATION_ERROR, mod PASS_REGS);
+    return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
   } else if (IsApplTerm(t)) {
     register Functor f = FunctorOfTerm(t);
     register CELL *pt;
@@ -182,11 +184,11 @@ do_execute(Term t, Term mod USES_REGS)
 
     f = FunctorOfTerm(t);
     if (IsExtensionFunctor(f)) {
-      return CallError(TYPE_ERROR_CALLABLE, t PASS_REGS);
+      return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
     }
     arity = ArityOfFunctor(f);
     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));
     /* You thought we would be over by now */
@@ -200,13 +202,13 @@ do_execute(Term t, Term mod USES_REGS)
 	  goto restart_exec;
 	} else {
 	  if (IsVarTerm(tmod)) {
-	    return CallError(INSTANTIATION_ERROR,t PASS_REGS);
+	    return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
 	  } else {
-	    return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
+	    return CallError(TYPE_ERROR_ATOM, t0, mod PASS_REGS);
 	  }
 	}
       } else {
-	return CallMetaCall(mod PASS_REGS);
+	return CallMetaCall(t, mod PASS_REGS);
       }
     }
     /* 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));
     return (CallPredicate(pe, B, pe->CodeOfPred PASS_REGS));
   } else if (IsIntTerm(t)) {
-    return CallError(TYPE_ERROR_CALLABLE, mod PASS_REGS);
+    return CallError(TYPE_ERROR_CALLABLE, t0, mod PASS_REGS);
   } else {
     /* 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;
   unsigned int i, arity;
   int j = -n;
+  Term t0 = t;
 
  restart_exec:
   if (IsVarTerm(t)) {
-    return CallError(INSTANTIATION_ERROR, mod PASS_REGS);
+    return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
   } else if (IsAtomTerm(t)) {
     arity = n;
     Name = AtomOfTerm(t);
     pt = NULL;
   } 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)) {
     arity = n+2;
     pt = RepPair(t);
@@ -316,9 +319,9 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
 	goto restart_exec;
       } else {
 	if (IsVarTerm(tmod)) {
-	  return CallError(INSTANTIATION_ERROR,t PASS_REGS);
+	  return CallError(INSTANTIATION_ERROR, t0, tmod PASS_REGS);
 	} 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);
   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) {
     LOCK(LOCAL_SignalLock);
@@ -338,20 +341,20 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS)
       CreepFlag = CalculateStackGap();
     }
     UNLOCK(LOCAL_SignalLock);
-    ARG1 = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
-    return CallMetaCall(mod PASS_REGS);
+    t = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
+    return CallMetaCall(t, mod PASS_REGS);
   } else if (LOCAL_ActiveSignals  && !LOCAL_InterruptsDisabled) {
     return EnterCreepMode(copy_execn_to_heap(f, pt, n, arity, CurrentModule PASS_REGS), mod PASS_REGS);
   }
   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));
   /* You thought we would be over by now */
   /* but no meta calls require special preprocessing */
   if (pen->PredFlags & (GoalExPredFlag|MetaPredFlag)) {
-    ARG1 = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
-    return(CallMetaCall(mod PASS_REGS));
+    Term t = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS);
+    return(CallMetaCall(t, mod PASS_REGS));
   }
   /* now let us do what we wanted to do from the beginning !! */
   /* I cannot use the standard macro here because
@@ -570,7 +573,7 @@ p_execute12( USES_REGS1 )
 static Int
 p_execute_clause( USES_REGS1 )
 {				/* '$execute_clause'(Goal)	 */
-  Term            t = Deref(ARG1);
+  Term            t = Deref(ARG1), t0 = t;
   Term            mod = Deref(ARG2);
   choiceptr       cut_cp = cp_from_integer(Deref(ARG4) PASS_REGS);
   unsigned int    arity;
@@ -603,7 +606,7 @@ p_execute_clause( USES_REGS1 )
     pe = PredPropByFunc(f, mod);
     arity = ArityOfFunctor(f);
     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
        otherwise I would dereference the argument and
@@ -646,7 +649,7 @@ p_execute_in_mod( USES_REGS1 )
 static Int
 p_execute0( USES_REGS1 )
 {				/* '$execute0'(Goal,Mod)	 */
-  Term            t = Deref(ARG1);
+  Term            t = Deref(ARG1), t0 = t;
   Term            mod = Deref(ARG2);
   unsigned int    arity;
   Prop            pe;
@@ -676,9 +679,9 @@ p_execute0( USES_REGS1 )
 	goto restart_exec;
       } else {
 	if (IsVarTerm(tmod)) {
-	  return CallError(INSTANTIATION_ERROR,t PASS_REGS);
+	  return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
 	} 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");
     arity = ArityOfFunctor(f);
     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
        otherwise I would dereference the argument and
@@ -715,7 +718,7 @@ p_execute0( USES_REGS1 )
 static Int
 p_execute_nonstop( USES_REGS1 )
 {				/* '$execute_nonstop'(Goal,Mod)	 */
-  Term            t = Deref(ARG1);
+  Term            t = Deref(ARG1), t0 = t;
   Term            mod = Deref(ARG2);
   unsigned int    arity;
   Prop            pe;
@@ -748,16 +751,16 @@ p_execute_nonstop( USES_REGS1 )
 	goto restart_exec;
       } else {
 	if (IsVarTerm(tmod)) {
-	  return CallError(INSTANTIATION_ERROR,t PASS_REGS);
+	  return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
 	} else {
-	  return CallError(TYPE_ERROR_ATOM,t PASS_REGS);
+	  return CallError(TYPE_ERROR_ATOM, t0, mod PASS_REGS);
 	}
       }
     }
     pe = PredPropByFunc(f, mod);
     arity = ArityOfFunctor(f);
     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
        otherwise I would dereference the argument and
@@ -1118,7 +1121,7 @@ Yap_execute_goal(Term t, int nargs, Term mod)
   }
   ppe = RepPredProp(pe);
   if (pe == NIL) {
-    return(CallMetaCall(mod PASS_REGS));
+    return CallMetaCall(t, mod PASS_REGS);
   }
   PELOCK(81,RepPredProp(pe));
   if (IsAtomTerm(t)) {