aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-07-05 00:10:31 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-07-05 00:10:31 -0400
commita179068d71be43fc1e0fbd14fe1fe9eb1b462a18 (patch)
treece1c09394d86ad4c5aa61e9e29c8efb6496b35e9
parentb5cfbb1768588dae74ce6e85d3d3a702f6677c7e (diff)
Improvements to error message printouts
-rw-r--r--builtins/array.h4
-rw-r--r--builtins/functions.c56
-rw-r--r--builtins/table.h2
3 files changed, 39 insertions, 23 deletions
diff --git a/builtins/array.h b/builtins/array.h
index 3f4bfe7e..fbf37a53 100644
--- a/builtins/array.h
+++ b/builtins/array.h
@@ -15,13 +15,13 @@
const array_t arr = arr_expr; int64_t index = (int64_t)(index_expr); \
int64_t off = index + (index < 0) * (arr.length + 1) - 1; \
if (__builtin_expect(off < 0 || off >= arr.length, 0)) \
- fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int$as_text(&index, USE_COLOR, NULL), arr.length); \
+ fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int$as_text(&index, no, NULL), arr.length); \
(item_type*)(arr.data + arr.stride * off);})
#define Array_lvalue(item_type, arr_expr, index_expr, typeinfo, filename, start, end) *({ \
array_t *arr = arr_expr; int64_t index = (int64_t)(index_expr); \
int64_t off = index + (index < 0) * (arr->length + 1) - 1; \
if (__builtin_expect(off < 0 || off >= arr->length, 0)) \
- fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int$as_text(&index, USE_COLOR, NULL), arr->length); \
+ fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int$as_text(&index, no, NULL), arr->length); \
if (arr->data_refcount > 0) \
Array$compact(arr, typeinfo); \
(item_type*)(arr->data + arr->stride * off); })
diff --git a/builtins/functions.c b/builtins/functions.c
index 8916f936..927c343e 100644
--- a/builtins/functions.c
+++ b/builtins/functions.c
@@ -36,23 +36,15 @@ public void tomo_init(void)
srand48(seed);
}
-public void fail(CORD fmt, ...)
+static void print_stack_trace(FILE *out)
{
- if (USE_COLOR) fputs("\x1b[31;7m FAIL: \x1b[m ", stderr);
- else fputs("FAIL: ", stderr);
- va_list args;
- va_start(args, fmt);
- CORD_vfprintf(stderr, fmt, args);
- fputs("\n", stderr);
- va_end(args);
-
// Print stack trace:
- fprintf(stderr, "\x1b[34m");
- fflush(stderr);
+ fprintf(out, "\x1b[34m");
+ fflush(out);
void *array[1024];
size_t size = backtrace(array, sizeof(array)/sizeof(array[0]));
char **strings = strings = backtrace_symbols(array, size);
- for (size_t i = 1; i < size; i++) {
+ for (size_t i = 2; i < size - 4; i++) {
char *filename = strings[i];
const char *cmd = heap_strf("addr2line -e %.*s -fip | sed 's/\\$/./g;s/ at /() at /' >&2", strcspn(filename, "("), filename);
FILE *fp = popen(cmd, "w");
@@ -62,16 +54,28 @@ public void fail(CORD fmt, ...)
}
pclose(fp);
}
- fprintf(stderr, "\x1b[m");
- fflush(stderr);
+ fprintf(out, "\x1b[m");
+}
+public void fail(CORD fmt, ...)
+{
+ if (USE_COLOR) fputs("\x1b[31;7m ==================== ERROR ==================== \n\n\x1b[0;1m", stderr);
+ else fputs("==================== ERROR ====================\n\n", stderr);
+ va_list args;
+ va_start(args, fmt);
+ CORD_vfprintf(stderr, fmt, args);
+ if (USE_COLOR) fputs("\x1b[m", stderr);
+ fputs("\n\n", stderr);
+ va_end(args);
+ print_stack_trace(stderr);
+ fflush(stderr);
raise(SIGABRT);
}
public void fail_source(const char *filename, int64_t start, int64_t end, CORD fmt, ...)
{
- if (USE_COLOR) fputs("\n\x1b[31;7m FAIL: \x1b[m ", stderr);
- else fputs("\nFAIL: ", stderr);
+ if (USE_COLOR) fputs("\n\x1b[31;7m ==================== ERROR ==================== \n\n\x1b[0;1m", stderr);
+ else fputs("\n==================== ERROR ====================\n\n", stderr);
va_list args;
va_start(args, fmt);
@@ -82,8 +86,12 @@ public void fail_source(const char *filename, int64_t start, int64_t end, CORD f
if (filename && file) {
fputs("\n", stderr);
highlight_error(file, file->text+start, file->text+end, "\x1b[31;1m", 2, USE_COLOR);
+ fputs("\n", stderr);
}
+ if (USE_COLOR) fputs("\x1b[m", stderr);
+ print_stack_trace(stderr);
+ fflush(stderr);
raise(SIGABRT);
}
@@ -185,6 +193,9 @@ public void start_test(const char *filename, int64_t start, int64_t end)
public void end_test(void *expr, const TypeInfo *type, CORD expected, const char *filename, int64_t start, int64_t end)
{
+ (void)filename;
+ (void)start;
+ (void)end;
--TEST_DEPTH;
if (!expr) return;
@@ -212,10 +223,15 @@ public void end_test(void *expr, const TypeInfo *type, CORD expected, const char
}
if (!success) {
- fail_source(filename, start, end,
- USE_COLOR ? "\x1b[31;1mDoctest failure:\nExpected: \x1b[32;1m%s\x1b[0m\n\x1b[31;1m But got:\x1b[m %s\n"
- : "Doctest failure:\nExpected: %s\n But got: %s\n",
- CORD_to_const_char_star(expected), CORD_to_const_char_star(expr_normalized));
+ fprintf(stderr,
+ USE_COLOR
+ ? "\n\x1b[31;7m ==================== TEST FAILED ==================== \x1b[0;1m\n\nExpected: \x1b[1;32m%s\x1b[0m\n\x1b[1m But got:\x1b[m %s\n\n"
+ : "\n==================== TEST FAILED ====================\nExpected: %s\n\n But got: %s\n\n",
+ CORD_to_const_char_star(expected), CORD_to_const_char_star(expr_normalized));
+
+ print_stack_trace(stderr);
+ fflush(stderr);
+ raise(SIGABRT);
}
}
}
diff --git a/builtins/table.h b/builtins/table.h
index 5de87dc8..a33b5775 100644
--- a/builtins/table.h
+++ b/builtins/table.h
@@ -25,7 +25,7 @@
const table_t t = table_expr; key_t k = key_expr; const TypeInfo* info = info_expr; \
const val_t *v = Table$get(t, &k, info); \
if (__builtin_expect(v == NULL, 0)) \
- fail_source(filename, start, end, "The key %r is not in this table\n", generic_as_text(&k, USE_COLOR, info->TableInfo.key)); \
+ fail_source(filename, start, end, "The key %r is not in this table\n", generic_as_text(&k, no, info->TableInfo.key)); \
*v; })
table_t Table$from_entries(array_t entries, const TypeInfo *type);