[PATCH 07 of 11] rust: simply use TryInto to convert slice to array

Raphaël Gomès raphael.gomes at octobus.net
Wed Aug 21 13:31:52 UTC 2019


Indeed. I think I wrote this function before TryInto was on Debian 
stable's Rust version.

On 8/17/19 2:12 PM, Yuya Nishihara wrote:

> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1566009462 -32400
> #      Sat Aug 17 11:37:42 2019 +0900
> # Node ID d496a0a5d5f8ff45afde5a0a90b0917e507cbbbb
> # Parent  a57c56ff9cec59f12780c83f5dc2ab679d2523e6
> rust: simply use TryInto to convert slice to array
>
> Since our rust module depends on TryInto, there's no point to avoid using it.
>
> While rewriting copy_into_array(), I noticed CPython interface doesn't check
> the length of the p1/p2 values, which is marked as TODO.
>
> diff --git a/rust/hg-core/src/dirstate/dirstate_map.rs b/rust/hg-core/src/dirstate/dirstate_map.rs
> --- a/rust/hg-core/src/dirstate/dirstate_map.rs
> +++ b/rust/hg-core/src/dirstate/dirstate_map.rs
> @@ -7,13 +7,13 @@
>   
>   use crate::{
>       dirstate::{parsers::PARENT_SIZE, EntryState},
> -    pack_dirstate, parse_dirstate,
> -    utils::copy_into_array,
> -    CopyMap, DirsIterable, DirsMultiset, DirstateEntry, DirstateError,
> -    DirstateMapError, DirstateParents, DirstateParseError, StateMap,
> +    pack_dirstate, parse_dirstate, CopyMap, DirsIterable, DirsMultiset,
> +    DirstateEntry, DirstateError, DirstateMapError, DirstateParents,
> +    DirstateParseError, StateMap,
>   };
>   use core::borrow::Borrow;
>   use std::collections::{HashMap, HashSet};
> +use std::convert::TryInto;
>   use std::iter::FromIterator;
>   use std::ops::Deref;
>   use std::time::Duration;
> @@ -260,10 +260,10 @@ impl DirstateMap {
>           let parents;
>           if file_contents.len() == PARENT_SIZE * 2 {
>               parents = DirstateParents {
> -                p1: copy_into_array(&file_contents[..PARENT_SIZE]),
> -                p2: copy_into_array(
> -                    &file_contents[PARENT_SIZE..PARENT_SIZE * 2],
> -                ),
> +                p1: file_contents[..PARENT_SIZE].try_into().unwrap(),
> +                p2: file_contents[PARENT_SIZE..PARENT_SIZE * 2]
> +                    .try_into()
> +                    .unwrap(),
>               };
>           } else if file_contents.is_empty() {
>               parents = DirstateParents {
> diff --git a/rust/hg-core/src/dirstate/parsers.rs b/rust/hg-core/src/dirstate/parsers.rs
> --- a/rust/hg-core/src/dirstate/parsers.rs
> +++ b/rust/hg-core/src/dirstate/parsers.rs
> @@ -5,7 +5,6 @@
>   
>   use crate::{
>       dirstate::{CopyMap, EntryState, StateMap},
> -    utils::copy_into_array,
>       DirstateEntry, DirstatePackError, DirstateParents, DirstateParseError,
>   };
>   use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
> @@ -31,8 +30,8 @@ pub fn parse_dirstate(
>   
>       let mut curr_pos = PARENT_SIZE * 2;
>       let parents = DirstateParents {
> -        p1: copy_into_array(&contents[..PARENT_SIZE]),
> -        p2: copy_into_array(&contents[PARENT_SIZE..curr_pos]),
> +        p1: contents[..PARENT_SIZE].try_into().unwrap(),
> +        p2: contents[PARENT_SIZE..curr_pos].try_into().unwrap(),
>       };
>   
>       while curr_pos < contents.len() {
> diff --git a/rust/hg-core/src/utils.rs b/rust/hg-core/src/utils.rs
> --- a/rust/hg-core/src/utils.rs
> +++ b/rust/hg-core/src/utils.rs
> @@ -9,23 +9,6 @@
>   
>   pub mod files;
>   
> -use std::convert::AsMut;
> -
> -/// Takes a slice and copies it into an array.
> -///
> -/// # Panics
> -///
> -/// Will panic if the slice and target array don't have the same length.
> -pub fn copy_into_array<A, T>(slice: &[T]) -> A
> -where
> -    A: Sized + Default + AsMut<[T]>,
> -    T: Copy,
> -{
> -    let mut a = Default::default();
> -    <A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
> -    a
> -}
> -
>   /// Replaces the `from` slice with the `to` slice inside the `buf` slice.
>   ///
>   /// # Examples
> diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs
> --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs
> +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs
> @@ -24,7 +24,7 @@ use crate::{
>       ref_sharing::PySharedState,
>   };
>   use hg::{
> -    utils::copy_into_array, DirsIterable, DirsMultiset, DirstateEntry,
> +    DirsIterable, DirsMultiset, DirstateEntry,
>       DirstateMap as RustDirstateMap, DirstateParents, DirstateParseError,
>       EntryState,
>   };
> @@ -239,8 +239,9 @@ py_class!(pub class DirstateMap |py| {
>       }
>   
>       def setparents(&self, p1: PyObject, p2: PyObject) -> PyResult<PyObject> {
> -        let p1 = copy_into_array(p1.extract::<PyBytes>(py)?.data(py));
> -        let p2 = copy_into_array(p2.extract::<PyBytes>(py)?.data(py));
> +        // TODO: don't panic; raise Python exception instead.
> +        let p1 = p1.extract::<PyBytes>(py)?.data(py).try_into().unwrap();
> +        let p2 = p2.extract::<PyBytes>(py)?.data(py).try_into().unwrap();
>   
>           self.inner(py)
>               .borrow_mut()
> @@ -274,8 +275,9 @@ py_class!(pub class DirstateMap |py| {
>       ) -> PyResult<PyBytes> {
>           let now = Duration::new(now.extract(py)?, 0);
>           let parents = DirstateParents {
> -            p1: copy_into_array(p1.extract::<PyBytes>(py)?.data(py)),
> -            p2: copy_into_array(p2.extract::<PyBytes>(py)?.data(py)),
> +            // TODO: don't panic; raise Python exception instead.
> +            p1: p1.extract::<PyBytes>(py)?.data(py).try_into().unwrap(),
> +            p2: p2.extract::<PyBytes>(py)?.data(py).try_into().unwrap(),
>           };
>   
>           match self.borrow_mut(py)?.pack(parents, now) {
> diff --git a/rust/hg-cpython/src/parsers.rs b/rust/hg-cpython/src/parsers.rs
> --- a/rust/hg-cpython/src/parsers.rs
> +++ b/rust/hg-cpython/src/parsers.rs
> @@ -15,10 +15,11 @@ use cpython::{
>       PythonObject, ToPyObject,
>   };
>   use hg::{
> -    pack_dirstate, parse_dirstate, utils::copy_into_array, DirstateEntry,
> +    pack_dirstate, parse_dirstate, DirstateEntry,
>       DirstatePackError, DirstateParents, DirstateParseError, PARENT_SIZE,
>   };
>   use std::collections::HashMap;
> +use std::convert::TryInto;
>   
>   use libc::c_char;
>   
> @@ -120,8 +121,8 @@ fn pack_dirstate_wrapper(
>           &mut dirstate_map,
>           &copies?,
>           DirstateParents {
> -            p1: copy_into_array(&p1),
> -            p2: copy_into_array(&p2),
> +            p1: p1.try_into().unwrap(),
> +            p2: p2.try_into().unwrap(),
>           },
>           Duration::from_secs(now.as_object().extract::<u64>(py)?),
>       ) {
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list