@@ -118,17 +118,42 @@ impl Cache {
118
118
119
119
cfg_if:: cfg_if! {
120
120
if #[ cfg( feature = "std_detect_env_override" ) ] {
121
+ #[ inline]
122
+ fn disable_features( disable: & [ u8 ] , value: & mut Initializer ) {
123
+ if let Ok ( disable) = core:: str :: from_utf8( disable) {
124
+ for v in disable. split( " " ) {
125
+ let _ = super :: Feature :: from_str( v) . map( |v| value. unset( v as u32 ) ) ;
126
+ }
127
+ }
128
+ }
129
+
121
130
#[ inline]
122
131
fn initialize( mut value: Initializer ) -> Initializer {
123
- let env = unsafe {
124
- libc:: getenv( b"RUST_STD_DETECT_UNSTABLE\0 " . as_ptr( ) as * const libc:: c_char)
125
- } ;
126
- if !env. is_null( ) {
127
- let len = unsafe { libc:: strlen( env) } ;
128
- let env = unsafe { core:: slice:: from_raw_parts( env as * const u8 , len) } ;
129
- if let Ok ( disable) = core:: str :: from_utf8( env) {
130
- for v in disable. split( " " ) {
131
- let _ = super :: Feature :: from_str( v) . map( |v| value. unset( v as u32 ) ) ;
132
+ const RUST_STD_DETECT_UNSTABLE : & [ u8 ] = b"RUST_STD_DETECT_UNSTABLE\0 " ;
133
+ cfg_if:: cfg_if! {
134
+ if #[ cfg( windows) ] {
135
+ use alloc:: vec;
136
+ #[ link( name = "kernel32" ) ]
137
+ extern "system" {
138
+ fn GetEnvironmentVariableA ( name: * const u8 , buffer: * mut u8 , size: u32 ) -> u32 ;
139
+ }
140
+ let len = unsafe { GetEnvironmentVariableA ( RUST_STD_DETECT_UNSTABLE . as_ptr( ) , core:: ptr:: null_mut( ) , 0 ) } ;
141
+ if len > 0 {
142
+ // +1 to include the null terminator.
143
+ let mut env = vec![ 0 ; len as usize + 1 ] ;
144
+ let len = unsafe { GetEnvironmentVariableA ( RUST_STD_DETECT_UNSTABLE . as_ptr( ) , env. as_mut_ptr( ) , len + 1 ) } ;
145
+ if len > 0 {
146
+ disable_features( & env[ ..len as usize ] , & mut value) ;
147
+ }
148
+ }
149
+ } else {
150
+ let env = unsafe {
151
+ libc:: getenv( RUST_STD_DETECT_UNSTABLE . as_ptr( ) as * const libc:: c_char)
152
+ } ;
153
+ if !env. is_null( ) {
154
+ let len = unsafe { libc:: strlen( env) } ;
155
+ let env = unsafe { core:: slice:: from_raw_parts( env as * const u8 , len) } ;
156
+ disable_features( env, & mut value) ;
132
157
}
133
158
}
134
159
}
0 commit comments