[tor-bugs] #23881 [Core Tor/Tor]: Implement a way to utilise tor's logging system from Rust code

Tor Bug Tracker & Wiki blackhole at torproject.org
Tue Feb 27 21:23:46 UTC 2018


#23881: Implement a way to utilise tor's logging system from Rust code
-----------------------------------------------+---------------------------
 Reporter:  isis                               |          Owner:  isis
     Type:  enhancement                        |         Status:  accepted
 Priority:  High                               |      Milestone:  Tor:
                                               |  0.3.3.x-final
Component:  Core Tor/Tor                       |        Version:
 Severity:  Normal                             |     Resolution:
 Keywords:  rust, rust-pilot, review-group-29  |  Actual Points:
Parent ID:                                     |         Points:  3
 Reviewer:  nickm                              |        Sponsor:
-----------------------------------------------+---------------------------

Comment (by manish.earth):

 Yeah, I'd missed the "not" in the second half.


 You're right that `CString::_new` does no copies or allocations; the
 sneaky bit is the `t.into()` -- the `From<&str>` impl for `Vec<u8>`. That
 itself calls the `From<&[u8]> for Vec<u8>` impl (https://github.com/rust-
 lang/rust/blob/29f5c699b11a6a148f097f82eaa05202f8799bbc/src/liballoc/vec.rs#L2161-L2171)
 :

 {{{#!rust
 impl<'a, T: Clone> From<&'a [T]> for Vec<T> {
     #[cfg(not(test))]
     fn from(s: &'a [T]) -> Vec<T> {
         s.to_vec()
     }
     #[cfg(test)]
     fn from(s: &'a [T]) -> Vec<T> {
         ::slice::to_vec(s)
     }
 }
 }}}

 which calls `alloc::slice::to_vec` (https://github.com/rust-
 lang/rust/blob/29f5c699b11a6a148f097f82eaa05202f8799bbc/src/liballoc/slice.rs#L164-L170),
 which creates a new vector and copies stuff into it via
 `extend_from_slice`

 {{{#!rust
     pub fn to_vec<T>(s: &[T]) -> Vec<T>
         where T: Clone
     {
         let mut vector = Vec::with_capacity(s.len());
         vector.extend_from_slice(s);
         vector
 }
 }}}

 If `T` is a `String` or `Vec<u8>`, it won't be copied, because the
 `From<String> for Vec<u8>` impl is basically a no-op move. But if it's a
 borrow (e.g. `&str` or `&[u8]` or something), it will be copied into a new
 allocation. It has to be -- you can't guarantee that borrow will live
 forever.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/23881#comment:37>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list