1414#include <string.h>
1515#include <errno.h>
1616
17- int error_caught ;
18-
1917/**
2018 * common message handler
2119 */
@@ -32,11 +30,41 @@ void err_common_msg(const char *seg, const char *file, int line, const char *des
3230 log_printf ("\033[80m\033[0m" );
3331}
3432
33+ void err_stack_dump () {
34+ int i_stack , i_kw ;
35+
36+ if (prog_stack_count ) {
37+ log_printf ("\033[4mStack:\033[0m\n" );
38+ }
39+
40+ // log the stack trace
41+ for (i_stack = prog_stack_count ; i_stack > 0 ; i_stack -- ) {
42+ stknode_t node = prog_stack [i_stack - 1 ];
43+ switch (node .type ) {
44+ case 0xFF :
45+ case kwBYREF :
46+ case kwTYPE_CRVAR :
47+ // ignore these types
48+ break ;
49+
50+ default :
51+ for (i_kw = 0 ; keyword_table [i_kw ].name [0 ] != '\0' ; i_kw ++ ) {
52+ if (node .type == keyword_table [i_kw ].code ) {
53+ log_printf (" %s: %d" , keyword_table [i_kw ].name , node .line );
54+ }
55+ }
56+ }
57+ }
58+ if (prog_stack_count ) {
59+ log_printf ("\n" );
60+ }
61+ }
62+
3563/**
3664 * raise a compiler error
3765 */
3866void sc_raise2 (const char * sec , int scline , const char * buff ) {
39- prog_error = 0x40 ;
67+ prog_error = errCompile ;
4068 err_common_msg (WORD_COMP , sec , scline , buff );
4169}
4270
@@ -46,44 +74,16 @@ void sc_raise2(const char *sec, int scline, const char *buff) {
4674void rt_raise (const char * fmt , ...) {
4775 char * buff ;
4876 va_list ap ;
49- int i_stack , i_kw ;
50-
51- if (!gsb_last_error ) {
52- prog_error = 0x80 ;
5377
78+ if (!gsb_last_error && !prog_error ) {
79+ prog_error = errRuntime ;
5480 va_start (ap , fmt );
5581 buff = malloc (SB_TEXTLINE_SIZE + 1 );
5682 vsprintf (buff , fmt , ap );
5783 va_end (ap );
58-
5984 err_common_msg (WORD_RTE , prog_file , prog_line , buff );
6085 free (buff );
61-
62- if (prog_stack_count ) {
63- log_printf ("\033[4mStack:\033[0m\n" );
64- }
65-
66- // log the stack trace
67- for (i_stack = prog_stack_count ; i_stack > 0 ; i_stack -- ) {
68- stknode_t node = prog_stack [i_stack - 1 ];
69- switch (node .type ) {
70- case 0xFF :
71- case kwBYREF :
72- case kwTYPE_CRVAR :
73- // ignore these types
74- break ;
75-
76- default :
77- for (i_kw = 0 ; keyword_table [i_kw ].name [0 ] != '\0' ; i_kw ++ ) {
78- if (node .type == keyword_table [i_kw ].code ) {
79- log_printf (" %s: %d" , keyword_table [i_kw ].name , node .line );
80- }
81- }
82- }
83- }
84- if (prog_stack_count ) {
85- log_printf ("\n" );
86- }
86+ err_stack_dump ();
8787 }
8888}
8989
@@ -95,7 +95,7 @@ void err_syntax(int keyword, const char *fmt) {
9595 char * buff = malloc (SB_TEXTLINE_SIZE + 1 );
9696 char * fmt_p = (char * )fmt ;
9797
98- prog_error = 0x80 ;
98+ prog_error = errSyntax ;
9999 buff [0 ] = '\0' ;
100100 if (keyword != -1 ) {
101101 if (kw_getfuncname (keyword , buff ) ||
@@ -169,7 +169,7 @@ void err_arrmis_rp(void) {
169169}
170170
171171void err_arridx (int i , int m ) {
172- rt_raise (ERR_ARRAY_RANGE , i , m );
172+ err_throw (ERR_ARRAY_RANGE , i , m );
173173}
174174
175175void err_typemismatch (void ) {
@@ -234,7 +234,7 @@ void err_missing_sep(void) {
234234}
235235
236236void err_division_by_zero (void ) {
237- rt_raise (ERR_DIVZERO );
237+ err_throw (ERR_DIVZERO );
238238}
239239
240240void err_matop (void ) {
@@ -411,6 +411,10 @@ void err_throw_str(const char *err) {
411411 }
412412 }
413413
414+ if (!caught ) {
415+ err_stack_dump ();
416+ }
417+
414418 // cleanup the stack
415419 stknode_t node ;
416420 int sp ;
@@ -422,10 +426,11 @@ void err_throw_str(const char *err) {
422426 }
423427 }
424428 if (!caught ) {
425- prog_error = 0x80 ;
429+ prog_error = errRuntime ;
426430 err_common_msg (WORD_RTE , prog_file , prog_line , err );
431+ } else {
432+ prog_error = errThrow ;
427433 }
428- error_caught = caught ;
429434}
430435
431436// throw internal error
@@ -469,17 +474,9 @@ void err_file(dword code) {
469474 }
470475}
471476
472- void err_reset () {
473- error_caught = 0 ;
474- }
475-
476- int err_has_error () {
477- return error_caught || prog_error ;
478- }
479-
480477int err_handle_error (const char * err , var_p_t var ) {
481478 int result ;
482- if (error_caught == 1 ) {
479+ if (prog_error == errThrow ) {
483480 result = 1 ;
484481 } else if (prog_error ) {
485482 rt_raise (err );
0 commit comments