From ca0962cdb37d30283fc9c601f9a32612d3152ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Fri, 4 May 2018 08:38:33 +0000 Subject: [PATCH] Printer addresses --- src/c/printer/print_unreadable.d | 27 ++++++++++++++++++++------- src/c/printer/write_array.d | 4 ++-- src/c/printer/write_code.d | 15 +++++---------- src/c/printer/write_ugly.d | 13 ++++++++++++- src/h/internal.h | 2 +- 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/c/printer/print_unreadable.d b/src/c/printer/print_unreadable.d index 7ea5305c4..bbbc543af 100644 --- a/src/c/printer/print_unreadable.d +++ b/src/c/printer/print_unreadable.d @@ -14,34 +14,47 @@ #include void -_ecl_write_addr(cl_object x, cl_object stream) +_ecl_write_addr(void *x, cl_object stream) { cl_fixnum i, j; + int print_zeros = 0; i = (cl_index)x; + + if (i == 0) { + writestr_stream("0x0", stream); + return; + } + writestr_stream("0x", stream); for (j = sizeof(i)*8-4; j >= 0; j -= 4) { int k = (i>>j) & 0xf; - if (k < 10) + if (!print_zeros && k == 0) { + ; + } else if (k < 10) { + print_zeros = 1; ecl_write_char('0' + k, stream); - else + } else { + print_zeros = 1; ecl_write_char('a' + k - 10, stream); + } } } void _ecl_write_unreadable(cl_object x, const char *prefix, cl_object name, cl_object stream) { - if (ecl_print_readably()) + if (ecl_print_readably()) { FEprint_not_readable(x); + } ecl_write_char('#', stream); ecl_write_char('<', stream); writestr_stream(prefix, stream); ecl_write_char(' ', stream); if (!Null(name)) { si_write_ugly_object(name, stream); - } else { - _ecl_write_addr(x, stream); + ecl_write_char(' ', stream); } + _ecl_write_addr((void *)x, stream); ecl_write_char('>', stream); } @@ -71,7 +84,7 @@ si_print_unreadable_object_function(cl_object o, cl_object stream, cl_object typ } if (!Null(id)) { ecl_write_char(' ', stream); - _ecl_write_addr(o, stream); + _ecl_write_addr((void *)o, stream); } ecl_write_char('>', stream); } diff --git a/src/c/printer/write_array.d b/src/c/printer/write_array.d index 98260a8d5..20a452d85 100644 --- a/src/c/printer/write_array.d +++ b/src/c/printer/write_array.d @@ -39,7 +39,7 @@ write_array_inner(bool vector, cl_object x, cl_object stream) } else { if (!ecl_print_array()) { writestr_stream(vector? "#', stream); return; } @@ -189,7 +189,7 @@ _ecl_write_bitvector(cl_object x, cl_object stream) { if (!ecl_print_array() && !ecl_print_readably()) { writestr_stream("#', stream); } else { cl_index ndx; diff --git a/src/c/printer/write_code.d b/src/c/printer/write_code.d index 5ebdd9c13..122af7770 100644 --- a/src/c/printer/write_code.d +++ b/src/c/printer/write_code.d @@ -33,13 +33,7 @@ _ecl_write_bytecodes(cl_object x, cl_object stream) x->bytecodes.file_position), stream); } else { - cl_object name = x->bytecodes.name; - writestr_stream("#', stream); + _ecl_write_unreadable(x, "bytecompiled-function", x->bytecodes.name, stream); } } @@ -58,10 +52,11 @@ _ecl_write_bclosure(cl_object x, cl_object stream) } else { cl_object name = x->bytecodes.name; writestr_stream("#', stream); } } diff --git a/src/c/printer/write_ugly.d b/src/c/printer/write_ugly.d index c0df6f97e..65dd70c1c 100644 --- a/src/c/printer/write_ugly.d +++ b/src/c/printer/write_ugly.d @@ -329,7 +329,18 @@ write_cclosure(cl_object x, cl_object stream) static void write_foreign(cl_object x, cl_object stream) { - _ecl_write_unreadable(x, "foreign", x->foreign.tag, stream); + if (ecl_print_readably()) { + FEprint_not_readable(x); + } + writestr_stream("#foreign.tag, stream); + ecl_write_char(' ', stream); + if (x->foreign.data == NULL) { + writestr_stream("NULL", stream); + } else { + _ecl_write_addr((void *)x->foreign.data, stream); + } + ecl_write_char('>', stream); } static void diff --git a/src/h/internal.h b/src/h/internal.h index 6318a3962..691f2e549 100755 --- a/src/h/internal.h +++ b/src/h/internal.h @@ -340,7 +340,7 @@ extern cl_fixnum ecl_option_values[ECL_OPT_LIMIT+1]; /* print.d */ extern cl_object _ecl_stream_or_default_output(cl_object stream); -extern void _ecl_write_addr(cl_object x, cl_object stream); +extern void _ecl_write_addr(void *x, cl_object stream); extern void _ecl_write_array(cl_object o, cl_object stream); extern void _ecl_write_vector(cl_object o, cl_object stream); extern void _ecl_write_bitvector(cl_object o, cl_object stream);