diff options
| author | bors <bors@rust-lang.org> | 2013-09-02 02:05:45 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-09-02 02:05:45 -0700 |
| commit | 7ff102a685de250eeecc77eb8a6d82cd25c1d8a5 (patch) | |
| tree | 405d5a8e5fc03aed0c7979debf4cb9c4d75b30a3 /src/libstd | |
| parent | 6a3dd30afe64f2d9f10a68ebc178ce22d8c90075 (diff) | |
| parent | 67a8ea521a81bbc7e2cab893d778eaaa8d34bb6c (diff) | |
| download | rust-7ff102a685de250eeecc77eb8a6d82cd25c1d8a5.tar.gz rust-7ff102a685de250eeecc77eb8a6d82cd25c1d8a5.zip | |
auto merge of #8927 : thestinger/rust/repr, r=huonw
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/reflect.rs | 19 | ||||
| -rw-r--r-- | src/libstd/repr.rs | 48 | ||||
| -rw-r--r-- | src/libstd/unstable/intrinsics.rs | 8 |
3 files changed, 52 insertions, 23 deletions
diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs index 7b352e7806e..91e3719e3d0 100644 --- a/src/libstd/reflect.rs +++ b/src/libstd/reflect.rs @@ -331,25 +331,28 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { true } - fn visit_enter_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint) -> bool { + fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint, + align: uint) -> bool { self.align(align); - if ! self.inner.visit_enter_class(name, n_fields, sz, align) { + if ! self.inner.visit_enter_class(name, named_fields, n_fields, sz, align) { return false; } true } - fn visit_class_field(&mut self, i: uint, name: &str, mtbl: uint, inner: *TyDesc) -> bool { + fn visit_class_field(&mut self, i: uint, name: &str, named: bool, mtbl: uint, + inner: *TyDesc) -> bool { unsafe { self.align((*inner).align); } - if ! self.inner.visit_class_field(i, name, mtbl, inner) { + if ! self.inner.visit_class_field(i, name, named, mtbl, inner) { return false; } unsafe { self.bump((*inner).size); } true } - fn visit_leave_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint) -> bool { - if ! self.inner.visit_leave_class(name, n_fields, sz, align) { + fn visit_leave_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint, + align: uint) -> bool { + if ! self.inner.visit_leave_class(name, named_fields, n_fields, sz, align) { return false; } true @@ -450,9 +453,9 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { true } - fn visit_trait(&mut self) -> bool { + fn visit_trait(&mut self, name: &str) -> bool { self.align_to::<@TyVisitor>(); - if ! self.inner.visit_trait() { return false; } + if ! self.inner.visit_trait(name) { return false; } self.bump_past::<@TyVisitor>(); true } diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index 003dda294da..31f5b6f5208 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -413,31 +413,40 @@ impl<'self> TyVisitor for ReprVisitor<'self> { true } - fn visit_enter_class(&mut self, name: &str, n_fields: uint, + fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint, _sz: uint, _align: uint) -> bool { self.writer.write(name.as_bytes()); if n_fields != 0 { - self.writer.write(['{' as u8]); + if named_fields { + self.writer.write(['{' as u8]); + } else { + self.writer.write(['(' as u8]); + } } true } - fn visit_class_field(&mut self, i: uint, name: &str, - mtbl: uint, inner: *TyDesc) -> bool { + fn visit_class_field(&mut self, i: uint, name: &str, named: bool, + _mtbl: uint, inner: *TyDesc) -> bool { if i != 0 { self.writer.write(", ".as_bytes()); } - self.write_mut_qualifier(mtbl); - self.writer.write(name.as_bytes()); - self.writer.write(": ".as_bytes()); + if named { + self.writer.write(name.as_bytes()); + self.writer.write(": ".as_bytes()); + } self.visit_inner(inner); true } - fn visit_leave_class(&mut self, _name: &str, n_fields: uint, + fn visit_leave_class(&mut self, _name: &str, named_fields: bool, n_fields: uint, _sz: uint, _align: uint) -> bool { if n_fields != 0 { - self.writer.write(['}' as u8]); + if named_fields { + self.writer.write(['}' as u8]); + } else { + self.writer.write([')' as u8]); + } } true } @@ -552,13 +561,19 @@ impl<'self> TyVisitor for ReprVisitor<'self> { } fn visit_enter_fn(&mut self, _purity: uint, _proto: uint, - _n_inputs: uint, _retstyle: uint) -> bool { true } + _n_inputs: uint, _retstyle: uint) -> bool { + self.writer.write("fn(".as_bytes()); + true + } fn visit_fn_input(&mut self, _i: uint, _mode: uint, _inner: *TyDesc) -> bool { + // FIXME: #8917: should print out the parameter types here, separated by commas true } fn visit_fn_output(&mut self, _retstyle: uint, _inner: *TyDesc) -> bool { + self.writer.write(")".as_bytes()); + // FIXME: #8917: should print out the output type here, as `-> T` true } @@ -566,7 +581,11 @@ impl<'self> TyVisitor for ReprVisitor<'self> { _n_inputs: uint, _retstyle: uint) -> bool { true } - fn visit_trait(&mut self) -> bool { true } + fn visit_trait(&mut self, name: &str) -> bool { + self.writer.write(name.as_bytes()); + true + } + fn visit_param(&mut self, _i: uint) -> bool { true } fn visit_self(&mut self) -> bool { true } fn visit_type(&mut self) -> bool { true } @@ -597,6 +616,7 @@ struct P {a: int, b: float} #[test] fn test_repr() { + use prelude::*; use str; use str::Str; use rt::io::Decorator; @@ -654,6 +674,12 @@ fn test_repr() { exact_test(&(10u64, ~"hello"), "(10u64, ~\"hello\")"); + exact_test(&(&println), "&fn()"); + exact_test(&(~5 as ~ToStr), "~to_str::ToStr:Send"); + struct Foo; exact_test(&(~[Foo, Foo]), "~[repr::test_repr::Foo, repr::test_repr::Foo]"); + + struct Bar(int, int); + exact_test(&(Bar(2, 2)), "repr::test_repr::Bar(2, 2)"); } diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 8e0f6255e09..fbd5bdaf587 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -220,11 +220,11 @@ pub trait TyVisitor { fn visit_leave_rec(&mut self, n_fields: uint, sz: uint, align: uint) -> bool; - fn visit_enter_class(&mut self, name: &str, n_fields: uint, + fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint, align: uint) -> bool; - fn visit_class_field(&mut self, i: uint, name: &str, + fn visit_class_field(&mut self, i: uint, name: &str, named: bool, mtbl: uint, inner: *TyDesc) -> bool; - fn visit_leave_class(&mut self, name: &str, n_fields: uint, + fn visit_leave_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint, align: uint) -> bool; fn visit_enter_tup(&mut self, n_fields: uint, @@ -256,7 +256,7 @@ pub trait TyVisitor { fn visit_leave_fn(&mut self, purity: uint, proto: uint, n_inputs: uint, retstyle: uint) -> bool; - fn visit_trait(&mut self) -> bool; + fn visit_trait(&mut self, name: &str) -> bool; fn visit_param(&mut self, i: uint) -> bool; fn visit_self(&mut self) -> bool; fn visit_type(&mut self) -> bool; |
