@@ -851,7 +851,9 @@ class data : public ctxt< data<T,U> > {
851
851
protected:
852
852
void walk_variant (bool align, tag_info &tinfo, uint32_t variant);
853
853
854
+ static std::pair<uint8_t *,uint8_t *> get_evec_data_range (uint8_t *dp);
854
855
static std::pair<uint8_t *,uint8_t *> get_ivec_data_range (uint8_t *dp);
856
+ static std::pair<ptr_pair,ptr_pair> get_evec_data_range (ptr_pair &dp);
855
857
static std::pair<ptr_pair,ptr_pair> get_ivec_data_range (ptr_pair &dp);
856
858
857
859
public:
@@ -920,6 +922,13 @@ data<T,U>::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id) {
920
922
variant_ptr_and_end);
921
923
}
922
924
925
+ template <typename T,typename U>
926
+ std::pair<uint8_t *,uint8_t *>
927
+ data<T,U>::get_evec_data_range(uint8_t *dp) {
928
+ rust_vec *vp = bump_dp<rust_vec *>(dp);
929
+ return std::make_pair (vp->data , vp->data + vp->fill );
930
+ }
931
+
923
932
template <typename T,typename U>
924
933
std::pair<uint8_t *,uint8_t *>
925
934
data<T,U>::get_ivec_data_range(uint8_t *dp) {
@@ -945,6 +954,16 @@ data<T,U>::get_ivec_data_range(uint8_t *dp) {
945
954
return std::make_pair (start, end);
946
955
}
947
956
957
+ template <typename T,typename U>
958
+ std::pair<ptr_pair,ptr_pair>
959
+ data<T,U>::get_evec_data_range(ptr_pair &dp) {
960
+ std::pair<uint8_t *,uint8_t *> fst = get_evec_data_range (dp.fst );
961
+ std::pair<uint8_t *,uint8_t *> snd = get_evec_data_range (dp.snd );
962
+ ptr_pair start (fst.first , snd.first );
963
+ ptr_pair end (fst.second , snd.second );
964
+ return std::make_pair (start, end);
965
+ }
966
+
948
967
template <typename T,typename U>
949
968
std::pair<ptr_pair,ptr_pair>
950
969
data<T,U>::get_ivec_data_range(ptr_pair &dp) {
@@ -1010,16 +1029,19 @@ class cmp : public data<cmp,ptr_pair> {
1010
1029
friend class data <cmp,ptr_pair>;
1011
1030
1012
1031
private:
1013
- template <typename T>
1014
- void cmp_number (const data_pair<T> &nums) {
1015
- result = (nums.fst < nums.snd ) ? -1 : (nums.fst == nums.snd ) ? 0 : 1 ;
1016
- }
1032
+ void walk_vec (bool align, bool is_pod,
1033
+ const std::pair<ptr_pair,ptr_pair> &data_range);
1017
1034
1018
1035
void walk_subcontext (bool align, cmp &sub) {
1019
1036
sub.walk (align);
1020
1037
result = sub.result ;
1021
1038
}
1022
1039
1040
+ template <typename T>
1041
+ void cmp_number (const data_pair<T> &nums) {
1042
+ result = (nums.fst < nums.snd ) ? -1 : (nums.fst == nums.snd ) ? 0 : 1 ;
1043
+ }
1044
+
1023
1045
public:
1024
1046
int result;
1025
1047
@@ -1048,7 +1070,14 @@ class cmp : public data<cmp,ptr_pair> {
1048
1070
in_dp),
1049
1071
result (0 ) {}
1050
1072
1051
- void walk_ivec (bool align, bool is_pod, size_align &elem_sa);
1073
+ void walk_evec (bool align, bool is_pod, uint16_t sp_size) {
1074
+ return walk_vec (align, is_pod, get_evec_data_range (dp));
1075
+ }
1076
+
1077
+ void walk_ivec (bool align, bool is_pod, size_align &elem_sa) {
1078
+ return walk_vec (align, is_pod, get_ivec_data_range (dp));
1079
+ }
1080
+
1052
1081
void walk_tag (bool align, tag_info &tinfo,
1053
1082
const data_pair<uint32_t > &tag_variants);
1054
1083
void walk_box (bool align);
@@ -1069,9 +1098,8 @@ void cmp::cmp_number<int32_t>(const data_pair<int32_t> &nums) {
1069
1098
}
1070
1099
1071
1100
void
1072
- cmp::walk_ivec (bool align, bool is_pod, size_align &elem_sa) {
1073
- std::pair<ptr_pair,ptr_pair> data_range = get_ivec_data_range (dp);
1074
-
1101
+ cmp::walk_vec (bool align, bool is_pod,
1102
+ const std::pair<ptr_pair,ptr_pair> &data_range) {
1075
1103
cmp sub (*this , data_range.first );
1076
1104
ptr_pair data_end = data_range.second ;
1077
1105
while (!result && sub.dp < data_end) {
0 commit comments