]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/debug.cpp
io.streams.256color: faster by caching styles
[factor.git] / vm / debug.cpp
index da00e76f876236b2de330bb7e07f1e3c052dddf1..4ffa5ac388947f6a9637a5c7ceedad4d04d90ebc 100644 (file)
@@ -13,10 +13,10 @@ ostream& operator<<(ostream& out, const string* str) {
 }
 
 void factor_vm::print_word(ostream& out, word* word, cell nesting) {
-  if (tagged<object>(word->vocabulary).type_p(STRING_TYPE))
+  if (TAG(word->vocabulary) == STRING_TYPE)
     out << untag<string>(word->vocabulary) << ":";
 
-  if (tagged<object>(word->name).type_p(STRING_TYPE))
+  if (TAG(word->name) == STRING_TYPE)
     out << untag<string>(word->name);
   else {
     out << "#<not a string: ";
@@ -62,6 +62,7 @@ void factor_vm::print_alien(ostream& out, alien* alien, cell nesting) {
 }
 
 void factor_vm::print_byte_array(ostream& out, byte_array* array, cell nesting) {
+  (void)nesting;
   cell length = array->capacity;
   cell i;
   bool trimmed;
@@ -112,7 +113,7 @@ void factor_vm::print_nested_obj(ostream& out, cell obj, fixnum nesting) {
 
   quotation* quot;
 
-  switch (tagged<object>(obj).type()) {
+  switch (TAG(obj)) {
     case FIXNUM_TYPE:
       out << untag_fixnum(obj);
       break;
@@ -158,7 +159,7 @@ void factor_vm::print_nested_obj(ostream& out, cell obj, fixnum nesting) {
       print_alien(out, untag<alien>(obj), nesting - 1);
       break;
     default:
-      out << "#<" << type_name(tagged<object>(obj).type()) << " @ ";
+      out << "#<" << type_name(TAG(obj)) << " @ ";
       out << (void*)obj << ">";
       break;
   }
@@ -264,26 +265,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(static_cast<int>(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) {
@@ -299,6 +313,7 @@ void factor_vm::dump_objects(ostream& out, cell type) {
 }
 
 void factor_vm::find_data_references(ostream& out, cell look_for) {
+  primitive_full_gc();
   auto find_data_ref_func = [&](object* obj, cell* slot) {
     if (look_for == *slot) {
       out << padded_address((cell)obj) << " ";
@@ -310,6 +325,7 @@ void factor_vm::find_data_references(ostream& out, cell look_for) {
 }
 
 void factor_vm::dump_edges(ostream& out) {
+  primitive_full_gc();
   auto dump_edges_func = [&](object* obj, cell* scan) {
     if (TAG(*scan) > F_TYPE) {
       out << (void*)tag_dynamic(obj);
@@ -333,8 +349,8 @@ struct code_block_printer {
     if (scan->free_p())
       status = "free";
     else {
-      reloc_size += parent->object_size(scan->relocation);
-      parameter_size += parent->object_size(scan->parameters);
+      reloc_size += object_size(scan->relocation);
+      parameter_size += object_size(scan->parameters);
 
       if (parent->code->allocator->state.marked_p((cell)scan))
         status = "marked";
@@ -350,10 +366,10 @@ struct code_block_printer {
   }
 };
 
-/* Dump all code blocks for debugging */
+// Dump all code blocks for debugging
 void factor_vm::dump_code_heap(ostream& out) {
   code_block_printer printer(this, out);
-  code->allocator->iterate(printer);
+  code->allocator->iterate(printer, no_fixup());
   out << printer.reloc_size << " bytes used by relocation tables" << endl;
   out << printer.parameter_size << " bytes used by parameter tables" << endl;
 }
@@ -380,7 +396,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;
@@ -445,10 +461,10 @@ void factor_vm::factorbug() {
     cin >> setw(1024) >> cmd >> setw(0);
     if (!cin.good()) {
       if (!seen_command) {
-        /* If we exit with an EOF immediately, then
-           dump stacks. This is useful for builder and
-           other cases where Factor is run with stdin
-           redirected to /dev/null */
+        // If we exit with an EOF immediately, then
+        // dump stacks. This is useful for builder and
+        // other cases where Factor is run with stdin
+        // redirected to /dev/null
         fep_disabled = true;
 
         print_datastack(cout);
@@ -496,7 +512,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;
@@ -522,8 +538,6 @@ void factor_vm::factorbug() {
       ctx->push(addr);
     } else if (cmd == "code")
       dump_code_heap(cout);
-    else if (cmd == "compact-gc")
-      primitive_compact_gc();
     else if (cmd == "gc")
       primitive_full_gc();
     else if (cmd == "compact-gc")
@@ -540,11 +554,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);
 }
 
 }