error context printing: show repeat counts
Instead of duplicating a context line, show "[repeats <n> times]". This improvement particularly helps avoid showing less context now that `for/list` creates a non-tail recursion to build up the result list.
This commit is contained in:
parent
c4926b5684
commit
869d48b784
|
@ -3153,6 +3153,13 @@ void scheme_write_proc_context(Scheme_Object *port, int print_width,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_context_repeats(int repeats, Scheme_Object *port)
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, "[repeats %d more time%s]", repeats, (repeats == 1) ? "" : "s");
|
||||||
|
scheme_write_byte_string(buf, strlen(buf), port);
|
||||||
|
}
|
||||||
|
|
||||||
static Scheme_Object *
|
static Scheme_Object *
|
||||||
def_error_display_proc(int argc, Scheme_Object *argv[])
|
def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
{
|
{
|
||||||
|
@ -3186,7 +3193,8 @@ def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
max_cnt = 0x7FFFFFFF;
|
max_cnt = 0x7FFFFFFF;
|
||||||
|
|
||||||
if (max_cnt) {
|
if (max_cnt) {
|
||||||
int orig_max_cnt = max_cnt;
|
Scheme_Object *prev_name;
|
||||||
|
int orig_max_cnt = max_cnt, repeats;
|
||||||
w = scheme_get_param(config, MZCONFIG_ERROR_PRINT_WIDTH);
|
w = scheme_get_param(config, MZCONFIG_ERROR_PRINT_WIDTH);
|
||||||
if (SCHEME_INTP(w))
|
if (SCHEME_INTP(w))
|
||||||
print_width = SCHEME_INT_VAL(w);
|
print_width = SCHEME_INT_VAL(w);
|
||||||
|
@ -3219,6 +3227,9 @@ def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prev_name = NULL;
|
||||||
|
repeats = 0;
|
||||||
|
|
||||||
l = scheme_get_stack_trace(scheme_struct_ref(argv[1], 1));
|
l = scheme_get_stack_trace(scheme_struct_ref(argv[1], 1));
|
||||||
while (!SCHEME_NULLP(l)) {
|
while (!SCHEME_NULLP(l)) {
|
||||||
if (!max_cnt) {
|
if (!max_cnt) {
|
||||||
|
@ -3227,6 +3238,10 @@ def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
} else {
|
} else {
|
||||||
Scheme_Object *name, *loc;
|
Scheme_Object *name, *loc;
|
||||||
|
|
||||||
|
name = SCHEME_CAR(l);
|
||||||
|
if (prev_name && scheme_equal(name, prev_name)) {
|
||||||
|
repeats++;
|
||||||
|
} else {
|
||||||
if (max_cnt == orig_max_cnt) {
|
if (max_cnt == orig_max_cnt) {
|
||||||
/* Starting label: */
|
/* Starting label: */
|
||||||
scheme_write_byte_string("\n context...:\n", 15, port);
|
scheme_write_byte_string("\n context...:\n", 15, port);
|
||||||
|
@ -3234,7 +3249,18 @@ def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
scheme_write_byte_string("\n", 1, port);
|
scheme_write_byte_string("\n", 1, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
name = SCHEME_CAR(l);
|
if (repeats) {
|
||||||
|
scheme_write_byte_string(" ", 3, port);
|
||||||
|
write_context_repeats(repeats, port);
|
||||||
|
repeats = 0;
|
||||||
|
--max_cnt;
|
||||||
|
if (max_cnt)
|
||||||
|
scheme_write_byte_string("\n", 1, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_name = name;
|
||||||
|
|
||||||
|
if (max_cnt) {
|
||||||
loc = SCHEME_CDR(name);
|
loc = SCHEME_CDR(name);
|
||||||
name = SCHEME_CAR(name);
|
name = SCHEME_CAR(name);
|
||||||
|
|
||||||
|
@ -3253,11 +3279,19 @@ def_error_display_proc(int argc, Scheme_Object *argv[])
|
||||||
NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
l = SCHEME_CDR(l);
|
|
||||||
--max_cnt;
|
--max_cnt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
l = SCHEME_CDR(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (repeats) {
|
||||||
|
scheme_write_byte_string("\n", 1, port);
|
||||||
|
scheme_write_byte_string(" ", 3, port);
|
||||||
|
write_context_repeats(repeats, port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user