@@ -77,12 +77,17 @@ align_to(T size, size_t alignment) {
77
77
78
78
template <typename T>
79
79
static inline T
80
- bump_dp (uint8_t *dp) {
80
+ bump_dp (uint8_t *& dp) {
81
81
T x = *((T *)dp);
82
82
dp += sizeof (T);
83
83
return x;
84
84
}
85
85
86
+ template <typename T>
87
+ static inline T
88
+ get_dp (uint8_t *dp) {
89
+ return *((T *)dp);
90
+ }
86
91
87
92
// Utility classes
88
93
@@ -145,6 +150,11 @@ class data_pair {
145
150
data_pair (T &in_fst, T &in_snd) : fst(in_fst), snd(in_snd) {}
146
151
147
152
inline void operator =(const T rhs) { fst = snd = rhs; }
153
+
154
+ static data_pair<T> make (T &fst, T &snd) {
155
+ data_pair<T> data (fst, snd);
156
+ return data;
157
+ }
148
158
};
149
159
150
160
class ptr_pair {
@@ -201,6 +211,14 @@ bump_dp(ptr_pair &ptr) {
201
211
return data;
202
212
}
203
213
214
+ template <typename T>
215
+ inline data_pair<T>
216
+ get_dp (ptr_pair &ptr) {
217
+ data_pair<T> data (*reinterpret_cast <T *>(ptr.fst ),
218
+ *reinterpret_cast <T *>(ptr.snd ));
219
+ return data;
220
+ }
221
+
204
222
205
223
// Contexts
206
224
@@ -231,6 +249,7 @@ class ctxt {
231
249
task(other.task) {}
232
250
233
251
void walk (bool align);
252
+ void walk_reset (bool align);
234
253
235
254
std::pair<const uint8_t *,const uint8_t *>
236
255
get_variant_sp (tag_info &info, uint32_t variant_id);
@@ -347,6 +366,8 @@ struct type_param {
347
366
template<typename T>
348
367
void
349
368
ctxt<T>::walk(bool align) {
369
+ fprintf (stderr, " walking %d\n " , *sp);
370
+
350
371
switch (*sp++) {
351
372
case SHAPE_U8: WALK_NUMBER (uint8_t ); break ;
352
373
case SHAPE_U16: WALK_NUMBER (uint16_t ); break ;
@@ -374,6 +395,14 @@ ctxt<T>::walk(bool align) {
374
395
}
375
396
}
376
397
398
+ template <typename T>
399
+ void
400
+ ctxt<T>::walk_reset(bool align) {
401
+ const uint8_t *old_sp = sp;
402
+ walk (align);
403
+ sp = old_sp;
404
+ }
405
+
377
406
template <typename T>
378
407
uint16_t
379
408
ctxt<T>::get_u16(const uint8_t *addr) {
@@ -816,8 +845,9 @@ size_of::walk_ivec(bool align, bool is_pod, size_align &elem_sa) {
816
845
817
846
#define DATA_SIMPLE (ty, call ) \
818
847
if (align) dp = align_to(dp, sizeof (ty)); \
848
+ U end_dp = dp + sizeof (ty); \
819
849
static_cast <T *>(this )->call; \
820
- dp += sizeof (ty) ;
850
+ dp = end_dp ;
821
851
822
852
template <typename T,typename U>
823
853
class data : public ctxt < data<T,U> > {
@@ -894,6 +924,7 @@ std::pair<uint8_t *,uint8_t *>
894
924
data<T,U>::get_ivec_data_range(uint8_t *dp) {
895
925
size_t fill = bump_dp<size_t >(dp);
896
926
bump_dp<size_t >(dp); // Skip over alloc.
927
+ uint8_t *payload_dp = dp;
897
928
rust_ivec_payload payload = bump_dp<rust_ivec_payload>(dp);
898
929
899
930
uint8_t *start, *end;
@@ -906,7 +937,7 @@ data<T,U>::get_ivec_data_range(uint8_t *dp) {
906
937
end = start + fill;
907
938
}
908
939
} else { // On stack.
909
- start = payload. data ;
940
+ start = payload_dp ;
910
941
end = start + fill;
911
942
}
912
943
@@ -916,6 +947,7 @@ data<T,U>::get_ivec_data_range(uint8_t *dp) {
916
947
template <typename T,typename U>
917
948
std::pair<ptr_pair,ptr_pair>
918
949
data<T,U>::get_ivec_data_range(ptr_pair &dp) {
950
+ fprintf (stderr, " get_ivec_data_range %p/%p\n " , dp.fst , dp.snd );
919
951
std::pair<uint8_t *,uint8_t *> fst = get_ivec_data_range (dp.fst );
920
952
std::pair<uint8_t *,uint8_t *> snd = get_ivec_data_range (dp.snd );
921
953
ptr_pair start (fst.first , snd.first );
@@ -1021,19 +1053,43 @@ class cmp : public data<cmp,ptr_pair> {
1021
1053
variant_ptr_and_end);
1022
1054
1023
1055
template <typename T>
1024
- void walk_number () { cmp_number (bump_dp <T>(dp)); }
1056
+ void walk_number () { cmp_number (get_dp <T>(dp)); }
1025
1057
};
1026
1058
1059
+ template <>
1060
+ void cmp::cmp_number<int32_t >(const data_pair<int32_t > &nums) {
1061
+ fprintf (stderr, " cmp %d/%d\n " , nums.fst , nums.snd );
1062
+ result = (nums.fst < nums.snd ) ? -1 : (nums.fst == nums.snd ) ? 0 : 1 ;
1063
+ }
1064
+
1027
1065
void
1028
1066
cmp::walk_ivec (bool align, bool is_pod, size_align &elem_sa) {
1029
1067
std::pair<ptr_pair,ptr_pair> data_range = get_ivec_data_range (dp);
1030
1068
1069
+ DPRINT (" walk_ivec %p/%p\n " , data_range.first .fst , data_range.first .snd );
1070
+
1031
1071
cmp sub (*this , data_range.first );
1032
1072
ptr_pair data_end = data_range.second ;
1033
1073
while (!result && sub.dp < data_end) {
1034
- sub.walk (align);
1074
+ DPRINT (" walk_ivec elem %p/%p %p/%p\n " , sub.dp .fst , sub.dp .snd ,
1075
+ data_end.fst , data_end.snd );
1076
+ DPRINTCX (&sub);
1077
+ DPRINT (" \n end\n " );
1078
+
1079
+ sub.walk_reset (align);
1080
+ DPRINT (" result = %d\n " , sub.result );
1035
1081
result = sub.result ;
1036
1082
align = true ;
1083
+
1084
+ DPRINT (" walk_ivec after elem %p/%p %p/%p\n " , sub.dp .fst , sub.dp .snd ,
1085
+ data_end.fst , data_end.snd );
1086
+ }
1087
+
1088
+ if (!result) {
1089
+ // If we hit the end, the result comes down to length comparison.
1090
+ int len_fst = data_range.second .fst - data_range.first .fst ;
1091
+ int len_snd = data_range.second .snd - data_range.first .snd ;
1092
+ cmp_number (data_pair<int >::make (len_fst, len_snd));
1037
1093
}
1038
1094
}
1039
1095
@@ -1090,6 +1146,8 @@ extern "C" void
1090
1146
upcall_cmp_type (int8_t *result, rust_task *task, type_desc *tydesc,
1091
1147
const type_desc **subtydescs, uint8_t *data_0,
1092
1148
uint8_t *data_1, uint8_t cmp_type) {
1149
+ fprintf (stderr, " cmp_type\n " );
1150
+
1093
1151
shape::arena arena;
1094
1152
shape::type_param *params = shape::type_param::make (tydesc, arena);
1095
1153
shape::cmp cmp (task, tydesc->shape , params, tydesc->shape_tables , data_0,
0 commit comments