From 1f8e0fa083fe527169019c8aa9c36017fd3ff6ad Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 9 Aug 2011 16:26:03 -0700 Subject: rt: Implement comparison of functions, objects, ports, channels, and tasks --- src/rt/rust_shape.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/rt/rust_shape.cpp') 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 &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 fst = bump_dp(dp); + data_pair snd = bump_dp(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(dp)); + } + template void cmp_number(const data_pair &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 &tag_variants); void walk_box(bool align); -- cgit 1.4.1-3-g733a5