moved debug functions into vm struct

db4
Phil Dawes 2009-08-17 21:37:06 +01:00
parent 64c2d81306
commit 13e0ae6d97
2 changed files with 158 additions and 24 deletions

158
vm/debug.cpp Normal file → Executable file
View File

@ -6,14 +6,19 @@ namespace factor
static bool fep_disabled; static bool fep_disabled;
static bool full_output; static bool full_output;
void print_chars(string* str) void factorvm::print_chars(string* str)
{ {
cell i; cell i;
for(i = 0; i < string_capacity(str); i++) for(i = 0; i < string_capacity(str); i++)
putchar(string_nth(str,i)); putchar(string_nth(str,i));
} }
void print_word(word* word, cell nesting) void print_chars(string* str)
{
return vm->print_chars(str);
}
void factorvm::print_word(word* word, cell nesting)
{ {
if(tagged<object>(word->vocabulary).type_p(STRING_TYPE)) if(tagged<object>(word->vocabulary).type_p(STRING_TYPE))
{ {
@ -31,14 +36,24 @@ void print_word(word* word, cell nesting)
} }
} }
void print_factor_string(string* str) void print_word(word* word, cell nesting)
{
return vm->print_word(word,nesting);
}
void factorvm::print_factor_string(string* str)
{ {
putchar('"'); putchar('"');
print_chars(str); print_chars(str);
putchar('"'); putchar('"');
} }
void print_array(array* array, cell nesting) void print_factor_string(string* str)
{
return vm->print_factor_string(str);
}
void factorvm::print_array(array* array, cell nesting)
{ {
cell length = array_capacity(array); cell length = array_capacity(array);
cell i; cell i;
@ -62,7 +77,12 @@ void print_array(array* array, cell nesting)
print_string("..."); print_string("...");
} }
void print_tuple(tuple *tuple, cell nesting) void print_array(array* array, cell nesting)
{
return vm->print_array(array,nesting);
}
void factorvm::print_tuple(tuple *tuple, cell nesting)
{ {
tuple_layout *layout = untag<tuple_layout>(tuple->layout); tuple_layout *layout = untag<tuple_layout>(tuple->layout);
cell length = to_fixnum(layout->size); cell length = to_fixnum(layout->size);
@ -91,7 +111,12 @@ void print_tuple(tuple *tuple, cell nesting)
print_string("..."); print_string("...");
} }
void print_nested_obj(cell obj, fixnum nesting) void print_tuple(tuple *tuple, cell nesting)
{
return vm->print_tuple(tuple,nesting);
}
void factorvm::print_nested_obj(cell obj, fixnum nesting)
{ {
if(nesting <= 0 && !full_output) if(nesting <= 0 && !full_output)
{ {
@ -141,12 +166,22 @@ void print_nested_obj(cell obj, fixnum nesting)
} }
} }
void print_obj(cell obj) void print_nested_obj(cell obj, fixnum nesting)
{
return vm->print_nested_obj(obj,nesting);
}
void factorvm::print_obj(cell obj)
{ {
print_nested_obj(obj,10); print_nested_obj(obj,10);
} }
void print_objects(cell *start, cell *end) void print_obj(cell obj)
{
return vm->print_obj(obj);
}
void factorvm::print_objects(cell *start, cell *end)
{ {
for(; start <= end; start++) for(; start <= end; start++)
{ {
@ -155,19 +190,34 @@ void print_objects(cell *start, cell *end)
} }
} }
void print_datastack() void print_objects(cell *start, cell *end)
{
return vm->print_objects(start,end);
}
void factorvm::print_datastack()
{ {
print_string("==== DATA STACK:\n"); print_string("==== DATA STACK:\n");
print_objects((cell *)ds_bot,(cell *)ds); print_objects((cell *)ds_bot,(cell *)ds);
} }
void print_retainstack() void print_datastack()
{
return vm->print_datastack();
}
void factorvm::print_retainstack()
{ {
print_string("==== RETAIN STACK:\n"); print_string("==== RETAIN STACK:\n");
print_objects((cell *)rs_bot,(cell *)rs); print_objects((cell *)rs_bot,(cell *)rs);
} }
void print_stack_frame(stack_frame *frame) void print_retainstack()
{
return vm->print_retainstack();
}
void factorvm::print_stack_frame(stack_frame *frame)
{ {
print_obj(frame_executing(frame)); print_obj(frame_executing(frame));
print_string("\n"); print_string("\n");
@ -184,15 +234,25 @@ void print_stack_frame(stack_frame *frame)
print_string("\n"); print_string("\n");
} }
void print_callstack() void print_stack_frame(stack_frame *frame)
{
return vm->print_stack_frame(frame);
}
void factorvm::print_callstack()
{ {
print_string("==== CALL STACK:\n"); print_string("==== CALL STACK:\n");
cell bottom = (cell)stack_chain->callstack_bottom; cell bottom = (cell)stack_chain->callstack_bottom;
cell top = (cell)stack_chain->callstack_top; cell top = (cell)stack_chain->callstack_top;
iterate_callstack(top,bottom,print_stack_frame); iterate_callstack(top,bottom,factor::print_stack_frame);
} }
void dump_cell(cell x) void print_callstack()
{
return vm->print_callstack();
}
void factorvm::dump_cell(cell x)
{ {
print_cell_hex_pad(x); print_string(": "); print_cell_hex_pad(x); print_string(": ");
x = *(cell *)x; x = *(cell *)x;
@ -200,7 +260,12 @@ void dump_cell(cell x)
nl(); nl();
} }
void dump_memory(cell from, cell to) void dump_cell(cell x)
{
return vm->dump_cell(x);
}
void factorvm::dump_memory(cell from, cell to)
{ {
from = UNTAG(from); from = UNTAG(from);
@ -208,14 +273,24 @@ void dump_memory(cell from, cell to)
dump_cell(from); dump_cell(from);
} }
void dump_zone(zone *z) void dump_memory(cell from, cell to)
{
return vm->dump_memory(from,to);
}
void factorvm::dump_zone(zone *z)
{ {
print_string("Start="); print_cell(z->start); print_string("Start="); print_cell(z->start);
print_string(", size="); print_cell(z->size); print_string(", size="); print_cell(z->size);
print_string(", here="); print_cell(z->here - z->start); nl(); print_string(", here="); print_cell(z->here - z->start); nl();
} }
void dump_generations() void dump_zone(zone *z)
{
return vm->dump_zone(z);
}
void factorvm::dump_generations()
{ {
cell i; cell i;
@ -241,7 +316,12 @@ void dump_generations()
nl(); nl();
} }
void dump_objects(cell type) void dump_generations()
{
return vm->dump_generations();
}
void factorvm::dump_objects(cell type)
{ {
gc(); gc();
begin_scan(); begin_scan();
@ -261,10 +341,15 @@ void dump_objects(cell type)
end_scan(); end_scan();
} }
void dump_objects(cell type)
{
return vm->dump_objects(type);
}
cell look_for; cell look_for;
cell obj; cell obj;
void find_data_references_step(cell *scan) void factorvm::find_data_references_step(cell *scan)
{ {
if(look_for == *scan) if(look_for == *scan)
{ {
@ -275,20 +360,30 @@ void find_data_references_step(cell *scan)
} }
} }
void find_data_references(cell look_for_) void find_data_references_step(cell *scan)
{
return vm->find_data_references_step(scan);
}
void factorvm::find_data_references(cell look_for_)
{ {
look_for = look_for_; look_for = look_for_;
begin_scan(); begin_scan();
while((obj = next_object()) != F) while((obj = next_object()) != F)
do_slots(UNTAG(obj),find_data_references_step); do_slots(UNTAG(obj),factor::find_data_references_step);
end_scan(); end_scan();
} }
void find_data_references(cell look_for_)
{
return vm->find_data_references(look_for_);
}
/* Dump all code blocks for debugging */ /* Dump all code blocks for debugging */
void dump_code_heap() void factorvm::dump_code_heap()
{ {
cell reloc_size = 0, literal_size = 0; cell reloc_size = 0, literal_size = 0;
@ -328,7 +423,12 @@ void dump_code_heap()
print_cell(literal_size); print_string(" bytes of literal data\n"); print_cell(literal_size); print_string(" bytes of literal data\n");
} }
void factorbug() void dump_code_heap()
{
return vm->dump_code_heap();
}
void factorvm::factorbug()
{ {
if(fep_disabled) if(fep_disabled)
{ {
@ -472,11 +572,21 @@ void factorbug()
} }
} }
PRIMITIVE(die) void factorbug()
{
return vm->factorbug();
}
inline void factorvm::vmprim_die()
{ {
print_string("The die word was called by the library. Unless you called it yourself,\n"); print_string("The die word was called by the library. Unless you called it yourself,\n");
print_string("you have triggered a bug in Factor. Please report.\n"); print_string("you have triggered a bug in Factor. Please report.\n");
factorbug(); factorbug();
} }
PRIMITIVE(die)
{
PRIMITIVE_GETVM()->vmprim_die();
}
} }

View File

@ -173,6 +173,30 @@ struct factorvm {
void clear_gc_stats(); void clear_gc_stats();
inline void vmprim_become(); inline void vmprim_become();
void inline_gc(cell *gc_roots_base, cell gc_roots_size); void inline_gc(cell *gc_roots_base, cell gc_roots_size);
//debug
void print_chars(string* str);
void print_word(word* word, cell nesting);
void print_factor_string(string* str);
void print_array(array* array, cell nesting);
void print_tuple(tuple *tuple, cell nesting);
void print_nested_obj(cell obj, fixnum nesting);
void print_obj(cell obj);
void print_objects(cell *start, cell *end);
void print_datastack();
void print_retainstack();
void print_stack_frame(stack_frame *frame);
void print_callstack();
void dump_cell(cell x);
void dump_memory(cell from, cell to);
void dump_zone(zone *z);
void dump_generations();
void dump_objects(cell type);
void find_data_references_step(cell *scan);
void find_data_references(cell look_for_);
void dump_code_heap();
void factorbug();
inline void vmprim_die();
// next method here: // next method here: