@@ -7,9 +7,9 @@ use syn::{
7
7
Token ,
8
8
} ;
9
9
10
- use crate :: {
11
- util , Data , DeriveTrait , DeriveWhere , Error , Item , SimpleType , SplitGenerics , TraitImpl ,
12
- } ;
10
+ use crate :: { util , DeriveTrait , DeriveWhere , Error , Item , SplitGenerics , TraitImpl } ;
11
+ # [ cfg ( feature = "zeroize-on-drop" ) ]
12
+ use crate :: { Data , SimpleType } ;
13
13
14
14
/// Dummy-struct implement [`Trait`](crate::Trait) for [`ZeroizeOnDrop`](https://docs.rs/zeroize/latest/zeroize/trait.ZeroizeOnDrop.html) .
15
15
pub struct ZeroizeOnDrop ;
@@ -97,80 +97,82 @@ impl TraitImpl for ZeroizeOnDrop {
97
97
Item :: Item ( data) if data. is_empty ( * * trait_) => quote ! {
98
98
fn drop( & mut self ) { }
99
99
} ,
100
+ #[ cfg( feature = "zeroize-on-drop" ) ]
100
101
_ => {
101
- #[ cfg( feature = "zeroize-on-drop" ) ]
102
- {
103
- let crate_ = trait_. crate_ ( ) ;
104
- let internal = util:: path_segment ( "__internal" ) ;
102
+ let crate_ = trait_. crate_ ( ) ;
103
+ let internal = util:: path_segment ( "__internal" ) ;
105
104
106
- let mut assert_zeroize = crate_. clone ( ) ;
107
- assert_zeroize
108
- . segments
109
- . extend ( [ internal. clone ( ) , util:: path_segment ( "AssertZeroize" ) ] ) ;
105
+ let mut assert_zeroize = crate_. clone ( ) ;
106
+ assert_zeroize
107
+ . segments
108
+ . extend ( [ internal. clone ( ) , util:: path_segment ( "AssertZeroize" ) ] ) ;
110
109
111
- let mut assert_zeroize_on_drop = crate_;
112
- assert_zeroize_on_drop
113
- . segments
114
- . extend ( [ internal, util:: path_segment ( "AssertZeroizeOnDrop" ) ] ) ;
110
+ let mut assert_zeroize_on_drop = crate_;
111
+ assert_zeroize_on_drop
112
+ . segments
113
+ . extend ( [ internal, util:: path_segment ( "AssertZeroizeOnDrop" ) ] ) ;
115
114
116
- quote ! {
117
- fn drop( & mut self ) {
118
- use #assert_zeroize;
119
- use #assert_zeroize_on_drop;
115
+ quote ! {
116
+ fn drop( & mut self ) {
117
+ use #assert_zeroize;
118
+ use #assert_zeroize_on_drop;
120
119
121
- match self {
122
- #body
123
- }
120
+ match self {
121
+ #body
124
122
}
125
123
}
126
124
}
127
- #[ cfg( not( feature = "zeroize-on-drop" ) ) ]
125
+ }
126
+ #[ cfg( not( feature = "zeroize-on-drop" ) ) ]
127
+ _ => {
128
+ // Use unused variables.
129
+ let _ = body;
130
+
131
+ let path = util:: path_from_root_and_strs ( trait_. crate_ ( ) , & [ "Zeroize" ] ) ;
132
+
128
133
quote ! {
129
134
fn drop( & mut self ) {
130
- #body
135
+ #path :: zeroize ( self ) ;
131
136
}
132
137
}
133
138
}
134
139
}
135
140
}
136
141
142
+ #[ cfg( feature = "zeroize-on-drop" ) ]
137
143
fn build_body (
138
144
& self ,
139
145
_derive_where : & DeriveWhere ,
140
146
trait_ : & DeriveTrait ,
141
147
data : & Data ,
142
148
) -> TokenStream {
143
- if data. is_empty ( * * trait_) {
144
- TokenStream :: new ( )
145
- } else {
146
- match data. simple_type ( ) {
147
- SimpleType :: Struct ( fields) | SimpleType :: Tuple ( fields) => {
148
- #[ cfg( feature = "zeroize-on-drop" ) ]
149
- {
150
- let self_pattern = fields. self_pattern_mut ( ) ;
151
- let self_ident = data. iter_self_ident ( * * trait_) ;
152
-
153
- quote ! {
154
- #self_pattern => {
155
- #( #self_ident. zeroize_or_on_drop( ) ; ) *
156
- }
149
+ match data. simple_type ( ) {
150
+ SimpleType :: Struct ( fields) | SimpleType :: Tuple ( fields) => {
151
+ #[ cfg( feature = "zeroize-on-drop" ) ]
152
+ {
153
+ let self_pattern = fields. self_pattern_mut ( ) ;
154
+ let self_ident = data. iter_self_ident ( * * trait_) ;
155
+
156
+ quote ! {
157
+ #self_pattern => {
158
+ #( #self_ident. zeroize_or_on_drop( ) ; ) *
157
159
}
158
160
}
159
- #[ cfg( not( feature = "zeroize-on-drop" ) ) ]
160
- {
161
- // Use unused variables.
162
- let _ = fields;
161
+ }
162
+ #[ cfg( not( feature = "zeroize-on-drop" ) ) ]
163
+ {
164
+ // Use unused variables.
165
+ let _ = fields;
163
166
164
- let path = util:: path_from_root_and_strs ( trait_. crate_ ( ) , & [ "Zeroize" ] ) ;
167
+ let path = util:: path_from_root_and_strs ( trait_. crate_ ( ) , & [ "Zeroize" ] ) ;
165
168
166
- quote ! {
167
- #path:: zeroize( self ) ;
168
- }
169
+ quote ! {
170
+ #path:: zeroize( self ) ;
169
171
}
170
172
}
171
- SimpleType :: Unit ( _) => TokenStream :: new ( ) ,
172
- SimpleType :: Union => unreachable ! ( "unexpected trait for union" ) ,
173
173
}
174
+ SimpleType :: Unit ( _) => TokenStream :: new ( ) ,
175
+ SimpleType :: Union => unreachable ! ( "unexpected trait for union" ) ,
174
176
}
175
177
}
176
178
}
0 commit comments