diff options
Diffstat (limited to 'src/rt/rust_shape.cpp')
| -rw-r--r-- | src/rt/rust_shape.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
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<T,U> > { protected: void walk_variant(bool align, tag_info &tinfo, uint32_t variant); + static std::pair<uint8_t *,uint8_t *> get_evec_data_range(uint8_t *dp); static std::pair<uint8_t *,uint8_t *> get_ivec_data_range(uint8_t *dp); + static std::pair<ptr_pair,ptr_pair> get_evec_data_range(ptr_pair &dp); static std::pair<ptr_pair,ptr_pair> get_ivec_data_range(ptr_pair &dp); public: @@ -922,6 +924,13 @@ data<T,U>::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id) { template<typename T,typename U> std::pair<uint8_t *,uint8_t *> +data<T,U>::get_evec_data_range(uint8_t *dp) { + rust_vec *vp = bump_dp<rust_vec *>(dp); + return std::make_pair(vp->data, vp->data + vp->fill); +} + +template<typename T,typename U> +std::pair<uint8_t *,uint8_t *> data<T,U>::get_ivec_data_range(uint8_t *dp) { size_t fill = bump_dp<size_t>(dp); bump_dp<size_t>(dp); // Skip over alloc. @@ -947,6 +956,16 @@ data<T,U>::get_ivec_data_range(uint8_t *dp) { template<typename T,typename U> std::pair<ptr_pair,ptr_pair> +data<T,U>::get_evec_data_range(ptr_pair &dp) { + std::pair<uint8_t *,uint8_t *> fst = get_evec_data_range(dp.fst); + std::pair<uint8_t *,uint8_t *> 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<typename T,typename U> +std::pair<ptr_pair,ptr_pair> data<T,U>::get_ivec_data_range(ptr_pair &dp) { std::pair<uint8_t *,uint8_t *> fst = get_ivec_data_range(dp.fst); std::pair<uint8_t *,uint8_t *> snd = get_ivec_data_range(dp.snd); @@ -1010,16 +1029,19 @@ class cmp : public data<cmp,ptr_pair> { friend class data<cmp,ptr_pair>; private: - template<typename T> - void cmp_number(const data_pair<T> &nums) { - result = (nums.fst < nums.snd) ? -1 : (nums.fst == nums.snd) ? 0 : 1; - } + void walk_vec(bool align, bool is_pod, + const std::pair<ptr_pair,ptr_pair> &data_range); void walk_subcontext(bool align, cmp &sub) { sub.walk(align); result = sub.result; } + template<typename T> + void cmp_number(const data_pair<T> &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<uint32_t> &tag_variants); void walk_box(bool align); @@ -1069,9 +1098,8 @@ void cmp::cmp_number<int32_t>(const data_pair<int32_t> &nums) { } void -cmp::walk_ivec(bool align, bool is_pod, size_align &elem_sa) { - std::pair<ptr_pair,ptr_pair> data_range = get_ivec_data_range(dp); - +cmp::walk_vec(bool align, bool is_pod, + const std::pair<ptr_pair,ptr_pair> &data_range) { cmp sub(*this, data_range.first); ptr_pair data_end = data_range.second; while (!result && sub.dp < data_end) { |
