Parcourir la source

aya: preallocate the vector

This code badly needs tests :(
Tamir Duberstein il y a 1 an
Parent
commit
89ef97e848
1 fichiers modifiés avec 28 ajouts et 27 suppressions
  1. 28 27
      aya/src/programs/uprobe.rs

+ 28 - 27
aya/src/programs/uprobe.rs

@@ -337,33 +337,34 @@ impl LdSoCache {
             0
         };
 
-        let mut entries = Vec::new();
-        for _ in 0..num_entries {
-            let flags = read_i32(&mut cursor)?;
-            let k_pos = read_u32(&mut cursor)? as usize;
-            let v_pos = read_u32(&mut cursor)? as usize;
-
-            if new_format {
-                cursor.consume(12);
-            }
-
-            let key = unsafe {
-                CStr::from_ptr(cursor.get_ref()[offset + k_pos..].as_ptr() as *const c_char)
-            }
-            .to_string_lossy()
-            .into_owned();
-            let value = unsafe {
-                CStr::from_ptr(cursor.get_ref()[offset + v_pos..].as_ptr() as *const c_char)
-            }
-            .to_string_lossy()
-            .into_owned();
-
-            entries.push(CacheEntry {
-                key,
-                value,
-                _flags: flags,
-            });
-        }
+        let entries = (0..num_entries)
+            .map(|_: u32| {
+                let flags = read_i32(&mut cursor)?;
+                let k_pos = read_u32(&mut cursor)? as usize;
+                let v_pos = read_u32(&mut cursor)? as usize;
+
+                if new_format {
+                    cursor.consume(12);
+                }
+
+                let read_str = |pos| {
+                    unsafe {
+                        CStr::from_ptr(cursor.get_ref()[offset + pos..].as_ptr() as *const c_char)
+                    }
+                    .to_string_lossy()
+                    .into_owned()
+                };
+
+                let key = read_str(k_pos);
+                let value = read_str(v_pos);
+
+                Ok::<_, io::Error>(CacheEntry {
+                    key,
+                    value,
+                    _flags: flags,
+                })
+            })
+            .collect::<Result<_, _>>()?;
 
         Ok(LdSoCache { entries })
     }