1
- use std:: {
2
- mem:: replace,
3
- sync:: atomic:: { AtomicBool , Ordering } ,
4
- } ;
1
+ use std:: { cell:: RefCell , mem:: replace} ;
5
2
6
3
use once_cell:: sync:: Lazy ;
7
4
use rustc_hash:: FxHashMap ;
@@ -52,7 +49,7 @@ macro_rules! add_to {
52
49
parse( & code)
53
50
} ) ;
54
51
55
- let enable = $b. load ( Ordering :: Relaxed ) ;
52
+ let enable = $b;
56
53
if enable {
57
54
$buf. extend( STMTS . iter( ) . cloned( ) . map( |mut stmt| {
58
55
stmt. visit_mut_with( & mut Marker {
@@ -69,7 +66,7 @@ macro_rules! add_to {
69
66
70
67
macro_rules! add_import_to {
71
68
( $buf: expr, $name: ident, $b: expr, $mark: expr) => { {
72
- let enable = $b. load ( Ordering :: Relaxed ) ;
69
+ let enable = $b;
73
70
if enable {
74
71
let ctxt = SyntaxContext :: empty( ) . apply_mark( $mark) ;
75
72
let s = ImportSpecifier :: Named ( ImportNamedSpecifier {
@@ -103,6 +100,13 @@ better_scoped_tls::scoped_tls!(
103
100
/// Tracks used helper methods. (e.g. __extends)
104
101
#[ derive( Debug , Default ) ]
105
102
pub struct Helpers {
103
+ external : bool ,
104
+ mark : HelperMark ,
105
+ inner : RefCell < Inner > ,
106
+ }
107
+
108
+ #[ derive( Debug , Clone , Copy ) ]
109
+ pub struct HelperData {
106
110
external : bool ,
107
111
mark : HelperMark ,
108
112
inner : Inner ,
@@ -124,6 +128,22 @@ impl Helpers {
124
128
pub const fn external ( & self ) -> bool {
125
129
self . external
126
130
}
131
+
132
+ pub fn data ( & self ) -> HelperData {
133
+ HelperData {
134
+ inner : * self . inner . borrow ( ) ,
135
+ external : self . external ,
136
+ mark : self . mark ,
137
+ }
138
+ }
139
+
140
+ pub fn from_data ( data : HelperData ) -> Self {
141
+ Helpers {
142
+ external : data. external ,
143
+ mark : data. mark ,
144
+ inner : RefCell :: new ( data. inner ) ,
145
+ }
146
+ }
127
147
}
128
148
129
149
#[ derive( Debug , Clone , Copy ) ]
@@ -140,15 +160,15 @@ macro_rules! define_helpers {
140
160
$( $name: ident : ( $( $dep: ident ) ,* ) , ) *
141
161
}
142
162
) => {
143
- #[ derive( Debug , Default ) ]
163
+ #[ derive( Debug , Default , Clone , Copy ) ]
144
164
struct Inner {
145
- $( $name: AtomicBool , ) *
165
+ $( $name: bool , ) *
146
166
}
147
167
148
168
impl Helpers {
149
169
$(
150
170
pub fn $name( & self ) {
151
- self . inner. $name. store ( true , Ordering :: Relaxed ) ;
171
+ self . inner. borrow_mut ( ) . $name = true ;
152
172
153
173
if !self . external {
154
174
$(
@@ -159,11 +179,14 @@ macro_rules! define_helpers {
159
179
) *
160
180
}
161
181
182
+
162
183
impl Helpers {
163
184
pub fn extend_from( & self , other: & Self ) {
185
+ let other = other. inner. borrow( ) ;
186
+ let mut me = self . inner. borrow_mut( ) ;
164
187
$(
165
- if other. inner . $name. load ( Ordering :: SeqCst ) {
166
- self . inner . $name. store ( true , Ordering :: Relaxed ) ;
188
+ if other. $name {
189
+ me . $name = true ;
167
190
}
168
191
) *
169
192
}
@@ -173,8 +196,9 @@ macro_rules! define_helpers {
173
196
fn is_helper_used( & self ) -> bool {
174
197
175
198
HELPERS . with( |helpers|{
199
+ let inner = helpers. inner. borrow( ) ;
176
200
false $(
177
- || helpers . inner. $name. load ( Ordering :: Relaxed )
201
+ || inner. $name
178
202
) *
179
203
} )
180
204
}
@@ -184,8 +208,9 @@ macro_rules! define_helpers {
184
208
185
209
HELPERS . with( |helpers|{
186
210
debug_assert!( !helpers. external) ;
211
+ let inner = helpers. inner. borrow( ) ;
187
212
$(
188
- add_to!( buf, $name, helpers . inner. $name, helpers. mark. 0 ) ;
213
+ add_to!( buf, $name, inner. $name, helpers. mark. 0 ) ;
189
214
) *
190
215
} ) ;
191
216
@@ -196,9 +221,10 @@ macro_rules! define_helpers {
196
221
let mut buf = Vec :: new( ) ;
197
222
198
223
HELPERS . with( |helpers|{
224
+ let inner = helpers. inner. borrow( ) ;
199
225
debug_assert!( helpers. external) ;
200
226
$(
201
- add_import_to!( buf, $name, helpers . inner. $name, helpers. mark. 0 ) ;
227
+ add_import_to!( buf, $name, inner. $name, helpers. mark. 0 ) ;
202
228
) *
203
229
} ) ;
204
230
@@ -209,8 +235,9 @@ macro_rules! define_helpers {
209
235
let mut buf = Vec :: new( ) ;
210
236
HELPERS . with( |helpers|{
211
237
debug_assert!( helpers. external) ;
238
+ let inner = helpers. inner. borrow( ) ;
212
239
$(
213
- let enable = helpers . inner. $name. load ( Ordering :: Relaxed ) ;
240
+ let enable = inner. $name;
214
241
if enable {
215
242
buf. push( self . build_reqire( stringify!( $name) , helpers. mark. 0 ) )
216
243
}
0 commit comments