From 4c29b4cb93ee090a22d27faf4e700bfc2364ebc5 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 2 Apr 2013 16:20:02 -0700 Subject: librustc: Optimize metadata::decoder::item_name. --- src/libsyntax/parse/token.rs | 22 ++++++++++++++++++++++ src/libsyntax/util/interner.rs | 9 +++++++++ 2 files changed, 31 insertions(+) (limited to 'src/libsyntax') diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index cf05a4375a8..b94b53076ec 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -18,9 +18,11 @@ use util::interner; use core::cast; use core::char; +use core::cmp::Equiv; use core::hashmap::HashSet; use core::str; use core::task; +use core::to_bytes; #[auto_encode] #[auto_decode] @@ -355,6 +357,19 @@ pub mod special_idents { pub static type_self: ident = ident { repr: 36u, ctxt: 0}; // `Self` } +pub struct StringRef<'self>(&'self str); + +impl<'self> Equiv<@~str> for StringRef<'self> { + #[inline(always)] + fn equiv(&self, other: &@~str) -> bool { str::eq_slice(**self, **other) } +} + +impl<'self> to_bytes::IterBytes for StringRef<'self> { + fn iter_bytes(&self, lsb0: bool, f: to_bytes::Cb) { + (**self).iter_bytes(lsb0, f); + } +} + pub struct ident_interner { priv interner: Interner<@~str>, } @@ -372,6 +387,13 @@ pub impl ident_interner { fn len(&self) -> uint { self.interner.len() } + fn find_equiv>(&self, val: &Q) + -> Option { + match self.interner.find_equiv(val) { + Some(v) => Some(ast::ident { repr: v }), + None => None, + } + } } pub fn mk_ident_interner() -> @ident_interner { diff --git a/src/libsyntax/util/interner.rs b/src/libsyntax/util/interner.rs index 75bcac1b163..cda1c6c0df3 100644 --- a/src/libsyntax/util/interner.rs +++ b/src/libsyntax/util/interner.rs @@ -16,6 +16,7 @@ #[macro_escape]; use core::prelude::*; +use core::cmp::Equiv; use core::hashmap::HashMap; pub struct Interner { @@ -67,6 +68,14 @@ pub impl Interner { fn get(&self, idx: uint) -> T { self.vect[idx] } fn len(&self) -> uint { let vect = &*self.vect; vect.len() } + + fn find_equiv>(&self, val: &Q) + -> Option { + match self.map.find_equiv(val) { + Some(v) => Some(*v), + None => None, + } + } } /* Key for thread-local data for sneaking interner information to the -- cgit 1.4.1-3-g733a5 From dcea71720852cf6b7d682d6caa054a2d6fb96068 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 19 Apr 2013 15:57:31 -0700 Subject: librustc: Fix botched merge. rs=merge --- src/libcore/vec.rs | 9 +++++++++ src/librustc/middle/trans/reflect.rs | 8 ++++++-- src/libsyntax/parse/token.rs | 8 ++++---- 3 files changed, 19 insertions(+), 6 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs index 0d612369cc5..efb11271af6 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -1976,6 +1976,7 @@ pub trait ImmutableVector<'self, T> { fn alli(&self, f: &fn(uint, t: &T) -> bool) -> bool; fn flat_map(&self, f: &fn(t: &T) -> ~[U]) -> ~[U]; fn filter_mapped(&self, f: &fn(t: &T) -> Option) -> ~[U]; + unsafe fn unsafe_ref(&self, index: uint) -> *T; } /// Extension methods for vectors @@ -2097,6 +2098,14 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] { fn filter_mapped(&self, f: &fn(t: &T) -> Option) -> ~[U] { filter_mapped(*self, f) } + + /// Returns a pointer to the element at the given index, without doing + /// bounds checking. + #[inline(always)] + unsafe fn unsafe_ref(&self, index: uint) -> *T { + let (ptr, _): (*T, uint) = transmute(*self); + ptr.offset(index) + } } pub trait ImmutableEqVector { diff --git a/src/librustc/middle/trans/reflect.rs b/src/librustc/middle/trans/reflect.rs index e62e19f636a..30c14ab679f 100644 --- a/src/librustc/middle/trans/reflect.rs +++ b/src/librustc/middle/trans/reflect.rs @@ -288,11 +288,15 @@ pub impl Reflector { let arg = unsafe { llvm::LLVMGetParam(llfdecl, first_real_arg as c_uint) }; - let fcx = new_fn_ctxt(ccx, ~[], llfdecl, None); + let fcx = new_fn_ctxt(ccx, + ~[], + llfdecl, + ty::mk_uint(ccx.tcx), + None); let bcx = top_scope_block(fcx, None); let arg = BitCast(bcx, arg, llptrty); let ret = adt::trans_get_discr(bcx, repr, arg); - Store(bcx, ret, fcx.llretptr); + Store(bcx, ret, fcx.llretptr.get()); cleanup_and_Br(bcx, bcx, fcx.llreturn); finish_fn(fcx, bcx.llbb); llfdecl diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index b94b53076ec..2483cacd1a6 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -376,10 +376,10 @@ pub struct ident_interner { pub impl ident_interner { fn intern(&self, val: @~str) -> ast::ident { - ast::ident { repr: self.interner.intern(val), ctxt: 0} + ast::ident { repr: self.interner.intern(val), ctxt: 0 } } fn gensym(&self, val: @~str) -> ast::ident { - ast::ident { repr: self.interner.gensym(val), ctxt: 0} + ast::ident { repr: self.interner.gensym(val), ctxt: 0 } } fn get(&self, idx: ast::ident) -> @~str { self.interner.get(idx.repr) @@ -388,9 +388,9 @@ pub impl ident_interner { self.interner.len() } fn find_equiv>(&self, val: &Q) - -> Option { + -> Option { match self.interner.find_equiv(val) { - Some(v) => Some(ast::ident { repr: v }), + Some(v) => Some(ast::ident { repr: v, ctxt: 0 }), None => None, } } -- cgit 1.4.1-3-g733a5