From b371891c7c35f5d561a4847515e41014c652fa26 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 24 Aug 2011 16:54:10 -0700 Subject: rt: Fix walk_obj_contents for type-parameteric objects. Hash tables can be logged now. --- src/rt/rust_shape.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'src/rt/rust_shape.cpp') diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index 8e99c41ea02..6a586860cd6 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -42,10 +42,21 @@ type_param::make(const type_desc **tydescs, unsigned n_tydescs, return ptrs; } +// Constructs type parameters from an object shape. This is a bit messy, +// because it requires that the object shape have a specific format. type_param * -type_param::from_obj_shape(const uint8_t *sp, arena &arena) { - // TODO - abort(); +type_param::from_obj_shape(const uint8_t *sp, ptr dp, arena &arena) { + uint8_t shape = *sp++; assert(shape == SHAPE_STRUCT); + get_u16_bump(sp); // Skip over the size. + shape = *sp++; assert(shape == SHAPE_PTR); + shape = *sp++; assert(shape == SHAPE_STRUCT); + + unsigned n_tydescs = get_u16_bump(sp); + + // Type descriptors start right after the reference count. + const type_desc **descs = (const type_desc **)(dp + sizeof(uintptr_t)); + + return make(descs, n_tydescs, arena); } -- cgit 1.4.1-3-g733a5