Skip to content

Commit 35987e7

Browse files
committed
COMMON: update error handling
1 parent 39e6b47 commit 35987e7

File tree

9 files changed

+87
-80
lines changed

9 files changed

+87
-80
lines changed

samples/distro-examples/tests/output/trycatch.out

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@ open failed FS(2): NO SUCH FILE OR DIRECTORY
44
after try
55
catch by error name
66
outer after try
7-
8-
9-
* RTE-ERROR AT ../../../samples/distro-examples/tests/trycatch.bas:200 *
10-
Description:
11-
Division by zero
12-
137
Stack:
148
TRY: 199
159
TRY: 198
@@ -21,3 +15,9 @@ Stack:
2115
IF: 192
2216
SUB: 216
2317

18+
19+
20+
* RTE-ERROR AT ../../../samples/distro-examples/tests/trycatch.bas:200 *
21+
Description:
22+
Division by zero
23+

samples/distro-examples/tests/trycatch.bas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,15 @@ if 1 == 1 then
198198
try
199199
try
200200
a = 1 / 0
201-
catch
201+
catch "X"
202202
end try
203-
catch
203+
catch "X"
204204
end try
205-
catch
205+
catch "X"
206206
end try
207-
catch
207+
catch "X"
208208
end try
209-
catch
209+
catch "X"
210210
end try
211211
fi
212212
fi

src/common/blib.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,9 +1475,8 @@ void cmd_endif() {
14751475
stknode_t node;
14761476

14771477
code_pop(&node, kwIF);
1478-
while (node.type != kwIF) {
1478+
while (node.type != kwIF && !prog_error) {
14791479
code_pop(&node, kwIF);
1480-
IF_ERR_BREAK;
14811480
}
14821481

14831482
if (!prog_error) {

src/common/blib_db.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,6 @@ void cmd_floadln() {
564564
int eof, eol, bufLen, bufIndex;
565565
dword unreadBytes;
566566

567-
err_reset();
568567
if (code_peek() == kwTYPE_SEP) {
569568
// "filename" is an already open file number
570569
flags = 0;
@@ -646,7 +645,7 @@ void cmd_floadln() {
646645
unreadBytes -= bufLen;
647646

648647
dev_fread(handle, (byte *)buf, bufLen);
649-
if (err_has_error()) {
648+
if (prog_error) {
650649
eof = 1;
651650
break;
652651
}
@@ -666,7 +665,7 @@ void cmd_floadln() {
666665
}
667666
} // read line
668667

669-
if (err_has_error()) {
668+
if (prog_error) {
670669
// clear & exit
671670
v_free(array_p);
672671
v_init(array_p);
@@ -716,7 +715,6 @@ void cmd_fsaveln() {
716715
int flags = DEV_FILE_OUTPUT;
717716
int handle, i;
718717

719-
err_reset();
720718
if (code_peek() == kwTYPE_SEP) {
721719
// "filename" is an already open file number
722720
flags = 0;

src/common/brun.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ static char fileName[OS_FILENAME_SIZE + 1];
3535
static int exec_tid;
3636

3737
#define EVT_CHECK_EVERY 50
38+
#define IF_ERR_BREAK if (prog_error) { \
39+
if (prog_error == errThrow) \
40+
prog_error = errNone; else break;}
3841

3942
/**
4043
* jump to label
@@ -326,7 +329,7 @@ void exec_setup_predefined_variables() {
326329
* BREAK
327330
*/
328331
void brun_stop() {
329-
prog_error = -3;
332+
prog_error = errBreak;
330333
}
331334

332335
/**
@@ -421,7 +424,7 @@ void cmd_chain(void) {
421424
if (success == 0) {
422425
close_task(tid_base);
423426
activate_task(tid_prev);
424-
prog_error = 1;
427+
prog_error = errCompile;
425428
return;
426429
}
427430

@@ -448,7 +451,7 @@ void cmd_chain(void) {
448451
strcpy(gsb_last_errmsg, "");
449452

450453
if (success == 0) {
451-
prog_error = 1;
454+
prog_error = errRuntime;
452455
}
453456
}
454457

@@ -671,7 +674,7 @@ static inline void bc_loop_call_proc() {
671674
dev_print("\nSTKDUMP:\n");
672675
dump_stack();
673676
// end of program
674-
prog_error = -1;
677+
prog_error = errEnd;
675678
break;
676679
case kwDEFINEKEY:
677680
cmd_definekey();
@@ -722,7 +725,7 @@ static inline void bc_loop_end() {
722725
}
723726
}
724727
// end of program
725-
prog_error = -1;
728+
prog_error = errEnd;
726729
}
727730

728731
/**
@@ -775,7 +778,7 @@ void bc_loop(int isf) {
775778
// break event
776779
break;
777780
case -2:
778-
prog_error = -2;
781+
prog_error = errBreak;
779782
inf_break(prog_line);
780783
break;
781784
default:
@@ -1275,7 +1278,7 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
12751278
eval_sp = 0;
12761279

12771280
// initialize the rest tasks globals
1278-
prog_error = 0;
1281+
prog_error = errNone;
12791282
prog_line = 0;
12801283
prog_dp = data_org = hdr.data_ip;
12811284
prog_length = hdr.bc_count;
@@ -1533,10 +1536,10 @@ int sbasic_exec_task(int tid) {
15331536

15341537
prev_tid = activate_task(tid);
15351538

1536-
bc_loop(0); // natural the value -1 is end of program
1537-
success = (prog_error == 0 || prog_error == -1);
1539+
bc_loop(0);
1540+
success = (prog_error == errNone || prog_error == errEnd);
15381541
if (success) {
1539-
prog_error = 0;
1542+
prog_error = errNone;
15401543
}
15411544
activate_task(prev_tid);
15421545
return success;

src/common/eval.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,7 @@ void eval(var_t *r) {
13061306
default:
13071307
if (code == kwTYPE_EOC ||
13081308
code == kwTYPE_SEP ||
1309+
code == kwTO ||
13091310
kw_check_evexit(code)) {
13101311
IP--;
13111312
// restore stack pointer

src/common/sberr.c

Lines changed: 45 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
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
*/
3866
void 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) {
4674
void 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

171171
void err_arridx(int i, int m) {
172-
rt_raise(ERR_ARRAY_RANGE, i, m);
172+
err_throw(ERR_ARRAY_RANGE, i, m);
173173
}
174174

175175
void err_typemismatch(void) {
@@ -234,7 +234,7 @@ void err_missing_sep(void) {
234234
}
235235

236236
void err_division_by_zero(void) {
237-
rt_raise(ERR_DIVZERO);
237+
err_throw(ERR_DIVZERO);
238238
}
239239

240240
void 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-
480477
int 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);

src/common/sberr.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,16 @@
1616
extern "C" {
1717
#endif
1818

19-
#define IF_ERR_BREAK if (prog_error) {break;}
19+
typedef enum {
20+
errNone = 0,
21+
errEnd,
22+
errBreak,
23+
errThrow,
24+
errCompile,
25+
errRuntime,
26+
errSyntax
27+
} ErrorState;
28+
2029
#define IF_ERR_RETURN if (prog_error) {return;}
2130
#define IF_ERR_RETURN_0 if (prog_error) {return 0;}
2231

@@ -71,13 +80,11 @@ void err_ref_var();
7180
void err_ref_circ_var();
7281
void err_array();
7382
void err_form_input();
83+
void err_throw(const char *fmt, ...);
84+
int err_handle_error(const char *err, var_p_t var);
7485
void inf_done(void);
7586
void inf_break(int pline);
76-
void err_throw(const char *fmt, ...);
7787
void cmd_throw();
78-
void err_reset();
79-
int err_handle_error(const char *err, var_p_t var);
80-
int err_has_error();
8188

8289
#if defined(__cplusplus)
8390
}

0 commit comments

Comments
 (0)