////////////////////////////////////////////////////////////////////////////// //Copyright 2008 // Andrew Gacek, Steven Holte, Gopalan Nadathur, Xiaochu Qi, Zach Snow ////////////////////////////////////////////////////////////////////////////// // This file is part of Teyjus. // // // // Teyjus is free software: you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation, either version 3 of the License, or // // (at your option) any later version. // // // // Teyjus is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with Teyjus. If not, see . // ////////////////////////////////////////////////////////////////////////////// /**************************************************************************** * * * File error.h -- error-handling functions * * * ****************************************************************************/ #ifndef ERROR_H #define ERROR_H #include #include #include #include "tjsignal.h" #include "../simulator/mctypes.h" //to be modified /**************************************************************************** * Exception stack declarations. * ****************************************************************************/ typedef enum EM_ExnType{ EM_NO_ERR = 0, // no errors EM_NO_EXN, // used for warnings ?? EM_ABORT, // exit the executable immediately EM_EXIT, // traverse the exception stack and exit EM_TOP_LEVEL, // return to the toplevel EM_QUERY, // abort solving the query EM_QUERY_RESULT, // query is solved; print answer EM_FAIL, // fail to simulator level } EM_ExnType; //function call environment stack extern SIGNAL_jmp_buf *EM_ExnHandlerStack; extern int EM_ExnHandlerStackTop; extern int EM_ExnHandlerStackSize; //exception type extern EM_ExnType EM_CurrentExnType; /**************************************************************************** * Exception-handling macros * ****************************************************************************/ //try #define EM_TRY \ if (EM_ExnHandlerStackTop >= EM_ExnHandlerStackSize) \ { \ EM_ExnHandlerStackSize = \ (EM_ExnHandlerStackSize + 1) * 2; \ EM_ExnHandlerStack = \ (SIGNAL_jmp_buf *)EM_realloc((void *)EM_ExnHandlerStack, \ EM_ExnHandlerStackSize * sizeof(SIGNAL_jmp_buf)); \ } \ if (SIGNAL_setjmp(EM_ExnHandlerStack[EM_ExnHandlerStackTop++]) == 0) \ { //catch #define EM_CATCH \ EM_ExnHandlerStackTop--; \ } \ else //throw /* Jump to the nearest (in a dynamic sense) EM_Try block, setting EM_CurrentExnType to TYPE. Given a constant, the conditional in this macro will be optimized away. TODO: added cast to EM_CurrentExnType. */ #define EM_THROW(type) EM_THROWVAL((type), 1) #define EM_THROWVAL(type, val) \ do { \ if ((type) == EM_ABORT) \ exit(1); \ else \ { \ EM_CurrentExnType = (EM_ExnType)(type); \ SIGNAL_longjmp(EM_ExnHandlerStack[--EM_ExnHandlerStackTop], val); \ } \ } while(0) //rethrow /* pass the current exception to the next handler. Use only within an EM_Catch block. */ #define EM_RETHROW() \ SIGNAL_longjmp(EM_ExnHandlerStack[--EM_ExnHandlerStackTop], 1) /* Here's an example use of the above macros: ... EM_TRY { foo(); if (foobar) EM_THROW(EM_FOOBAR); } EM_CATCH { un_foo(); // clean up if (EM_CurrentExnType == EM_FOOBAR) printf("foobar!"); // stop the error here else EM_RETHROW(); // let a later handler handle it } */ /**************************************************************************** * Routines which will generate errors automatically. * ****************************************************************************/ void *EM_malloc(unsigned int); void *EM_realloc(void *, unsigned int); char *EM_strdup(char *); /**************************************************************************** * Beginning error indices for different modules (by module abbreviation) * ****************************************************************************/ /* general errors */ #define EM_NO_ERROR 0 #define EM_FIRST_ERR_INDEX 1 #define LINKER_FIRST_ERR_INDEX 50 #define LOADER_FIRST_ERR_INDEX 100 #define STREAM_FIRST_ERR_INDEX 150 #define SIM_FIRST_ERR_INDEX 200 #define BI_FIRST_ERR_INDEX 300 #define RT_FIRST_ERR_INDEX 400 #define FRONT_FIRST_ERR_INDEX 500 /**************************************************************************** * General-use error messages * ****************************************************************************/ enum { EM_OUT_OF_MEMORY = EM_FIRST_ERR_INDEX, EM_OUT_OF_HEAP, EM_NEWLINE, EM_ERROR_COLON, EM_WARNING_COLON }; /**************************************************************************** * The routine that gets called in the event of an error * ****************************************************************************/ void EM_error(int inIndex, ...); /**************************************************************************** * Have there been any errors since last EM_Reset()? * ****************************************************************************/ extern Boolean EM_anyErrors; void EM_reset(); #endif //ERROR_H