X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fprint.c;h=485948fb480c8ca6a87c810607773b96d9bf7e27;hb=872175cd9cb5b4966a36d4bd92421cc407a0355b;hp=56cdb39923222e1e0f4cfae31e0975d886a1194f;hpb=6df93cdd503b613151de9c82982259b558465915;p=sbcl.git diff --git a/src/runtime/print.c b/src/runtime/print.c index 56cdb39..485948f 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -1,4 +1,4 @@ -/* code for low-level debugging output */ +/* code for low-level debugging/diagnostic output */ /* * This software is part of the SBCL system. See the README file for @@ -13,18 +13,19 @@ /* * FIXME: - * 1. Ordinary users won't get much out of this code, so it shouldn't - * be compiled into the ordinary build of the system. Probably it - * should be made conditional on the SB-SHOW target feature. - * 2. Some of the code in here (subtype_Names[] and the various - * foo_slots[], at least) is deeply broken, depending on fixed - * (and already out-of-date) values in sbcl.h. + * Some of the code in here (subtype_Names[] and the various + * foo_slots[], at least) is deeply broken, depending on fixed + * (and already out-of-date) values in sbcl.h. */ #include #include "print.h" #include "runtime.h" + +/* This file can be skipped if we're not supporting LDB. */ +#if defined(LISP_FEATURE_SB_LDB) + #include "sbcl.h" #include "monitor.h" #include "vars.h" @@ -38,7 +39,7 @@ static int cur_clock = 0; static void print_obj(char *prefix, lispobj obj); -#define NEWLINE if (continue_p(1)) newline(NULL); else return; +#define NEWLINE_OR_RETURN if (continue_p(1)) newline(NULL); else return; char *lowtag_Names[] = { "even fixnum", @@ -294,7 +295,7 @@ static void brief_list(lispobj obj) else { putchar('('); while (LowtagOf(obj) == type_ListPointer) { - struct cons *cons = (struct cons *)PTR(obj); + struct cons *cons = (struct cons *)native_pointer(obj); if (space) putchar(' '); @@ -324,7 +325,7 @@ static void print_list(lispobj obj) } else if (obj == NIL) { printf(" (NIL)"); } else { - struct cons *cons = (struct cons *)PTR(obj); + struct cons *cons = (struct cons *)native_pointer(obj); print_obj("car: ", cons->car); print_obj("cdr: ", cons->cdr); @@ -334,15 +335,15 @@ static void print_list(lispobj obj) static void brief_struct(lispobj obj) { printf("#", - (unsigned long) ((struct instance *)PTR(obj))->slots[0]); + (unsigned long) ((struct instance *)native_pointer(obj))->slots[0]); } static void print_struct(lispobj obj) { - struct instance *instance = (struct instance *)PTR(obj); + struct instance *instance = (struct instance *)native_pointer(obj); int i; char buffer[16]; - print_obj("type: ", ((struct instance *)PTR(obj))->slots[0]); + print_obj("type: ", ((struct instance *)native_pointer(obj))->slots[0]); for (i = 1; i < HeaderValue(instance->header); i++) { sprintf(buffer, "slot %d: ", i); print_obj(buffer, instance->slots[i]); @@ -357,7 +358,7 @@ static void brief_otherptr(lispobj obj) struct vector *vector; char *charptr; - ptr = (lispobj *) PTR(obj); + ptr = (lispobj *) native_pointer(obj); if (!is_valid_lisp_addr((os_vm_address_t)obj)) { printf("(invalid address)"); @@ -369,7 +370,7 @@ static void brief_otherptr(lispobj obj) switch (type) { case type_SymbolHeader: symbol = (struct symbol *)ptr; - vector = (struct vector *)PTR(symbol->name); + vector = (struct vector *)native_pointer(symbol->name); for (charptr = (char *)vector->data; *charptr != '\0'; charptr++) { if (*charptr == '"') putchar('\\'); @@ -437,7 +438,7 @@ static void print_otherptr(lispobj obj) int count, type, index; char *cptr, buffer[16]; - ptr = (lispobj*) PTR(obj); + ptr = (lispobj*) native_pointer(obj); if (ptr == NULL) { printf(" (NULL Pointer)"); return; @@ -450,7 +451,7 @@ static void print_otherptr(lispobj obj) print_obj("header: ", header); if (LowtagOf(header) != type_OtherImmediate0 && LowtagOf(header) != type_OtherImmediate1) { - NEWLINE; + NEWLINE_OR_RETURN; printf("(invalid header object)"); return; } @@ -458,7 +459,7 @@ static void print_otherptr(lispobj obj) switch (type) { case type_Bignum: ptr += count; - NEWLINE; + NEWLINE_OR_RETURN; printf("0x"); while (count-- > 0) printf("%08lx", (unsigned long) *--ptr); @@ -477,51 +478,51 @@ static void print_otherptr(lispobj obj) break; case type_SingleFloat: - NEWLINE; - printf("%g", ((struct single_float *)PTR(obj))->value); + NEWLINE_OR_RETURN; + printf("%g", ((struct single_float *)native_pointer(obj))->value); break; case type_DoubleFloat: - NEWLINE; - printf("%g", ((struct double_float *)PTR(obj))->value); + NEWLINE_OR_RETURN; + printf("%g", ((struct double_float *)native_pointer(obj))->value); break; #ifdef type_LongFloat case type_LongFloat: - NEWLINE; - printf("%Lg", ((struct long_float *)PTR(obj))->value); + NEWLINE_OR_RETURN; + printf("%Lg", ((struct long_float *)native_pointer(obj))->value); break; #endif #ifdef type_ComplexSingleFloat case type_ComplexSingleFloat: - NEWLINE; - printf("%g", ((struct complex_single_float *)PTR(obj))->real); - NEWLINE; - printf("%g", ((struct complex_single_float *)PTR(obj))->imag); + NEWLINE_OR_RETURN; + printf("%g", ((struct complex_single_float *)native_pointer(obj))->real); + NEWLINE_OR_RETURN; + printf("%g", ((struct complex_single_float *)native_pointer(obj))->imag); break; #endif #ifdef type_ComplexDoubleFloat case type_ComplexDoubleFloat: - NEWLINE; - printf("%g", ((struct complex_double_float *)PTR(obj))->real); - NEWLINE; - printf("%g", ((struct complex_double_float *)PTR(obj))->imag); + NEWLINE_OR_RETURN; + printf("%g", ((struct complex_double_float *)native_pointer(obj))->real); + NEWLINE_OR_RETURN; + printf("%g", ((struct complex_double_float *)native_pointer(obj))->imag); break; #endif #ifdef type_ComplexLongFloat case type_ComplexLongFloat: - NEWLINE; - printf("%Lg", ((struct complex_long_float *)PTR(obj))->real); - NEWLINE; - printf("%Lg", ((struct complex_long_float *)PTR(obj))->imag); + NEWLINE_OR_RETURN; + printf("%Lg", ((struct complex_long_float *)native_pointer(obj))->real); + NEWLINE_OR_RETURN; + printf("%Lg", ((struct complex_long_float *)native_pointer(obj))->imag); break; #endif case type_SimpleString: - NEWLINE; + NEWLINE_OR_RETURN; cptr = (char *)(ptr+1); putchar('"'); while (length-- > 0) @@ -530,8 +531,7 @@ static void print_otherptr(lispobj obj) break; case type_SimpleVector: - case type_InstanceHeader: - NEWLINE; + NEWLINE_OR_RETURN; printf("length = %ld", length); ptr++; index = 0; @@ -541,6 +541,16 @@ static void print_otherptr(lispobj obj) } break; + case type_InstanceHeader: + NEWLINE_OR_RETURN; + printf("length = %ld", (long) count); + index = 0; + while (count-- > 0) { + sprintf(buffer, "%d: ", index++); + print_obj(buffer, *ptr++); + } + break; + case type_SimpleArray: case type_SimpleBitVector: case type_SimpleArrayUnsignedByte2: @@ -606,7 +616,7 @@ static void print_otherptr(lispobj obj) break; case type_Sap: - NEWLINE; + NEWLINE_OR_RETURN; #ifndef alpha printf("0x%08lx", (unsigned long) *ptr); #else @@ -620,7 +630,7 @@ static void print_otherptr(lispobj obj) case type_BaseChar: case type_UnboundMarker: - NEWLINE; + NEWLINE_OR_RETURN; printf("pointer to an immediate?"); break; @@ -629,7 +639,7 @@ static void print_otherptr(lispobj obj) break; default: - NEWLINE; + NEWLINE_OR_RETURN; printf("Unknown header object?"); break; } @@ -649,7 +659,6 @@ static void print_obj(char *prefix, lispobj obj) char buffer[256]; boolean verbose = cur_depth < brief_depth; - if (!continue_p(verbose)) return; @@ -720,3 +729,13 @@ void brief_print(lispobj obj) print_obj("", obj); putchar('\n'); } + +#else + +void +brief_print(lispobj obj) +{ + printf("lispobj 0x%lx\n", (unsigned long)obj); +} + +#endif /* defined(LISP_FEATURE_SB_LDB) */