diff options
| author | Ariel Ben-Yehuda <ariel.byd@gmail.com> | 2014-10-25 22:27:15 +0300 |
|---|---|---|
| committer | Ariel Ben-Yehuda <ariel.byd@gmail.com> | 2014-11-03 22:53:59 +0200 |
| commit | a87078a27d4e5434f937ed3810c9fbfa7ff1f793 (patch) | |
| tree | e948e57d5e71ef9cb5a2afb935d85f443af0b1bd /src/libsyntax | |
| parent | fbb90c3458e1db30fc62c96195c9e71ba2111aa4 (diff) | |
| download | rust-a87078a27d4e5434f937ed3810c9fbfa7ff1f793.tar.gz rust-a87078a27d4e5434f937ed3810c9fbfa7ff1f793.zip | |
Clean-up transmutes in librustc
None of them would break by implementation-defined struct layout, but one would break with strict lifetime aliasing, and the rest are just ugly code.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast_util.rs | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs index 8b0e1f32fd4..863f53be798 100644 --- a/src/libsyntax/ast_util.rs +++ b/src/libsyntax/ast_util.rs @@ -21,7 +21,6 @@ use ptr::P; use visit::Visitor; use visit; -use std::cell::Cell; use std::cmp; use std::u32; @@ -333,20 +332,20 @@ impl IdRange { } pub trait IdVisitingOperation { - fn visit_id(&self, node_id: NodeId); + fn visit_id(&mut self, node_id: NodeId); } /// A visitor that applies its operation to all of the node IDs /// in a visitable thing. pub struct IdVisitor<'a, O:'a> { - pub operation: &'a O, + pub operation: &'a mut O, pub pass_through_items: bool, pub visited_outermost: bool, } impl<'a, O: IdVisitingOperation> IdVisitor<'a, O> { - fn visit_generics_helper(&self, generics: &Generics) { + fn visit_generics_helper(&mut self, generics: &Generics) { for type_parameter in generics.ty_params.iter() { self.operation.visit_id(type_parameter.id) } @@ -540,7 +539,7 @@ impl<'a, 'v, O: IdVisitingOperation> Visitor<'v> for IdVisitor<'a, O> { } pub fn visit_ids_for_inlined_item<O: IdVisitingOperation>(item: &InlinedItem, - operation: &O) { + operation: &mut O) { let mut id_visitor = IdVisitor { operation: operation, pass_through_items: true, @@ -551,23 +550,21 @@ pub fn visit_ids_for_inlined_item<O: IdVisitingOperation>(item: &InlinedItem, } struct IdRangeComputingVisitor { - result: Cell<IdRange>, + result: IdRange, } impl IdVisitingOperation for IdRangeComputingVisitor { - fn visit_id(&self, id: NodeId) { - let mut id_range = self.result.get(); - id_range.add(id); - self.result.set(id_range) + fn visit_id(&mut self, id: NodeId) { + self.result.add(id); } } pub fn compute_id_range_for_inlined_item(item: &InlinedItem) -> IdRange { - let visitor = IdRangeComputingVisitor { - result: Cell::new(IdRange::max()) + let mut visitor = IdRangeComputingVisitor { + result: IdRange::max() }; - visit_ids_for_inlined_item(item, &visitor); - visitor.result.get() + visit_ids_for_inlined_item(item, &mut visitor); + visitor.result } pub fn compute_id_range_for_fn_body(fk: visit::FnKind, @@ -582,16 +579,16 @@ pub fn compute_id_range_for_fn_body(fk: visit::FnKind, * ignoring nested items. */ - let visitor = IdRangeComputingVisitor { - result: Cell::new(IdRange::max()) + let mut visitor = IdRangeComputingVisitor { + result: IdRange::max() }; let mut id_visitor = IdVisitor { - operation: &visitor, + operation: &mut visitor, pass_through_items: false, visited_outermost: false, }; id_visitor.visit_fn(fk, decl, body, sp, id); - visitor.result.get() + id_visitor.operation.result } pub fn walk_pat(pat: &Pat, it: |&Pat| -> bool) -> bool { |
