about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-08-27 14:35:49 -0700
committerbors <bors@rust-lang.org>2013-08-27 14:35:49 -0700
commit7f32ea8820727f4f4944423133e6b32e2653a1d2 (patch)
tree96ee20983cc3cf4c3ecad104554e4c65db8f9292 /src/libstd
parent3ab0561b00d2993706d11bfbbce4a357110195dd (diff)
parent803f941867d1d68710f211535de69bb30f79f917 (diff)
downloadrust-7f32ea8820727f4f4944423133e6b32e2653a1d2.tar.gz
rust-7f32ea8820727f4f4944423133e6b32e2653a1d2.zip
auto merge of #8771 : thestinger/rust/repr, r=catamorphism
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/reflect.rs15
-rw-r--r--src/libstd/repr.rs85
-rw-r--r--src/libstd/unstable/intrinsics.rs3
-rw-r--r--src/libstd/vec.rs11
4 files changed, 64 insertions, 50 deletions
diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs
index 1d093c4c14b..56e0f83e05c 100644
--- a/src/libstd/reflect.rs
+++ b/src/libstd/reflect.rs
@@ -460,16 +460,6 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
         true
     }
 
-    fn visit_var(&self) -> bool {
-        if ! self.inner.visit_var() { return false; }
-        true
-    }
-
-    fn visit_var_integral(&self) -> bool {
-        if ! self.inner.visit_var_integral() { return false; }
-        true
-    }
-
     fn visit_param(&self, i: uint) -> bool {
         if ! self.inner.visit_param(i) { return false; }
         true
@@ -494,11 +484,6 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
         true
     }
 
-    fn visit_constr(&self, inner: *TyDesc) -> bool {
-        if ! self.inner.visit_constr(inner) { return false; }
-        true
-    }
-
     fn visit_closure_ptr(&self, ck: uint) -> bool {
         self.align_to::<@fn()>();
         if ! self.inner.visit_closure_ptr(ck) { return false; }
diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs
index 0218a0e7f3a..ad4658d2f42 100644
--- a/src/libstd/repr.rs
+++ b/src/libstd/repr.rs
@@ -75,35 +75,50 @@ impl Repr for bool {
     }
 }
 
-macro_rules! int_repr(($ty:ident) => (impl Repr for $ty {
+impl Repr for int {
+    fn write_repr(&self, writer: @Writer) {
+        do ::int::to_str_bytes(*self, 10u) |bits| {
+            writer.write(bits);
+        }
+    }
+}
+
+macro_rules! int_repr(($ty:ident, $suffix:expr) => (impl Repr for $ty {
     fn write_repr(&self, writer: @Writer) {
         do ::$ty::to_str_bytes(*self, 10u) |bits| {
             writer.write(bits);
+            writer.write(bytes!($suffix));
         }
     }
 }))
 
-int_repr!(int)
-int_repr!(i8)
-int_repr!(i16)
-int_repr!(i32)
-int_repr!(i64)
-int_repr!(uint)
-int_repr!(u8)
-int_repr!(u16)
-int_repr!(u32)
-int_repr!(u64)
-
-macro_rules! num_repr(($ty:ident) => (impl Repr for $ty {
+int_repr!(i8, "i8")
+int_repr!(i16, "i16")
+int_repr!(i32, "i32")
+int_repr!(i64, "i64")
+int_repr!(uint, "u")
+int_repr!(u8, "u8")
+int_repr!(u16, "u16")
+int_repr!(u32, "u32")
+int_repr!(u64, "u64")
+
+impl Repr for float {
+    fn write_repr(&self, writer: @Writer) {
+        let s = self.to_str();
+        writer.write(s.as_bytes());
+    }
+}
+
+macro_rules! num_repr(($ty:ident, $suffix:expr) => (impl Repr for $ty {
     fn write_repr(&self, writer: @Writer) {
         let s = self.to_str();
         writer.write(s.as_bytes());
+        writer.write(bytes!($suffix));
     }
 }))
 
-num_repr!(float)
-num_repr!(f32)
-num_repr!(f64)
+num_repr!(f32, "f32")
+num_repr!(f64, "f64")
 
 // New implementation using reflect::MovePtr
 
@@ -267,12 +282,14 @@ impl TyVisitor for ReprVisitor {
             self.write_escaped_slice(*s);
         }
     }
+
     fn visit_estr_uniq(&self) -> bool {
         do self.get::<~str> |s| {
             self.writer.write_char('~');
             self.write_escaped_slice(*s);
         }
     }
+
     fn visit_estr_slice(&self) -> bool {
         do self.get::<&str> |s| {
             self.write_escaped_slice(*s);
@@ -307,6 +324,7 @@ impl TyVisitor for ReprVisitor {
         }
     }
 
+    #[cfg(stage0)]
     fn visit_ptr(&self, _mtbl: uint, _inner: *TyDesc) -> bool {
         do self.get::<*c_void> |p| {
             self.writer.write_str(fmt!("(0x%x as *())",
@@ -314,6 +332,15 @@ impl TyVisitor for ReprVisitor {
         }
     }
 
+    #[cfg(not(stage0))]
+    fn visit_ptr(&self, mtbl: uint, _inner: *TyDesc) -> bool {
+        do self.get::<*c_void> |p| {
+            self.writer.write_str(fmt!("(0x%x as *", *p as uint));
+            self.write_mut_qualifier(mtbl);
+            self.writer.write_str("())");
+        }
+    }
+
     fn visit_rptr(&self, mtbl: uint, inner: *TyDesc) -> bool {
         self.writer.write_char('&');
         self.write_mut_qualifier(mtbl);
@@ -536,8 +563,6 @@ impl TyVisitor for ReprVisitor {
 
 
     fn visit_trait(&self) -> bool { true }
-    fn visit_var(&self) -> bool { true }
-    fn visit_var_integral(&self) -> bool { true }
     fn visit_param(&self, _i: uint) -> bool { true }
     fn visit_self(&self) -> bool { true }
     fn visit_type(&self) -> bool { true }
@@ -550,9 +575,6 @@ impl TyVisitor for ReprVisitor {
         }
     }
 
-    // Type no longer exists, vestigial function.
-    fn visit_constr(&self, _inner: *TyDesc) -> bool { fail!(); }
-
     fn visit_closure_ptr(&self, _ck: uint) -> bool { true }
 }
 
@@ -598,11 +620,14 @@ fn test_repr() {
     exact_test(&(&mut x), "&mut 10");
     exact_test(&(@mut [1, 2]), "@mut [1, 2]");
 
+    exact_test(&(0 as *()), "(0x0 as *())");
+    exact_test(&(0 as *mut ()), "(0x0 as *mut ())");
+
     exact_test(&(1,), "(1,)");
     exact_test(&(@[1,2,3,4,5,6,7,8]),
                "@[1, 2, 3, 4, 5, 6, 7, 8]");
     exact_test(&(@[1u8,2u8,3u8,4u8]),
-               "@[1, 2, 3, 4]");
+               "@[1u8, 2u8, 3u8, 4u8]");
     exact_test(&(@["hi", "there"]),
                "@[\"hi\", \"there\"]");
     exact_test(&(~["hi", "there"]),
@@ -615,14 +640,14 @@ fn test_repr() {
                "@{a: 10, b: 1.234}");
     exact_test(&(~P{a:10, b:1.234}),
                "~{a: 10, b: 1.234}");
-    exact_test(&(10_u8, ~"hello"),
-               "(10, ~\"hello\")");
-    exact_test(&(10_u16, ~"hello"),
-               "(10, ~\"hello\")");
-    exact_test(&(10_u32, ~"hello"),
-               "(10, ~\"hello\")");
-    exact_test(&(10_u64, ~"hello"),
-               "(10, ~\"hello\")");
+    exact_test(&(10u8, ~"hello"),
+               "(10u8, ~\"hello\")");
+    exact_test(&(10u16, ~"hello"),
+               "(10u16, ~\"hello\")");
+    exact_test(&(10u32, ~"hello"),
+               "(10u32, ~\"hello\")");
+    exact_test(&(10u64, ~"hello"),
+               "(10u64, ~\"hello\")");
 
     struct Foo;
     exact_test(&(~[Foo, Foo, Foo]), "~[{}, {}, {}]");
diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs
index 0642bb19737..796567bd561 100644
--- a/src/libstd/unstable/intrinsics.rs
+++ b/src/libstd/unstable/intrinsics.rs
@@ -161,13 +161,10 @@ pub trait TyVisitor {
                       n_inputs: uint, retstyle: uint) -> bool;
 
     fn visit_trait(&self) -> bool;
-    fn visit_var(&self) -> bool;
-    fn visit_var_integral(&self) -> bool;
     fn visit_param(&self, i: uint) -> bool;
     fn visit_self(&self) -> bool;
     fn visit_type(&self) -> bool;
     fn visit_opaque_box(&self) -> bool;
-    fn visit_constr(&self, inner: *TyDesc) -> bool;
     fn visit_closure_ptr(&self, ck: uint) -> bool;
 }
 
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 3e9c4b788fe..556842e6544 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -59,7 +59,7 @@ And much, much more.
 #[warn(non_camel_case_types)];
 
 use cast;
-use clone::Clone;
+use clone::{Clone, DeepClone};
 use container::{Container, Mutable};
 use cmp::{Eq, TotalOrd, Ordering, Less, Equal, Greater};
 use cmp;
@@ -2199,13 +2199,20 @@ pub mod bytes {
     }
 }
 
-impl<A:Clone> Clone for ~[A] {
+impl<A: Clone> Clone for ~[A] {
     #[inline]
     fn clone(&self) -> ~[A] {
         self.iter().map(|item| item.clone()).collect()
     }
 }
 
+impl<A: DeepClone> DeepClone for ~[A] {
+    #[inline]
+    fn deep_clone(&self) -> ~[A] {
+        self.iter().map(|item| item.deep_clone()).collect()
+    }
+}
+
 // This works because every lifetime is a sub-lifetime of 'static
 impl<'self, A> Zero for &'self [A] {
     fn zero() -> &'self [A] { &'self [] }