about summary refs log tree commit diff
path: root/src/libextra
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-11-01 18:06:31 -0700
committerBrian Anderson <banderson@mozilla.com>2014-01-04 14:44:12 -0800
commit3b1862a82f04f8f5bcb197715d2ff506c6cdecc3 (patch)
tree0057a02e6d56e9bea0357d649a420b6e66b5be71 /src/libextra
parent18cef3fad47f90c6c5ec1f2ad4dbc12b86b7ee7e (diff)
downloadrust-3b1862a82f04f8f5bcb197715d2ff506c6cdecc3.tar.gz
rust-3b1862a82f04f8f5bcb197715d2ff506c6cdecc3.zip
Don't allow newtype structs to be dereferenced. #6246
Diffstat (limited to 'src/libextra')
-rw-r--r--src/libextra/sync.rs25
-rw-r--r--src/libextra/test.rs20
-rw-r--r--src/libextra/workcache.rs21
3 files changed, 46 insertions, 20 deletions
diff --git a/src/libextra/sync.rs b/src/libextra/sync.rs
index f43329076c8..988a642e583 100644
--- a/src/libextra/sync.rs
+++ b/src/libextra/sync.rs
@@ -107,7 +107,8 @@ impl<Q:Send> Sem<Q> {
     pub fn acquire(&self) {
         unsafe {
             let mut waiter_nobe = None;
-            (**self).with(|state| {
+            let Sem(ref lock) = *self;
+            lock.with(|state| {
                 state.count -= 1;
                 if state.count < 0 {
                     // Create waiter nobe, enqueue ourself, and tell
@@ -126,7 +127,8 @@ impl<Q:Send> Sem<Q> {
 
     pub fn release(&self) {
         unsafe {
-            (**self).with(|state| {
+            let Sem(ref lock) = *self;
+            lock.with(|state| {
                 state.count += 1;
                 if state.count <= 0 {
                     state.waiters.signal();
@@ -206,7 +208,8 @@ impl<'a> Condvar<'a> {
         let mut out_of_bounds = None;
         // Release lock, 'atomically' enqueuing ourselves in so doing.
         unsafe {
-            (**self.sem).with(|state| {
+            let Sem(ref queue) = *self.sem;
+            queue.with(|state| {
                 if condvar_id < state.blocked.len() {
                     // Drop the lock.
                     state.count += 1;
@@ -248,7 +251,8 @@ impl<'a> Condvar<'a> {
         unsafe {
             let mut out_of_bounds = None;
             let mut result = false;
-            (**self.sem).with(|state| {
+            let Sem(ref lock) = *self.sem;
+            lock.with(|state| {
                 if condvar_id < state.blocked.len() {
                     result = state.blocked[condvar_id].signal();
                 } else {
@@ -270,7 +274,8 @@ impl<'a> Condvar<'a> {
         let mut out_of_bounds = None;
         let mut queue = None;
         unsafe {
-            (**self.sem).with(|state| {
+            let Sem(ref lock) = *self.sem;
+            lock.with(|state| {
                 if condvar_id < state.blocked.len() {
                     // To avoid :broadcast_heavy, we make a new waitqueue,
                     // swap it out with the old one, and broadcast on the
@@ -336,7 +341,8 @@ pub struct Semaphore { priv sem: Sem<()> }
 impl Clone for Semaphore {
     /// Create a new handle to the semaphore.
     fn clone(&self) -> Semaphore {
-        Semaphore { sem: Sem((*self.sem).clone()) }
+        let Sem(ref lock) = self.sem;
+        Semaphore { sem: Sem(lock.clone()) }
     }
 }
 
@@ -378,7 +384,9 @@ impl Semaphore {
 pub struct Mutex { priv sem: Sem<~[WaitQueue]> }
 impl Clone for Mutex {
     /// Create a new handle to the mutex.
-    fn clone(&self) -> Mutex { Mutex { sem: Sem((*self.sem).clone()) } }
+    fn clone(&self) -> Mutex {
+        let Sem(ref queue) = self.sem;
+        Mutex { sem: Sem(queue.clone()) } }
 }
 
 impl Mutex {
@@ -467,8 +475,9 @@ impl RWLock {
 
     /// Create a new handle to the rwlock.
     pub fn clone(&self) -> RWLock {
+        let Sem(ref access_lock_queue) = self.access_lock;
         RWLock { order_lock:  (&(self.order_lock)).clone(),
-                 access_lock: Sem((*self.access_lock).clone()),
+                 access_lock: Sem(access_lock_queue.clone()),
                  state:       self.state.clone() }
     }
 
diff --git a/src/libextra/test.rs b/src/libextra/test.rs
index 79fb9e3935a..55d59954224 100644
--- a/src/libextra/test.rs
+++ b/src/libextra/test.rs
@@ -137,7 +137,8 @@ pub struct MetricMap(TreeMap<~str,Metric>);
 
 impl Clone for MetricMap {
     fn clone(&self) -> MetricMap {
-        MetricMap((**self).clone())
+        let MetricMap(ref map) = *self;
+        MetricMap(map.clone())
     }
 }
 
@@ -584,6 +585,7 @@ impl<T: Writer> ConsoleTestState<T> {
 }
 
 pub fn fmt_metrics(mm: &MetricMap) -> ~str {
+    let MetricMap(ref mm) = *mm;
     let v : ~[~str] = mm.iter()
         .map(|(k,v)| format!("{}: {} (+/- {})",
                           *k,
@@ -622,6 +624,7 @@ pub fn run_tests_console(opts: &TestOpts,
                     TrIgnored => st.ignored += 1,
                     TrMetrics(mm) => {
                         let tname = test.name.to_str();
+                        let MetricMap(mm) = mm;
                         for (k,v) in mm.iter() {
                             st.metrics.insert_metric(tname + "." + *k,
                                                      v.value, v.noise);
@@ -950,7 +953,8 @@ impl MetricMap {
     /// Write MetricDiff to a file.
     pub fn save(&self, p: &Path) {
         let mut file = File::create(p);
-        self.to_json().to_pretty_writer(&mut file)
+        let MetricMap(ref map) = *self;
+        map.to_json().to_pretty_writer(&mut file)
     }
 
     /// Compare against another MetricMap. Optionally compare all
@@ -962,8 +966,10 @@ impl MetricMap {
     pub fn compare_to_old(&self, old: &MetricMap,
                           noise_pct: Option<f64>) -> MetricDiff {
         let mut diff : MetricDiff = TreeMap::new();
+        let MetricMap(ref selfmap) = *self;
+        let MetricMap(ref old) = *old;
         for (k, vold) in old.iter() {
-            let r = match self.find(k) {
+            let r = match selfmap.find(k) {
                 None => MetricRemoved,
                 Some(v) => {
                     let delta = (v.value - vold.value);
@@ -999,7 +1005,8 @@ impl MetricMap {
             };
             diff.insert((*k).clone(), r);
         }
-        for (k, _) in self.iter() {
+        let MetricMap(ref map) = *self;
+        for (k, _) in map.iter() {
             if !diff.contains_key(k) {
                 diff.insert((*k).clone(), MetricAdded);
             }
@@ -1025,7 +1032,8 @@ impl MetricMap {
             value: value,
             noise: noise
         };
-        self.insert(name.to_owned(), m);
+        let MetricMap(ref mut map) = *self;
+        map.insert(name.to_owned(), m);
     }
 
     /// Attempt to "ratchet" an external metric file. This involves loading
@@ -1464,6 +1472,7 @@ mod tests {
 
         // Check that it was not rewritten.
         let m3 = MetricMap::load(&pth);
+        let MetricMap(m3) = m3;
         assert_eq!(m3.len(), 2);
         assert_eq!(*(m3.find(&~"runtime").unwrap()), Metric { value: 1000.0, noise: 2.0 });
         assert_eq!(*(m3.find(&~"throughput").unwrap()), Metric { value: 50.0, noise: 2.0 });
@@ -1478,6 +1487,7 @@ mod tests {
 
         // Check that it was rewritten.
         let m4 = MetricMap::load(&pth);
+        let MetricMap(m4) = m4;
         assert_eq!(m4.len(), 2);
         assert_eq!(*(m4.find(&~"runtime").unwrap()), Metric { value: 1100.0, noise: 2.0 });
         assert_eq!(*(m4.find(&~"throughput").unwrap()), Metric { value: 50.0, noise: 2.0 });
diff --git a/src/libextra/workcache.rs b/src/libextra/workcache.rs
index 874e3c70af0..19c5f6f69d8 100644
--- a/src/libextra/workcache.rs
+++ b/src/libextra/workcache.rs
@@ -116,13 +116,14 @@ impl WorkMap {
 
     fn insert_work_key(&mut self, k: WorkKey, val: ~str) {
         let WorkKey { kind, name } = k;
-        match self.find_mut(&name) {
+        let WorkMap(ref mut map) = *self;
+        match map.find_mut(&name) {
             Some(&KindMap(ref mut m)) => { m.insert(kind, val); return; }
             None => ()
         }
         let mut new_map = TreeMap::new();
         new_map.insert(kind, val);
-        self.insert(name, KindMap(new_map));
+        map.insert(name, KindMap(new_map));
     }
 }
 
@@ -328,8 +329,10 @@ impl Exec {
     // returns pairs of (kind, name)
     pub fn lookup_discovered_inputs(&self) -> ~[(~str, ~str)] {
         let mut rs = ~[];
-        for (k, v) in self.discovered_inputs.iter() {
-            for (k1, _) in v.iter() {
+        let WorkMap(ref discovered_inputs) = self.discovered_inputs;
+        for (k, v) in discovered_inputs.iter() {
+            let KindMap(ref vmap) = *v;
+            for (k1, _) in vmap.iter() {
                 rs.push((k1.clone(), k.clone()));
             }
         }
@@ -348,8 +351,10 @@ impl<'a> Prep<'a> {
 
     pub fn lookup_declared_inputs(&self) -> ~[~str] {
         let mut rs = ~[];
-        for (_, v) in self.declared_inputs.iter() {
-            for (inp, _) in v.iter() {
+        let WorkMap(ref declared_inputs) = self.declared_inputs;
+        for (_, v) in declared_inputs.iter() {
+            let KindMap(ref vmap) = *v;
+            for (inp, _) in vmap.iter() {
                 rs.push(inp.clone());
             }
         }
@@ -386,8 +391,10 @@ impl<'a> Prep<'a> {
     }
 
     fn all_fresh(&self, cat: &str, map: &WorkMap) -> bool {
+        let WorkMap(ref map) = *map;
         for (k_name, kindmap) in map.iter() {
-            for (k_kind, v) in kindmap.iter() {
+            let KindMap(ref kindmap_) = *kindmap;
+            for (k_kind, v) in kindmap_.iter() {
                if ! self.is_fresh(cat, *k_kind, *k_name, *v) {
                   return false;
             }