@@ -51,6 +51,7 @@ const uint8_t SHAPE_OBJ = 19u;
51
51
const uint8_t SHAPE_RES = 20u ;
52
52
const uint8_t SHAPE_VAR = 21u ;
53
53
const uint8_t SHAPE_UNIQ = 22u ;
54
+ const uint8_t SHAPE_IFACE = 24u ;
54
55
55
56
#ifdef _LP64
56
57
const uint8_t SHAPE_PTR = SHAPE_U64;
@@ -382,6 +383,7 @@ ctxt<T>::walk() {
382
383
case SHAPE_RES: walk_res (); break ;
383
384
case SHAPE_VAR: walk_var (); break ;
384
385
case SHAPE_UNIQ: walk_uniq (); break ;
386
+ case SHAPE_IFACE: WALK_SIMPLE (walk_iface); break ;
385
387
default : abort ();
386
388
}
387
389
}
@@ -566,6 +568,7 @@ class print : public ctxt<print> {
566
568
567
569
void walk_fn () { DPRINT (" fn" ); }
568
570
void walk_obj () { DPRINT (" obj" ); }
571
+ void walk_iface () { DPRINT (" iface" ); }
569
572
void walk_closure ();
570
573
571
574
template <typename T>
@@ -611,6 +614,7 @@ class size_of : public ctxt<size_of> {
611
614
void walk_box () { sa.set (sizeof (void *), sizeof (void *)); }
612
615
void walk_fn () { sa.set (sizeof (void *)*2 , sizeof (void *)); }
613
616
void walk_obj () { sa.set (sizeof (void *)*2 , sizeof (void *)); }
617
+ void walk_iface () { sa.set (sizeof (void *), sizeof (void *)); }
614
618
void walk_closure ();
615
619
616
620
void walk_vec (bool is_pod, uint16_t sp_size) {
@@ -819,6 +823,7 @@ class data : public ctxt< data<T,U> > {
819
823
void walk_uniq_contents ();
820
824
void walk_fn_contents (ptr &dp);
821
825
void walk_obj_contents (ptr &dp);
826
+ void walk_iface_value (ptr &dp);
822
827
void walk_variant (tag_info &tinfo, tag_variant_t variant);
823
828
824
829
static std::pair<uint8_t *,uint8_t *> get_vec_data_range (ptr dp);
@@ -863,6 +868,8 @@ class data : public ctxt< data<T,U> > {
863
868
dp = next_dp;
864
869
}
865
870
871
+ void walk_iface () { DATA_SIMPLE (void *, walk_iface ()); }
872
+
866
873
void walk_res (const rust_fn *dtor, unsigned n_params,
867
874
const type_param *params, const uint8_t *end_sp) {
868
875
typename U::template data<uintptr_t >::t live = bump_dp<uintptr_t >(dp);
@@ -989,6 +996,20 @@ data<T,U>::walk_obj_contents(ptr &dp) {
989
996
sub.walk ();
990
997
}
991
998
999
+ template <typename T,typename U>
1000
+ void
1001
+ data<T,U>::walk_iface_value(ptr &dp) {
1002
+ uint8_t *box_ptr = bump_dp<uint8_t *>(dp);
1003
+ if (!box_ptr) return ;
1004
+ uint8_t *body_ptr = box_ptr + sizeof (void *);
1005
+ type_desc *valtydesc =
1006
+ *reinterpret_cast <type_desc **>(body_ptr);
1007
+ ptr value_dp (body_ptr + sizeof (void *) * 2 );
1008
+ T sub (*static_cast <T *>(this ), valtydesc->shape + 2 , NULL , NULL ,
1009
+ value_dp);
1010
+ sub.align = true ;
1011
+ sub.walk ();
1012
+ }
992
1013
993
1014
// Polymorphic logging, for convenience
994
1015
@@ -1073,6 +1094,13 @@ class log : public data<log,ptr> {
1073
1094
data<log,ptr>::walk_obj_contents (dp);
1074
1095
}
1075
1096
1097
+ void walk_iface () {
1098
+ out << prefix << " iface(" ;
1099
+ prefix = " " ;
1100
+ data<log,ptr>::walk_iface_value (dp);
1101
+ out << prefix << " )" ;
1102
+ }
1103
+
1076
1104
void walk_subcontext (log &sub) { sub.walk (); }
1077
1105
1078
1106
void walk_box_contents (log &sub, ptr &ref_count_dp) {
0 commit comments