#ifdef DEBUG #include #include "debugger.h" #include "instruct.h" #include "memory.h" #include "mlvalues.h" #include "opnames.h" #include "stacks.h" #include "unalignd.h" bytecode_t log_buffer[LOG_BUFFER_SIZE]; bytecode_t * log_ptr; int trace_flag; /* Displaying a heap object */ long max_print = 100; long max_print_depth = 10; long print_cnt; static void print_val(v, d) value v; long d; { long n; value * p; if (d <= 0) { printf("."); return; } print_cnt--; if (print_cnt <= 0) { if (print_cnt == 0) printf("..."); return; } if (Is_long(v)) printf("%ld", Long_val(v)); else if (!Is_in_heap (v) && !Is_young (v)) printf("0x%lx", v); else switch(Tag_val(v)) { case String_tag: printf("\"%s\"", String_val(v)); break; case Double_tag: printf("%g", Double_val(v)); break; case Abstract_tag: printf(""); break; case Final_tag: printf(""); break; default: n = Tag_val(v); if (n < 26){ printf ("%c", n + 'A'); }else{ printf("tag%ld", n); } n = Wosize_val(v); if (n > 0) { printf("("); p = &Field(v, 0); while (n > 1) { print_val(*p, d-1); printf(", "); p++; n--; } print_val(*p, d-1); printf(")"); } break; } } void print_value(v) value v; { print_cnt = max_print; print_val(v, max_print_depth); printf("\n"); } extern bytecode_t start_code; void print_pc(pc) bytecode_t pc; { printf("%6d ", pc - start_code); } /* Disassembling one instruction */ bytecode_t disasm_instr(pc) bytecode_t pc; { return pc; } void disasm(pc) bytecode_t pc; { int i; for (i = 0; i < 20; i++) pc = disasm_instr(pc); } void post_mortem(n) int n; { bytecode_t * p; if (n > LOG_BUFFER_SIZE) n = LOG_BUFFER_SIZE; for (p = log_buffer + (unsigned) (log_ptr - log_buffer - n) % LOG_BUFFER_SIZE; n > 0; n--) { disasm_instr(*p); p++; if (p >= log_buffer + LOG_BUFFER_SIZE) p = log_buffer; } } void failed_assert (expr, file, line) char *expr, *file; int line; { fprintf (stderr, "Assertion failed: %s; file %s; line %d\n", expr, file, line); exit (100); } static unsigned long seed = 0x12345; unsigned long not_random () { seed = seed * 65537 + 12345; return seed; } #endif /* DEBUG */