@@ -46,6 +46,7 @@ const uint8_t SHAPE_FN = 18u;
46
46
const uint8_t SHAPE_OBJ = 19u ;
47
47
const uint8_t SHAPE_RES = 20u ;
48
48
const uint8_t SHAPE_VAR = 21u ;
49
+ const uint8_t SHAPE_UNIQ = 22u ;
49
50
50
51
#ifdef _LP64
51
52
const uint8_t SHAPE_PTR = SHAPE_U64;
@@ -244,6 +245,7 @@ class ctxt {
244
245
void walk_vec ();
245
246
void walk_tag ();
246
247
void walk_box ();
248
+ void walk_uniq ();
247
249
void walk_struct ();
248
250
void walk_res ();
249
251
void walk_var ();
@@ -346,6 +348,7 @@ ctxt<T>::walk() {
346
348
case SHAPE_OBJ: WALK_SIMPLE (walk_obj); break ;
347
349
case SHAPE_RES: walk_res (); break ;
348
350
case SHAPE_VAR: walk_var (); break ;
351
+ case SHAPE_UNIQ: walk_uniq (); break ;
349
352
default : abort ();
350
353
}
351
354
}
@@ -441,6 +444,17 @@ ctxt<T>::walk_box() {
441
444
sp = end_sp;
442
445
}
443
446
447
+ template <typename T>
448
+ void
449
+ ctxt<T>::walk_uniq() {
450
+ uint16_t sp_size = get_u16_bump (sp);
451
+ const uint8_t *end_sp = sp + sp_size;
452
+
453
+ static_cast <T *>(this )->walk_uniq ();
454
+
455
+ sp = end_sp;
456
+ }
457
+
444
458
template <typename T>
445
459
void
446
460
ctxt<T>::walk_struct() {
@@ -760,6 +774,7 @@ class data : public ctxt< data<T,U> > {
760
774
U end_dp;
761
775
762
776
void walk_box_contents ();
777
+ void walk_uniq_contents ();
763
778
void walk_fn_contents (ptr &dp);
764
779
void walk_obj_contents (ptr &dp);
765
780
void walk_variant (tag_info &tinfo, uint32_t variant);
@@ -790,6 +805,8 @@ class data : public ctxt< data<T,U> > {
790
805
791
806
void walk_box () { DATA_SIMPLE (void *, walk_box ()); }
792
807
808
+ void walk_uniq () { DATA_SIMPLE (void *, walk_uniq ()); }
809
+
793
810
void walk_fn () {
794
811
ALIGN_TO (alignof<void *>());
795
812
U next_dp = dp + sizeof (void *) * 2 ;
@@ -834,6 +851,15 @@ data<T,U>::walk_box_contents() {
834
851
static_cast <T *>(this )->walk_box_contents (sub, ref_count_dp);
835
852
}
836
853
854
+ template <typename T,typename U>
855
+ void
856
+ data<T,U>::walk_uniq_contents() {
857
+ typename U::template data<uint8_t *>::t box_ptr = bump_dp<uint8_t *>(dp);
858
+ U data_ptr (box_ptr);
859
+ T sub (*static_cast <T *>(this ), data_ptr);
860
+ static_cast <T *>(this )->walk_uniq_contents (sub);
861
+ }
862
+
837
863
template <typename T,typename U>
838
864
void
839
865
data<T,U>::walk_variant(tag_info &tinfo, uint32_t variant_id) {
@@ -993,6 +1019,12 @@ class log : public data<log,ptr> {
993
1019
data<log ,ptr>::walk_box_contents ();
994
1020
}
995
1021
1022
+ void walk_uniq () {
1023
+ out << prefix << " ~" ;
1024
+ prefix = " " ;
1025
+ data<log ,ptr>::walk_uniq_contents ();
1026
+ }
1027
+
996
1028
void walk_fn () {
997
1029
out << prefix << " fn" ;
998
1030
prefix = " " ;
@@ -1017,6 +1049,12 @@ class log : public data<log,ptr> {
1017
1049
}
1018
1050
}
1019
1051
1052
+ void walk_uniq_contents (log &sub) {
1053
+ out << prefix;
1054
+ sub.align = true ;
1055
+ sub.walk ();
1056
+ }
1057
+
1020
1058
void walk_struct (const uint8_t *end_sp);
1021
1059
void walk_vec (bool is_pod, const std::pair<ptr,ptr> &data);
1022
1060
void walk_variant (tag_info &tinfo, uint32_t variant_id,
0 commit comments