about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorSimon BD <simon@server>2012-10-04 11:24:55 -0500
committerSimon BD <simon@server>2012-10-04 11:24:55 -0500
commit7bd48b92d951a72c40e472a14c6c83d733be1282 (patch)
treea44115f9140c55a76663ef675df99532fb5d4c32 /src/libstd
parent455591d026546c78b5f03a4d013470685bcc2813 (diff)
Get tim_sort working, add test for double-freeing elements in tmp
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sort.rs49
1 files changed, 25 insertions, 24 deletions
diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs
index 6a292402dac..6f3628f4fc7 100644
--- a/src/libstd/sort.rs
+++ b/src/libstd/sort.rs
@@ -215,7 +215,7 @@ fn binarysort<T: Ord>(array: &[mut T], start: uint) {
 
     let mut pivot = ~[];
     vec::reserve(&mut pivot, 1);
-    unsafe { vec::raw::set_len(pivot, 1); };
+    unsafe { vec::raw::set_len(&mut pivot, 1); };
 
     while start < size {
         unsafe {
@@ -243,7 +243,7 @@ fn binarysort<T: Ord>(array: &[mut T], start: uint) {
         array[left] <-> pivot[0];
         start += 1;
     }
-    unsafe { vec::raw::set_len(pivot, 0); } // Forget the boxed element
+    unsafe { vec::raw::set_len(&mut pivot, 0); } // Forget the boxed element
 }
 
 /// Reverse the order of elements in a slice, in place
@@ -411,7 +411,7 @@ struct MergeState<T> {
                 move_vec(self.array, self.mergePt,
                         self.tmp, self.tmpPt, size-self.tmpPt);
             }
-            vec::raw::set_len(self.tmp, 0);
+            vec::raw::set_len(&mut self.tmp, 0);
         }
     }
 }
@@ -488,7 +488,7 @@ impl<T: Ord> &MergeState<T> {
         self.last_hi = false;
 
         unsafe {
-            vec::raw::set_len(self.tmp, len1);
+            vec::raw::set_len(&mut self.tmp, len1);
             move_vec(self.tmp, 0, array, base1, len1);
         }
         self.tmpPt = 0;
@@ -507,7 +507,7 @@ impl<T: Ord> &MergeState<T> {
         if len2 == 0 {
             unsafe {
                 move_vec(array, dest, self.tmp, 0, len1);
-                vec::raw::set_len(self.tmp, 0); // Forget the elements
+                vec::raw::set_len(&mut self.tmp, 0); // Forget the elements
             }
             return;
         }
@@ -515,7 +515,7 @@ impl<T: Ord> &MergeState<T> {
             unsafe {
                 move_vec(array, dest, array, c2, len2);
                 array[dest+len2] <-> self.tmp[c1];
-                vec::raw::set_len(self.tmp, 0); // Forget the element
+                vec::raw::set_len(&mut self.tmp, 0); // Forget the element
             }
             return;
         }
@@ -556,8 +556,9 @@ impl<T: Ord> &MergeState<T> {
             loop {
                 assert len1 > 1 && len2 != 0;
 
-                let tmp_view = vec::const_view(self.tmp, c1, c1+len1);
-                count1 = gallop_right(&const array[c2], tmp_view, 0);
+                //let tmp_view = vec::const_view(self.tmp, c1, c1+len1);
+                count1 = gallop_right(&const array[c2],
+                    vec::const_view(self.tmp, c1, c1+len1), 0);
                 if count1 != 0 {
                     unsafe {
                         move_vec(array, dest, self.tmp, c1, count1);
@@ -571,7 +572,7 @@ impl<T: Ord> &MergeState<T> {
                 self.mergePt += 1;
                 if len2 == 0 { break_outer = true; break; }
 
-                let tmp_view = vec::mut_view(array, c2, c2+len2);
+                let tmp_view = vec::const_view(array, c2, c2+len2);
                 count2 = gallop_left(&const self.tmp[c1], tmp_view, 0);
                 if count2 != 0 {
                     unsafe {
@@ -612,7 +613,7 @@ impl<T: Ord> &MergeState<T> {
             }
         }
         self.tmpPt = 0;
-        unsafe { vec::raw::set_len(self.tmp, 0); }
+        unsafe { vec::raw::set_len(&mut self.tmp, 0); }
     }
 
     fn merge_hi(array: &[mut T], base1: uint, len1: uint,
@@ -623,7 +624,7 @@ impl<T: Ord> &MergeState<T> {
         self.last_hi = true;
 
         unsafe {
-            vec::raw::set_len(self.tmp, len2);
+            vec::raw::set_len(&mut self.tmp, len2);
             move_vec(self.tmp, 0, array, base2, len2);
         }
 
@@ -642,7 +643,7 @@ impl<T: Ord> &MergeState<T> {
         if len1 == 0 {
             unsafe {
                 move_vec(array, dest-(len2-1), self.tmp, 0, len2);
-                vec::raw::set_len(self.tmp, 0); // Forget the elements
+                vec::raw::set_len(&mut self.tmp, 0); // Forget the elements
             }
             return;
         }
@@ -652,7 +653,7 @@ impl<T: Ord> &MergeState<T> {
             unsafe {
                 move_vec(array, dest+1, array, c1+1, len1);
                 array[dest] <-> self.tmp[c2];
-                vec::raw::set_len(self.tmp, 0); // Forget the element
+                vec::raw::set_len(&mut self.tmp, 0); // Forget the element
             }
             return;
         }
@@ -710,9 +711,9 @@ impl<T: Ord> &MergeState<T> {
                 self.mergePt -= 1; self.tmpPt -= 1;
                 if len2 == 1 { break_outer = true; break; }
 
-                let tmp_view = vec::mut_view(self.tmp, 0, len2);
-                let count2 = len2 - gallop_left(
-                    &const array[c1], tmp_view, len2-1);
+                //let tmp_view = vec::mut_view(self.tmp, 0, len2);
+                let count2 = len2 - gallop_left(&const array[c1],
+                            vec::mut_view(self.tmp, 0, len2), len2-1);
                 if count2 != 0 {
                     dest -= count2; c2 -= count2; len2 -= count2;
                     self.mergePt -= count2; self.tmpPt -= count2;
@@ -755,7 +756,7 @@ impl<T: Ord> &MergeState<T> {
             }
         }
         self.tmpPt = 0;
-        unsafe { vec::raw::set_len(self.tmp, 0); }
+        unsafe { vec::raw::set_len(&mut self.tmp, 0); }
     }
 
     fn merge_collapse(array: &[mut T]) {
@@ -974,9 +975,9 @@ mod tests {
     }
 }
 
-//#[cfg(test)]
-//mod test_tim_sort {
-//    #[legacy_exports];
+#[cfg(test)]
+mod test_tim_sort {
+    #[legacy_exports];
     struct CVal {
         val: ~float,
     }
@@ -1029,9 +1030,9 @@ mod tests {
             check_sort(v1, v2);
         }
     }
-//}
-    //#[test]
-    //#[should_fail]
+
+    #[test]
+    #[should_fail]
     fn crash_test() {
         let rng = rand::Rng();
         let mut arr = do vec::from_fn(1000) |_i| {
@@ -1042,7 +1043,7 @@ mod tests {
         tim_sort(arr);
         fail ~"Guarantee the fail";
     }
-//}
+}
 
 //#[cfg(test)]
 /*mod big_tests {