]> git.lizzy.rs Git - rust.git/commitdiff
test System/Global allocator API: alloc_zeroed, realloc
authorRalf Jung <post@ralfj.de>
Sun, 21 Apr 2019 11:43:53 +0000 (13:43 +0200)
committerRalf Jung <post@ralfj.de>
Sun, 21 Apr 2019 11:47:12 +0000 (13:47 +0200)
tests/run-pass/env.rs
tests/run-pass/hashmap.rs
tests/run-pass/heap_allocator.rs

index 0ca63e148fdbb056d7cf155d3307f57a9d6e89b2..91e15f249d452dc4539431464549ebc974766afb 100644 (file)
@@ -1,4 +1,4 @@
-//ignore-windows: env var emulation not implemented on Windows
+//ignore-windows: TODO env var emulation stubbed out on Windows
 
 use std::env;
 
index 796e63c81a412a864df0a2a0cfad832989f699f4..25a816bcf2454df0d074259e3aaafcffe7ba43e6 100644 (file)
@@ -27,13 +27,12 @@ fn test_map<S: BuildHasher>(mut map: HashMap<i32, i32, S>) {
 }
 
 fn main() {
-    if cfg!(not(target_os = "macos")) {
-        let map: HashMap<i32, i32> = HashMap::default();
-        test_map(map);
-    } else {
-        // TODO: Implement random number generation on OS X.
+    if cfg!(target_os = "macos") { // TODO: Implement random number generation on OS X.
         // Until then, use a deterministic map.
         let map : HashMap<i32, i32, BuildHasherDefault<collections::hash_map::DefaultHasher>> = HashMap::default();
         test_map(map);
+    } else {
+        let map: HashMap<i32, i32> = HashMap::default();
+        test_map(map);
     }
 }
index bfed725a497ccafb248985fabe2ebe91a25e1383..b201f24e25634b37c2fc2d2b73c047c32928f617 100644 (file)
@@ -1,9 +1,32 @@
-//ignore-windows: inspects allocation base address on Windows
-
 #![feature(allocator_api)]
 
 use std::ptr::NonNull;
 use std::alloc::{Global, Alloc, Layout, System};
+use std::slice;
+
+fn check_alloc<T: Alloc>(mut allocator: T) { unsafe {
+    let layout = Layout::from_size_align(20, 4).unwrap();
+    let a = allocator.alloc(layout).unwrap();
+    allocator.dealloc(a, layout);
+
+    let p1 = allocator.alloc_zeroed(layout).unwrap();
+
+    let p2 = allocator.realloc(p1, Layout::from_size_align(20, 4).unwrap(), 40).unwrap();
+    let slice = slice::from_raw_parts(p2.as_ptr(), 20);
+    assert_eq!(&slice, &[0_u8; 20]);
+
+    // old size == new size
+    let p3 = allocator.realloc(p2, Layout::from_size_align(40, 4).unwrap(), 40).unwrap();
+    let slice = slice::from_raw_parts(p3.as_ptr(), 20);
+    assert_eq!(&slice, &[0_u8; 20]);
+
+    // old size > new size
+    let p4 = allocator.realloc(p3, Layout::from_size_align(40, 4).unwrap(), 10).unwrap();
+    let slice = slice::from_raw_parts(p4.as_ptr(), 10);
+    assert_eq!(&slice, &[0_u8; 10]);
+
+    allocator.dealloc(p4, Layout::from_size_align(10, 4).unwrap());
+} }
 
 fn check_overalign_requests<T: Alloc>(mut allocator: T) {
     let size = 8;
@@ -50,6 +73,9 @@ fn box_to_global() {
 }
 
 fn main() {
+    check_alloc(System);
+    check_alloc(Global);
+    #[cfg(not(target_os = "windows"))] // TODO: Inspects allocation base address on Windows; needs intptrcast model
     check_overalign_requests(System);
     check_overalign_requests(Global);
     global_to_box();