@@ -58,6 +58,7 @@ const uint8_t SHAPE_SEND_TYDESC = 29u;
58
58
const uint8_t SHAPE_RPTR = 31u ;
59
59
const uint8_t SHAPE_FIXEDVEC = 32u ;
60
60
const uint8_t SHAPE_SLICE = 33u ;
61
+ const uint8_t SHAPE_UNBOXED_VEC = 34u ;
61
62
62
63
#ifdef _LP64
63
64
const uint8_t SHAPE_PTR = SHAPE_U64;
@@ -263,9 +264,9 @@ class ctxt {
263
264
264
265
private:
265
266
void walk_vec0 ();
267
+ void walk_unboxed_vec0 ();
266
268
void walk_tag0 ();
267
269
void walk_box0 ();
268
- void walk_box_old0 ();
269
270
void walk_uniq0 ();
270
271
void walk_struct0 ();
271
272
void walk_res0 ();
@@ -318,6 +319,7 @@ ctxt<T>::walk() {
318
319
case SHAPE_RPTR: walk_rptr0 (); break ;
319
320
case SHAPE_FIXEDVEC: walk_fixedvec0 (); break ;
320
321
case SHAPE_SLICE: walk_slice0 (); break ;
322
+ case SHAPE_UNBOXED_VEC: walk_unboxed_vec0 (); break ;
321
323
default : abort ();
322
324
}
323
325
}
@@ -375,6 +377,19 @@ ctxt<T>::walk_vec0() {
375
377
sp = end_sp;
376
378
}
377
379
380
+ template <typename T>
381
+ void
382
+ ctxt<T>::walk_unboxed_vec0() {
383
+ bool is_pod = *sp++;
384
+
385
+ uint16_t sp_size = get_u16_bump (sp);
386
+ const uint8_t *end_sp = sp + sp_size;
387
+
388
+ static_cast <T *>(this )->walk_unboxed_vec1 (is_pod);
389
+
390
+ sp = end_sp;
391
+ }
392
+
378
393
template <typename T>
379
394
void
380
395
ctxt<T>::walk_tag0() {
@@ -516,6 +531,9 @@ class print : public ctxt<print> {
516
531
void walk_vec1 (bool is_pod) {
517
532
DPRINT (" vec<" ); walk (); DPRINT (" >" );
518
533
}
534
+ void walk_unboxed_vec1 (bool is_pod) {
535
+ DPRINT (" unboxed_vec<" ); walk (); DPRINT (" >" );
536
+ }
519
537
void walk_uniq1 () {
520
538
DPRINT (" ~<" ); walk (); DPRINT (" >" );
521
539
}
@@ -603,6 +621,11 @@ class size_of : public ctxt<size_of> {
603
621
sa.set (sizeof (void *), sizeof (void *));
604
622
}
605
623
624
+ void walk_unboxed_vec1 (bool is_pod) {
625
+ assert (false &&
626
+ " trying to compute size of dynamically sized unboxed vector" );
627
+ }
628
+
606
629
void walk_res1 (const rust_fn *dtor, const uint8_t *end_sp) {
607
630
abort (); // TODO
608
631
}
@@ -849,6 +872,12 @@ class data : public ctxt< data<T,U> > {
849
872
static std::pair<uint8_t *,uint8_t *> get_vec_data_range (ptr dp);
850
873
static std::pair<ptr_pair,ptr_pair> get_vec_data_range (ptr_pair &dp);
851
874
875
+ static std::pair<uint8_t *,uint8_t *> get_unboxed_vec_data_range (ptr dp);
876
+ static std::pair<ptr_pair,ptr_pair>
877
+ get_unboxed_vec_data_range (ptr_pair &dp);
878
+ static ptr get_unboxed_vec_end (ptr dp);
879
+ static ptr_pair get_unboxed_vec_end (ptr_pair &dp);
880
+
852
881
static std::pair<uint8_t *,uint8_t *> get_slice_data_range (bool is_str,
853
882
ptr dp);
854
883
static std::pair<ptr_pair,ptr_pair> get_slice_data_range (bool is_str,
@@ -880,6 +909,13 @@ class data : public ctxt< data<T,U> > {
880
909
DATA_SIMPLE (void *, walk_vec2 (is_pod));
881
910
}
882
911
912
+ void walk_unboxed_vec1 (bool is_pod) {
913
+ // align?
914
+ U next_dp = get_unboxed_vec_end (dp);
915
+ static_cast <T *>(this )->walk_unboxed_vec2 (is_pod);
916
+ dp = next_dp;
917
+ }
918
+
883
919
void walk_slice1 (bool is_pod, bool is_str) {
884
920
DATA_SIMPLE (void *, walk_slice2 (is_pod, is_str));
885
921
}
@@ -955,7 +991,7 @@ data<T,U>::walk_uniq_contents1() {
955
991
if (body_td) {
956
992
U body_dp (dp.box_body ());
957
993
arena arena;
958
- T sub (*static_cast <T *>(this ), body_td->shape ,
994
+ T sub (*static_cast <T *>(this ), /* body_td->shape, */ this -> sp ,
959
995
body_td->shape_tables , body_dp);
960
996
sub.align = true ;
961
997
static_cast <T *>(this )->walk_uniq_contents2 (sub);
@@ -1000,6 +1036,38 @@ data<T,U>::get_vec_data_range(ptr_pair &dp) {
1000
1036
return std::make_pair (start, end);
1001
1037
}
1002
1038
1039
+ template <typename T,typename U>
1040
+ std::pair<uint8_t *,uint8_t *>
1041
+ data<T,U>::get_unboxed_vec_data_range(ptr dp) {
1042
+ rust_vec* ptr = (rust_vec*)dp;
1043
+ uint8_t * data = &ptr->data [0 ];
1044
+ return std::make_pair (data, data + ptr->fill );
1045
+ }
1046
+
1047
+ template <typename T,typename U>
1048
+ std::pair<ptr_pair,ptr_pair>
1049
+ data<T,U>::get_unboxed_vec_data_range(ptr_pair &dp) {
1050
+ std::pair<uint8_t *,uint8_t *> fst =
1051
+ get_unboxed_vec_data_range (shape::ptr (dp.fst ));
1052
+ std::pair<uint8_t *,uint8_t *> snd =
1053
+ get_unboxed_vec_data_range (shape::ptr (dp.snd ));
1054
+ ptr_pair start (fst.first , snd.first );
1055
+ ptr_pair end (fst.second , snd.second );
1056
+ return std::make_pair (start, end);
1057
+ }
1058
+
1059
+ template <typename T,typename U>
1060
+ ptr data<T,U>::get_unboxed_vec_end(ptr dp) {
1061
+ rust_vec* ptr = (rust_vec*)dp;
1062
+ return dp + sizeof (rust_vec) + ptr->fill ;
1063
+ }
1064
+
1065
+ template <typename T,typename U>
1066
+ ptr_pair data<T,U>::get_unboxed_vec_end(ptr_pair &dp) {
1067
+ return ptr_pair (get_unboxed_vec_end (ptr (dp.fst )),
1068
+ get_unboxed_vec_end (ptr (dp.snd )));
1069
+ }
1070
+
1003
1071
template <typename T,typename U>
1004
1072
std::pair<uint8_t *,uint8_t *>
1005
1073
data<T,U>::get_slice_data_range(bool is_str, ptr dp) {
@@ -1135,6 +1203,10 @@ class log : public data<log,ptr> {
1135
1203
walk_vec2 (is_pod, get_vec_data_range (dp));
1136
1204
}
1137
1205
1206
+ void walk_unboxed_vec2 (bool is_pod) {
1207
+ walk_vec2 (is_pod, get_unboxed_vec_data_range (dp));
1208
+ }
1209
+
1138
1210
void walk_slice2 (bool is_pod, bool is_str) {
1139
1211
walk_vec2 (is_pod, get_slice_data_range (is_str, dp));
1140
1212
out << " /&" ;
0 commit comments