From 6affa3264b6e1bb6dec39b0393c9b0f4df9df7b4 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 10 Aug 2011 14:54:29 -0700 Subject: rt: Allow tags to be logged --- src/rt/rust_shape.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'src/rt/rust_shape.cpp') diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index eb52dfbc618..7ad88f4cc4b 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -1239,8 +1239,12 @@ private: log(log &other, const uint8_t *in_sp, const type_param *in_params, - const rust_shape_tables *in_tables) - : data(other.task, in_sp, in_params, in_tables, other.dp), + const rust_shape_tables *in_tables = NULL) + : data(other.task, + in_sp, + in_params, + in_tables ? in_tables : other.tables, + other.dp), out(other.out) {} log(log &other, ptr in_dp) @@ -1259,12 +1263,15 @@ private: void walk_tag(bool align, tag_info &tinfo, uint32_t tag_variant) { out << "tag" << tag_variant; - // TODO: Print insides. + data::walk_variant(align, tinfo, tag_variant); } void walk_subcontext(bool align, log &sub) { sub.walk(align); } void walk_vec(bool align, bool is_pod, const std::pair &data); + void walk_variant(bool align, tag_info &tinfo, uint32_t variant_id, + const std::pair + variant_ptr_and_end); template void walk_number() { out << get_dp(dp); } @@ -1323,6 +1330,27 @@ log::walk_vec(bool align, bool is_pod, const std::pair &data) { out << "]"; } +void +log::walk_variant(bool align, tag_info &tinfo, uint32_t variant_id, + const std::pair + variant_ptr_and_end) { + log sub(*this, variant_ptr_and_end.first, tinfo.params); + const uint8_t *variant_end = variant_ptr_and_end.second; + + bool first = true; + while (sub.sp < variant_end) { + out << (first ? "(" : ", "); + + sub.walk(align); + + align = true; + first = false; + } + + if (!first) + out << ")"; +} + } // end namespace shape extern "C" void -- cgit 1.4.1-3-g733a5