vm: "edges" command for factorbug

db4
Joe Groff 2011-11-11 10:12:36 -08:00
parent 88bbffd838
commit 2c5014e74e
2 changed files with 29 additions and 5 deletions

View File

@ -322,12 +322,12 @@ void factor_vm::dump_objects(cell type)
each_object(dumper); each_object(dumper);
} }
struct data_reference_slot_visitor { struct find_data_reference_slot_visitor {
cell look_for; cell look_for;
object *obj; object *obj;
factor_vm *parent; factor_vm *parent;
explicit data_reference_slot_visitor(cell look_for_, object *obj_, factor_vm *parent_) : explicit find_data_reference_slot_visitor(cell look_for_, object *obj_, factor_vm *parent_) :
look_for(look_for_), obj(obj_), parent(parent_) { } look_for(look_for_), obj(obj_), parent(parent_) { }
void operator()(cell *scan) void operator()(cell *scan)
@ -341,6 +341,21 @@ struct data_reference_slot_visitor {
} }
}; };
struct dump_edges_slot_visitor {
object *obj;
factor_vm *parent;
explicit dump_edges_slot_visitor(cell, object *obj_, factor_vm *parent_) :
obj(obj_), parent(parent_) { }
void operator()(cell *scan)
{
if (TAG(*scan) > F_TYPE)
std::cout << (void*)tag_dynamic(obj) << " ==> " << (void*)*scan << std::endl;
}
};
template <typename SlotVisitor>
struct data_reference_object_visitor { struct data_reference_object_visitor {
cell look_for; cell look_for;
factor_vm *parent; factor_vm *parent;
@ -350,14 +365,20 @@ struct data_reference_object_visitor {
void operator()(object *obj) void operator()(object *obj)
{ {
data_reference_slot_visitor visitor(look_for,obj,parent); SlotVisitor visitor(look_for,obj,parent);
obj->each_slot(visitor); obj->each_slot(visitor);
} }
}; };
void factor_vm::find_data_references(cell look_for) void factor_vm::find_data_references(cell look_for)
{ {
data_reference_object_visitor visitor(look_for,this); data_reference_object_visitor<find_data_reference_slot_visitor> visitor(look_for,this);
each_object(visitor);
}
void factor_vm::dump_edges()
{
data_reference_object_visitor<dump_edges_slot_visitor> visitor(0,this);
each_object(visitor); each_object(visitor);
} }
@ -424,6 +445,7 @@ void factor_vm::factorbug_usage(bool advanced_p)
std::cout << " data -- data heap dump" << std::endl; std::cout << " data -- data heap dump" << std::endl;
std::cout << " words -- words dump" << std::endl; std::cout << " words -- words dump" << std::endl;
std::cout << " tuples -- tuples dump" << std::endl; std::cout << " tuples -- tuples dump" << std::endl;
std::cout << " edges -- print all object-to-object references" << std::endl;
std::cout << " refs <addr> -- find data heap references to object" << std::endl; std::cout << " refs <addr> -- find data heap references to object" << std::endl;
std::cout << " push <addr> -- push object on data stack - NOT SAFE" << std::endl; std::cout << " push <addr> -- push object on data stack - NOT SAFE" << std::endl;
std::cout << " gc -- trigger full GC - NOT SAFE" << std::endl; std::cout << " gc -- trigger full GC - NOT SAFE" << std::endl;
@ -553,6 +575,8 @@ void factor_vm::factorbug()
} }
else if(strcmp(cmd,"data") == 0) else if(strcmp(cmd,"data") == 0)
dump_objects(TYPE_COUNT); dump_objects(TYPE_COUNT);
else if(strcmp(cmd,"edges") == 0)
dump_edges();
else if(strcmp(cmd,"refs") == 0) else if(strcmp(cmd,"refs") == 0)
{ {
cell addr = read_cell_hex(); cell addr = read_cell_hex();

View File

@ -402,7 +402,7 @@ struct factor_vm
template<typename Generation> void dump_generation(const char *name, Generation *gen); template<typename Generation> void dump_generation(const char *name, Generation *gen);
void dump_generations(); void dump_generations();
void dump_objects(cell type); void dump_objects(cell type);
void find_data_references_step(cell *scan); void dump_edges();
void find_data_references(cell look_for_); void find_data_references(cell look_for_);
void dump_code_heap(); void dump_code_heap();
void factorbug_usage(bool advanced_p); void factorbug_usage(bool advanced_p);