147 lines · 2.4 KB · C
RawDownload
#ifdef DEBUG #include <stdio.h>#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("<abstract>");      break;    case Final_tag:      printf("<finalized>");      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 */