about summary refs log tree commit diff
path: root/src/rt/rust_shape.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/rust_shape.cpp')
-rw-r--r--src/rt/rust_shape.cpp17
1 files changed, 14 insertions, 3 deletions
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);
 }