-impl RegionMaps {
- pub fn lookup_code_extent(&self, e: CodeExtentData) -> CodeExtent {
- match self.code_extent_interner.get(&e) {
- Some(&d) => d,
- None => bug!("unknown code extent {:?}", e)
- }
- }
- pub fn node_extent(&self, n: ast::NodeId) -> CodeExtent {
- self.lookup_code_extent(CodeExtentData::Misc(n))
- }
- // Returns the code extent for an item - the destruction scope.
- pub fn item_extent(&self, n: ast::NodeId) -> CodeExtent {
- self.lookup_code_extent(CodeExtentData::DestructionScope(n))
- }
- pub fn call_site_extent(&self, fn_id: ast::NodeId, body_id: ast::NodeId) -> CodeExtent {
- assert!(fn_id != body_id);
- self.lookup_code_extent(CodeExtentData::CallSiteScope { fn_id: fn_id, body_id: body_id })
- }
- pub fn opt_destruction_extent(&self, n: ast::NodeId) -> Option<CodeExtent> {
- self.code_extent_interner.get(&CodeExtentData::DestructionScope(n)).cloned()
- }
- pub fn intern_code_extent(&mut self,
- e: CodeExtentData,
- parent: Option<CodeExtent>) -> CodeExtent {
- match self.code_extent_interner.entry(e) {
- Entry::Occupied(_) => {
- bug!("intern_code_extent: already exists")
- }
- Entry::Vacant(v) => {
- if self.code_extents.len() > 0xffffffffusize {
- bug!() // should pass a sess,
- // but this isn't the only place
- }
- let idx = CodeExtent(self.code_extents.len() as u32);
- debug!("CodeExtent({:?}) = {:?} [parent={:?}]", idx, e, parent);
- self.code_extents.push(e);
- self.scope_map.push(parent);
- *v.insert(idx)
- }
- }
- }
- pub fn intern_node(&mut self,
- n: ast::NodeId,
- parent: Option<CodeExtent>) -> CodeExtent {
- self.intern_code_extent(CodeExtentData::Misc(n), parent)
- }
- pub fn code_extent_data(&self, e: CodeExtent) -> CodeExtentData {
- self.code_extents[e.0 as usize]
- }
- pub fn each_encl_scope<E>(&self, mut e:E) where E: FnMut(&CodeExtent, &CodeExtent) {
- for child_id in 1..self.code_extents.len() {
- let child = CodeExtent(child_id as u32);
- if let Some(parent) = self.opt_encl_scope(child) {
- e(&child, &parent)
- }