1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-01 11:30:37 +00:00

Extended error reporting, pointing to included lines.

The "Unhandled error" message will now display "Line: #### (included line: ####)" with the line number in the included file that generated the error. 0 will be reported if the error wasn't in an included line.

Also:
- Add function _INCLERRORLINE, which returns a value greater than zero when _ERRORLINE points to an $INCLUDEd file.
This commit is contained in:
FellippeHeitor 2016-03-23 07:45:51 -03:00
parent a23a733bf0
commit e891ce0891
4 changed files with 26 additions and 7 deletions

View file

@ -216,7 +216,7 @@ extern "C" int QB64_Resizable(){
int32 sub_gl_called=0;
extern void evnt(uint32 linenumber);
extern void evnt(uint32 linenumber, uint32 inclinenumber = 0);
extern "C" int qb64_custom_event(int event,int v1,int v2,int v3,int v4,int v5,int v6,int v7,int v8,void *p1,void *p2);
#ifdef QB64_WINDOWS
@ -4135,6 +4135,7 @@ void convert_text_to_utf16(int32 fonthandle,void *buf,int32 size){
qbs *unknown_opcode_mess;
extern uint32 ercl;
extern uint32 inclercl;
int32 exit_blocked=0;
int32 exit_value=0;
@ -7188,7 +7189,7 @@ const char fixerr_strcont[]="\nContinue?";
const char fixerr_strunhan[]="Unhandled Error #";
const char fixerr_strcrit[]="Critical Error #";
void fix_error(){
void fix_error(uint32 inclinenumber = 0){
static char errtitle[256];//builds message
static char errmess[256];//builds message
static char *cp;
@ -7284,7 +7285,7 @@ void fix_error(){
i=0;
memcpy(&errmess[i],&fixerr_strline[0],strlen(fixerr_strline)); i=i+strlen(fixerr_strline);
i2=sprintf(&errmess[i],"%u\n",ercl); i=i+i2;
i2=sprintf(&errmess[i],"%u (included line: %u)\n",ercl,inclercl); i=i+i2;
memcpy(&errmess[i],cp,strlen(cp)); i=i+strlen(cp);
if (!prevent_handling) {memcpy(&errmess[i],&fixerr_strcont[0],strlen(fixerr_strcont)); i=i+strlen(fixerr_strcont);}
errmess[i]=0;

View file

@ -286,7 +286,7 @@ extern uint32 *rm32();
extern void cpu_call();
extern int64 build_int64(uint32 val2,uint32 val1);
extern uint64 build_uint64(uint32 val2,uint32 val1);
extern void fix_error();
extern void fix_error(uint32 inclinenumber = 0);
extern double get_error_erl();
extern uint32 get_error_err();
extern void end();
@ -655,6 +655,7 @@ int32 key_event_id=0;
int32 strig_event_occurred=0;//inc/dec as each GOSUB to QBMAIN () begins/ends
int32 strig_event_id=0;
uint32 ercl;
uint32 inclercl;
uint16 call_absolute_offsets[256];
uint32 dbgline;
uint32 qbs_cmem_sp=256;
@ -1055,6 +1056,10 @@ return ercl;
}
int32 func__inclerrorline(){
return inclercl;
}
void chain_input(){
//note: common data or not, every program must check for chained data,
@ -1932,7 +1937,7 @@ extern int64 display_lock_released;
extern int32 disableEvents;
uint32 r;
void evnt(uint32 linenumber){
void evnt(uint32 linenumber, uint32 inclinenumber = 0){
if (disableEvents) return;
qbevent=0;
@ -1953,7 +1958,8 @@ Sleep(10);
if(new_error){
ercl=linenumber;
fix_error();
inclercl=inclinenumber;
fix_error(inclinenumber);
if (error_retry){error_retry=0; r=1;}
}else{
if (sub_gl_called==0) events();

View file

@ -10262,7 +10262,11 @@ DO
dynscope = 0
PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");if(r)goto S_" + str2$(statementn) + ";}"
ELSE
PRINT #12, "if(!qbevent)break;evnt(" + str2$(linenumber) + ");}while(r);"
inclinenump$ = ""
IF inclinenumber(inclevel) THEN
inclinenump$ = ", " + str2$(inclinenumber(inclevel))
END IF
PRINT #12, "if(!qbevent)break;evnt(" + str2$(linenumber) + inclinenump$ + ");}while(r);"
END IF
END IF

View file

@ -745,6 +745,14 @@ id.callname = "func__errorline"
id.ret = LONGTYPE - ISPOINTER
regid
clearid
id.n = "_INCLERRORLINE"
id.subfunc = 1
id.callname = "func__inclerrorline"
id.ret = LONGTYPE - ISPOINTER
regid
clearid
id.n = "_DISPLAY"
id.subfunc = 2