Add support in dbg.debug_obj for printing the obj body.

This commit is contained in:
Roy Frostig 2010-08-24 19:49:39 -07:00
parent d9e3fb2c5d
commit 7ccdb88374
2 changed files with 19 additions and 4 deletions

View file

@ -9,7 +9,7 @@ native "rust" mod rustrt {
fn debug_opaque[T](&T x); fn debug_opaque[T](&T x);
fn debug_box[T](@T x); fn debug_box[T](@T x);
fn debug_tag[T](&T x); fn debug_tag[T](&T x);
fn debug_obj[T](&T x, uint nmethods); fn debug_obj[T](&T x, uint nmethods, uint nbytes);
fn debug_fn[T](&T x); fn debug_fn[T](&T x);
} }
@ -33,8 +33,17 @@ fn debug_tag[T](&T x) {
rustrt.debug_tag[T](x); rustrt.debug_tag[T](x);
} }
fn debug_obj[T](&T x, uint nmethods) { /**
rustrt.debug_obj[T](x, nmethods); * `nmethods` is the number of methods we expect the object to have. The
* runtime will print this many words of the obj vtbl).
*
* `nbytes` is the number of bytes of body data we expect the object to have.
* The runtime will print this many bytes of the obj body. You probably want
* this to at least be 4u, since an implicit captured tydesc pointer sits in
* the front of any obj's data tuple.x
*/
fn debug_obj[T](&T x, uint nmethods, uint nbytes) {
rustrt.debug_obj[T](x, nmethods, nbytes);
} }
fn debug_fn[T](&T x) { fn debug_fn[T](&T x) {

View file

@ -308,7 +308,8 @@ struct rust_obj {
}; };
extern "C" CDECL void extern "C" CDECL void
debug_obj(rust_task *task, type_desc *t, rust_obj *obj, size_t nmethods) debug_obj(rust_task *task, type_desc *t, rust_obj *obj,
size_t nmethods, size_t nbytes)
{ {
task->log(rust_log::STDLIB, task->log(rust_log::STDLIB,
"debug_obj with %" PRIdPTR " methods", nmethods); "debug_obj with %" PRIdPTR " methods", nmethods);
@ -318,6 +319,11 @@ debug_obj(rust_task *task, type_desc *t, rust_obj *obj, size_t nmethods)
for (uintptr_t *p = obj->vtbl; p < obj->vtbl + nmethods; ++p) for (uintptr_t *p = obj->vtbl; p < obj->vtbl + nmethods; ++p)
task->log(rust_log::STDLIB, " vtbl word: 0x%" PRIxPTR, *p); task->log(rust_log::STDLIB, " vtbl word: 0x%" PRIxPTR, *p);
for (uintptr_t i = 0; i < nbytes; ++i)
task->log(rust_log::STDLIB,
" body byte %" PRIdPTR ": 0x%" PRIxPTR,
i, obj->body->data[i]);
} }
struct rust_fn { struct rust_fn {