]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: prettier and more detailed output when dumping generations
authorBjörn Lindqvist <bjourne@gmail.com>
Thu, 8 Oct 2015 14:25:35 +0000 (16:25 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Thu, 8 Oct 2015 14:25:35 +0000 (16:25 +0200)
vm/debug.cpp
vm/errors.cpp
vm/vm.hpp

index 0be3c2cc4a4573903a725d0a069e796e2ad78fe3..a464ff751bedfbf8c69bb82ba1066fd2508b21e8 100644 (file)
@@ -264,26 +264,39 @@ void factor_vm::dump_memory(ostream& out, cell from, cell to) {
     dump_cell(out, from);
 }
 
-template <typename Generation>
-void factor_vm::dump_generation(ostream& out, const char* name, Generation* gen) {
-  out << name << ": ";
-  out << "Start=" << gen->start;
-  out << ", size=" << gen->size;
-  out << ", end=" << gen->end;
-  out << endl;
+void dump_memory_range(ostream& out, const char* name, cell name_w,
+                       cell start, cell end) {
+  out << setw(name_w) << left << name << ": ";
+
+  out << "[" << (void*)start << " -> " << (void*)end << "] ";
+  out << setw(10) << right << (end - start) << " bytes" << endl;
 }
 
-void factor_vm::dump_generations(ostream& out) {
-  out << hex;
+template <typename Generation>
+void dump_generation(ostream& out, const char* name, Generation* gen) {
+  dump_memory_range(out, name, 10, gen->start, gen->end);
+}
 
-  dump_generation(out, "Nursery", &nursery);
+void factor_vm::dump_memory_layout(ostream& out) {
+  dump_generation(out, "Nursery", data->nursery);
   dump_generation(out, "Aging", data->aging);
   dump_generation(out, "Tenured", data->tenured);
-
-  out << "Cards:";
-  out << "base=" << (cell)data->cards << ", ";
-  out << "size=" << (cell)(data->cards_end - data->cards) << endl;
-  out << dec;
+  dump_memory_range(out, "Cards", 10, (cell)data->cards, (cell)data->cards_end);
+
+  out << endl << "Contexts:" << endl << endl;
+  FACTOR_FOR_EACH(active_contexts) {
+    context* the_ctx = *iter;
+    segment* ds = the_ctx->datastack_seg;
+    segment* rs = the_ctx->retainstack_seg;
+    segment* cs = the_ctx->callstack_seg;
+    if (the_ctx == ctx) {
+      out << "  Active:" << endl;
+    }
+    dump_memory_range(out, "  Datastack", 14, ds->start, ds->end);
+    dump_memory_range(out, "  Retainstack", 14, rs->start, rs->end);
+    dump_memory_range(out, "  Callstack", 14, cs->start, cs->end);
+    out << endl;
+  }
 }
 
 void factor_vm::dump_objects(ostream& out, cell type) {
@@ -382,7 +395,7 @@ void factor_vm::factorbug_usage(bool advanced_p) {
          << endl;
     cout << "  . <addr>         -- print object at tagged <addr>"
          << endl;
-    cout << "  g                -- dump generations" << endl;
+    cout << "  g                -- dump memory layout" << endl;
     cout << "  ds dr            -- dump data, retain stacks" << endl;
     cout << "  trim             -- toggle output trimming" << endl;
     cout << "  data             -- data heap dump" << endl;
@@ -498,7 +511,7 @@ void factor_vm::factorbug() {
       for (cell i = 0; i < special_object_count; i++)
         dump_cell(cout, (cell)&special_objects[i]);
     } else if (cmd == "g")
-      dump_generations(cout);
+      dump_memory_layout(cout);
     else if (cmd == "c") {
       exit_fep(this);
       return;
@@ -542,11 +555,7 @@ void factor_vm::factorbug() {
 }
 
 void factor_vm::primitive_die() {
-  cout << "The die word was called by the library. Unless you called it "
-      "yourself," << endl;
-  cout << "you have triggered a bug in Factor. Please report."
-       << endl;
-  factorbug();
+  critical_error("The die word was called by the library.", 0);
 }
 
 }
index 3de6945435e270411be6e9e96e4cfe3619ae5cce..c8f080cea3ce5be91e848341b4a30d34999a9adf 100644 (file)
@@ -32,7 +32,7 @@ void critical_error(const char* msg, cell tagged) {
 
 void out_of_memory(const char *msg) {
   std::cout << "Out of memory: " << msg << "\n\n";
-  current_vm()->dump_generations(std::cout);
+  current_vm()->dump_memory_layout(std::cout);
   abort();
 }
 
index fec5b38a8212fa02393547438b94e53731f8a542..5c94db010e85ea6233faabb85749b95d81c066bb 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -410,9 +410,7 @@ struct factor_vm {
   void print_callstack_object(ostream& out, callstack* obj);
   void dump_cell(ostream& out, cell x);
   void dump_memory(ostream& out, cell from, cell to);
-  template <typename Generation>
-  void dump_generation(ostream& out, const char* name, Generation* gen);
-  void dump_generations(ostream& out);
+  void dump_memory_layout(ostream& out);
   void dump_objects(ostream& out, cell type);
   void dump_edges(ostream& out);
   void find_data_references(ostream& out, cell look_for_);