diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp index 7f242143d516..c6ee35717dc9 100644 --- a/src/rt/rust_shape.cpp +++ b/src/rt/rust_shape.cpp @@ -279,6 +279,12 @@ private: result = sub.result; } + inline void walk_uniq_contents(cmp &sub) { + sub.align = true; + sub.walk(); + result = sub.result; + } + inline void cmp_two_pointers() { ALIGN_TO(alignof() * 2); data_pair fst = bump_dp(dp); @@ -341,6 +347,10 @@ public: data::walk_box_contents(); } + void walk_uniq() { + data::walk_uniq_contents(); + } + void walk_fn() { return cmp_two_pointers(); } void walk_obj() { return cmp_two_pointers(); } diff --git a/src/rt/rust_shape.h b/src/rt/rust_shape.h index 9a8e22e8a4fa..1f1490a36c8a 100644 --- a/src/rt/rust_shape.h +++ b/src/rt/rust_shape.h @@ -46,6 +46,7 @@ const uint8_t SHAPE_FN = 18u; const uint8_t SHAPE_OBJ = 19u; const uint8_t SHAPE_RES = 20u; const uint8_t SHAPE_VAR = 21u; +const uint8_t SHAPE_UNIQ = 22u; #ifdef _LP64 const uint8_t SHAPE_PTR = SHAPE_U64; @@ -244,6 +245,7 @@ private: void walk_vec(); void walk_tag(); void walk_box(); + void walk_uniq(); void walk_struct(); void walk_res(); void walk_var(); @@ -346,6 +348,7 @@ ctxt::walk() { case SHAPE_OBJ: WALK_SIMPLE(walk_obj); break; case SHAPE_RES: walk_res(); break; case SHAPE_VAR: walk_var(); break; + case SHAPE_UNIQ: walk_uniq(); break; default: abort(); } } @@ -441,6 +444,17 @@ ctxt::walk_box() { sp = end_sp; } +template +void +ctxt::walk_uniq() { + uint16_t sp_size = get_u16_bump(sp); + const uint8_t *end_sp = sp + sp_size; + + static_cast(this)->walk_uniq(); + + sp = end_sp; +} + template void ctxt::walk_struct() { @@ -760,6 +774,7 @@ protected: U end_dp; void walk_box_contents(); + void walk_uniq_contents(); void walk_fn_contents(ptr &dp); void walk_obj_contents(ptr &dp); void walk_variant(tag_info &tinfo, uint32_t variant); @@ -790,6 +805,8 @@ public: void walk_box() { DATA_SIMPLE(void *, walk_box()); } + void walk_uniq() { DATA_SIMPLE(void *, walk_uniq()); } + void walk_fn() { ALIGN_TO(alignof()); U next_dp = dp + sizeof(void *) * 2; @@ -834,6 +851,15 @@ data::walk_box_contents() { static_cast(this)->walk_box_contents(sub, ref_count_dp); } +template +void +data::walk_uniq_contents() { + typename U::template data::t box_ptr = bump_dp(dp); + U data_ptr(box_ptr); + T sub(*static_cast(this), data_ptr); + static_cast(this)->walk_uniq_contents(sub); +} + template void data::walk_variant(tag_info &tinfo, uint32_t variant_id) { @@ -993,6 +1019,12 @@ private: data::walk_box_contents(); } + void walk_uniq() { + out << prefix << "~"; + prefix = ""; + data::walk_uniq_contents(); + } + void walk_fn() { out << prefix << "fn"; prefix = ""; @@ -1017,6 +1049,12 @@ private: } } + void walk_uniq_contents(log &sub) { + out << prefix; + sub.align = true; + sub.walk(); + } + void walk_struct(const uint8_t *end_sp); void walk_vec(bool is_pod, const std::pair &data); void walk_variant(tag_info &tinfo, uint32_t variant_id, diff --git a/src/test/run-pass/unique-cmp.rs b/src/test/run-pass/unique-cmp.rs new file mode 100644 index 000000000000..2e5c37949c28 --- /dev/null +++ b/src/test/run-pass/unique-cmp.rs @@ -0,0 +1,8 @@ +fn main() { + let i = ~100; + assert i == ~100; + assert i < ~101; + assert i <= ~100; + assert i > ~99; + assert i >= ~99; +} \ No newline at end of file diff --git a/src/test/run-pass/unique-log.rs b/src/test/run-pass/unique-log.rs new file mode 100644 index 000000000000..91ce7e504d91 --- /dev/null +++ b/src/test/run-pass/unique-log.rs @@ -0,0 +1,4 @@ +fn main() { + let i = ~100; + log_err i; +} \ No newline at end of file