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.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp
index 0d981955410..3e927b0f393 100644
--- a/src/rt/rust_shape.cpp
+++ b/src/rt/rust_shape.cpp
@@ -1031,11 +1031,25 @@ private:
     void walk_vec(bool align, bool is_pod,
                   const std::pair<ptr_pair,ptr_pair> &data_range);
 
-    void walk_subcontext(bool align, cmp &sub) {
+    inline void walk_subcontext(bool align, cmp &sub) {
         sub.walk(align);
         result = sub.result;
     }
 
+    inline void cmp_two_pointers(bool align) {
+        if (align) dp = align_to(dp, ALIGNOF(uint8_t *) * 2);
+        data_pair<uint8_t *> fst = bump_dp<uint8_t *>(dp);
+        data_pair<uint8_t *> snd = bump_dp<uint8_t *>(dp);
+        cmp_number(fst);
+        if (!result)
+            cmp_number(snd);
+    }
+
+    inline void cmp_pointer(bool align) {
+        if (align) dp = align_to(dp, ALIGNOF(uint8_t *));
+        cmp_number(bump_dp<uint8_t *>(dp));
+    }
+
     template<typename T>
     void cmp_number(const data_pair<T> &nums) {
         result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1;
@@ -1078,6 +1092,12 @@ public:
         return walk_vec(align, is_pod, get_ivec_data_range(dp));
     }
 
+    void walk_fn(bool align) { return cmp_two_pointers(align); }
+    void walk_obj(bool align) { return cmp_two_pointers(align); }
+    void walk_port(bool align) { return cmp_pointer(align); }
+    void walk_chan(bool align) { return cmp_pointer(align); }
+    void walk_task(bool align) { return cmp_pointer(align); }
+
     void walk_tag(bool align, tag_info &tinfo,
                   const data_pair<uint32_t> &tag_variants);
     void walk_box(bool align);