From e891ce089183d932a30d1fe869721ee2f4f84e5d Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Wed, 23 Mar 2016 07:45:51 -0300 Subject: [PATCH] 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. --- internal/c/libqb.cpp | 7 ++++--- internal/c/qbx.cpp | 12 +++++++++--- source/qb64.bas | 6 +++++- source/subs_functions/subs_functions.bas | 8 ++++++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/internal/c/libqb.cpp b/internal/c/libqb.cpp index e58559cc9..24d3af7d9 100644 --- a/internal/c/libqb.cpp +++ b/internal/c/libqb.cpp @@ -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; diff --git a/internal/c/qbx.cpp b/internal/c/qbx.cpp index d6cfad84a..aafbcadd3 100644 --- a/internal/c/qbx.cpp +++ b/internal/c/qbx.cpp @@ -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(); diff --git a/source/qb64.bas b/source/qb64.bas index d051f0c78..b2dbd51e0 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -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 diff --git a/source/subs_functions/subs_functions.bas b/source/subs_functions/subs_functions.bas index 9d5fdc6a8..d2be107a2 100644 --- a/source/subs_functions/subs_functions.bas +++ b/source/subs_functions/subs_functions.bas @@ -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