about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-09-02 01:15:03 -0400
committerDaniel Micay <danielmicay@gmail.com>2013-09-02 02:50:14 -0400
commitcc1f0027c73f2728fa20867a4dfdbdcfad77847f (patch)
tree4c96e668fbe4089b1b0b07226043e09308fde184 /src
parent7a52154d78ff85fe87647685885e9958a50cb42e (diff)
downloadrust-cc1f0027c73f2728fa20867a4dfdbdcfad77847f.tar.gz
rust-cc1f0027c73f2728fa20867a4dfdbdcfad77847f.zip
repr: add support for trait objects
Closes #8916
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/trans/reflect.rs12
-rw-r--r--src/libstd/reflect.rs4
-rw-r--r--src/libstd/repr.rs7
-rw-r--r--src/libstd/unstable/intrinsics.rs2
-rw-r--r--src/test/run-pass/reflect-visit-data.rs6
-rw-r--r--src/test/run-pass/reflect-visit-type.rs2
6 files changed, 20 insertions, 13 deletions
diff --git a/src/librustc/middle/trans/reflect.rs b/src/librustc/middle/trans/reflect.rs
index b6cb47efc76..e57b845567a 100644
--- a/src/librustc/middle/trans/reflect.rs
+++ b/src/librustc/middle/trans/reflect.rs
@@ -146,6 +146,7 @@ impl Reflector {
     // Entrypoint
     pub fn visit_ty(&mut self, t: ty::t) {
         let bcx = self.bcx;
+        let tcx = bcx.ccx().tcx;
         debug!("reflect::visit_ty %s", ty_to_str(bcx.ccx().tcx, t));
 
         match ty::get(t).sty {
@@ -248,8 +249,6 @@ impl Reflector {
           }
 
           ty::ty_struct(did, ref substs) => {
-              let bcx = self.bcx;
-              let tcx = bcx.ccx().tcx;
               let fields = ty::struct_fields(tcx, did, substs);
 
               let extra = ~[self.c_slice(ty_to_str(tcx, t).to_managed()),
@@ -270,7 +269,6 @@ impl Reflector {
           // let the visitor tell us if it wants to visit only a particular
           // variant?
           ty::ty_enum(did, ref substs) => {
-            let bcx = self.bcx;
             let ccx = bcx.ccx();
             let repr = adt::represent_type(bcx.ccx(), t);
             let variants = ty::substd_enum_variants(ccx.tcx, did, substs);
@@ -336,8 +334,12 @@ impl Reflector {
             }
           }
 
-          // Miscallaneous extra types
-          ty::ty_trait(_, _, _, _, _) => self.leaf("trait"),
+          ty::ty_trait(_, _, _, _, _) => {
+              let extra = [self.c_slice(ty_to_str(tcx, t).to_managed())];
+              self.visit("trait", extra);
+          }
+
+          // Miscellaneous extra types
           ty::ty_infer(_) => self.leaf("infer"),
           ty::ty_err => self.leaf("err"),
           ty::ty_param(ref p) => {
diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs
index 7b352e7806e..6bef4402bf1 100644
--- a/src/libstd/reflect.rs
+++ b/src/libstd/reflect.rs
@@ -450,9 +450,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 381cd449695..63a1416e48a 100644
--- a/src/libstd/repr.rs
+++ b/src/libstd/repr.rs
@@ -571,7 +571,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 }
@@ -661,6 +665,7 @@ fn test_repr() {
                "(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]");
diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs
index 8e0f6255e09..1726d144df1 100644
--- a/src/libstd/unstable/intrinsics.rs
+++ b/src/libstd/unstable/intrinsics.rs
@@ -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;
diff --git a/src/test/run-pass/reflect-visit-data.rs b/src/test/run-pass/reflect-visit-data.rs
index 317fdb634bc..e088cb1b45d 100644
--- a/src/test/run-pass/reflect-visit-data.rs
+++ b/src/test/run-pass/reflect-visit-data.rs
@@ -428,9 +428,9 @@ impl<V:TyVisitor + movable_ptr> TyVisitor for ptr_visit_adaptor<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
     }
@@ -616,7 +616,7 @@ impl TyVisitor for my_visitor {
                       _n_inputs: uint, _retstyle: uint) -> bool { true }
 
 
-    fn visit_trait(&mut self) -> bool { true }
+    fn visit_trait(&mut self, _name: &str) -> bool { true }
     fn visit_param(&mut self, _i: uint) -> bool { true }
     fn visit_self(&mut self) -> bool { true }
     fn visit_type(&mut self) -> bool { true }
diff --git a/src/test/run-pass/reflect-visit-type.rs b/src/test/run-pass/reflect-visit-type.rs
index 32df4376983..53aef472aaf 100644
--- a/src/test/run-pass/reflect-visit-type.rs
+++ b/src/test/run-pass/reflect-visit-type.rs
@@ -139,7 +139,7 @@ impl TyVisitor for MyVisitor {
                       _n_inputs: uint, _retstyle: uint) -> bool { true }
 
 
-    fn visit_trait(&mut self) -> bool { true }
+    fn visit_trait(&mut self, _name: &str) -> bool { true }
     fn visit_param(&mut self, _i: uint) -> bool { true }
     fn visit_self(&mut self) -> bool { true }
     fn visit_type(&mut self) -> bool { true }