Feature #839 ยป add_code_output.diff
| eval_error.c (working copy) | ||
|---|---|---|
|
rb_funcall(info, rb_intern("set_backtrace"), 1, bt);
|
||
|
}
|
||
|
static void
|
||
|
print_line_from_file(char *filename_and_line_number) {
|
||
|
char *c;
|
||
|
char *filename;
|
||
|
char *line_number_string;
|
||
|
FILE *test;
|
||
|
int bytes_read;
|
||
|
int done = 0;
|
||
|
int byte_at;
|
||
|
int line_number = 0;
|
||
|
int am_within_preceding_whitespace = 1;
|
||
|
int line_at = 1;
|
||
|
char read_buffer[100];
|
||
|
|
||
|
/* find filename from string filename:line:more */
|
||
|
filename = alloca(strlen(filename_and_line_number) + 1);
|
||
|
strcpy(filename, filename_and_line_number );
|
||
|
|
||
|
for(c = &filename[0]; *c != 0 && *c != ':'; c++) { }
|
||
|
*c = 0;
|
||
|
test = fopen(filename, "r");
|
||
|
if(!test)
|
||
|
return; // file not found
|
||
|
c++;
|
||
|
line_number_string = c;
|
||
|
for(; *c != 0 && *c != ':'; c++) { }
|
||
|
*c = 0;
|
||
|
line_number = atoi(line_number_string);
|
||
|
if(!line_number)
|
||
|
return;
|
||
|
warn_printf("\t\t ");
|
||
|
while(!done) {
|
||
|
char current;
|
||
|
bytes_read = fread(&read_buffer[0], sizeof(char), 99, test);
|
||
|
read_buffer[bytes_read] = 0;
|
||
|
for(byte_at = 0; byte_at < bytes_read; byte_at++) {
|
||
|
current = read_buffer[byte_at];
|
||
|
if(current == '\n')
|
||
|
line_at += 1;
|
||
|
if(line_at == line_number && current != '\r' && current != '\n') {
|
||
|
if(!(am_within_preceding_whitespace && (current == '\t' || current == ' '))) {
|
||
|
am_within_preceding_whitespace = 0;
|
||
|
printf("%c", current);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
if(bytes_read < 99) // EOF
|
||
|
done = 1;
|
||
|
if(line_at > line_number)
|
||
|
done = 1;
|
||
|
}
|
||
|
fclose(test);
|
||
|
warn_printf("\n");
|
||
|
|
||
|
}
|
||
|
static void
|
||
|
error_print(void)
|
||
|
{
|
||
| ... | ... | |
|
goto error;
|
||
|
if (eclass == rb_eRuntimeError && elen == 0) {
|
||
|
warn_print(": unhandled exception\n");
|
||
|
if (!NIL_P(errat))
|
||
|
print_line_from_file(RSTRING_PTR( RARRAY_PTR(errat)[0]));
|
||
|
}
|
||
|
else {
|
||
|
VALUE epath;
|
||
| ... | ... | |
|
for (i = 1; i < len; i++) {
|
||
|
if (TYPE(ptr[i]) == T_STRING) {
|
||
|
warn_printf("\tfrom %s\n", RSTRING_PTR(ptr[i]));
|
||
|
print_line_from_file(RSTRING_PTR(ptr[i]));
|
||
|
}
|
||
|
if (skip && i == TRACE_HEAD && len > TRACE_MAX) {
|
||
|
warn_printf("\t ... %ld levels...\n",
|
||