diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-08-10 15:36:15 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-08-10 15:36:37 -0700 |
| commit | 15e1e3185d209a84d69400a12a473e50dedbd89f (patch) | |
| tree | 0157e41a3ecd565f194ff479cf6c42b89c717502 /src/rt/rust_shape.cpp | |
| parent | c7f1c36f2bdc83449c164b1fa4937071fb055e5b (diff) | |
| download | rust-15e1e3185d209a84d69400a12a473e50dedbd89f.tar.gz rust-15e1e3185d209a84d69400a12a473e50dedbd89f.zip | |
rt: Allow records and boxes to be logged
Diffstat (limited to 'src/rt/rust_shape.cpp')
| -rw-r--r-- | src/rt/rust_shape.cpp | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index 7ad88f4cc4b..89efe046229 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -156,6 +156,8 @@ public: ptr_pair(uint8_t *in_fst, uint8_t *in_snd) : fst(in_fst), snd(in_snd) {} + ptr_pair(data_pair<uint8_t *> &other) : fst(other.fst), snd(other.snd) {} + inline void operator=(uint8_t *rhs) { fst = snd = rhs; } inline ptr_pair operator+(size_t n) const { @@ -890,6 +892,7 @@ size_of::walk_ivec(bool align, bool is_pod, size_align &elem_sa) { template<typename T,typename U> class data : public ctxt< data<T,U> > { protected: + void walk_box_contents(bool align); void walk_variant(bool align, tag_info &tinfo, uint32_t variant); static std::pair<uint8_t *,uint8_t *> get_evec_data_range(ptr dp); @@ -955,6 +958,16 @@ public: template<typename T,typename U> void +data<T,U>::walk_box_contents(bool align) { + typename U::template data<uint8_t *>::t box_ptr = bump_dp<uint8_t *>(dp); + + U ref_count_dp(box_ptr); + T sub(*static_cast<T *>(this), ref_count_dp + sizeof(uint32_t)); + static_cast<T *>(this)->walk_box_contents(align, sub, ref_count_dp); +} + +template<typename T,typename U> +void data<T,U>::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id) { std::pair<const uint8_t *,const uint8_t *> variant_ptr_and_end = this->get_variant_sp(tinfo, variant_id); @@ -1079,6 +1092,12 @@ private: result = sub.result; } + inline void walk_box_contents(bool align, cmp &sub, + ptr_pair &ref_count_dp) { + sub.walk(true); + result = sub.result; + } + inline void cmp_two_pointers(bool align) { if (align) dp = align_to(dp, ALIGNOF(uint8_t *) * 2); data_pair<uint8_t *> fst = bump_dp<uint8_t *>(dp); @@ -1135,6 +1154,10 @@ public: walk_vec(align, is_pod, get_ivec_data_range(dp)); } + void walk_box(bool align) { + data<cmp,ptr_pair>::walk_box_contents(align); + } + void walk_fn(bool align) { return cmp_two_pointers(align); } void walk_obj(bool align) { return cmp_two_pointers(align); } void walk_port(bool align) { return cmp_pointer(align); } @@ -1143,7 +1166,6 @@ public: void walk_tag(bool align, tag_info &tinfo, const data_pair<uint32_t> &tag_variants); - void walk_box(bool align); void walk_struct(bool align, const uint8_t *end_sp); void walk_res(bool align, const rust_fn *dtor, uint16_t n_ty_params, const uint8_t *ty_params_sp); @@ -1189,16 +1211,6 @@ cmp::walk_tag(bool align, tag_info &tinfo, } void -cmp::walk_box(bool align) { - data_pair<uint8_t *> subdp = bump_dp<uint8_t *>(dp); - - cmp sub(*this, ptr_pair::make(subdp)); - sub.dp += sizeof(uint32_t); // Skip over the reference count. - sub.walk(true); - result = sub.result; -} - -void cmp::walk_struct(bool align, const uint8_t *end_sp) { while (!result && this->sp != end_sp) { this->walk(align); @@ -1266,8 +1278,18 @@ private: data<log,ptr>::walk_variant(align, tinfo, tag_variant); } + void walk_box(bool align) { + out << "@"; + data<log,ptr>::walk_box_contents(align); + } + void walk_subcontext(bool align, log &sub) { sub.walk(align); } + void walk_box_contents(bool align, log &sub, ptr &ref_count_dp) { + sub.walk(true); + } + + void walk_struct(bool align, const uint8_t *end_sp); void walk_vec(bool align, bool is_pod, const std::pair<ptr,ptr> &data); void walk_variant(bool align, tag_info &tinfo, uint32_t variant_id, const std::pair<const uint8_t *,const uint8_t *> @@ -1305,6 +1327,21 @@ log::walk_string(const std::pair<ptr,ptr> &data) { } void +log::walk_struct(bool align, const uint8_t *end_sp) { + out << "("; + + bool first = true; + while (sp != end_sp) { + if (!first) + out << ", "; + walk(align); + align = true, first = false; + } + + out << ")"; +} + +void log::walk_vec(bool align, bool is_pod, const std::pair<ptr,ptr> &data) { if (peek() == SHAPE_U8) { sp++; // It's a string. We handle this ourselves. |
