93
93
//! for a bit longer as well!
94
94
95
95
use std:: cell:: RefCell ;
96
+ use std:: cmp;
96
97
use std:: collections:: HashSet ;
97
- use std:: collections:: hash_map:: HashMap ;
98
+ use std:: collections:: hash_map:: { Entry , HashMap } ;
98
99
use std:: fmt;
99
100
use std:: rc:: Rc ;
100
101
use std:: slice;
@@ -120,6 +121,7 @@ mod encode;
120
121
pub struct Resolve {
121
122
graph : Graph < PackageId > ,
122
123
features : HashMap < PackageId , HashSet < String > > ,
124
+ opt_levels : HashMap < PackageId , u32 > ,
123
125
root : PackageId ,
124
126
metadata : Option < Metadata > ,
125
127
}
@@ -132,6 +134,7 @@ pub enum Method<'a> {
132
134
features : & ' a [ String ] ,
133
135
uses_default_features : bool ,
134
136
target_platform : Option < & ' a str > ,
137
+ opt_level : Option < u32 > ,
135
138
} ,
136
139
}
137
140
@@ -149,7 +152,13 @@ impl Resolve {
149
152
fn new ( root : PackageId ) -> Resolve {
150
153
let mut g = Graph :: new ( ) ;
151
154
g. add ( root. clone ( ) , & [ ] ) ;
152
- Resolve { graph : g, root : root, features : HashMap :: new ( ) , metadata : None }
155
+ Resolve {
156
+ graph : g,
157
+ root : root,
158
+ features : HashMap :: new ( ) ,
159
+ opt_levels : HashMap :: new ( ) ,
160
+ metadata : None ,
161
+ }
153
162
}
154
163
155
164
pub fn copy_metadata ( & mut self , other : & Resolve ) {
@@ -215,6 +224,10 @@ impl Resolve {
215
224
pub fn features ( & self , pkg : & PackageId ) -> Option < & HashSet < String > > {
216
225
self . features . get ( pkg)
217
226
}
227
+
228
+ pub fn opt_level ( & self , pkg : & PackageId ) -> Option < u32 > {
229
+ self . opt_levels . get ( pkg) . map ( |opt_level| * opt_level)
230
+ }
218
231
}
219
232
220
233
impl fmt:: Debug for Resolve {
@@ -329,6 +342,7 @@ fn activate_deps<'a>(cx: Box<Context>,
329
342
features : features,
330
343
uses_default_features : dep. uses_default_features ( ) ,
331
344
target_platform : platform,
345
+ opt_level : dep. opt_level ( ) ,
332
346
} ;
333
347
334
348
let prev_active = cx. prev_active ( dep) ;
@@ -630,6 +644,23 @@ impl Context {
630
644
// for our own dependencies.
631
645
let deps = try!( self . resolve_features ( parent, method) ) ;
632
646
647
+ // Record the optimization level for this package.
648
+ //println!("about to record optimzation level for {:?}...", parent.package_id());
649
+ if let Method :: Required { opt_level : Some ( opt_level) , ..} = method {
650
+ //println!("recording optimization level {}!", opt_level);
651
+ match self . resolve . opt_levels . entry ( parent. package_id ( ) . clone ( ) ) {
652
+ Entry :: Occupied ( mut entry) => {
653
+ let max_opt_level = cmp:: max ( * entry. get ( ) , opt_level) ;
654
+ entry. insert ( max_opt_level) ;
655
+ }
656
+ Entry :: Vacant ( entry) => {
657
+ entry. insert ( opt_level) ;
658
+ }
659
+ }
660
+ } else {
661
+ //println!("no optimization level present!");
662
+ }
663
+
633
664
// Next, transform all dependencies into a list of possible candidates
634
665
// which can satisfy that dependency.
635
666
let mut deps = try!( deps. into_iter ( ) . map ( |( dep, features) | {
0 commit comments