From e5533a5d5e589bad751e4af3f29dc4c65cb8958e Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 9 Aug 2011 12:49:04 -0700 Subject: rt: Compare exterior vectors --- src/rt/rust_shape.cpp | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'src/rt/rust_shape.cpp') diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index 8bbb090d826..6e6d8fd4b09 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -851,7 +851,9 @@ class data : public ctxt< data > { protected: void walk_variant(bool align, tag_info &tinfo, uint32_t variant); + static std::pair get_evec_data_range(uint8_t *dp); static std::pair get_ivec_data_range(uint8_t *dp); + static std::pair get_evec_data_range(ptr_pair &dp); static std::pair get_ivec_data_range(ptr_pair &dp); public: @@ -920,6 +922,13 @@ data::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id) { variant_ptr_and_end); } +template +std::pair +data::get_evec_data_range(uint8_t *dp) { + rust_vec *vp = bump_dp(dp); + return std::make_pair(vp->data, vp->data + vp->fill); +} + template std::pair data::get_ivec_data_range(uint8_t *dp) { @@ -945,6 +954,16 @@ data::get_ivec_data_range(uint8_t *dp) { return std::make_pair(start, end); } +template +std::pair +data::get_evec_data_range(ptr_pair &dp) { + std::pair fst = get_evec_data_range(dp.fst); + std::pair snd = get_evec_data_range(dp.snd); + ptr_pair start(fst.first, snd.first); + ptr_pair end(fst.second, snd.second); + return std::make_pair(start, end); +} + template std::pair data::get_ivec_data_range(ptr_pair &dp) { @@ -1010,16 +1029,19 @@ class cmp : public data { friend class data; private: - template - void cmp_number(const data_pair &nums) { - result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1; - } + void walk_vec(bool align, bool is_pod, + const std::pair &data_range); void walk_subcontext(bool align, cmp &sub) { sub.walk(align); result = sub.result; } + template + void cmp_number(const data_pair &nums) { + result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1; + } + public: int result; @@ -1048,7 +1070,14 @@ public: in_dp), result(0) {} - void walk_ivec(bool align, bool is_pod, size_align &elem_sa); + void walk_evec(bool align, bool is_pod, uint16_t sp_size) { + return walk_vec(align, is_pod, get_evec_data_range(dp)); + } + + void walk_ivec(bool align, bool is_pod, size_align &elem_sa) { + return walk_vec(align, is_pod, get_ivec_data_range(dp)); + } + void walk_tag(bool align, tag_info &tinfo, const data_pair &tag_variants); void walk_box(bool align); @@ -1069,9 +1098,8 @@ void cmp::cmp_number(const data_pair &nums) { } void -cmp::walk_ivec(bool align, bool is_pod, size_align &elem_sa) { - std::pair data_range = get_ivec_data_range(dp); - +cmp::walk_vec(bool align, bool is_pod, + const std::pair &data_range) { cmp sub(*this, data_range.first); ptr_pair data_end = data_range.second; while (!result && sub.dp < data_end) { -- cgit 1.4.1-3-g733a5