You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.6 KiB
77 lines
1.6 KiB
// Debugging support for dynamic typing.
|
|
|
|
// General includes.
|
|
#include "base/cl_sysdep.h"
|
|
|
|
// Specification.
|
|
#include "cln/object.h"
|
|
|
|
|
|
// Implementation.
|
|
|
|
#include "cln/io.h"
|
|
|
|
namespace cln {
|
|
|
|
// The default printer function.
|
|
void cl_dprint_unknown (cl_heap* pointer)
|
|
{
|
|
fprint(cl_debugout, "<unknown @0x");
|
|
fprinthexadecimal(cl_debugout, (unsigned long) pointer);
|
|
fprint(cl_debugout, " refcount=");
|
|
fprintdecimal(cl_debugout, pointer->refcount);
|
|
fprint(cl_debugout, " type=");
|
|
fprinthexadecimal(cl_debugout, (unsigned long) pointer->type);
|
|
fprint(cl_debugout, ">");
|
|
}
|
|
|
|
static void cl_dprint_unknown_immediate (cl_heap* pointer)
|
|
{
|
|
fprint(cl_debugout, "<unknown @0x");
|
|
fprinthexadecimal(cl_debugout, (unsigned long) pointer);
|
|
fprint(cl_debugout, ">");
|
|
}
|
|
|
|
// Print an object. This function is callable from the debugger.
|
|
extern "C" void* cl_print (cl_uint word);
|
|
void* cl_print (cl_uint word)
|
|
{
|
|
var cl_heap* pointer = (cl_heap*)word;
|
|
if (cl_pointer_p(word)) {
|
|
var const cl_class* type = pointer->type;
|
|
if (type->dprint)
|
|
type->dprint(pointer);
|
|
else
|
|
cl_dprint_unknown(pointer);
|
|
} else {
|
|
var const cl_class* type = cl_immediate_classes[cl_tag(word)];
|
|
if (type && type->dprint)
|
|
type->dprint(pointer);
|
|
else
|
|
cl_dprint_unknown_immediate(pointer);
|
|
}
|
|
cl_debugout << std::endl; // newline and flush output
|
|
return pointer;
|
|
}
|
|
|
|
void cl_gcobject::debug_print () const
|
|
{
|
|
cl_print(word);
|
|
}
|
|
|
|
void cl_gcpointer::debug_print () const
|
|
{
|
|
cl_print(word);
|
|
}
|
|
|
|
void cl_rcobject::debug_print () const
|
|
{
|
|
cl_print(word);
|
|
}
|
|
|
|
void cl_rcpointer::debug_print () const
|
|
{
|
|
cl_print(word);
|
|
}
|
|
|
|
} // namespace cln
|