Skip to content

Commit f7232e2

Browse files
authored
Merge pull request #183 from steffahn/remove-additional-recursive-finalize-calls
Remove finalizer method bodies and bounds from implementations for standard library types
2 parents d445318 + d860b56 commit f7232e2

File tree

2 files changed

+17
-111
lines changed

2 files changed

+17
-111
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ impl Finalize for Foo {
4747
// Clean up resources for Foo, because we think it will be destroyed.
4848
// Foo may not be destroyed after a call to finalize, as another
4949
// finalizer may create a reference to it due to reference cycles.
50+
// Recursive calls of Finalize::finalize on fields are not required here
51+
// because this is handled by Trace::finalize_glue already.
5052
}
5153
}
5254
```

gc/src/trace.rs

+15-111
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,7 @@ simple_empty_finalize_trace![
172172
RandomState
173173
];
174174

175-
impl<T: Finalize, const N: usize> Finalize for [T; N] {
176-
fn finalize(&self) {
177-
for v in self {
178-
v.finalize();
179-
}
180-
}
181-
}
175+
impl<T, const N: usize> Finalize for [T; N] {}
182176
unsafe impl<T: Trace, const N: usize> Trace for [T; N] {
183177
custom_trace!(this, {
184178
for v in this {
@@ -213,13 +207,7 @@ macro_rules! fn_finalize_trace_group {
213207
macro_rules! tuple_finalize_trace {
214208
() => {}; // This case is handled above, by simple_finalize_empty_trace!().
215209
($($args:ident),*) => {
216-
impl<$($args: $crate::Finalize),*> Finalize for ($($args,)*) {
217-
fn finalize(&self) {
218-
#[allow(non_snake_case)]
219-
let &($(ref $args,)*) = self;
220-
$(($args).finalize();)*
221-
}
222-
}
210+
impl<$($args),*> Finalize for ($($args,)*) {}
223211
unsafe impl<$($args: $crate::Trace),*> Trace for ($($args,)*) {
224212
custom_trace!(this, {
225213
#[allow(non_snake_case)]
@@ -255,24 +243,14 @@ type_arg_tuple_based_finalize_trace_impls![
255243
(A, B, C, D, E, F, G, H, I, J, K, L);
256244
];
257245

258-
impl<T: Finalize + ?Sized> Finalize for Box<T> {
259-
fn finalize(&self) {
260-
(**self).finalize();
261-
}
262-
}
246+
impl<T: ?Sized> Finalize for Box<T> {}
263247
unsafe impl<T: Trace + ?Sized> Trace for Box<T> {
264248
custom_trace!(this, {
265249
mark(&**this);
266250
});
267251
}
268252

269-
impl<T: Finalize> Finalize for [T] {
270-
fn finalize(&self) {
271-
for e in self {
272-
e.finalize();
273-
}
274-
}
275-
}
253+
impl<T> Finalize for [T] {}
276254
unsafe impl<T: Trace> Trace for [T] {
277255
custom_trace!(this, {
278256
for e in this {
@@ -281,13 +259,7 @@ unsafe impl<T: Trace> Trace for [T] {
281259
});
282260
}
283261

284-
impl<T: Finalize> Finalize for Vec<T> {
285-
fn finalize(&self) {
286-
for e in self {
287-
e.finalize();
288-
}
289-
}
290-
}
262+
impl<T> Finalize for Vec<T> {}
291263
unsafe impl<T: Trace> Trace for Vec<T> {
292264
custom_trace!(this, {
293265
for e in this {
@@ -296,13 +268,7 @@ unsafe impl<T: Trace> Trace for Vec<T> {
296268
});
297269
}
298270

299-
impl<T: Finalize> Finalize for Option<T> {
300-
fn finalize(&self) {
301-
if let Some(v) = self {
302-
v.finalize();
303-
}
304-
}
305-
}
271+
impl<T> Finalize for Option<T> {}
306272
unsafe impl<T: Trace> Trace for Option<T> {
307273
custom_trace!(this, {
308274
if let Some(v) = this {
@@ -311,14 +277,7 @@ unsafe impl<T: Trace> Trace for Option<T> {
311277
});
312278
}
313279

314-
impl<T: Finalize, E: Finalize> Finalize for Result<T, E> {
315-
fn finalize(&self) {
316-
match self {
317-
Ok(v) => v.finalize(),
318-
Err(v) => v.finalize(),
319-
}
320-
}
321-
}
280+
impl<T, E> Finalize for Result<T, E> {}
322281
unsafe impl<T: Trace, E: Trace> Trace for Result<T, E> {
323282
custom_trace!(this, {
324283
match this {
@@ -328,13 +287,7 @@ unsafe impl<T: Trace, E: Trace> Trace for Result<T, E> {
328287
});
329288
}
330289

331-
impl<T: Finalize> Finalize for BinaryHeap<T> {
332-
fn finalize(&self) {
333-
for v in self {
334-
v.finalize();
335-
}
336-
}
337-
}
290+
impl<T> Finalize for BinaryHeap<T> {}
338291
unsafe impl<T: Trace> Trace for BinaryHeap<T> {
339292
custom_trace!(this, {
340293
for v in this {
@@ -343,14 +296,7 @@ unsafe impl<T: Trace> Trace for BinaryHeap<T> {
343296
});
344297
}
345298

346-
impl<K: Finalize, V: Finalize> Finalize for BTreeMap<K, V> {
347-
fn finalize(&self) {
348-
for (k, v) in self {
349-
k.finalize();
350-
v.finalize();
351-
}
352-
}
353-
}
299+
impl<K, V> Finalize for BTreeMap<K, V> {}
354300
unsafe impl<K: Trace, V: Trace> Trace for BTreeMap<K, V> {
355301
custom_trace!(this, {
356302
for (k, v) in this {
@@ -360,13 +306,7 @@ unsafe impl<K: Trace, V: Trace> Trace for BTreeMap<K, V> {
360306
});
361307
}
362308

363-
impl<T: Finalize> Finalize for BTreeSet<T> {
364-
fn finalize(&self) {
365-
for v in self {
366-
v.finalize();
367-
}
368-
}
369-
}
309+
impl<T> Finalize for BTreeSet<T> {}
370310
unsafe impl<T: Trace> Trace for BTreeSet<T> {
371311
custom_trace!(this, {
372312
for v in this {
@@ -375,15 +315,7 @@ unsafe impl<T: Trace> Trace for BTreeSet<T> {
375315
});
376316
}
377317

378-
impl<K: Finalize, V: Finalize, S: Finalize> Finalize for HashMap<K, V, S> {
379-
fn finalize(&self) {
380-
self.hasher().finalize();
381-
for (k, v) in self {
382-
k.finalize();
383-
v.finalize();
384-
}
385-
}
386-
}
318+
impl<K, V, S> Finalize for HashMap<K, V, S> {}
387319
unsafe impl<K: Trace, V: Trace, S: Trace> Trace for HashMap<K, V, S> {
388320
custom_trace!(this, {
389321
mark(this.hasher());
@@ -394,14 +326,7 @@ unsafe impl<K: Trace, V: Trace, S: Trace> Trace for HashMap<K, V, S> {
394326
});
395327
}
396328

397-
impl<T: Finalize, S: Finalize> Finalize for HashSet<T, S> {
398-
fn finalize(&self) {
399-
self.hasher().finalize();
400-
for v in self {
401-
v.finalize();
402-
}
403-
}
404-
}
329+
impl<T, S> Finalize for HashSet<T, S> {}
405330
unsafe impl<T: Trace, S: Trace> Trace for HashSet<T, S> {
406331
custom_trace!(this, {
407332
mark(this.hasher());
@@ -411,13 +336,7 @@ unsafe impl<T: Trace, S: Trace> Trace for HashSet<T, S> {
411336
});
412337
}
413338

414-
impl<T: Finalize> Finalize for LinkedList<T> {
415-
fn finalize(&self) {
416-
for v in self {
417-
v.finalize();
418-
}
419-
}
420-
}
339+
impl<T> Finalize for LinkedList<T> {}
421340
unsafe impl<T: Trace> Trace for LinkedList<T> {
422341
custom_trace!(this, {
423342
for v in this.iter() {
@@ -431,13 +350,7 @@ unsafe impl<T: ?Sized> Trace for PhantomData<T> {
431350
unsafe_empty_trace!();
432351
}
433352

434-
impl<T: Finalize> Finalize for VecDeque<T> {
435-
fn finalize(&self) {
436-
for v in self {
437-
v.finalize();
438-
}
439-
}
440-
}
353+
impl<T> Finalize for VecDeque<T> {}
441354
unsafe impl<T: Trace> Trace for VecDeque<T> {
442355
custom_trace!(this, {
443356
for v in this {
@@ -446,16 +359,7 @@ unsafe impl<T: Trace> Trace for VecDeque<T> {
446359
});
447360
}
448361

449-
impl<'a, T: ToOwned + ?Sized> Finalize for Cow<'a, T>
450-
where
451-
T::Owned: Finalize,
452-
{
453-
fn finalize(&self) {
454-
if let Cow::Owned(ref v) = self {
455-
v.finalize();
456-
}
457-
}
458-
}
362+
impl<'a, T: ToOwned + ?Sized> Finalize for Cow<'a, T>{}
459363
unsafe impl<'a, T: ToOwned + ?Sized> Trace for Cow<'a, T>
460364
where
461365
T::Owned: Trace,

0 commit comments

Comments
 (0)