imprive error handling.

This commit is contained in:
Vitor Santos Costa 2013-01-29 10:50:04 +00:00
parent 14d4386e5a
commit 9ce268915d
9 changed files with 24 additions and 12 deletions

View File

@ -444,7 +444,7 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
tmpbuf[0] = '\0'; tmpbuf[0] = '\0';
} }
va_end (ap); va_end (ap);
fprintf(stderr,"%% ERROR WITHIN ERROR: %s\n", tmpbuf); fprintf(stderr,"%% ERROR WITHIN ERROR %d: %s\n", tmpbuf, LOCAL_CurrentError);
exit(1); exit(1);
} }
/* must do this here */ /* must do this here */
@ -485,6 +485,7 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
if (type == PURE_ABORT || LOCAL_PrologMode & BootMode) { if (type == PURE_ABORT || LOCAL_PrologMode & BootMode) {
where = TermNil; where = TermNil;
LOCAL_PrologMode &= ~AbortMode; LOCAL_PrologMode &= ~AbortMode;
LOCAL_CurrentError = type;
LOCAL_PrologMode |= InErrorMode; LOCAL_PrologMode |= InErrorMode;
/* make sure failure will be seen at next port */ /* make sure failure will be seen at next port */
if (LOCAL_PrologMode & AsyncIntMode) if (LOCAL_PrologMode & AsyncIntMode)
@ -499,6 +500,7 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
} }
/* Exit Abort Mode, if we were there */ /* Exit Abort Mode, if we were there */
LOCAL_PrologMode &= ~AbortMode; LOCAL_PrologMode &= ~AbortMode;
LOCAL_CurrentError = type;
LOCAL_PrologMode |= InErrorMode; LOCAL_PrologMode |= InErrorMode;
if (!(where = Yap_CopyTerm(where))) { if (!(where = Yap_CopyTerm(where))) {
where = TermNil; where = TermNil;

View File

@ -4010,7 +4010,7 @@ p_executable( USES_REGS1 )
if (GLOBAL_argv && GLOBAL_argv[0]) if (GLOBAL_argv && GLOBAL_argv[0])
Yap_TrueFileName (GLOBAL_argv[0], LOCAL_FileNameBuf, FALSE); Yap_TrueFileName (GLOBAL_argv[0], LOCAL_FileNameBuf, FALSE);
else else
strncpy(LOCAL_FileNameBuf,Yap_FindExecutable (), YAP_FILENAME_MAX) ; strncpy(LOCAL_FileNameBuf, Yap_FindExecutable(), YAP_FILENAME_MAX-1) ;
return Yap_unify(MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)),ARG1); return Yap_unify(MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)),ARG1);
} }
@ -4034,23 +4034,25 @@ p_access_yap_flags( USES_REGS1 )
if (flag < 0 || flag >= NUMBER_OF_YAP_FLAGS) { if (flag < 0 || flag >= NUMBER_OF_YAP_FLAGS) {
return(FALSE); return(FALSE);
} }
#ifdef TABLING
if (flag == TABLING_MODE_FLAG) { if (flag == TABLING_MODE_FLAG) {
#ifdef TABLING
tout = TermNil; tout = TermNil;
if (IsMode_LocalTrie(yap_flags[flag])) if (IsMode_LocalTrie(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomLocalTrie), tout); tout = MkPairTerm(MkAtomTerm(AtomLocalTrie), tout);
else if (IsMode_GlobalTrie(yap_flags[flag])) else // if (IsMode_GlobalTrie(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomGlobalTrie), tout); tout = MkPairTerm(MkAtomTerm(AtomGlobalTrie), tout);
if (IsMode_ExecAnswers(yap_flags[flag])) if (IsMode_LoadAnswers(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomExecAnswers), tout);
else if (IsMode_LoadAnswers(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomLoadAnswers), tout); tout = MkPairTerm(MkAtomTerm(AtomLoadAnswers), tout);
if (IsMode_Batched(yap_flags[flag])) else // if (IsMode_ExecAnswers(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomBatched), tout); tout = MkPairTerm(MkAtomTerm(AtomExecAnswers), tout);
else if (IsMode_Local(yap_flags[flag])) if (IsMode_Local(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomLocal), tout); tout = MkPairTerm(MkAtomTerm(AtomLocal), tout);
} else else // if (IsMode_Batched(yap_flags[flag]))
tout = MkPairTerm(MkAtomTerm(AtomBatched), tout);
#else
tout = MkAtomTerm(AtomFalse);
#endif /* TABLING */ #endif /* TABLING */
} else
tout = MkIntegerTerm(yap_flags[flag]); tout = MkIntegerTerm(yap_flags[flag]);
return(Yap_unify(ARG2, tout)); return(Yap_unify(ARG2, tout));
} }

View File

@ -105,7 +105,6 @@ typedef void (*YapInitProc)(void);
#define STD_PROTO(F,A) F A #define STD_PROTO(F,A) F A
#endif #endif
char *STD_PROTO(Yap_FindExecutable,(void));
void *STD_PROTO(Yap_LoadForeignFile,(char *, int)); void *STD_PROTO(Yap_LoadForeignFile,(char *, int));
int STD_PROTO(Yap_CallForeignFile,(void *, char *)); int STD_PROTO(Yap_CallForeignFile,(void *, char *));
int STD_PROTO(Yap_CloseForeignFile,(void *)); int STD_PROTO(Yap_CloseForeignFile,(void *));

View File

@ -186,6 +186,9 @@ Term STD_PROTO(Yap_GetException,(void));
/* exo.c */ /* exo.c */
void STD_PROTO(Yap_InitExoPreds,(void)); void STD_PROTO(Yap_InitExoPreds,(void));
/* foreign.c */
char *STD_PROTO(Yap_FindExecutable,(void));
/* gprof.c */ /* gprof.c */
void STD_PROTO(Yap_InitLowProf,(void)); void STD_PROTO(Yap_InitLowProf,(void));
#if LOW_PROF #if LOW_PROF

View File

@ -310,6 +310,8 @@
#define LOCAL_matherror LOCAL->matherror_ #define LOCAL_matherror LOCAL->matherror_
#define REMOTE_matherror(wid) REMOTE(wid)->matherror_ #define REMOTE_matherror(wid) REMOTE(wid)->matherror_
#define LOCAL_CurrentError LOCAL->CurrentError_
#define REMOTE_CurrentError(wid) REMOTE(wid)->CurrentError_
#define LOCAL_heap_overflows LOCAL->heap_overflows_ #define LOCAL_heap_overflows LOCAL->heap_overflows_
#define REMOTE_heap_overflows(wid) REMOTE(wid)->heap_overflows_ #define REMOTE_heap_overflows(wid) REMOTE(wid)->heap_overflows_

View File

@ -176,6 +176,7 @@ typedef struct worker_local {
struct db_globs* s_dbg_; struct db_globs* s_dbg_;
yap_error_number matherror_; yap_error_number matherror_;
yap_error_number CurrentError_;
int heap_overflows_; int heap_overflows_;
Int total_heap_overflow_time_; Int total_heap_overflow_time_;

View File

@ -176,6 +176,7 @@ static void InitWorker(int wid) {
REMOTE_matherror(wid) = YAP_NO_ERROR; REMOTE_matherror(wid) = YAP_NO_ERROR;
REMOTE_CurrentError(wid) = YAP_NO_ERROR;
REMOTE_heap_overflows(wid) = 0; REMOTE_heap_overflows(wid) = 0;
REMOTE_total_heap_overflow_time(wid) = 0; REMOTE_total_heap_overflow_time(wid) = 0;

View File

@ -188,6 +188,7 @@ static void RestoreWorker(int wid USES_REGS) {
#ifdef LOAD_DYLD #ifdef LOAD_DYLD
#endif #endif

View File

@ -199,6 +199,7 @@ struct db_globs* s_dbg void
//eval.c //eval.c
yap_error_number matherror =YAP_NO_ERROR yap_error_number matherror =YAP_NO_ERROR
yap_error_number CurrentError =YAP_NO_ERROR
//grow.c //grow.c
int heap_overflows =0 int heap_overflows =0