File tree 1 file changed +18
-3
lines changed
1 file changed +18
-3
lines changed Original file line number Diff line number Diff line change @@ -1895,9 +1895,24 @@ impl<'a> From<&'a [char]> for String {
1895
1895
1896
1896
#[ stable( feature = "stringfromchars" , since = "1.12.0" ) ]
1897
1897
impl From < Vec < char > > for String {
1898
- #[ inline]
1899
- fn from ( v : Vec < char > ) -> String {
1900
- String :: from ( v. as_slice ( ) )
1898
+ fn from ( mut v : Vec < char > ) -> String {
1899
+ unsafe {
1900
+ let cap = v. capacity ( ) ;
1901
+ let ptr = v. as_mut_ptr ( ) as * mut u8 ;
1902
+ let mut bytes = 0usize ;
1903
+
1904
+ for chr in v. iter ( ) {
1905
+ // Regular loop instead of copy_nonoverlapping, because LLVM insists on having a
1906
+ // memcpy for slices shorter than 4 bytes.
1907
+ for b in chr. encode_utf8 ( ) . as_slice ( ) {
1908
+ // Neither bytes nor ptr can overflow.
1909
+ * ptr. offset ( bytes as isize ) = * b;
1910
+ bytes = bytes. wrapping_add ( 1 ) ;
1911
+ }
1912
+ }
1913
+ mem:: forget ( v) ;
1914
+ String :: from_raw_parts ( ptr, bytes, cap * mem:: size_of :: < char > ( ) )
1915
+ }
1901
1916
}
1902
1917
}
1903
1918
You can’t perform that action at this time.
0 commit comments