@@ -29,7 +29,7 @@ pub(crate) struct ArArchiveBuilder<'a> {
29
29
src_archives : Vec < File > ,
30
30
// Don't use `HashMap` here, as the order is important. `rust.metadata.bin` must always be at
31
31
// the end of an archive for linkers to not get confused.
32
- entries : Vec < ( String , ArchiveEntry ) > ,
32
+ entries : Vec < ( Vec < u8 > , ArchiveEntry ) > ,
33
33
}
34
34
35
35
impl < ' a > ArchiveBuilder < ' a > for ArArchiveBuilder < ' a > {
@@ -44,7 +44,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
44
44
for entry in archive. members ( ) {
45
45
let entry = entry. unwrap ( ) ;
46
46
entries. push ( (
47
- String :: from_utf8 ( entry. name ( ) . to_vec ( ) ) . unwrap ( ) ,
47
+ entry. name ( ) . to_vec ( ) ,
48
48
ArchiveEntry :: FromArchive { archive_index : 0 , file_range : entry. file_range ( ) } ,
49
49
) ) ;
50
50
}
@@ -68,21 +68,21 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
68
68
}
69
69
70
70
fn src_files ( & mut self ) -> Vec < String > {
71
- self . entries . iter ( ) . map ( |( name, _) | name. clone ( ) ) . collect ( )
71
+ self . entries . iter ( ) . map ( |( name, _) | String :: from_utf8 ( name. clone ( ) ) . unwrap ( ) ) . collect ( )
72
72
}
73
73
74
74
fn remove_file ( & mut self , name : & str ) {
75
75
let index = self
76
76
. entries
77
77
. iter ( )
78
- . position ( |( entry_name, _) | entry_name == name)
78
+ . position ( |( entry_name, _) | entry_name == name. as_bytes ( ) )
79
79
. expect ( "Tried to remove file not existing in src archive" ) ;
80
80
self . entries . remove ( index) ;
81
81
}
82
82
83
83
fn add_file ( & mut self , file : & Path ) {
84
84
self . entries . push ( (
85
- file. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . to_string ( ) ,
85
+ file. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . to_string ( ) . into_bytes ( ) ,
86
86
ArchiveEntry :: File ( file. to_owned ( ) ) ,
87
87
) ) ;
88
88
}
@@ -165,7 +165,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
165
165
match object:: File :: parse ( & * data) {
166
166
Ok ( object) => {
167
167
symbol_table. insert (
168
- entry_name. as_bytes ( ) . to_vec ( ) ,
168
+ entry_name. to_vec ( ) ,
169
169
object
170
170
. symbols ( )
171
171
. filter_map ( |symbol| {
@@ -190,7 +190,8 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
190
190
} else {
191
191
sess. fatal ( & format ! (
192
192
"error parsing `{}` during archive creation: {}" ,
193
- entry_name, err
193
+ String :: from_utf8_lossy( & entry_name) ,
194
+ err
194
195
) ) ;
195
196
}
196
197
}
@@ -209,7 +210,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
209
210
err
210
211
) ) ;
211
212
} ) ,
212
- entries. iter ( ) . map ( |( name, _) | name. as_bytes ( ) . to_vec ( ) ) . collect ( ) ,
213
+ entries. iter ( ) . map ( |( name, _) | name. clone ( ) ) . collect ( ) ,
213
214
ar:: GnuSymbolTableFormat :: Size32 ,
214
215
symbol_table,
215
216
)
@@ -232,7 +233,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
232
233
233
234
// Add all files
234
235
for ( entry_name, data) in entries. into_iter ( ) {
235
- let header = ar:: Header :: new ( entry_name. into_bytes ( ) , data. len ( ) as u64 ) ;
236
+ let header = ar:: Header :: new ( entry_name, data. len ( ) as u64 ) ;
236
237
match builder {
237
238
BuilderKind :: Bsd ( ref mut builder) => builder. append ( & header, & mut & * data) . unwrap ( ) ,
238
239
BuilderKind :: Gnu ( ref mut builder) => builder. append ( & header, & mut & * data) . unwrap ( ) ,
@@ -282,7 +283,7 @@ impl<'a> ArArchiveBuilder<'a> {
282
283
. map_err ( |err| io:: Error :: new ( io:: ErrorKind :: InvalidData , err) ) ?;
283
284
if !skip ( & file_name) {
284
285
self . entries . push ( (
285
- file_name,
286
+ file_name. into_bytes ( ) ,
286
287
ArchiveEntry :: FromArchive { archive_index, file_range : entry. file_range ( ) } ,
287
288
) ) ;
288
289
}
0 commit comments