@@ -103,31 +103,31 @@ use std::io::{File, MemWriter};
103
103
104
104
#[ deriving( Clone , Eq , Encodable , Decodable , Ord , TotalOrd , TotalEq ) ]
105
105
struct WorkKey {
106
- kind : ~ str ,
107
- name : ~ str
106
+ kind : StrBuf ,
107
+ name : StrBuf
108
108
}
109
109
110
110
impl WorkKey {
111
111
pub fn new ( kind : & str , name : & str ) -> WorkKey {
112
112
WorkKey {
113
- kind : kind. to_owned ( ) ,
114
- name : name. to_owned ( ) ,
113
+ kind : kind. to_strbuf ( ) ,
114
+ name : name. to_strbuf ( ) ,
115
115
}
116
116
}
117
117
}
118
118
119
- // FIXME #8883: The key should be a WorkKey and not a ~str .
119
+ // FIXME #8883: The key should be a WorkKey and not a StrBuf .
120
120
// This is working around some JSON weirdness.
121
121
#[ deriving( Clone , Eq , Encodable , Decodable ) ]
122
- struct WorkMap ( TreeMap < ~ str , KindMap > ) ;
122
+ struct WorkMap ( TreeMap < StrBuf , KindMap > ) ;
123
123
124
124
#[ deriving( Clone , Eq , Encodable , Decodable ) ]
125
- struct KindMap ( TreeMap < ~ str , ~ str > ) ;
125
+ struct KindMap ( TreeMap < StrBuf , StrBuf > ) ;
126
126
127
127
impl WorkMap {
128
128
fn new ( ) -> WorkMap { WorkMap ( TreeMap :: new ( ) ) }
129
129
130
- fn insert_work_key ( & mut self , k : WorkKey , val : ~ str ) {
130
+ fn insert_work_key ( & mut self , k : WorkKey , val : StrBuf ) {
131
131
let WorkKey { kind, name } = k;
132
132
let WorkMap ( ref mut map) = * self ;
133
133
match map. find_mut ( & name) {
@@ -142,7 +142,7 @@ impl WorkMap {
142
142
143
143
pub struct Database {
144
144
db_filename : Path ,
145
- db_cache : TreeMap < ~ str , ~ str > ,
145
+ db_cache : TreeMap < StrBuf , StrBuf > ,
146
146
pub db_dirty : bool ,
147
147
}
148
148
@@ -163,11 +163,11 @@ impl Database {
163
163
pub fn prepare ( & self ,
164
164
fn_name : & str ,
165
165
declared_inputs : & WorkMap )
166
- -> Option < ( WorkMap , WorkMap , ~ str ) > {
166
+ -> Option < ( WorkMap , WorkMap , StrBuf ) > {
167
167
let k = json_encode ( & ( fn_name, declared_inputs) ) ;
168
168
match self . db_cache . find ( & k) {
169
169
None => None ,
170
- Some ( v) => Some ( json_decode ( * v ) )
170
+ Some ( v) => Some ( json_decode ( v . as_slice ( ) ) )
171
171
}
172
172
}
173
173
@@ -188,7 +188,14 @@ impl Database {
188
188
// FIXME #4330: This should have &mut self and should set self.db_dirty to false.
189
189
fn save ( & self ) -> io:: IoResult < ( ) > {
190
190
let mut f = File :: create ( & self . db_filename ) ;
191
- self . db_cache . to_json ( ) . to_pretty_writer ( & mut f)
191
+
192
+ // FIXME(pcwalton): Yuck.
193
+ let mut new_db_cache = TreeMap :: new ( ) ;
194
+ for ( ref k, ref v) in self . db_cache . iter ( ) {
195
+ new_db_cache. insert ( ( * k) . to_owned ( ) , ( * v) . to_owned ( ) ) ;
196
+ }
197
+
198
+ new_db_cache. to_json ( ) . to_pretty_writer ( & mut f)
192
199
}
193
200
194
201
fn load ( & mut self ) {
@@ -222,7 +229,7 @@ impl Drop for Database {
222
229
}
223
230
}
224
231
225
- pub type FreshnessMap = TreeMap < ~ str , extern fn ( & str , & str ) ->bool > ;
232
+ pub type FreshnessMap = TreeMap < StrBuf , extern fn ( & str , & str ) ->bool > ;
226
233
227
234
#[ deriving( Clone ) ]
228
235
pub struct Context {
@@ -253,11 +260,11 @@ enum Work<'a, T> {
253
260
WorkFromTask ( & ' a Prep < ' a > , Receiver < ( Exec , T ) > ) ,
254
261
}
255
262
256
- fn json_encode < ' a , T : Encodable < json:: Encoder < ' a > , io:: IoError > > ( t : & T ) -> ~ str {
263
+ fn json_encode < ' a , T : Encodable < json:: Encoder < ' a > , io:: IoError > > ( t : & T ) -> StrBuf {
257
264
let mut writer = MemWriter :: new ( ) ;
258
265
let mut encoder = json:: Encoder :: new ( & mut writer as & mut io:: Writer ) ;
259
266
let _ = t. encode ( & mut encoder) ;
260
- str:: from_utf8 ( writer. unwrap ( ) . as_slice ( ) ) . unwrap ( ) . to_owned ( )
267
+ str:: from_utf8 ( writer. unwrap ( ) . as_slice ( ) ) . unwrap ( ) . to_strbuf ( )
261
268
}
262
269
263
270
// FIXME(#5121)
@@ -308,19 +315,19 @@ impl Exec {
308
315
dependency_val : & str ) {
309
316
debug ! ( "Discovering input {} {} {}" , dependency_kind, dependency_name, dependency_val) ;
310
317
self . discovered_inputs . insert_work_key ( WorkKey :: new ( dependency_kind, dependency_name) ,
311
- dependency_val. to_owned ( ) ) ;
318
+ dependency_val. to_strbuf ( ) ) ;
312
319
}
313
320
pub fn discover_output ( & mut self ,
314
321
dependency_kind : & str ,
315
322
dependency_name : & str ,
316
323
dependency_val : & str ) {
317
324
debug ! ( "Discovering output {} {} {}" , dependency_kind, dependency_name, dependency_val) ;
318
325
self . discovered_outputs . insert_work_key ( WorkKey :: new ( dependency_kind, dependency_name) ,
319
- dependency_val. to_owned ( ) ) ;
326
+ dependency_val. to_strbuf ( ) ) ;
320
327
}
321
328
322
329
// returns pairs of (kind, name)
323
- pub fn lookup_discovered_inputs ( & self ) -> Vec < ( ~ str , ~ str ) > {
330
+ pub fn lookup_discovered_inputs ( & self ) -> Vec < ( StrBuf , StrBuf ) > {
324
331
let mut rs = vec ! [ ] ;
325
332
let WorkMap ( ref discovered_inputs) = self . discovered_inputs ;
326
333
for ( k, v) in discovered_inputs. iter ( ) {
@@ -342,7 +349,7 @@ impl<'a> Prep<'a> {
342
349
}
343
350
}
344
351
345
- pub fn lookup_declared_inputs ( & self ) -> Vec < ~ str > {
352
+ pub fn lookup_declared_inputs ( & self ) -> Vec < StrBuf > {
346
353
let mut rs = vec ! [ ] ;
347
354
let WorkMap ( ref declared_inputs) = self . declared_inputs ;
348
355
for ( _, v) in declared_inputs. iter ( ) {
@@ -359,12 +366,11 @@ impl<'a> Prep<'a> {
359
366
pub fn declare_input ( & mut self , kind : & str , name : & str , val : & str ) {
360
367
debug ! ( "Declaring input {} {} {}" , kind, name, val) ;
361
368
self . declared_inputs . insert_work_key ( WorkKey :: new ( kind, name) ,
362
- val. to_owned ( ) ) ;
369
+ val. to_strbuf ( ) ) ;
363
370
}
364
371
365
- fn is_fresh ( & self , cat : & str , kind : & str ,
366
- name : & str , val : & str ) -> bool {
367
- let k = kind. to_owned ( ) ;
372
+ fn is_fresh ( & self , cat : & str , kind : & str , name : & str , val : & str ) -> bool {
373
+ let k = kind. to_strbuf ( ) ;
368
374
let f = self . ctxt . freshness . deref ( ) . find ( & k) ;
369
375
debug ! ( "freshness for: {}/{}/{}/{}" , cat, kind, name, val)
370
376
let fresh = match f {
@@ -384,7 +390,10 @@ impl<'a> Prep<'a> {
384
390
for ( k_name, kindmap) in map. iter ( ) {
385
391
let KindMap ( ref kindmap_) = * kindmap;
386
392
for ( k_kind, v) in kindmap_. iter ( ) {
387
- if ! self . is_fresh ( cat, * k_kind, * k_name, * v) {
393
+ if !self . is_fresh ( cat,
394
+ k_kind. as_slice ( ) ,
395
+ k_name. as_slice ( ) ,
396
+ v. as_slice ( ) ) {
388
397
return false ;
389
398
}
390
399
}
@@ -420,7 +429,7 @@ impl<'a> Prep<'a> {
420
429
debug ! ( "Cache hit!" ) ;
421
430
debug ! ( "Trying to decode: {:?} / {:?} / {}" ,
422
431
disc_in, disc_out, * res) ;
423
- Work :: from_value ( json_decode ( * res) )
432
+ Work :: from_value ( json_decode ( res. as_slice ( ) ) )
424
433
}
425
434
426
435
_ => {
@@ -467,7 +476,7 @@ impl<'a, T:Send +
467
476
& prep. declared_inputs ,
468
477
& exe. discovered_inputs ,
469
478
& exe. discovered_outputs ,
470
- s) ;
479
+ s. as_slice ( ) ) ;
471
480
v
472
481
}
473
482
}
@@ -484,18 +493,18 @@ fn test() {
484
493
485
494
// Create a path to a new file 'filename' in the directory in which
486
495
// this test is running.
487
- fn make_path ( filename : ~ str ) -> Path {
496
+ fn make_path ( filename : StrBuf ) -> Path {
488
497
let pth = os:: self_exe_path ( ) . expect ( "workcache::test failed" ) . with_filename ( filename) ;
489
498
if pth. exists ( ) {
490
499
fs:: unlink ( & pth) . unwrap ( ) ;
491
500
}
492
501
return pth;
493
502
}
494
503
495
- let pth = make_path ( "foo.c" . to_owned ( ) ) ;
504
+ let pth = make_path ( "foo.c" . to_strbuf ( ) ) ;
496
505
File :: create ( & pth) . write ( bytes ! ( "int main() { return 0; }" ) ) . unwrap ( ) ;
497
506
498
- let db_path = make_path ( "db.json" . to_owned ( ) ) ;
507
+ let db_path = make_path ( "db.json" . to_strbuf ( ) ) ;
499
508
500
509
let cx = Context :: new ( Arc :: new ( RWLock :: new ( Database :: new ( db_path) ) ) ,
501
510
Arc :: new ( TreeMap :: new ( ) ) ) ;
@@ -511,7 +520,7 @@ fn test() {
511
520
// FIXME (#9639): This needs to handle non-utf8 paths
512
521
prep. declare_input ( "file" , pth. as_str ( ) . unwrap ( ) , file_content) ;
513
522
prep. exec ( proc ( _exe) {
514
- let out = make_path ( "foo.o" . to_owned ( ) ) ;
523
+ let out = make_path ( "foo.o" . to_strbuf ( ) ) ;
515
524
let compiler = if cfg ! ( windows) { "gcc" } else { "cc" } ;
516
525
// FIXME (#9639): This needs to handle non-utf8 paths
517
526
Process :: status ( compiler, [ pth. as_str ( ) . unwrap ( ) . to_owned ( ) ,
0 commit comments