@@ -1031,11 +1031,25 @@ class cmp : public data<cmp,ptr_pair> {
1031
1031
void walk_vec (bool align, bool is_pod,
1032
1032
const std::pair<ptr_pair,ptr_pair> &data_range);
1033
1033
1034
- void walk_subcontext (bool align, cmp &sub) {
1034
+ inline void walk_subcontext (bool align, cmp &sub) {
1035
1035
sub.walk (align);
1036
1036
result = sub.result ;
1037
1037
}
1038
1038
1039
+ inline void cmp_two_pointers (bool align) {
1040
+ if (align) dp = align_to (dp, ALIGNOF (uint8_t *) * 2 );
1041
+ data_pair<uint8_t *> fst = bump_dp<uint8_t *>(dp);
1042
+ data_pair<uint8_t *> snd = bump_dp<uint8_t *>(dp);
1043
+ cmp_number (fst);
1044
+ if (!result)
1045
+ cmp_number (snd);
1046
+ }
1047
+
1048
+ inline void cmp_pointer (bool align) {
1049
+ if (align) dp = align_to (dp, ALIGNOF (uint8_t *));
1050
+ cmp_number (bump_dp<uint8_t *>(dp));
1051
+ }
1052
+
1039
1053
template <typename T>
1040
1054
void cmp_number (const data_pair<T> &nums) {
1041
1055
result = (nums.fst < nums.snd ) ? -1 : (nums.fst == nums.snd ) ? 0 : 1 ;
@@ -1078,6 +1092,12 @@ class cmp : public data<cmp,ptr_pair> {
1078
1092
return walk_vec (align, is_pod, get_ivec_data_range (dp));
1079
1093
}
1080
1094
1095
+ void walk_fn (bool align) { return cmp_two_pointers (align); }
1096
+ void walk_obj (bool align) { return cmp_two_pointers (align); }
1097
+ void walk_port (bool align) { return cmp_pointer (align); }
1098
+ void walk_chan (bool align) { return cmp_pointer (align); }
1099
+ void walk_task (bool align) { return cmp_pointer (align); }
1100
+
1081
1101
void walk_tag (bool align, tag_info &tinfo,
1082
1102
const data_pair<uint32_t > &tag_variants);
1083
1103
void walk_box (bool align);
0 commit comments