mirror of
https://github.com/rust-lang/rust
synced 2024-09-15 22:50:55 +00:00
auto merge of #12809 : eddyb/rust/ty-arena, r=cmr
This was inspired by seeing a LLVM flatline of **~600MB** when running rustc with jemalloc (each type's `t_box_` is allocated on the heap, creating a lot of fragmentation, which jemalloc can deal with, unlike glibc).
This commit is contained in:
commit
0c73e5fc5f
|
@ -32,6 +32,7 @@
|
|||
|
||||
use std::io;
|
||||
use std::io::fs;
|
||||
use arena::TypedArena;
|
||||
use syntax::ast;
|
||||
use syntax::attr;
|
||||
use syntax::attr::{AttrMetaMethods};
|
||||
|
@ -86,8 +87,9 @@ pub fn compile_input(sess: Session,
|
|||
|
||||
if stop_after_phase_2(&sess) { return; }
|
||||
|
||||
let type_arena = TypedArena::new();
|
||||
let analysis = phase_3_run_analysis_passes(sess, &expanded_crate,
|
||||
ast_map, id);
|
||||
ast_map, &type_arena, id);
|
||||
phase_save_analysis(&analysis.ty_cx.sess, &expanded_crate, &analysis, outdir);
|
||||
if stop_after_phase_3(&analysis.ty_cx.sess) { return; }
|
||||
let (tcx, trans) = phase_4_translate_to_llvm(expanded_crate, analysis);
|
||||
|
@ -299,11 +301,11 @@ pub fn phase_2_configure_and_expand(sess: &Session,
|
|||
Some((krate, map))
|
||||
}
|
||||
|
||||
pub struct CrateAnalysis {
|
||||
pub struct CrateAnalysis<'tcx> {
|
||||
pub exp_map2: middle::resolve::ExportMap2,
|
||||
pub exported_items: middle::privacy::ExportedItems,
|
||||
pub public_items: middle::privacy::PublicItems,
|
||||
pub ty_cx: ty::ctxt,
|
||||
pub ty_cx: ty::ctxt<'tcx>,
|
||||
pub reachable: NodeSet,
|
||||
pub name: String,
|
||||
}
|
||||
|
@ -312,10 +314,11 @@ pub struct CrateAnalysis {
|
|||
/// Run the resolution, typechecking, region checking and other
|
||||
/// miscellaneous analysis passes on the crate. Return various
|
||||
/// structures carrying the results of the analysis.
|
||||
pub fn phase_3_run_analysis_passes(sess: Session,
|
||||
krate: &ast::Crate,
|
||||
ast_map: syntax::ast_map::Map,
|
||||
name: String) -> CrateAnalysis {
|
||||
pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
|
||||
krate: &ast::Crate,
|
||||
ast_map: syntax::ast_map::Map,
|
||||
type_arena: &'tcx TypedArena<ty::t_box_>,
|
||||
name: String) -> CrateAnalysis<'tcx> {
|
||||
let time_passes = sess.time_passes();
|
||||
|
||||
time(time_passes, "external crate/lib resolution", (), |_|
|
||||
|
@ -362,6 +365,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
|
|||
stability::Index::build(krate));
|
||||
|
||||
let ty_cx = ty::mk_ctxt(sess,
|
||||
type_arena,
|
||||
def_map,
|
||||
named_region_map,
|
||||
ast_map,
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
use std::io::{mod, MemReader};
|
||||
use std::from_str::FromStr;
|
||||
use std::option;
|
||||
|
||||
use arena::TypedArena;
|
||||
|
||||
#[deriving(PartialEq, Show)]
|
||||
pub enum PpSourceMode {
|
||||
|
@ -114,7 +114,9 @@ fn call_with_pp_support<A,B>(&self,
|
|||
}
|
||||
PpmTyped => {
|
||||
let ast_map = ast_map.expect("--pretty=typed missing ast_map");
|
||||
let analysis = driver::phase_3_run_analysis_passes(sess, krate, ast_map, id);
|
||||
let type_arena = TypedArena::new();
|
||||
let analysis = driver::phase_3_run_analysis_passes(sess, krate, ast_map,
|
||||
&type_arena, id);
|
||||
let annotation = TypedAnnotation { analysis: analysis };
|
||||
f(&annotation, payload)
|
||||
}
|
||||
|
@ -260,25 +262,25 @@ fn post(&self,
|
|||
}
|
||||
|
||||
|
||||
struct TypedAnnotation {
|
||||
analysis: CrateAnalysis,
|
||||
struct TypedAnnotation<'tcx> {
|
||||
analysis: CrateAnalysis<'tcx>,
|
||||
}
|
||||
|
||||
impl PrinterSupport for TypedAnnotation {
|
||||
impl<'tcx> PrinterSupport for TypedAnnotation<'tcx> {
|
||||
fn pp_ann<'a>(&'a self) -> &'a pprust::PpAnn { self as &pprust::PpAnn }
|
||||
}
|
||||
|
||||
impl SessionCarrier for TypedAnnotation {
|
||||
impl<'tcx> SessionCarrier for TypedAnnotation<'tcx> {
|
||||
fn sess<'a>(&'a self) -> &'a Session { &self.analysis.ty_cx.sess }
|
||||
}
|
||||
|
||||
impl AstMapCarrier for TypedAnnotation {
|
||||
impl<'tcx> AstMapCarrier for TypedAnnotation<'tcx> {
|
||||
fn ast_map<'a>(&'a self) -> Option<&'a ast_map::Map> {
|
||||
Some(&self.analysis.ty_cx.map)
|
||||
}
|
||||
}
|
||||
|
||||
impl pprust::PpAnn for TypedAnnotation {
|
||||
impl<'tcx> pprust::PpAnn for TypedAnnotation<'tcx> {
|
||||
fn pre(&self,
|
||||
s: &mut pprust::State,
|
||||
node: pprust::AnnNode) -> io::IoResult<()> {
|
||||
|
@ -531,8 +533,9 @@ pub fn pretty_print_input(sess: Session,
|
|||
match code {
|
||||
Some(code) => {
|
||||
let variants = gather_flowgraph_variants(&sess);
|
||||
let type_arena = TypedArena::new();
|
||||
let analysis = driver::phase_3_run_analysis_passes(sess, &krate,
|
||||
ast_map, id);
|
||||
ast_map, &type_arena, id);
|
||||
print_flowgraph(variants, analysis, code, out)
|
||||
}
|
||||
None => {
|
||||
|
|
|
@ -340,11 +340,11 @@ fn is_comparison(binop: ast::BinOp) -> bool {
|
|||
declare_lint!(CTYPES, Warn,
|
||||
"proper use of libc types in foreign modules")
|
||||
|
||||
struct CTypesVisitor<'a> {
|
||||
cx: &'a Context<'a>
|
||||
struct CTypesVisitor<'a, 'tcx: 'a> {
|
||||
cx: &'a Context<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> CTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> CTypesVisitor<'a, 'tcx> {
|
||||
fn check_def(&mut self, sp: Span, ty_id: ast::NodeId, path_id: ast::NodeId) {
|
||||
match self.cx.tcx.def_map.borrow().get_copy(&path_id) {
|
||||
def::DefPrimTy(ast::TyInt(ast::TyI)) => {
|
||||
|
@ -375,7 +375,7 @@ fn check_def(&mut self, sp: Span, ty_id: ast::NodeId, path_id: ast::NodeId) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for CTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for CTypesVisitor<'a, 'tcx> {
|
||||
fn visit_ty(&mut self, ty: &ast::Ty, _: ()) {
|
||||
match ty.node {
|
||||
ast::TyPath(_, _, id) => self.check_def(ty.span, ty.id, id),
|
||||
|
@ -505,11 +505,11 @@ fn check_expr(&mut self, cx: &Context, e: &ast::Expr) {
|
|||
declare_lint!(RAW_POINTER_DERIVING, Warn,
|
||||
"uses of #[deriving] with raw pointers are rarely correct")
|
||||
|
||||
struct RawPtrDerivingVisitor<'a> {
|
||||
cx: &'a Context<'a>
|
||||
struct RawPtrDerivingVisitor<'a, 'tcx: 'a> {
|
||||
cx: &'a Context<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for RawPtrDerivingVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for RawPtrDerivingVisitor<'a, 'tcx> {
|
||||
fn visit_ty(&mut self, ty: &ast::Ty, _: ()) {
|
||||
static MSG: &'static str = "use of `#[deriving]` with a raw pointer";
|
||||
match ty.node {
|
||||
|
|
|
@ -231,9 +231,9 @@ pub fn process_command_line(&mut self, sess: &Session) {
|
|||
}
|
||||
|
||||
/// Context for lint checking.
|
||||
pub struct Context<'a> {
|
||||
pub struct Context<'a, 'tcx: 'a> {
|
||||
/// Type context we're checking in.
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
/// The crate being checked.
|
||||
pub krate: &'a ast::Crate,
|
||||
|
@ -345,10 +345,10 @@ pub fn raw_emit_lint(sess: &Session, lint: &'static Lint,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Context<'a> {
|
||||
fn new(tcx: &'a ty::ctxt,
|
||||
impl<'a, 'tcx> Context<'a, 'tcx> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>,
|
||||
krate: &'a ast::Crate,
|
||||
exported_items: &'a ExportedItems) -> Context<'a> {
|
||||
exported_items: &'a ExportedItems) -> Context<'a, 'tcx> {
|
||||
// We want to own the lint store, so move it out of the session.
|
||||
let lint_store = mem::replace(&mut *tcx.sess.lint_store.borrow_mut(),
|
||||
LintStore::new());
|
||||
|
@ -476,8 +476,8 @@ fn visit_ids(&self, f: |&mut ast_util::IdVisitor<Context>|) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> AstConv for Context<'a>{
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.tcx }
|
||||
impl<'a, 'tcx> AstConv<'tcx> for Context<'a, 'tcx>{
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.tcx }
|
||||
|
||||
fn get_item_ty(&self, id: ast::DefId) -> ty::Polytype {
|
||||
ty::lookup_item_type(self.tcx, id)
|
||||
|
@ -492,7 +492,7 @@ fn ty_infer(&self, _span: Span) -> ty::t {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for Context<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for Context<'a, 'tcx> {
|
||||
fn visit_item(&mut self, it: &ast::Item, _: ()) {
|
||||
self.with_lint_attrs(it.attrs.as_slice(), |cx| {
|
||||
run_lints!(cx, check_item, it);
|
||||
|
@ -663,7 +663,7 @@ fn visit_attribute(&mut self, attr: &ast::Attribute, _: ()) {
|
|||
}
|
||||
|
||||
// Output any lints that were previously added to the session.
|
||||
impl<'a> IdVisitingOperation for Context<'a> {
|
||||
impl<'a, 'tcx> IdVisitingOperation for Context<'a, 'tcx> {
|
||||
fn visit_id(&self, id: ast::NodeId) {
|
||||
match self.tcx.sess.lints.borrow_mut().pop(&id) {
|
||||
None => {}
|
||||
|
|
|
@ -71,9 +71,9 @@ pub enum InlinedTraitItemRef<'a> {
|
|||
rbml_w: &mut Encoder,
|
||||
ii: InlinedItemRef|: 'a;
|
||||
|
||||
pub struct EncodeParams<'a> {
|
||||
pub struct EncodeParams<'a, 'tcx: 'a> {
|
||||
pub diag: &'a SpanHandler,
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
pub reexports2: &'a middle::resolve::ExportMap2,
|
||||
pub item_symbols: &'a RefCell<NodeMap<String>>,
|
||||
pub non_inlineable_statics: &'a RefCell<NodeSet>,
|
||||
|
@ -83,9 +83,9 @@ pub struct EncodeParams<'a> {
|
|||
pub reachable: &'a NodeSet,
|
||||
}
|
||||
|
||||
pub struct EncodeContext<'a> {
|
||||
pub struct EncodeContext<'a, 'tcx: 'a> {
|
||||
pub diag: &'a SpanHandler,
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
pub reexports2: &'a middle::resolve::ExportMap2,
|
||||
pub item_symbols: &'a RefCell<NodeMap<String>>,
|
||||
pub non_inlineable_statics: &'a RefCell<NodeSet>,
|
||||
|
@ -1793,12 +1793,12 @@ fn visit_struct_field(&mut self, field: &ast::StructField, _: ()) {
|
|||
|
||||
|
||||
|
||||
struct ImplVisitor<'a,'b:'a,'c:'a> {
|
||||
ecx: &'a EncodeContext<'b>,
|
||||
struct ImplVisitor<'a, 'b:'a, 'c:'a, 'tcx:'b> {
|
||||
ecx: &'a EncodeContext<'b, 'tcx>,
|
||||
rbml_w: &'a mut Encoder<'c>,
|
||||
}
|
||||
|
||||
impl<'a,'b,'c> Visitor<()> for ImplVisitor<'a,'b,'c> {
|
||||
impl<'a, 'b, 'c, 'tcx> Visitor<()> for ImplVisitor<'a, 'b, 'c, 'tcx> {
|
||||
fn visit_item(&mut self, item: &Item, _: ()) {
|
||||
match item.node {
|
||||
ItemImpl(_, Some(ref trait_ref), _, _) => {
|
||||
|
|
|
@ -59,11 +59,11 @@ pub enum DefIdSource {
|
|||
pub type conv_did<'a> =
|
||||
|source: DefIdSource, ast::DefId|: 'a -> ast::DefId;
|
||||
|
||||
pub struct PState<'a> {
|
||||
pub struct PState<'a, 'tcx: 'a> {
|
||||
data: &'a [u8],
|
||||
krate: ast::CrateNum,
|
||||
pos: uint,
|
||||
tcx: &'a ty::ctxt
|
||||
tcx: &'a ty::ctxt<'tcx>
|
||||
}
|
||||
|
||||
fn peek(st: &PState) -> char {
|
||||
|
@ -105,8 +105,9 @@ fn parse_ident_(st: &mut PState, is_last: |char| -> bool) -> ast::Ident {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn parse_state_from_data<'a>(data: &'a [u8], crate_num: ast::CrateNum,
|
||||
pos: uint, tcx: &'a ty::ctxt) -> PState<'a> {
|
||||
pub fn parse_state_from_data<'a, 'tcx>(data: &'a [u8], crate_num: ast::CrateNum,
|
||||
pos: uint, tcx: &'a ty::ctxt<'tcx>)
|
||||
-> PState<'a, 'tcx> {
|
||||
PState {
|
||||
data: data,
|
||||
krate: crate_num,
|
||||
|
|
|
@ -31,12 +31,12 @@
|
|||
|
||||
macro_rules! mywrite( ($($arg:tt)*) => ({ write!($($arg)*); }) )
|
||||
|
||||
pub struct ctxt<'a> {
|
||||
pub struct ctxt<'a, 'tcx: 'a> {
|
||||
pub diag: &'a SpanHandler,
|
||||
// Def -> str Callback:
|
||||
pub ds: fn(DefId) -> String,
|
||||
// The type context.
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
pub abbrevs: &'a abbrev_map
|
||||
}
|
||||
|
||||
|
|
|
@ -54,13 +54,13 @@
|
|||
#[cfg(test)] use syntax::print::pprust;
|
||||
#[cfg(test)] use std::gc::Gc;
|
||||
|
||||
struct DecodeContext<'a> {
|
||||
struct DecodeContext<'a, 'tcx: 'a> {
|
||||
cdata: &'a cstore::crate_metadata,
|
||||
tcx: &'a ty::ctxt,
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
}
|
||||
|
||||
struct ExtendedDecodeContext<'a> {
|
||||
dcx: &'a DecodeContext<'a>,
|
||||
struct ExtendedDecodeContext<'a, 'tcx: 'a> {
|
||||
dcx: &'a DecodeContext<'a, 'tcx>,
|
||||
from_id_range: ast_util::IdRange,
|
||||
to_id_range: ast_util::IdRange
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ fn reserve_id_range(sess: &Session,
|
|||
ast_util::IdRange { min: to_id_min, max: to_id_max }
|
||||
}
|
||||
|
||||
impl<'a> ExtendedDecodeContext<'a> {
|
||||
impl<'a, 'tcx> ExtendedDecodeContext<'a, 'tcx> {
|
||||
pub fn tr_id(&self, id: ast::NodeId) -> ast::NodeId {
|
||||
/*!
|
||||
* Translates an internal id, meaning a node id that is known
|
||||
|
@ -382,11 +382,11 @@ fn decode_ast(par_doc: rbml::Doc) -> ast::InlinedItem {
|
|||
Decodable::decode(&mut d).unwrap()
|
||||
}
|
||||
|
||||
struct AstRenumberer<'a> {
|
||||
xcx: &'a ExtendedDecodeContext<'a>,
|
||||
struct AstRenumberer<'a, 'tcx: 'a> {
|
||||
xcx: &'a ExtendedDecodeContext<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> ast_map::FoldOps for AstRenumberer<'a> {
|
||||
impl<'a, 'tcx> ast_map::FoldOps for AstRenumberer<'a, 'tcx> {
|
||||
fn new_id(&self, id: ast::NodeId) -> ast::NodeId {
|
||||
if id == ast::DUMMY_NODE_ID {
|
||||
// Used by ast_map to map the NodeInlinedParent.
|
||||
|
@ -914,12 +914,12 @@ fn encode_vec_per_param_space<T>(rbml_w: &mut Encoder,
|
|||
// ______________________________________________________________________
|
||||
// Encoding and decoding the side tables
|
||||
|
||||
trait get_ty_str_ctxt {
|
||||
fn ty_str_ctxt<'a>(&'a self) -> tyencode::ctxt<'a>;
|
||||
trait get_ty_str_ctxt<'tcx> {
|
||||
fn ty_str_ctxt<'a>(&'a self) -> tyencode::ctxt<'a, 'tcx>;
|
||||
}
|
||||
|
||||
impl<'a> get_ty_str_ctxt for e::EncodeContext<'a> {
|
||||
fn ty_str_ctxt<'a>(&'a self) -> tyencode::ctxt<'a> {
|
||||
impl<'a, 'tcx> get_ty_str_ctxt<'tcx> for e::EncodeContext<'a, 'tcx> {
|
||||
fn ty_str_ctxt<'a>(&'a self) -> tyencode::ctxt<'a, 'tcx> {
|
||||
tyencode::ctxt {
|
||||
diag: self.tcx.sess.diagnostic(),
|
||||
ds: e::def_to_string,
|
||||
|
|
|
@ -79,14 +79,14 @@ fn owned_ptr_base_path_helper(loan_path: &Rc<LoanPath>) -> Option<Rc<LoanPath>>
|
|||
}
|
||||
}
|
||||
|
||||
struct CheckLoanCtxt<'a> {
|
||||
bccx: &'a BorrowckCtxt<'a>,
|
||||
dfcx_loans: &'a LoanDataFlow<'a>,
|
||||
move_data: move_data::FlowedMoveData<'a>,
|
||||
struct CheckLoanCtxt<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
dfcx_loans: &'a LoanDataFlow<'a, 'tcx>,
|
||||
move_data: move_data::FlowedMoveData<'a, 'tcx>,
|
||||
all_loans: &'a [Loan],
|
||||
}
|
||||
|
||||
impl<'a> euv::Delegate for CheckLoanCtxt<'a> {
|
||||
impl<'a, 'tcx> euv::Delegate for CheckLoanCtxt<'a, 'tcx> {
|
||||
fn consume(&mut self,
|
||||
consume_id: ast::NodeId,
|
||||
consume_span: Span,
|
||||
|
@ -179,12 +179,12 @@ fn mutate(&mut self,
|
|||
fn decl_without_init(&mut self, _id: ast::NodeId, _span: Span) { }
|
||||
}
|
||||
|
||||
pub fn check_loans(bccx: &BorrowckCtxt,
|
||||
dfcx_loans: &LoanDataFlow,
|
||||
move_data: move_data::FlowedMoveData,
|
||||
all_loans: &[Loan],
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block) {
|
||||
pub fn check_loans<'a, 'b, 'c, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
|
||||
dfcx_loans: &LoanDataFlow<'b, 'tcx>,
|
||||
move_data: move_data::FlowedMoveData<'c, 'tcx>,
|
||||
all_loans: &[Loan],
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block) {
|
||||
debug!("check_loans(body id={:?})", body.id);
|
||||
|
||||
let mut clcx = CheckLoanCtxt {
|
||||
|
@ -212,8 +212,8 @@ fn compatible_borrow_kinds(borrow_kind1: ty::BorrowKind,
|
|||
borrow_kind1 == ty::ImmBorrow && borrow_kind2 == ty::ImmBorrow
|
||||
}
|
||||
|
||||
impl<'a> CheckLoanCtxt<'a> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt { self.bccx.tcx }
|
||||
impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt<'tcx> { self.bccx.tcx }
|
||||
|
||||
pub fn each_issued_loan(&self, scope_id: ast::NodeId, op: |&Loan| -> bool)
|
||||
-> bool {
|
||||
|
|
|
@ -45,8 +45,8 @@ pub fn guarantee_lifetime(bccx: &BorrowckCtxt,
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// Private
|
||||
|
||||
struct GuaranteeLifetimeContext<'a> {
|
||||
bccx: &'a BorrowckCtxt<'a>,
|
||||
struct GuaranteeLifetimeContext<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
|
||||
// the node id of the function body for the enclosing item
|
||||
item_scope_id: ast::NodeId,
|
||||
|
@ -57,7 +57,7 @@ struct GuaranteeLifetimeContext<'a> {
|
|||
cmt_original: mc::cmt
|
||||
}
|
||||
|
||||
impl<'a> GuaranteeLifetimeContext<'a> {
|
||||
impl<'a, 'tcx> GuaranteeLifetimeContext<'a, 'tcx> {
|
||||
|
||||
fn check(&self, cmt: &mc::cmt, discr_scope: Option<ast::NodeId>) -> R {
|
||||
//! Main routine. Walks down `cmt` until we find the "guarantor".
|
||||
|
|
|
@ -57,15 +57,15 @@ pub fn gather_loans_in_fn(bccx: &BorrowckCtxt,
|
|||
(all_loans, move_data)
|
||||
}
|
||||
|
||||
struct GatherLoanCtxt<'a> {
|
||||
bccx: &'a BorrowckCtxt<'a>,
|
||||
struct GatherLoanCtxt<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
move_data: move_data::MoveData,
|
||||
move_error_collector: move_error::MoveErrorCollector,
|
||||
all_loans: Vec<Loan>,
|
||||
item_ub: ast::NodeId,
|
||||
}
|
||||
|
||||
impl<'a> euv::Delegate for GatherLoanCtxt<'a> {
|
||||
impl<'a, 'tcx> euv::Delegate for GatherLoanCtxt<'a, 'tcx> {
|
||||
fn consume(&mut self,
|
||||
consume_id: ast::NodeId,
|
||||
_consume_span: Span,
|
||||
|
@ -204,8 +204,8 @@ fn check_aliasability(bccx: &BorrowckCtxt,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> GatherLoanCtxt<'a> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt { self.bccx.tcx }
|
||||
impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt<'tcx> { self.bccx.tcx }
|
||||
|
||||
fn guarantee_valid(&mut self,
|
||||
borrow_id: ast::NodeId,
|
||||
|
@ -467,11 +467,11 @@ pub fn report_potential_errors(&self) {
|
|||
///
|
||||
/// This visitor walks static initializer's expressions and makes
|
||||
/// sure the loans being taken are sound.
|
||||
struct StaticInitializerCtxt<'a> {
|
||||
bccx: &'a BorrowckCtxt<'a>
|
||||
struct StaticInitializerCtxt<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for StaticInitializerCtxt<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for StaticInitializerCtxt<'a, 'tcx> {
|
||||
fn visit_expr(&mut self, ex: &Expr, _: ()) {
|
||||
match ex.node {
|
||||
ast::ExprAddrOf(mutbl, ref base) => {
|
||||
|
|
|
@ -44,14 +44,14 @@ pub fn compute_restrictions(bccx: &BorrowckCtxt,
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// Private
|
||||
|
||||
struct RestrictionsContext<'a> {
|
||||
bccx: &'a BorrowckCtxt<'a>,
|
||||
struct RestrictionsContext<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
span: Span,
|
||||
loan_region: ty::Region,
|
||||
cause: euv::LoanCause,
|
||||
}
|
||||
|
||||
impl<'a> RestrictionsContext<'a> {
|
||||
impl<'a, 'tcx> RestrictionsContext<'a, 'tcx> {
|
||||
fn restrict(&self,
|
||||
cmt: mc::cmt) -> RestrictionResult {
|
||||
debug!("restrict(cmt={})", cmt.repr(self.bccx.tcx));
|
||||
|
|
|
@ -43,14 +43,14 @@ pub fn short_name(&self) -> &'static str {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct DataflowLabeller<'a> {
|
||||
pub struct DataflowLabeller<'a, 'tcx: 'a> {
|
||||
pub inner: cfg_dot::LabelledCFG<'a>,
|
||||
pub variants: Vec<Variant>,
|
||||
pub borrowck_ctxt: &'a BorrowckCtxt<'a>,
|
||||
pub analysis_data: &'a borrowck::AnalysisData<'a>,
|
||||
pub borrowck_ctxt: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
pub analysis_data: &'a borrowck::AnalysisData<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> DataflowLabeller<'a> {
|
||||
impl<'a, 'tcx> DataflowLabeller<'a, 'tcx> {
|
||||
fn dataflow_for(&self, e: EntryOrExit, n: &Node<'a>) -> String {
|
||||
let id = n.val1().data.id;
|
||||
debug!("dataflow_for({}, id={}) {}", e, id, self.variants);
|
||||
|
@ -77,7 +77,7 @@ fn dataflow_for_variant(&self, e: EntryOrExit, n: &Node, v: Variant) -> String {
|
|||
fn build_set<O:DataFlowOperator>(&self,
|
||||
e: EntryOrExit,
|
||||
cfgidx: CFGIndex,
|
||||
dfcx: &DataFlowContext<'a, O>,
|
||||
dfcx: &DataFlowContext<'a, 'tcx, O>,
|
||||
to_lp: |uint| -> Rc<LoanPath>) -> String {
|
||||
let mut saw_some = false;
|
||||
let mut set = "{".to_string();
|
||||
|
@ -126,7 +126,7 @@ fn dataflow_assigns_for(&self, e: EntryOrExit, cfgidx: CFGIndex) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> dot::Labeller<'a, Node<'a>, Edge<'a>> for DataflowLabeller<'a> {
|
||||
impl<'a, 'tcx> dot::Labeller<'a, Node<'a>, Edge<'a>> for DataflowLabeller<'a, 'tcx> {
|
||||
fn graph_id(&'a self) -> dot::Id<'a> { self.inner.graph_id() }
|
||||
fn node_id(&'a self, n: &Node<'a>) -> dot::Id<'a> { self.inner.node_id(n) }
|
||||
fn node_label(&'a self, n: &Node<'a>) -> dot::LabelText<'a> {
|
||||
|
@ -140,7 +140,7 @@ fn node_label(&'a self, n: &Node<'a>) -> dot::LabelText<'a> {
|
|||
fn edge_label(&'a self, e: &Edge<'a>) -> dot::LabelText<'a> { self.inner.edge_label(e) }
|
||||
}
|
||||
|
||||
impl<'a> dot::GraphWalk<'a, Node<'a>, Edge<'a>> for DataflowLabeller<'a> {
|
||||
impl<'a, 'tcx> dot::GraphWalk<'a, Node<'a>, Edge<'a>> for DataflowLabeller<'a, 'tcx> {
|
||||
fn nodes(&self) -> dot::Nodes<'a, Node<'a>> { self.inner.nodes() }
|
||||
fn edges(&self) -> dot::Edges<'a, Edge<'a>> { self.inner.edges() }
|
||||
fn source(&self, edge: &Edge<'a>) -> Node<'a> { self.inner.source(edge) }
|
||||
|
|
|
@ -58,9 +58,9 @@ macro_rules! if_ok(
|
|||
#[deriving(Clone)]
|
||||
pub struct LoanDataFlowOperator;
|
||||
|
||||
pub type LoanDataFlow<'a> = DataFlowContext<'a, LoanDataFlowOperator>;
|
||||
pub type LoanDataFlow<'a, 'tcx> = DataFlowContext<'a, 'tcx, LoanDataFlowOperator>;
|
||||
|
||||
impl<'a> Visitor<()> for BorrowckCtxt<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for BorrowckCtxt<'a, 'tcx> {
|
||||
fn visit_fn(&mut self, fk: &FnKind, fd: &FnDecl,
|
||||
b: &Block, s: Span, n: NodeId, _: ()) {
|
||||
borrowck_fn(self, fk, fd, b, s, n);
|
||||
|
@ -120,10 +120,10 @@ fn borrowck_item(this: &mut BorrowckCtxt, item: &ast::Item) {
|
|||
}
|
||||
|
||||
/// Collection of conclusions determined via borrow checker analyses.
|
||||
pub struct AnalysisData<'a> {
|
||||
pub struct AnalysisData<'a, 'tcx: 'a> {
|
||||
pub all_loans: Vec<Loan>,
|
||||
pub loans: DataFlowContext<'a, LoanDataFlowOperator>,
|
||||
pub move_data: move_data::FlowedMoveData<'a>,
|
||||
pub loans: DataFlowContext<'a, 'tcx, LoanDataFlowOperator>,
|
||||
pub move_data: move_data::FlowedMoveData<'a, 'tcx>,
|
||||
}
|
||||
|
||||
fn borrowck_fn(this: &mut BorrowckCtxt,
|
||||
|
@ -145,13 +145,13 @@ fn borrowck_fn(this: &mut BorrowckCtxt,
|
|||
visit::walk_fn(this, fk, decl, body, sp, ());
|
||||
}
|
||||
|
||||
fn build_borrowck_dataflow_data<'a>(this: &mut BorrowckCtxt<'a>,
|
||||
fk: &FnKind,
|
||||
decl: &ast::FnDecl,
|
||||
cfg: &cfg::CFG,
|
||||
body: &ast::Block,
|
||||
sp: Span,
|
||||
id: ast::NodeId) -> AnalysisData<'a> {
|
||||
fn build_borrowck_dataflow_data<'a, 'tcx>(this: &mut BorrowckCtxt<'a, 'tcx>,
|
||||
fk: &FnKind,
|
||||
decl: &ast::FnDecl,
|
||||
cfg: &cfg::CFG,
|
||||
body: &ast::Block,
|
||||
sp: Span,
|
||||
id: ast::NodeId) -> AnalysisData<'a, 'tcx> {
|
||||
// Check the body of fn items.
|
||||
let id_range = ast_util::compute_id_range_for_fn_body(fk, decl, body, sp, id);
|
||||
let (all_loans, move_data) =
|
||||
|
@ -200,9 +200,9 @@ pub fn from_fn_like(f: &'a FnLikeNode,
|
|||
|
||||
/// Accessor for introspective clients inspecting `AnalysisData` and
|
||||
/// the `BorrowckCtxt` itself , e.g. the flowgraph visualizer.
|
||||
pub fn build_borrowck_dataflow_data_for_fn<'a>(
|
||||
tcx: &'a ty::ctxt,
|
||||
input: FnPartsWithCFG<'a>) -> (BorrowckCtxt<'a>, AnalysisData<'a>) {
|
||||
pub fn build_borrowck_dataflow_data_for_fn<'a, 'tcx>(
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
input: FnPartsWithCFG<'a>) -> (BorrowckCtxt<'a, 'tcx>, AnalysisData<'a, 'tcx>) {
|
||||
|
||||
let mut bccx = BorrowckCtxt {
|
||||
tcx: tcx,
|
||||
|
@ -230,8 +230,8 @@ pub fn build_borrowck_dataflow_data_for_fn<'a>(
|
|||
// ----------------------------------------------------------------------
|
||||
// Type definitions
|
||||
|
||||
pub struct BorrowckCtxt<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct BorrowckCtxt<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
// Statistics:
|
||||
stats: Gc<BorrowStats>,
|
||||
|
@ -390,7 +390,7 @@ pub enum MovedValueUseKind {
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// Misc
|
||||
|
||||
impl<'a> BorrowckCtxt<'a> {
|
||||
impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
|
||||
pub fn is_subregion_of(&self, r_sub: ty::Region, r_sup: ty::Region)
|
||||
-> bool {
|
||||
self.tcx.region_maps.is_subregion_of(r_sub, r_sup)
|
||||
|
@ -401,7 +401,7 @@ pub fn is_subscope_of(&self, r_sub: ast::NodeId, r_sup: ast::NodeId)
|
|||
self.tcx.region_maps.is_subscope_of(r_sub, r_sup)
|
||||
}
|
||||
|
||||
pub fn mc(&self) -> mc::MemCategorizationContext<'a,ty::ctxt> {
|
||||
pub fn mc(&self) -> mc::MemCategorizationContext<'a, ty::ctxt<'tcx>> {
|
||||
mc::MemCategorizationContext::new(self.tcx)
|
||||
}
|
||||
|
||||
|
|
|
@ -56,15 +56,15 @@ pub struct MoveData {
|
|||
pub assignee_ids: RefCell<HashSet<ast::NodeId>>,
|
||||
}
|
||||
|
||||
pub struct FlowedMoveData<'a> {
|
||||
pub struct FlowedMoveData<'a, 'tcx: 'a> {
|
||||
pub move_data: MoveData,
|
||||
|
||||
pub dfcx_moves: MoveDataFlow<'a>,
|
||||
pub dfcx_moves: MoveDataFlow<'a, 'tcx>,
|
||||
|
||||
// We could (and maybe should, for efficiency) combine both move
|
||||
// and assign data flow into one, but this way it's easier to
|
||||
// distinguish the bits that correspond to moves and assignments.
|
||||
pub dfcx_assign: AssignDataFlow<'a>
|
||||
pub dfcx_assign: AssignDataFlow<'a, 'tcx>
|
||||
}
|
||||
|
||||
/// Index into `MoveData.paths`, used like a pointer
|
||||
|
@ -154,12 +154,12 @@ pub struct Assignment {
|
|||
#[deriving(Clone)]
|
||||
pub struct MoveDataFlowOperator;
|
||||
|
||||
pub type MoveDataFlow<'a> = DataFlowContext<'a, MoveDataFlowOperator>;
|
||||
pub type MoveDataFlow<'a, 'tcx> = DataFlowContext<'a, 'tcx, MoveDataFlowOperator>;
|
||||
|
||||
#[deriving(Clone)]
|
||||
pub struct AssignDataFlowOperator;
|
||||
|
||||
pub type AssignDataFlow<'a> = DataFlowContext<'a, AssignDataFlowOperator>;
|
||||
pub type AssignDataFlow<'a, 'tcx> = DataFlowContext<'a, 'tcx, AssignDataFlowOperator>;
|
||||
|
||||
fn loan_path_is_precise(loan_path: &LoanPath) -> bool {
|
||||
match *loan_path {
|
||||
|
@ -531,14 +531,14 @@ fn kill_moves(&self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> FlowedMoveData<'a> {
|
||||
impl<'a, 'tcx> FlowedMoveData<'a, 'tcx> {
|
||||
pub fn new(move_data: MoveData,
|
||||
tcx: &'a ty::ctxt,
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
cfg: &cfg::CFG,
|
||||
id_range: ast_util::IdRange,
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block)
|
||||
-> FlowedMoveData<'a> {
|
||||
-> FlowedMoveData<'a, 'tcx> {
|
||||
let mut dfcx_moves =
|
||||
DataFlowContext::new(tcx,
|
||||
"flowed_move_data_moves",
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
use std::gc::Gc;
|
||||
|
||||
struct CFGBuilder<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct CFGBuilder<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
exit_map: NodeMap<CFGIndex>,
|
||||
graph: CFGGraph,
|
||||
fn_exit: CFGIndex,
|
||||
|
@ -65,7 +65,7 @@ fn add_initial_dummy_node(g: &mut CFGGraph) -> CFGIndex {
|
|||
g.add_node(CFGNodeData { id: ast::DUMMY_NODE_ID })
|
||||
}
|
||||
|
||||
impl<'a> CFGBuilder<'a> {
|
||||
impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
|
||||
fn block(&mut self, blk: &ast::Block, pred: CFGIndex) -> CFGIndex {
|
||||
let mut stmts_exit = pred;
|
||||
for stmt in blk.stmts.iter() {
|
||||
|
|
|
@ -21,11 +21,11 @@
|
|||
use syntax::visit::Visitor;
|
||||
use syntax::visit;
|
||||
|
||||
pub struct CheckCrateVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct CheckCrateVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<bool> for CheckCrateVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<bool> for CheckCrateVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &Item, env: bool) {
|
||||
check_item(self, i, env);
|
||||
}
|
||||
|
|
|
@ -86,8 +86,8 @@ fn from_iter<T: Iterator<Vec<Gc<Pat>>>>(mut iterator: T) -> Matrix {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct MatchCheckCtxt<'a> {
|
||||
pub tcx: &'a ty::ctxt
|
||||
pub struct MatchCheckCtxt<'a, 'tcx: 'a> {
|
||||
pub tcx: &'a ty::ctxt<'tcx>
|
||||
}
|
||||
|
||||
#[deriving(Clone, PartialEq)]
|
||||
|
@ -119,7 +119,7 @@ enum WitnessPreference {
|
|||
LeaveOutWitness
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for MatchCheckCtxt<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for MatchCheckCtxt<'a, 'tcx> {
|
||||
fn visit_expr(&mut self, ex: &Expr, _: ()) {
|
||||
check_expr(self, ex);
|
||||
}
|
||||
|
@ -304,13 +304,13 @@ fn const_val_to_expr(value: &const_val) -> Gc<Expr> {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct StaticInliner<'a> {
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub struct StaticInliner<'a, 'tcx: 'a> {
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
pub failed: bool
|
||||
}
|
||||
|
||||
impl<'a> StaticInliner<'a> {
|
||||
pub fn new<'a>(tcx: &'a ty::ctxt) -> StaticInliner<'a> {
|
||||
impl<'a, 'tcx> StaticInliner<'a, 'tcx> {
|
||||
pub fn new<'a>(tcx: &'a ty::ctxt<'tcx>) -> StaticInliner<'a, 'tcx> {
|
||||
StaticInliner {
|
||||
tcx: tcx,
|
||||
failed: false
|
||||
|
@ -318,7 +318,7 @@ pub fn new<'a>(tcx: &'a ty::ctxt) -> StaticInliner<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Folder for StaticInliner<'a> {
|
||||
impl<'a, 'tcx> Folder for StaticInliner<'a, 'tcx> {
|
||||
fn fold_pat(&mut self, pat: Gc<Pat>) -> Gc<Pat> {
|
||||
match pat.node {
|
||||
PatIdent(..) | PatEnum(..) => {
|
||||
|
@ -963,7 +963,7 @@ fn check_legality_of_move_bindings(cx: &MatchCheckCtxt,
|
|||
|
||||
/// Ensures that a pattern guard doesn't borrow by mutable reference or
|
||||
/// assign.
|
||||
fn check_for_mutation_in_guard<'a>(cx: &'a MatchCheckCtxt<'a>, guard: &Expr) {
|
||||
fn check_for_mutation_in_guard<'a, 'tcx>(cx: &'a MatchCheckCtxt<'a, 'tcx>, guard: &Expr) {
|
||||
let mut checker = MutationChecker {
|
||||
cx: cx,
|
||||
};
|
||||
|
@ -971,11 +971,11 @@ fn check_for_mutation_in_guard<'a>(cx: &'a MatchCheckCtxt<'a>, guard: &Expr) {
|
|||
visitor.walk_expr(guard);
|
||||
}
|
||||
|
||||
struct MutationChecker<'a> {
|
||||
cx: &'a MatchCheckCtxt<'a>,
|
||||
struct MutationChecker<'a, 'tcx: 'a> {
|
||||
cx: &'a MatchCheckCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> Delegate for MutationChecker<'a> {
|
||||
impl<'a, 'tcx> Delegate for MutationChecker<'a, 'tcx> {
|
||||
fn consume(&mut self, _: NodeId, _: Span, _: cmt, _: ConsumeMode) {}
|
||||
fn consume_pat(&mut self, _: &Pat, _: cmt, _: ConsumeMode) {}
|
||||
fn borrow(&mut self,
|
||||
|
@ -1020,11 +1020,11 @@ fn check_legality_of_bindings_in_at_patterns(cx: &MatchCheckCtxt, pat: &Pat) {
|
|||
visitor.visit_pat(pat, true);
|
||||
}
|
||||
|
||||
struct AtBindingPatternVisitor<'a,'b:'a> {
|
||||
cx: &'a MatchCheckCtxt<'b>,
|
||||
struct AtBindingPatternVisitor<'a, 'b:'a, 'tcx:'b> {
|
||||
cx: &'a MatchCheckCtxt<'b, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a,'b> Visitor<bool> for AtBindingPatternVisitor<'a,'b> {
|
||||
impl<'a, 'b, 'tcx> Visitor<bool> for AtBindingPatternVisitor<'a, 'b, 'tcx> {
|
||||
fn visit_pat(&mut self, pat: &Pat, bindings_allowed: bool) {
|
||||
if !bindings_allowed && pat_is_binding(&self.cx.tcx.def_map, pat) {
|
||||
self.cx.tcx.sess.span_err(pat.span,
|
||||
|
|
|
@ -26,11 +26,11 @@ pub fn check_crate(tcx: &ty::ctxt,
|
|||
visit::walk_crate(&mut rvcx, krate, ());
|
||||
}
|
||||
|
||||
struct RvalueContext<'a> {
|
||||
tcx: &'a ty::ctxt
|
||||
struct RvalueContext<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for RvalueContext<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for RvalueContext<'a, 'tcx> {
|
||||
fn visit_fn(&mut self,
|
||||
_: &visit::FnKind,
|
||||
fd: &ast::FnDecl,
|
||||
|
@ -43,7 +43,7 @@ fn visit_fn(&mut self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> euv::Delegate for RvalueContext<'a> {
|
||||
impl<'a, 'tcx> euv::Delegate for RvalueContext<'a, 'tcx> {
|
||||
fn consume(&mut self,
|
||||
_: ast::NodeId,
|
||||
span: Span,
|
||||
|
|
|
@ -52,15 +52,15 @@ fn safe_type_for_static_mut(cx: &ty::ctxt, e: &ast::Expr) -> Option<String> {
|
|||
Some(format!("mutable static items are not allowed to have {}", suffix))
|
||||
}
|
||||
|
||||
struct CheckStaticVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct CheckStaticVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
}
|
||||
|
||||
pub fn check_crate(tcx: &ty::ctxt, krate: &ast::Crate) {
|
||||
visit::walk_crate(&mut CheckStaticVisitor { tcx: tcx }, krate, false)
|
||||
}
|
||||
|
||||
impl<'a> CheckStaticVisitor<'a> {
|
||||
impl<'a, 'tcx> CheckStaticVisitor<'a, 'tcx> {
|
||||
fn report_error(&self, span: Span, result: Option<String>) -> bool {
|
||||
match result {
|
||||
None => { false }
|
||||
|
@ -72,7 +72,7 @@ fn report_error(&self, span: Span, result: Option<String>) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<bool> for CheckStaticVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<bool> for CheckStaticVisitor<'a, 'tcx> {
|
||||
|
||||
fn visit_item(&mut self, i: &ast::Item, _is_const: bool) {
|
||||
debug!("visit_item(item={})", pprust::item_to_string(i));
|
||||
|
|
|
@ -176,12 +176,12 @@ pub fn lookup_const_by_id(tcx: &ty::ctxt, def_id: ast::DefId)
|
|||
}
|
||||
}
|
||||
|
||||
struct ConstEvalVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct ConstEvalVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
ccache: constness_cache,
|
||||
}
|
||||
|
||||
impl<'a> ConstEvalVisitor<'a> {
|
||||
impl<'a, 'tcx> ConstEvalVisitor<'a, 'tcx> {
|
||||
fn classify(&mut self, e: &Expr) -> constness {
|
||||
let did = ast_util::local_def(e.id);
|
||||
match self.ccache.find(&did) {
|
||||
|
@ -266,7 +266,7 @@ fn lookup_constness(&self, e: &Expr) -> constness {
|
|||
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for ConstEvalVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for ConstEvalVisitor<'a, 'tcx> {
|
||||
fn visit_ty(&mut self, t: &Ty, _: ()) {
|
||||
match t.node {
|
||||
TyFixedLengthVec(_, expr) => {
|
||||
|
@ -365,8 +365,7 @@ pub fn eval_const_expr(tcx: &ty::ctxt, e: &Expr) -> const_val {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn eval_const_expr_partial<T: ty::ExprTyProvider>(tcx: &T, e: &Expr)
|
||||
-> Result<const_val, String> {
|
||||
pub fn eval_const_expr_partial(tcx: &ty::ctxt, e: &Expr) -> Result<const_val, String> {
|
||||
fn fromb(b: bool) -> Result<const_val, String> { Ok(const_int(b as i64)) }
|
||||
match e.node {
|
||||
ExprUnary(UnNeg, ref inner) => {
|
||||
|
@ -494,12 +493,11 @@ fn fromb(b: bool) -> Result<const_val, String> { Ok(const_int(b as i64)) }
|
|||
// This tends to get called w/o the type actually having been
|
||||
// populated in the ctxt, which was causing things to blow up
|
||||
// (#5900). Fall back to doing a limited lookup to get past it.
|
||||
let ety = ty::expr_ty_opt(tcx.ty_ctxt(), e)
|
||||
.or_else(|| astconv::ast_ty_to_prim_ty(tcx.ty_ctxt(), &**target_ty))
|
||||
let ety = ty::expr_ty_opt(tcx, e)
|
||||
.or_else(|| astconv::ast_ty_to_prim_ty(tcx, &**target_ty))
|
||||
.unwrap_or_else(|| {
|
||||
tcx.ty_ctxt().sess.span_fatal(target_ty.span,
|
||||
"target type not found for \
|
||||
const cast")
|
||||
tcx.sess.span_fatal(target_ty.span,
|
||||
"target type not found for const cast")
|
||||
});
|
||||
|
||||
let base = eval_const_expr_partial(tcx, &**base);
|
||||
|
@ -540,8 +538,8 @@ fn fromb(b: bool) -> Result<const_val, String> { Ok(const_int(b as i64)) }
|
|||
}
|
||||
}
|
||||
ExprPath(_) => {
|
||||
match lookup_const(tcx.ty_ctxt(), e) {
|
||||
Some(actual_e) => eval_const_expr_partial(tcx.ty_ctxt(), &*actual_e),
|
||||
match lookup_const(tcx, e) {
|
||||
Some(actual_e) => eval_const_expr_partial(tcx, &*actual_e),
|
||||
None => Err("non-constant path in constant expr".to_string())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
pub enum EntryOrExit { Entry, Exit }
|
||||
|
||||
#[deriving(Clone)]
|
||||
pub struct DataFlowContext<'a, O> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct DataFlowContext<'a, 'tcx: 'a, O> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
/// a name for the analysis using this dataflow instance
|
||||
analysis_name: &'static str,
|
||||
|
@ -80,8 +80,8 @@ pub trait DataFlowOperator : BitwiseOperator {
|
|||
fn initial_value(&self) -> bool;
|
||||
}
|
||||
|
||||
struct PropagationContext<'a, 'b:'a, O:'a> {
|
||||
dfcx: &'a mut DataFlowContext<'b, O>,
|
||||
struct PropagationContext<'a, 'b: 'a, 'tcx: 'b, O: 'a> {
|
||||
dfcx: &'a mut DataFlowContext<'b, 'tcx, O>,
|
||||
changed: bool
|
||||
}
|
||||
|
||||
|
@ -92,14 +92,14 @@ fn to_cfgidx_or_die(id: ast::NodeId, index: &NodeMap<CFGIndex>) -> CFGIndex {
|
|||
})
|
||||
}
|
||||
|
||||
impl<'a, O:DataFlowOperator> DataFlowContext<'a, O> {
|
||||
impl<'a, 'tcx, O:DataFlowOperator> DataFlowContext<'a, 'tcx, O> {
|
||||
fn has_bitset_for_nodeid(&self, n: ast::NodeId) -> bool {
|
||||
assert!(n != ast::DUMMY_NODE_ID);
|
||||
self.nodeid_to_index.contains_key(&n)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, O:DataFlowOperator> pprust::PpAnn for DataFlowContext<'a, O> {
|
||||
impl<'a, 'tcx, O:DataFlowOperator> pprust::PpAnn for DataFlowContext<'a, 'tcx, O> {
|
||||
fn pre(&self,
|
||||
ps: &mut pprust::State,
|
||||
node: pprust::AnnNode) -> io::IoResult<()> {
|
||||
|
@ -182,14 +182,14 @@ fn visit_pat(&mut self, p: &ast::Pat, e: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, O:DataFlowOperator> DataFlowContext<'a, O> {
|
||||
pub fn new(tcx: &'a ty::ctxt,
|
||||
impl<'a, 'tcx, O:DataFlowOperator> DataFlowContext<'a, 'tcx, O> {
|
||||
pub fn new(tcx: &'a ty::ctxt<'tcx>,
|
||||
analysis_name: &'static str,
|
||||
decl: Option<&ast::FnDecl>,
|
||||
cfg: &cfg::CFG,
|
||||
oper: O,
|
||||
id_range: IdRange,
|
||||
bits_per_id: uint) -> DataFlowContext<'a, O> {
|
||||
bits_per_id: uint) -> DataFlowContext<'a, 'tcx, O> {
|
||||
let words_per_id = (bits_per_id + uint::BITS - 1) / uint::BITS;
|
||||
let num_nodes = cfg.graph.all_nodes().len();
|
||||
|
||||
|
@ -427,8 +427,8 @@ pub fn add_kills_from_flow_exits(&mut self, cfg: &cfg::CFG) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, O:DataFlowOperator+Clone+'static> DataFlowContext<'a, O> {
|
||||
// ^^^^^^^^^^^^^ only needed for pretty printing
|
||||
impl<'a, 'tcx, O:DataFlowOperator+Clone+'static> DataFlowContext<'a, 'tcx, O> {
|
||||
// ^^^^^^^^^^^^^ only needed for pretty printing
|
||||
pub fn propagate(&mut self, cfg: &cfg::CFG, blk: &ast::Block) {
|
||||
//! Performs the data flow analysis.
|
||||
|
||||
|
@ -469,7 +469,7 @@ fn pretty_print_to(&self, wr: Box<io::Writer+'static>,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b, O:DataFlowOperator> PropagationContext<'a, 'b, O> {
|
||||
impl<'a, 'b, 'tcx, O:DataFlowOperator> PropagationContext<'a, 'b, 'tcx, O> {
|
||||
fn walk_cfg(&mut self,
|
||||
cfg: &cfg::CFG,
|
||||
in_out: &mut [uint]) {
|
||||
|
|
|
@ -47,9 +47,9 @@ fn should_explore(tcx: &ty::ctxt, def_id: ast::DefId) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
struct MarkSymbolVisitor<'a> {
|
||||
struct MarkSymbolVisitor<'a, 'tcx: 'a> {
|
||||
worklist: Vec<ast::NodeId>,
|
||||
tcx: &'a ty::ctxt,
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
live_symbols: Box<HashSet<ast::NodeId>>,
|
||||
}
|
||||
|
||||
|
@ -58,9 +58,9 @@ struct MarkSymbolVisitorContext {
|
|||
struct_has_extern_repr: bool
|
||||
}
|
||||
|
||||
impl<'a> MarkSymbolVisitor<'a> {
|
||||
fn new(tcx: &'a ty::ctxt,
|
||||
worklist: Vec<ast::NodeId>) -> MarkSymbolVisitor<'a> {
|
||||
impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>,
|
||||
worklist: Vec<ast::NodeId>) -> MarkSymbolVisitor<'a, 'tcx> {
|
||||
MarkSymbolVisitor {
|
||||
worklist: worklist,
|
||||
tcx: tcx,
|
||||
|
@ -232,7 +232,7 @@ fn visit_node(&mut self, node: &ast_map::Node) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<MarkSymbolVisitorContext> for MarkSymbolVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<MarkSymbolVisitorContext> for MarkSymbolVisitor<'a, 'tcx> {
|
||||
|
||||
fn visit_struct_def(&mut self, def: &ast::StructDef, _: ast::Ident, _: &ast::Generics,
|
||||
_: ast::NodeId, ctxt: MarkSymbolVisitorContext) {
|
||||
|
@ -418,12 +418,12 @@ fn get_struct_ctor_id(item: &ast::Item) -> Option<ast::NodeId> {
|
|||
}
|
||||
}
|
||||
|
||||
struct DeadVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct DeadVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
live_symbols: Box<HashSet<ast::NodeId>>,
|
||||
}
|
||||
|
||||
impl<'a> DeadVisitor<'a> {
|
||||
impl<'a, 'tcx> DeadVisitor<'a, 'tcx> {
|
||||
fn should_warn_about_field(&mut self, node: &ast::StructField_) -> bool {
|
||||
let is_named = node.ident().is_some();
|
||||
let field_type = ty::node_id_to_type(self.tcx, node.id);
|
||||
|
@ -490,7 +490,7 @@ fn warn_dead_code(&mut self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for DeadVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for DeadVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
let ctor_id = get_struct_ctor_id(item);
|
||||
if !self.symbol_is_live(item.id, ctor_id) && should_warn(item) {
|
||||
|
|
|
@ -37,14 +37,14 @@ fn type_is_unsafe_function(ty: ty::t) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
struct EffectCheckVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct EffectCheckVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
/// Whether we're in an unsafe context.
|
||||
unsafe_context: UnsafeContext,
|
||||
}
|
||||
|
||||
impl<'a> EffectCheckVisitor<'a> {
|
||||
impl<'a, 'tcx> EffectCheckVisitor<'a, 'tcx> {
|
||||
fn require_unsafe(&mut self, span: Span, description: &str) {
|
||||
match self.unsafe_context {
|
||||
SafeContext => {
|
||||
|
@ -86,7 +86,7 @@ fn check_str_index(&mut self, e: &ast::Expr) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for EffectCheckVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for EffectCheckVisitor<'a, 'tcx> {
|
||||
fn visit_fn(&mut self, fn_kind: &visit::FnKind, fn_decl: &ast::FnDecl,
|
||||
block: &ast::Block, span: Span, _: ast::NodeId, _:()) {
|
||||
|
||||
|
|
|
@ -214,7 +214,7 @@ macro_rules! return_if_err(
|
|||
)
|
||||
)
|
||||
|
||||
impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> {
|
||||
impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,TYPER> {
|
||||
pub fn new(delegate: &'d mut Delegate,
|
||||
typer: &'t TYPER)
|
||||
-> ExprUseVisitor<'d,'t,TYPER> {
|
||||
|
@ -246,7 +246,7 @@ fn walk_arg_patterns(&mut self,
|
|||
}
|
||||
}
|
||||
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
fn tcx(&self) -> &'t ty::ctxt<'tcx> {
|
||||
self.typer.tcx()
|
||||
}
|
||||
|
||||
|
|
|
@ -180,7 +180,7 @@ pub fn with_freevars<T>(tcx: &ty::ctxt, fid: ast::NodeId, f: |&[freevar_entry]|
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_capture_mode<T:Typer>(tcx: &T, closure_expr_id: ast::NodeId)
|
||||
-> CaptureMode {
|
||||
pub fn get_capture_mode<'tcx, T:Typer<'tcx>>(tcx: &T, closure_expr_id: ast::NodeId)
|
||||
-> CaptureMode {
|
||||
tcx.capture_mode(closure_expr_id)
|
||||
}
|
||||
|
|
|
@ -67,11 +67,11 @@ fn type_size_is_affected_by_type_parameters(tcx: &ty::ctxt, typ: ty::t)
|
|||
result
|
||||
}
|
||||
|
||||
struct IntrinsicCheckingVisitor<'a> {
|
||||
tcx: &'a ctxt,
|
||||
struct IntrinsicCheckingVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ctxt<'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> IntrinsicCheckingVisitor<'a> {
|
||||
impl<'a, 'tcx> IntrinsicCheckingVisitor<'a, 'tcx> {
|
||||
fn def_id_is_transmute(&self, def_id: DefId) -> bool {
|
||||
let intrinsic = match ty::get(ty::lookup_item_type(self.tcx, def_id).ty).sty {
|
||||
ty::ty_bare_fn(ref bfty) => bfty.abi == RustIntrinsic,
|
||||
|
@ -116,7 +116,7 @@ fn check_transmute(&self, span: Span, from: ty::t, to: ty::t, id: ast::NodeId) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for IntrinsicCheckingVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for IntrinsicCheckingVisitor<'a, 'tcx> {
|
||||
fn visit_expr(&mut self, expr: &ast::Expr, (): ()) {
|
||||
match expr.node {
|
||||
ast::ExprPath(..) => {
|
||||
|
|
|
@ -50,13 +50,13 @@
|
|||
// primitives in the stdlib are explicitly annotated to only take sendable
|
||||
// types.
|
||||
|
||||
pub struct Context<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct Context<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
struct_and_enum_bounds_checked: HashSet<ty::t>,
|
||||
parameter_environments: Vec<ParameterEnvironment>,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for Context<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for Context<'a, 'tcx> {
|
||||
fn visit_expr(&mut self, ex: &Expr, _: ()) {
|
||||
check_expr(self, ex);
|
||||
}
|
||||
|
@ -94,11 +94,11 @@ pub fn check_crate(tcx: &ty::ctxt,
|
|||
tcx.sess.abort_if_errors();
|
||||
}
|
||||
|
||||
struct EmptySubstsFolder<'a> {
|
||||
tcx: &'a ty::ctxt
|
||||
struct EmptySubstsFolder<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>
|
||||
}
|
||||
impl<'a> ty_fold::TypeFolder for EmptySubstsFolder<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'a, 'tcx> ty_fold::TypeFolder<'tcx> for EmptySubstsFolder<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.tcx
|
||||
}
|
||||
fn fold_substs(&mut self, _: &subst::Substs) -> subst::Substs {
|
||||
|
|
|
@ -179,7 +179,7 @@ fn live_node_kind_to_string(lnk: LiveNodeKind, cx: &ty::ctxt) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for IrMaps<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for IrMaps<'a, 'tcx> {
|
||||
fn visit_fn(&mut self, fk: &FnKind, fd: &FnDecl, b: &Block, s: Span, n: NodeId, _: ()) {
|
||||
visit_fn(self, fk, fd, b, s, n);
|
||||
}
|
||||
|
@ -252,8 +252,8 @@ enum VarKind {
|
|||
ImplicitRet
|
||||
}
|
||||
|
||||
struct IrMaps<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct IrMaps<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
num_live_nodes: uint,
|
||||
num_vars: uint,
|
||||
|
@ -264,8 +264,8 @@ struct IrMaps<'a> {
|
|||
lnks: Vec<LiveNodeKind>,
|
||||
}
|
||||
|
||||
impl<'a> IrMaps<'a> {
|
||||
fn new(tcx: &'a ty::ctxt) -> IrMaps<'a> {
|
||||
impl<'a, 'tcx> IrMaps<'a, 'tcx> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>) -> IrMaps<'a, 'tcx> {
|
||||
IrMaps {
|
||||
tcx: tcx,
|
||||
num_live_nodes: 0,
|
||||
|
@ -343,7 +343,7 @@ fn lnk(&self, ln: LiveNode) -> LiveNodeKind {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for Liveness<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for Liveness<'a, 'tcx> {
|
||||
fn visit_fn(&mut self, fk: &FnKind, fd: &FnDecl, b: &Block, s: Span, n: NodeId, _: ()) {
|
||||
check_fn(self, fk, fd, b, s, n);
|
||||
}
|
||||
|
@ -555,8 +555,8 @@ struct Specials {
|
|||
static ACC_WRITE: uint = 2u;
|
||||
static ACC_USE: uint = 4u;
|
||||
|
||||
struct Liveness<'a> {
|
||||
ir: &'a mut IrMaps<'a>,
|
||||
struct Liveness<'a, 'tcx: 'a> {
|
||||
ir: &'a mut IrMaps<'a, 'tcx>,
|
||||
s: Specials,
|
||||
successors: Vec<LiveNode>,
|
||||
users: Vec<Users>,
|
||||
|
@ -570,8 +570,8 @@ struct Liveness<'a> {
|
|||
cont_ln: NodeMap<LiveNode>
|
||||
}
|
||||
|
||||
impl<'a> Liveness<'a> {
|
||||
fn new(ir: &'a mut IrMaps<'a>, specials: Specials) -> Liveness<'a> {
|
||||
impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
||||
fn new(ir: &'a mut IrMaps<'a, 'tcx>, specials: Specials) -> Liveness<'a, 'tcx> {
|
||||
let num_live_nodes = ir.num_live_nodes;
|
||||
let num_vars = ir.num_vars;
|
||||
Liveness {
|
||||
|
@ -607,7 +607,7 @@ fn variable(&self, node_id: NodeId, span: Span) -> Variable {
|
|||
|
||||
fn pat_bindings(&mut self,
|
||||
pat: &Pat,
|
||||
f: |&mut Liveness<'a>, LiveNode, Variable, Span, NodeId|) {
|
||||
f: |&mut Liveness<'a, 'tcx>, LiveNode, Variable, Span, NodeId|) {
|
||||
pat_util::pat_bindings(&self.ir.tcx.def_map, pat, |_bm, p_id, sp, _n| {
|
||||
let ln = self.live_node(p_id, sp);
|
||||
let var = self.variable(p_id, sp);
|
||||
|
@ -617,7 +617,7 @@ fn pat_bindings(&mut self,
|
|||
|
||||
fn arm_pats_bindings(&mut self,
|
||||
pats: &[Gc<Pat>],
|
||||
f: |&mut Liveness<'a>, LiveNode, Variable, Span, NodeId|) {
|
||||
f: |&mut Liveness<'a, 'tcx>, LiveNode, Variable, Span, NodeId|) {
|
||||
// only consider the first pattern; any later patterns must have
|
||||
// the same bindings, and we also consider the first pattern to be
|
||||
// the "authoritative" set of ids
|
||||
|
@ -683,7 +683,7 @@ fn assigned_on_exit(&self, ln: LiveNode, var: Variable)
|
|||
fn indices2(&mut self,
|
||||
ln: LiveNode,
|
||||
succ_ln: LiveNode,
|
||||
op: |&mut Liveness<'a>, uint, uint|) {
|
||||
op: |&mut Liveness<'a, 'tcx>, uint, uint|) {
|
||||
let node_base_idx = self.idx(ln, Variable(0u));
|
||||
let succ_base_idx = self.idx(succ_ln, Variable(0u));
|
||||
for var_idx in range(0u, self.ir.num_vars) {
|
||||
|
@ -1376,7 +1376,7 @@ fn with_loop_nodes<R>(&mut self,
|
|||
loop_node_id: NodeId,
|
||||
break_ln: LiveNode,
|
||||
cont_ln: LiveNode,
|
||||
f: |&mut Liveness<'a>| -> R)
|
||||
f: |&mut Liveness<'a, 'tcx>| -> R)
|
||||
-> R {
|
||||
debug!("with_loop_nodes: {} {}", loop_node_id, break_ln.get());
|
||||
self.loop_scope.push(loop_node_id);
|
||||
|
@ -1465,7 +1465,7 @@ fn check_fn(_v: &Liveness,
|
|||
// do not check contents of nested fns
|
||||
}
|
||||
|
||||
impl<'a> Liveness<'a> {
|
||||
impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
||||
fn check_ret(&self,
|
||||
id: NodeId,
|
||||
sp: Span,
|
||||
|
|
|
@ -264,8 +264,8 @@ pub struct MemCategorizationContext<'t,TYPER:'t> {
|
|||
* know that no errors have occurred, so we simply consult the tcx and we
|
||||
* can be sure that only `Ok` results will occur.
|
||||
*/
|
||||
pub trait Typer {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt;
|
||||
pub trait Typer<'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx>;
|
||||
fn node_ty(&self, id: ast::NodeId) -> McResult<ty::t>;
|
||||
fn node_method_ty(&self, method_call: typeck::MethodCall) -> Option<ty::t>;
|
||||
fn adjustments<'a>(&'a self) -> &'a RefCell<NodeMap<ty::AutoAdjustment>>;
|
||||
|
@ -375,12 +375,12 @@ macro_rules! if_ok(
|
|||
)
|
||||
)
|
||||
|
||||
impl<'t,TYPER:Typer> MemCategorizationContext<'t,TYPER> {
|
||||
impl<'t,'tcx,TYPER:Typer<'tcx>> MemCategorizationContext<'t,TYPER> {
|
||||
pub fn new(typer: &'t TYPER) -> MemCategorizationContext<'t,TYPER> {
|
||||
MemCategorizationContext { typer: typer }
|
||||
}
|
||||
|
||||
fn tcx(&self) -> &'t ty::ctxt {
|
||||
fn tcx(&self) -> &'t ty::ctxt<'tcx> {
|
||||
self.typer.tcx()
|
||||
}
|
||||
|
||||
|
|
|
@ -133,8 +133,8 @@ fn visit_struct_def(&mut self, s: &ast::StructDef, _: ast::Ident,
|
|||
/// The embargo visitor, used to determine the exports of the ast
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct EmbargoVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct EmbargoVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
exp_map2: &'a resolve::ExportMap2,
|
||||
|
||||
// This flag is an indicator of whether the previous item in the
|
||||
|
@ -163,7 +163,7 @@ struct EmbargoVisitor<'a> {
|
|||
prev_public: bool,
|
||||
}
|
||||
|
||||
impl<'a> EmbargoVisitor<'a> {
|
||||
impl<'a, 'tcx> EmbargoVisitor<'a, 'tcx> {
|
||||
// There are checks inside of privacy which depend on knowing whether a
|
||||
// trait should be exported or not. The two current consumers of this are:
|
||||
//
|
||||
|
@ -180,7 +180,7 @@ fn exported_trait(&self, _id: ast::NodeId) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for EmbargoVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for EmbargoVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
let orig_all_pub = self.prev_public;
|
||||
self.prev_public = orig_all_pub && item.vis == ast::Public;
|
||||
|
@ -355,8 +355,8 @@ fn visit_mod(&mut self, m: &ast::Mod, _sp: Span, id: ast::NodeId, _: ()) {
|
|||
/// The privacy visitor, where privacy checks take place (violations reported)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct PrivacyVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct PrivacyVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
curitem: ast::NodeId,
|
||||
in_foreign: bool,
|
||||
parents: NodeMap<ast::NodeId>,
|
||||
|
@ -376,7 +376,7 @@ enum FieldName {
|
|||
NamedField(ast::Ident),
|
||||
}
|
||||
|
||||
impl<'a> PrivacyVisitor<'a> {
|
||||
impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> {
|
||||
// used when debugging
|
||||
fn nodestr(&self, id: ast::NodeId) -> String {
|
||||
self.tcx.map.node_to_string(id).to_string()
|
||||
|
@ -802,7 +802,7 @@ fn check_method(&mut self, span: Span, origin: MethodOrigin,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for PrivacyVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for PrivacyVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
let orig_curitem = replace(&mut self.curitem, item.id);
|
||||
visit::walk_item(self, item, ());
|
||||
|
@ -1023,12 +1023,12 @@ fn visit_path(&mut self, path: &ast::Path, id: ast::NodeId, _: ()) {
|
|||
/// The privacy sanity check visitor, ensures unnecessary visibility isn't here
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct SanePrivacyVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct SanePrivacyVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
in_fn: bool,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for SanePrivacyVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for SanePrivacyVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
if self.in_fn {
|
||||
self.check_all_inherited(item);
|
||||
|
@ -1076,7 +1076,7 @@ fn visit_view_item(&mut self, i: &ast::ViewItem, _: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> SanePrivacyVisitor<'a> {
|
||||
impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
|
||||
/// Validates all of the visibility qualifiers placed on the item given. This
|
||||
/// ensures that there are no extraneous qualifiers that don't actually do
|
||||
/// anything. In theory these qualifiers wouldn't parse, but that may happen
|
||||
|
@ -1215,14 +1215,14 @@ fn check_inherited(tcx: &ty::ctxt, sp: Span, vis: ast::Visibility) {
|
|||
}
|
||||
}
|
||||
|
||||
struct VisiblePrivateTypesVisitor<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct VisiblePrivateTypesVisitor<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
exported_items: &'a ExportedItems,
|
||||
public_items: &'a PublicItems,
|
||||
}
|
||||
|
||||
struct CheckTypeForPrivatenessVisitor<'a, 'b:'a> {
|
||||
inner: &'a VisiblePrivateTypesVisitor<'b>,
|
||||
struct CheckTypeForPrivatenessVisitor<'a, 'b: 'a, 'tcx: 'b> {
|
||||
inner: &'a VisiblePrivateTypesVisitor<'b, 'tcx>,
|
||||
/// whether the type refers to private types.
|
||||
contains_private: bool,
|
||||
/// whether we've recurred at all (i.e. if we're pointing at the
|
||||
|
@ -1232,7 +1232,7 @@ struct CheckTypeForPrivatenessVisitor<'a, 'b:'a> {
|
|||
outer_type_is_public_path: bool,
|
||||
}
|
||||
|
||||
impl<'a> VisiblePrivateTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> VisiblePrivateTypesVisitor<'a, 'tcx> {
|
||||
fn path_is_private_type(&self, path_id: ast::NodeId) -> bool {
|
||||
let did = match self.tcx.def_map.borrow().find_copy(&path_id) {
|
||||
// `int` etc. (None doesn't seem to occur.)
|
||||
|
@ -1256,7 +1256,7 @@ fn trait_is_public(&self, trait_id: ast::NodeId) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Visitor<()> for CheckTypeForPrivatenessVisitor<'a, 'b> {
|
||||
impl<'a, 'b, 'tcx> Visitor<()> for CheckTypeForPrivatenessVisitor<'a, 'b, 'tcx> {
|
||||
fn visit_ty(&mut self, ty: &ast::Ty, _: ()) {
|
||||
match ty.node {
|
||||
ast::TyPath(_, _, path_id) => {
|
||||
|
@ -1279,7 +1279,7 @@ fn visit_ty(&mut self, ty: &ast::Ty, _: ()) {
|
|||
fn visit_expr(&mut self, _: &ast::Expr, _: ()) {}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for VisiblePrivateTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for VisiblePrivateTypesVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
match item.node {
|
||||
// contents of a private mod can be reexported, so we need
|
||||
|
|
|
@ -89,9 +89,9 @@ fn method_might_be_inlined(tcx: &ty::ctxt, method: &ast::Method,
|
|||
}
|
||||
|
||||
// Information needed while computing reachability.
|
||||
struct ReachableContext<'a> {
|
||||
struct ReachableContext<'a, 'tcx: 'a> {
|
||||
// The type context.
|
||||
tcx: &'a ty::ctxt,
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
// The set of items which must be exported in the linkage sense.
|
||||
reachable_symbols: NodeSet,
|
||||
// A worklist of item IDs. Each item ID in this worklist will be inlined
|
||||
|
@ -101,7 +101,7 @@ struct ReachableContext<'a> {
|
|||
any_library: bool,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for ReachableContext<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for ReachableContext<'a, 'tcx> {
|
||||
|
||||
fn visit_expr(&mut self, expr: &ast::Expr, _: ()) {
|
||||
|
||||
|
@ -164,9 +164,9 @@ fn visit_item(&mut self, _item: &ast::Item, _: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> ReachableContext<'a> {
|
||||
impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
|
||||
// Creates a new reachability computation context.
|
||||
fn new(tcx: &'a ty::ctxt) -> ReachableContext<'a> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>) -> ReachableContext<'a, 'tcx> {
|
||||
let any_library = tcx.sess.crate_types.borrow().iter().any(|ty| {
|
||||
*ty != config::CrateTypeExecutable
|
||||
});
|
||||
|
|
|
@ -74,9 +74,9 @@ fn generated_code(span: Span) -> bool {
|
|||
span.expn_info.is_some() || span == DUMMY_SP
|
||||
}
|
||||
|
||||
struct DxrVisitor<'l> {
|
||||
struct DxrVisitor<'l, 'tcx: 'l> {
|
||||
sess: &'l Session,
|
||||
analysis: &'l CrateAnalysis,
|
||||
analysis: &'l CrateAnalysis<'tcx>,
|
||||
|
||||
collected_paths: Vec<(NodeId, ast::Path, bool, recorder::Row)>,
|
||||
collecting: bool,
|
||||
|
@ -85,7 +85,7 @@ struct DxrVisitor<'l> {
|
|||
fmt: FmtStrs<'l>,
|
||||
}
|
||||
|
||||
impl <'l> DxrVisitor<'l> {
|
||||
impl <'l, 'tcx> DxrVisitor<'l, 'tcx> {
|
||||
fn dump_crate_info(&mut self, name: &str, krate: &ast::Crate) {
|
||||
// the current crate
|
||||
self.fmt.crate_str(krate.span, name);
|
||||
|
@ -1023,7 +1023,7 @@ fn process_pat(&mut self, p:&ast::Pat, e: DxrVisitorEnv) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'l> Visitor<DxrVisitorEnv> for DxrVisitor<'l> {
|
||||
impl<'l, 'tcx> Visitor<DxrVisitorEnv> for DxrVisitor<'l, 'tcx> {
|
||||
fn visit_item(&mut self, item:&ast::Item, e: DxrVisitorEnv) {
|
||||
if generated_code(item.span) {
|
||||
return
|
||||
|
|
|
@ -548,8 +548,8 @@ fn subst_spanned(&self,
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// The actual substitution engine itself is a type folder.
|
||||
|
||||
struct SubstFolder<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct SubstFolder<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
substs: &'a Substs,
|
||||
|
||||
// The location for which the substitution is performed, if available.
|
||||
|
@ -562,8 +562,8 @@ struct SubstFolder<'a> {
|
|||
ty_stack_depth: uint,
|
||||
}
|
||||
|
||||
impl<'a> TypeFolder for SubstFolder<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.tcx }
|
||||
impl<'a, 'tcx> TypeFolder<'tcx> for SubstFolder<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.tcx }
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
// Note: This routine only handles regions that are bound on
|
||||
|
|
|
@ -225,14 +225,14 @@
|
|||
use syntax::codemap::Span;
|
||||
use syntax::fold::Folder;
|
||||
|
||||
struct ConstantExpr<'a>(&'a ty::ctxt, Gc<ast::Expr>);
|
||||
struct ConstantExpr<'a, 'tcx: 'a>(&'a ty::ctxt<'tcx>, Gc<ast::Expr>);
|
||||
|
||||
impl<'a> Eq for ConstantExpr<'a> {
|
||||
impl<'a, 'tcx> Eq for ConstantExpr<'a, 'tcx> {
|
||||
fn assert_receiver_is_total_eq(&self) {}
|
||||
}
|
||||
|
||||
impl<'a> PartialEq for ConstantExpr<'a> {
|
||||
fn eq(&self, other: &ConstantExpr<'a>) -> bool {
|
||||
impl<'a, 'tcx> PartialEq for ConstantExpr<'a, 'tcx> {
|
||||
fn eq(&self, other: &ConstantExpr<'a, 'tcx>) -> bool {
|
||||
let &ConstantExpr(tcx, expr) = self;
|
||||
let &ConstantExpr(_, other_expr) = other;
|
||||
match const_eval::compare_lit_exprs(tcx, &*expr, &*other_expr) {
|
||||
|
@ -244,16 +244,16 @@ fn eq(&self, other: &ConstantExpr<'a>) -> bool {
|
|||
|
||||
// An option identifying a branch (either a literal, an enum variant or a range)
|
||||
#[deriving(Eq, PartialEq)]
|
||||
enum Opt<'a> {
|
||||
ConstantValue(ConstantExpr<'a>),
|
||||
ConstantRange(ConstantExpr<'a>, ConstantExpr<'a>),
|
||||
enum Opt<'blk, 'tcx: 'blk> {
|
||||
ConstantValue(ConstantExpr<'blk, 'tcx>),
|
||||
ConstantRange(ConstantExpr<'blk, 'tcx>, ConstantExpr<'blk, 'tcx>),
|
||||
Variant(ty::Disr, Rc<adt::Repr>, ast::DefId),
|
||||
SliceLengthEqual(uint),
|
||||
SliceLengthGreaterOrEqual(/* prefix length */ uint, /* suffix length */ uint),
|
||||
}
|
||||
|
||||
impl<'a> Opt<'a> {
|
||||
fn trans(&self, mut bcx: &'a Block<'a>) -> OptResult<'a> {
|
||||
impl<'blk, 'tcx> Opt<'blk, 'tcx> {
|
||||
fn trans(&self, mut bcx: Block<'blk, 'tcx>) -> OptResult<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::trans_opt");
|
||||
let ccx = bcx.ccx();
|
||||
match *self {
|
||||
|
@ -293,10 +293,10 @@ pub enum BranchKind {
|
|||
CompareSliceLength
|
||||
}
|
||||
|
||||
pub enum OptResult<'a> {
|
||||
SingleResult(Result<'a>),
|
||||
RangeResult(Result<'a>, Result<'a>),
|
||||
LowerBound(Result<'a>)
|
||||
pub enum OptResult<'blk, 'tcx: 'blk> {
|
||||
SingleResult(Result<'blk, 'tcx>),
|
||||
RangeResult(Result<'blk, 'tcx>, Result<'blk, 'tcx>),
|
||||
LowerBound(Result<'blk, 'tcx>)
|
||||
}
|
||||
|
||||
#[deriving(Clone)]
|
||||
|
@ -325,8 +325,8 @@ pub struct BindingInfo {
|
|||
|
||||
type BindingsMap = HashMap<Ident, BindingInfo>;
|
||||
|
||||
struct ArmData<'a, 'b> {
|
||||
bodycx: &'b Block<'b>,
|
||||
struct ArmData<'a, 'blk, 'tcx: 'blk> {
|
||||
bodycx: Block<'blk, 'tcx>,
|
||||
arm: &'a ast::Arm,
|
||||
bindings_map: BindingsMap
|
||||
}
|
||||
|
@ -337,13 +337,13 @@ struct ArmData<'a, 'b> {
|
|||
* As we proceed `bound_ptrs` are filled with pointers to values to be bound,
|
||||
* these pointers are stored in llmatch variables just before executing `data` arm.
|
||||
*/
|
||||
struct Match<'a, 'b:'a> {
|
||||
struct Match<'a, 'blk: 'a, 'tcx: 'blk> {
|
||||
pats: Vec<Gc<ast::Pat>>,
|
||||
data: &'a ArmData<'a, 'b>,
|
||||
data: &'a ArmData<'a, 'blk, 'tcx>,
|
||||
bound_ptrs: Vec<(Ident, ValueRef)>
|
||||
}
|
||||
|
||||
impl<'a, 'b> Repr for Match<'a, 'b> {
|
||||
impl<'a, 'blk, 'tcx> Repr for Match<'a, 'blk, 'tcx> {
|
||||
fn repr(&self, tcx: &ty::ctxt) -> String {
|
||||
if tcx.sess.verbose() {
|
||||
// for many programs, this just take too long to serialize
|
||||
|
@ -364,12 +364,11 @@ fn has_nested_bindings(m: &[Match], col: uint) -> bool {
|
|||
return false;
|
||||
}
|
||||
|
||||
fn expand_nested_bindings<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
col: uint,
|
||||
val: ValueRef)
|
||||
-> Vec<Match<'a, 'b>> {
|
||||
fn expand_nested_bindings<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
col: uint,
|
||||
val: ValueRef)
|
||||
-> Vec<Match<'a, 'blk, 'tcx>> {
|
||||
debug!("expand_nested_bindings(bcx={}, m={}, col={}, val={})",
|
||||
bcx.to_str(),
|
||||
m.repr(bcx.tcx()),
|
||||
|
@ -402,14 +401,13 @@ fn expand_nested_bindings<'a, 'b>(
|
|||
|
||||
type EnterPatterns<'a> = |&[Gc<ast::Pat>]|: 'a -> Option<Vec<Gc<ast::Pat>>>;
|
||||
|
||||
fn enter_match<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
dm: &DefMap,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
col: uint,
|
||||
val: ValueRef,
|
||||
e: EnterPatterns)
|
||||
-> Vec<Match<'a, 'b>> {
|
||||
fn enter_match<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
dm: &DefMap,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
col: uint,
|
||||
val: ValueRef,
|
||||
e: EnterPatterns)
|
||||
-> Vec<Match<'a, 'blk, 'tcx>> {
|
||||
debug!("enter_match(bcx={}, m={}, col={}, val={})",
|
||||
bcx.to_str(),
|
||||
m.repr(bcx.tcx()),
|
||||
|
@ -450,13 +448,12 @@ fn enter_match<'a, 'b>(
|
|||
}).collect()
|
||||
}
|
||||
|
||||
fn enter_default<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
dm: &DefMap,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
col: uint,
|
||||
val: ValueRef)
|
||||
-> Vec<Match<'a, 'b>> {
|
||||
fn enter_default<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
dm: &DefMap,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
col: uint,
|
||||
val: ValueRef)
|
||||
-> Vec<Match<'a, 'blk, 'tcx>> {
|
||||
debug!("enter_default(bcx={}, m={}, col={}, val={})",
|
||||
bcx.to_str(),
|
||||
m.repr(bcx.tcx()),
|
||||
|
@ -502,16 +499,16 @@ fn enter_default<'a, 'b>(
|
|||
/// takes the complete row of patterns rather than just the first one.
|
||||
/// Also, most of the enter_() family functions have been unified with
|
||||
/// the check_match specialization step.
|
||||
fn enter_opt<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
fn enter_opt<'a, 'blk, 'tcx>(
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
_: ast::NodeId,
|
||||
dm: &DefMap,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
opt: &Opt,
|
||||
col: uint,
|
||||
variant_size: uint,
|
||||
val: ValueRef)
|
||||
-> Vec<Match<'a, 'b>> {
|
||||
-> Vec<Match<'a, 'blk, 'tcx>> {
|
||||
debug!("enter_opt(bcx={}, m={}, opt={:?}, col={}, val={})",
|
||||
bcx.to_str(),
|
||||
m.repr(bcx.tcx()),
|
||||
|
@ -545,10 +542,12 @@ fn enter_opt<'a, 'b>(
|
|||
// Returns the options in one column of matches. An option is something that
|
||||
// needs to be conditionally matched at runtime; for example, the discriminant
|
||||
// on a set of enum variants or a literal.
|
||||
fn get_branches<'a>(bcx: &'a Block, m: &[Match], col: uint) -> Vec<Opt<'a>> {
|
||||
fn get_branches<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
m: &[Match], col: uint)
|
||||
-> Vec<Opt<'blk, 'tcx>> {
|
||||
let ccx = bcx.ccx();
|
||||
|
||||
fn add_to_set<'a>(set: &mut Vec<Opt<'a>>, opt: Opt<'a>) {
|
||||
fn add_to_set<'blk, 'tcx>(set: &mut Vec<Opt<'blk, 'tcx>>, opt: Opt<'blk, 'tcx>) {
|
||||
if !set.contains(&opt) {
|
||||
set.push(opt);
|
||||
}
|
||||
|
@ -593,17 +592,16 @@ fn add_to_set<'a>(set: &mut Vec<Opt<'a>>, opt: Opt<'a>) {
|
|||
found
|
||||
}
|
||||
|
||||
struct ExtractedBlock<'a> {
|
||||
vals: Vec<ValueRef> ,
|
||||
bcx: &'a Block<'a>,
|
||||
struct ExtractedBlock<'blk, 'tcx: 'blk> {
|
||||
vals: Vec<ValueRef>,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
}
|
||||
|
||||
fn extract_variant_args<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
repr: &adt::Repr,
|
||||
disr_val: ty::Disr,
|
||||
val: ValueRef)
|
||||
-> ExtractedBlock<'a> {
|
||||
fn extract_variant_args<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
repr: &adt::Repr,
|
||||
disr_val: ty::Disr,
|
||||
val: ValueRef)
|
||||
-> ExtractedBlock<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::extract_variant_args");
|
||||
let args = Vec::from_fn(adt::num_args(repr, disr_val), |i| {
|
||||
adt::trans_field_ptr(bcx, repr, val, disr_val, i)
|
||||
|
@ -621,12 +619,11 @@ fn match_datum(val: ValueRef, left_ty: ty::t) -> Datum<Lvalue> {
|
|||
Datum::new(val, left_ty, Lvalue)
|
||||
}
|
||||
|
||||
fn bind_subslice_pat<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
pat_id: ast::NodeId,
|
||||
val: ValueRef,
|
||||
offset_left: uint,
|
||||
offset_right: uint) -> ValueRef {
|
||||
fn bind_subslice_pat(bcx: Block,
|
||||
pat_id: ast::NodeId,
|
||||
val: ValueRef,
|
||||
offset_left: uint,
|
||||
offset_right: uint) -> ValueRef {
|
||||
let _icx = push_ctxt("match::bind_subslice_pat");
|
||||
let vec_ty = node_id_type(bcx, pat_id);
|
||||
let vt = tvec::vec_types(bcx, ty::sequence_element_type(bcx.tcx(), ty::type_content(vec_ty)));
|
||||
|
@ -647,13 +644,12 @@ fn bind_subslice_pat<'a>(
|
|||
scratch.val
|
||||
}
|
||||
|
||||
fn extract_vec_elems<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
left_ty: ty::t,
|
||||
before: uint,
|
||||
after: uint,
|
||||
val: ValueRef)
|
||||
-> ExtractedBlock<'a> {
|
||||
fn extract_vec_elems<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
left_ty: ty::t,
|
||||
before: uint,
|
||||
after: uint,
|
||||
val: ValueRef)
|
||||
-> ExtractedBlock<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::extract_vec_elems");
|
||||
let vec_datum = match_datum(val, left_ty);
|
||||
let (base, len) = vec_datum.get_vec_base_and_len(bcx);
|
||||
|
@ -714,13 +710,13 @@ fn any_irrefutable_adt_pat(tcx: &ty::ctxt, m: &[Match], col: uint) -> bool {
|
|||
}
|
||||
|
||||
/// What to do when the pattern match fails.
|
||||
enum FailureHandler<'a> {
|
||||
enum FailureHandler {
|
||||
Infallible,
|
||||
JumpToBasicBlock(BasicBlockRef),
|
||||
Unreachable
|
||||
}
|
||||
|
||||
impl<'a> FailureHandler<'a> {
|
||||
impl FailureHandler {
|
||||
fn is_fallible(&self) -> bool {
|
||||
match *self {
|
||||
Infallible => false,
|
||||
|
@ -732,7 +728,7 @@ fn is_infallible(&self) -> bool {
|
|||
!self.is_fallible()
|
||||
}
|
||||
|
||||
fn handle_fail(&self, bcx: &Block) {
|
||||
fn handle_fail(&self, bcx: Block) {
|
||||
match *self {
|
||||
Infallible =>
|
||||
fail!("attempted to fail in an infallible failure handler!"),
|
||||
|
@ -774,17 +770,16 @@ fn score(p: &ast::Pat) -> uint {
|
|||
}
|
||||
|
||||
// Compiles a comparison between two things.
|
||||
fn compare_values<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> Result<'a> {
|
||||
fn compare_str<'a>(cx: &'a Block<'a>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> Result<'a> {
|
||||
fn compare_values<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> Result<'blk, 'tcx> {
|
||||
fn compare_str<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let did = langcall(cx,
|
||||
None,
|
||||
format!("comparison of `{}`",
|
||||
|
@ -819,9 +814,10 @@ fn compare_str<'a>(cx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn insert_lllocals<'a>(mut bcx: &'a Block<'a>, bindings_map: &BindingsMap,
|
||||
cs: Option<cleanup::ScopeId>)
|
||||
-> &'a Block<'a> {
|
||||
fn insert_lllocals<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
bindings_map: &BindingsMap,
|
||||
cs: Option<cleanup::ScopeId>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* For each binding in `data.bindings_map`, adds an appropriate entry into
|
||||
* the `fcx.lllocals` map
|
||||
|
@ -874,15 +870,14 @@ fn insert_lllocals<'a>(mut bcx: &'a Block<'a>, bindings_map: &BindingsMap,
|
|||
bcx
|
||||
}
|
||||
|
||||
fn compile_guard<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
guard_expr: &ast::Expr,
|
||||
data: &ArmData,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
has_genuine_default: bool)
|
||||
-> &'b Block<'b> {
|
||||
fn compile_guard<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
guard_expr: &ast::Expr,
|
||||
data: &ArmData,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
has_genuine_default: bool)
|
||||
-> Block<'blk, 'tcx> {
|
||||
debug!("compile_guard(bcx={}, guard_expr={}, m={}, vals={})",
|
||||
bcx.to_str(),
|
||||
bcx.expr_to_string(guard_expr),
|
||||
|
@ -923,12 +918,11 @@ fn compile_guard<'a, 'b>(
|
|||
})
|
||||
}
|
||||
|
||||
fn compile_submatch<'a, 'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
has_genuine_default: bool) {
|
||||
fn compile_submatch<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
has_genuine_default: bool) {
|
||||
debug!("compile_submatch(bcx={}, m={}, vals={})",
|
||||
bcx.to_str(),
|
||||
m.repr(bcx.tcx()),
|
||||
|
@ -984,14 +978,13 @@ fn compile_submatch<'a, 'b>(
|
|||
}
|
||||
}
|
||||
|
||||
fn compile_submatch_continue<'a, 'b>(
|
||||
mut bcx: &'b Block<'b>,
|
||||
m: &'a [Match<'a, 'b>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
col: uint,
|
||||
val: ValueRef,
|
||||
has_genuine_default: bool) {
|
||||
fn compile_submatch_continue<'a, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
m: &'a [Match<'a, 'blk, 'tcx>],
|
||||
vals: &[ValueRef],
|
||||
chk: &FailureHandler,
|
||||
col: uint,
|
||||
val: ValueRef,
|
||||
has_genuine_default: bool) {
|
||||
let fcx = bcx.fcx;
|
||||
let tcx = bcx.tcx();
|
||||
let dm = &tcx.def_map;
|
||||
|
@ -1218,19 +1211,18 @@ fn compile_submatch_continue<'a, 'b>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_match<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
match_expr: &ast::Expr,
|
||||
discr_expr: &ast::Expr,
|
||||
arms: &[ast::Arm],
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_match<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
match_expr: &ast::Expr,
|
||||
discr_expr: &ast::Expr,
|
||||
arms: &[ast::Arm],
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::trans_match");
|
||||
trans_match_inner(bcx, match_expr.id, discr_expr, arms, dest)
|
||||
}
|
||||
|
||||
/// Checks whether the binding in `discr` is assigned to anywhere in the expression `body`
|
||||
fn is_discr_reassigned(bcx: &Block, discr: &ast::Expr, body: &ast::Expr) -> bool {
|
||||
fn is_discr_reassigned(bcx: Block, discr: &ast::Expr, body: &ast::Expr) -> bool {
|
||||
match discr.node {
|
||||
ast::ExprPath(..) => match bcx.def(discr.id) {
|
||||
def::DefArg(vid, _) | def::DefBinding(vid, _) |
|
||||
|
@ -1272,7 +1264,7 @@ fn mutate(&mut self, _: ast::NodeId, _: Span, cmt: mc::cmt, _: euv::MutateMode)
|
|||
}
|
||||
}
|
||||
|
||||
fn create_bindings_map(bcx: &Block, pat: Gc<ast::Pat>,
|
||||
fn create_bindings_map(bcx: Block, pat: Gc<ast::Pat>,
|
||||
discr: &ast::Expr, body: &ast::Expr) -> BindingsMap {
|
||||
// Create the bindings map, which is a mapping from each binding name
|
||||
// to an alloca() that will be the value for that local variable.
|
||||
|
@ -1327,11 +1319,11 @@ fn create_bindings_map(bcx: &Block, pat: Gc<ast::Pat>,
|
|||
return bindings_map;
|
||||
}
|
||||
|
||||
fn trans_match_inner<'a>(scope_cx: &'a Block<'a>,
|
||||
match_id: ast::NodeId,
|
||||
discr_expr: &ast::Expr,
|
||||
arms: &[ast::Arm],
|
||||
dest: Dest) -> &'a Block<'a> {
|
||||
fn trans_match_inner<'blk, 'tcx>(scope_cx: Block<'blk, 'tcx>,
|
||||
match_id: ast::NodeId,
|
||||
discr_expr: &ast::Expr,
|
||||
arms: &[ast::Arm],
|
||||
dest: Dest) -> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::trans_match_inner");
|
||||
let fcx = scope_cx.fcx;
|
||||
let mut bcx = scope_cx;
|
||||
|
@ -1402,9 +1394,9 @@ enum IrrefutablePatternBindingMode {
|
|||
BindArgument
|
||||
}
|
||||
|
||||
pub fn store_local<'a>(bcx: &'a Block<'a>,
|
||||
local: &ast::Local)
|
||||
-> &'a Block<'a> {
|
||||
pub fn store_local<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
local: &ast::Local)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Generates code for a local variable declaration like
|
||||
* `let <pat>;` or `let <pat> = <opt_init_expr>`.
|
||||
|
@ -1457,9 +1449,9 @@ pub fn store_local<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
};
|
||||
|
||||
fn create_dummy_locals<'a>(mut bcx: &'a Block<'a>,
|
||||
pat: Gc<ast::Pat>)
|
||||
-> &'a Block<'a> {
|
||||
fn create_dummy_locals<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
pat: Gc<ast::Pat>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
// create dummy memory for the variables if we have no
|
||||
// value to store into them immediately
|
||||
let tcx = bcx.tcx();
|
||||
|
@ -1473,11 +1465,11 @@ fn create_dummy_locals<'a>(mut bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn store_arg<'a>(mut bcx: &'a Block<'a>,
|
||||
pat: Gc<ast::Pat>,
|
||||
arg: Datum<Rvalue>,
|
||||
arg_scope: cleanup::ScopeId)
|
||||
-> &'a Block<'a> {
|
||||
pub fn store_arg<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
pat: Gc<ast::Pat>,
|
||||
arg: Datum<Rvalue>,
|
||||
arg_scope: cleanup::ScopeId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Generates code for argument patterns like `fn foo(<pat>: T)`.
|
||||
* Creates entries in the `llargs` map for each of the bindings
|
||||
|
@ -1527,12 +1519,11 @@ pub fn store_arg<'a>(mut bcx: &'a Block<'a>,
|
|||
|
||||
/// Generates code for the pattern binding in a `for` loop like
|
||||
/// `for <pat> in <expr> { ... }`.
|
||||
pub fn store_for_loop_binding<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
pat: Gc<ast::Pat>,
|
||||
llvalue: ValueRef,
|
||||
body_scope: cleanup::ScopeId)
|
||||
-> &'a Block<'a> {
|
||||
pub fn store_for_loop_binding<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
pat: Gc<ast::Pat>,
|
||||
llvalue: ValueRef,
|
||||
body_scope: cleanup::ScopeId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("match::store_for_loop_binding");
|
||||
|
||||
if simple_identifier(&*pat).is_some() {
|
||||
|
@ -1550,14 +1541,15 @@ pub fn store_for_loop_binding<'a>(
|
|||
bind_irrefutable_pat(bcx, pat, llvalue, BindLocal, body_scope)
|
||||
}
|
||||
|
||||
fn mk_binding_alloca<'a,A>(bcx: &'a Block<'a>,
|
||||
p_id: ast::NodeId,
|
||||
ident: &ast::Ident,
|
||||
binding_mode: IrrefutablePatternBindingMode,
|
||||
cleanup_scope: cleanup::ScopeId,
|
||||
arg: A,
|
||||
populate: |A, &'a Block<'a>, ValueRef, ty::t| -> &'a Block<'a>)
|
||||
-> &'a Block<'a> {
|
||||
fn mk_binding_alloca<'blk, 'tcx, A>(bcx: Block<'blk, 'tcx>,
|
||||
p_id: ast::NodeId,
|
||||
ident: &ast::Ident,
|
||||
binding_mode: IrrefutablePatternBindingMode,
|
||||
cleanup_scope: cleanup::ScopeId,
|
||||
arg: A,
|
||||
populate: |A, Block<'blk, 'tcx>, ValueRef, ty::t|
|
||||
-> Block<'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let var_ty = node_id_type(bcx, p_id);
|
||||
|
||||
// Allocate memory on stack for the binding.
|
||||
|
@ -1580,13 +1572,12 @@ fn mk_binding_alloca<'a,A>(bcx: &'a Block<'a>,
|
|||
bcx
|
||||
}
|
||||
|
||||
fn bind_irrefutable_pat<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
pat: Gc<ast::Pat>,
|
||||
val: ValueRef,
|
||||
binding_mode: IrrefutablePatternBindingMode,
|
||||
cleanup_scope: cleanup::ScopeId)
|
||||
-> &'a Block<'a> {
|
||||
fn bind_irrefutable_pat<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
pat: Gc<ast::Pat>,
|
||||
val: ValueRef,
|
||||
binding_mode: IrrefutablePatternBindingMode,
|
||||
cleanup_scope: cleanup::ScopeId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* A simple version of the pattern matching code that only handles
|
||||
* irrefutable patterns. This is used in let/argument patterns,
|
||||
|
|
|
@ -143,7 +143,7 @@ pub struct Struct {
|
|||
* these, for places in trans where the `ty::t` isn't directly
|
||||
* available.
|
||||
*/
|
||||
pub fn represent_node(bcx: &Block, node: ast::NodeId) -> Rc<Repr> {
|
||||
pub fn represent_node(bcx: Block, node: ast::NodeId) -> Rc<Repr> {
|
||||
represent_type(bcx.ccx(), node_id_type(bcx, node))
|
||||
}
|
||||
|
||||
|
@ -574,7 +574,7 @@ fn struct_llfields(cx: &CrateContext, st: &Struct, sizing: bool, dst: bool) -> V
|
|||
*
|
||||
* This should ideally be less tightly tied to `_match`.
|
||||
*/
|
||||
pub fn trans_switch(bcx: &Block, r: &Repr, scrutinee: ValueRef)
|
||||
pub fn trans_switch(bcx: Block, r: &Repr, scrutinee: ValueRef)
|
||||
-> (_match::BranchKind, Option<ValueRef>) {
|
||||
match *r {
|
||||
CEnum(..) | General(..) |
|
||||
|
@ -590,7 +590,7 @@ pub fn trans_switch(bcx: &Block, r: &Repr, scrutinee: ValueRef)
|
|||
|
||||
|
||||
/// Obtain the actual discriminant of a value.
|
||||
pub fn trans_get_discr(bcx: &Block, r: &Repr, scrutinee: ValueRef, cast_to: Option<Type>)
|
||||
pub fn trans_get_discr(bcx: Block, r: &Repr, scrutinee: ValueRef, cast_to: Option<Type>)
|
||||
-> ValueRef {
|
||||
let signed;
|
||||
let val;
|
||||
|
@ -625,7 +625,7 @@ pub fn trans_get_discr(bcx: &Block, r: &Repr, scrutinee: ValueRef, cast_to: Opti
|
|||
}
|
||||
}
|
||||
|
||||
fn struct_wrapped_nullable_bitdiscr(bcx: &Block, nndiscr: Disr, ptrfield: PointerField,
|
||||
fn struct_wrapped_nullable_bitdiscr(bcx: Block, nndiscr: Disr, ptrfield: PointerField,
|
||||
scrutinee: ValueRef) -> ValueRef {
|
||||
let llptrptr = match ptrfield {
|
||||
ThinPointer(field) => GEPi(bcx, scrutinee, [0, field]),
|
||||
|
@ -637,7 +637,7 @@ fn struct_wrapped_nullable_bitdiscr(bcx: &Block, nndiscr: Disr, ptrfield: Pointe
|
|||
}
|
||||
|
||||
/// Helper for cases where the discriminant is simply loaded.
|
||||
fn load_discr(bcx: &Block, ity: IntType, ptr: ValueRef, min: Disr, max: Disr)
|
||||
fn load_discr(bcx: Block, ity: IntType, ptr: ValueRef, min: Disr, max: Disr)
|
||||
-> ValueRef {
|
||||
let llty = ll_inttype(bcx.ccx(), ity);
|
||||
assert_eq!(val_ty(ptr), llty.ptr_to());
|
||||
|
@ -666,8 +666,8 @@ fn load_discr(bcx: &Block, ity: IntType, ptr: ValueRef, min: Disr, max: Disr)
|
|||
*
|
||||
* This should ideally be less tightly tied to `_match`.
|
||||
*/
|
||||
pub fn trans_case<'a>(bcx: &'a Block<'a>, r: &Repr, discr: Disr)
|
||||
-> _match::OptResult<'a> {
|
||||
pub fn trans_case<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, r: &Repr, discr: Disr)
|
||||
-> _match::OptResult<'blk, 'tcx> {
|
||||
match *r {
|
||||
CEnum(ity, _, _) => {
|
||||
_match::SingleResult(Result::new(bcx, C_integral(ll_inttype(bcx.ccx(), ity),
|
||||
|
@ -692,7 +692,7 @@ pub fn trans_case<'a>(bcx: &'a Block<'a>, r: &Repr, discr: Disr)
|
|||
* Set the discriminant for a new value of the given case of the given
|
||||
* representation.
|
||||
*/
|
||||
pub fn trans_set_discr(bcx: &Block, r: &Repr, val: ValueRef, discr: Disr) {
|
||||
pub fn trans_set_discr(bcx: Block, r: &Repr, val: ValueRef, discr: Disr) {
|
||||
match *r {
|
||||
CEnum(ity, min, max) => {
|
||||
assert_discr_in_range(ity, min, max, discr);
|
||||
|
@ -770,7 +770,7 @@ pub fn num_args(r: &Repr, discr: Disr) -> uint {
|
|||
}
|
||||
|
||||
/// Access a field, at a point when the value's case is known.
|
||||
pub fn trans_field_ptr(bcx: &Block, r: &Repr, val: ValueRef, discr: Disr,
|
||||
pub fn trans_field_ptr(bcx: Block, r: &Repr, val: ValueRef, discr: Disr,
|
||||
ix: uint) -> ValueRef {
|
||||
// Note: if this ever needs to generate conditionals (e.g., if we
|
||||
// decide to do some kind of cdr-coding-like non-unique repr
|
||||
|
@ -809,7 +809,7 @@ pub fn trans_field_ptr(bcx: &Block, r: &Repr, val: ValueRef, discr: Disr,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn struct_field_ptr(bcx: &Block, st: &Struct, val: ValueRef,
|
||||
pub fn struct_field_ptr(bcx: Block, st: &Struct, val: ValueRef,
|
||||
ix: uint, needs_cast: bool) -> ValueRef {
|
||||
let val = if needs_cast {
|
||||
let ccx = bcx.ccx();
|
||||
|
@ -823,10 +823,10 @@ pub fn struct_field_ptr(bcx: &Block, st: &Struct, val: ValueRef,
|
|||
GEPi(bcx, val, [0, ix])
|
||||
}
|
||||
|
||||
pub fn fold_variants<'r, 'b>(
|
||||
bcx: &'b Block<'b>, r: &Repr, value: ValueRef,
|
||||
f: |&'b Block<'b>, &Struct, ValueRef|: 'r -> &'b Block<'b>
|
||||
) -> &'b Block<'b> {
|
||||
pub fn fold_variants<'blk, 'tcx>(
|
||||
bcx: Block<'blk, 'tcx>, r: &Repr, value: ValueRef,
|
||||
f: |Block<'blk, 'tcx>, &Struct, ValueRef| -> Block<'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let fcx = bcx.fcx;
|
||||
match *r {
|
||||
Univariant(ref st, _) => {
|
||||
|
@ -864,8 +864,8 @@ pub fn fold_variants<'r, 'b>(
|
|||
}
|
||||
|
||||
/// Access the struct drop flag, if present.
|
||||
pub fn trans_drop_flag_ptr<'b>(mut bcx: &'b Block<'b>, r: &Repr,
|
||||
val: ValueRef) -> datum::DatumBlock<'b, datum::Expr> {
|
||||
pub fn trans_drop_flag_ptr<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>, r: &Repr, val: ValueRef)
|
||||
-> datum::DatumBlock<'blk, 'tcx, datum::Expr> {
|
||||
let ptr_ty = ty::mk_imm_ptr(bcx.tcx(), ty::mk_bool());
|
||||
match *r {
|
||||
Univariant(ref st, true) => {
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
use syntax::ast;
|
||||
|
||||
// Take an inline assembly expression and splat it out via LLVM
|
||||
pub fn trans_inline_asm<'a>(bcx: &'a Block<'a>, ia: &ast::InlineAsm)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_inline_asm<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ia: &ast::InlineAsm)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let fcx = bcx.fcx;
|
||||
let mut bcx = bcx;
|
||||
let mut constraints = Vec::new();
|
||||
|
|
|
@ -137,15 +137,16 @@ pub fn push_ctxt(s: &'static str) -> _InsnCtxt {
|
|||
_InsnCtxt { _cannot_construct_outside_of_this_module: () }
|
||||
}
|
||||
|
||||
pub struct StatRecorder<'a> {
|
||||
ccx: &'a CrateContext<'a>,
|
||||
pub struct StatRecorder<'a, 'tcx: 'a> {
|
||||
ccx: &'a CrateContext<'a, 'tcx>,
|
||||
name: Option<String>,
|
||||
start: u64,
|
||||
istart: uint,
|
||||
}
|
||||
|
||||
impl<'a> StatRecorder<'a> {
|
||||
pub fn new(ccx: &'a CrateContext, name: String) -> StatRecorder<'a> {
|
||||
impl<'a, 'tcx> StatRecorder<'a, 'tcx> {
|
||||
pub fn new(ccx: &'a CrateContext<'a, 'tcx>, name: String)
|
||||
-> StatRecorder<'a, 'tcx> {
|
||||
let start = if ccx.sess().trans_stats() {
|
||||
time::precise_time_ns()
|
||||
} else {
|
||||
|
@ -162,7 +163,7 @@ pub fn new(ccx: &'a CrateContext, name: String) -> StatRecorder<'a> {
|
|||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<'a> Drop for StatRecorder<'a> {
|
||||
impl<'a, 'tcx> Drop for StatRecorder<'a, 'tcx> {
|
||||
fn drop(&mut self) {
|
||||
if self.ccx.sess().trans_stats() {
|
||||
let end = time::precise_time_ns();
|
||||
|
@ -343,7 +344,7 @@ pub fn get_extern_const(externs: &mut ExternMap, llmod: ModuleRef,
|
|||
// Returns a pointer to the body for the box. The box may be an opaque
|
||||
// box. The result will be casted to the type of body_t, if it is statically
|
||||
// known.
|
||||
pub fn at_box_body(bcx: &Block, body_t: ty::t, boxptr: ValueRef) -> ValueRef {
|
||||
pub fn at_box_body(bcx: Block, body_t: ty::t, boxptr: ValueRef) -> ValueRef {
|
||||
let _icx = push_ctxt("at_box_body");
|
||||
let ccx = bcx.ccx();
|
||||
let ty = Type::at_box(ccx, type_of(ccx, body_t));
|
||||
|
@ -351,7 +352,7 @@ pub fn at_box_body(bcx: &Block, body_t: ty::t, boxptr: ValueRef) -> ValueRef {
|
|||
GEPi(bcx, boxptr, [0u, abi::box_field_body])
|
||||
}
|
||||
|
||||
fn require_alloc_fn(bcx: &Block, info_ty: ty::t, it: LangItem) -> ast::DefId {
|
||||
fn require_alloc_fn(bcx: Block, info_ty: ty::t, it: LangItem) -> ast::DefId {
|
||||
match bcx.tcx().lang_items.require(it) {
|
||||
Ok(id) => id,
|
||||
Err(s) => {
|
||||
|
@ -365,12 +366,12 @@ fn require_alloc_fn(bcx: &Block, info_ty: ty::t, it: LangItem) -> ast::DefId {
|
|||
// The following malloc_raw_dyn* functions allocate a box to contain
|
||||
// a given type, but with a potentially dynamic size.
|
||||
|
||||
pub fn malloc_raw_dyn<'a>(bcx: &'a Block<'a>,
|
||||
llty_ptr: Type,
|
||||
info_ty: ty::t,
|
||||
size: ValueRef,
|
||||
align: ValueRef)
|
||||
-> Result<'a> {
|
||||
pub fn malloc_raw_dyn<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
llty_ptr: Type,
|
||||
info_ty: ty::t,
|
||||
size: ValueRef,
|
||||
align: ValueRef)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("malloc_raw_exchange");
|
||||
|
||||
// Allocate space:
|
||||
|
@ -382,9 +383,9 @@ pub fn malloc_raw_dyn<'a>(bcx: &'a Block<'a>,
|
|||
Result::new(r.bcx, PointerCast(r.bcx, r.val, llty_ptr))
|
||||
}
|
||||
|
||||
pub fn malloc_raw_dyn_proc<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
t: ty::t, alloc_fn: LangItem) -> Result<'a> {
|
||||
pub fn malloc_raw_dyn_proc<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
t: ty::t, alloc_fn: LangItem)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("malloc_raw_dyn_proc");
|
||||
let ccx = bcx.ccx();
|
||||
|
||||
|
@ -413,12 +414,11 @@ pub fn malloc_raw_dyn_proc<'a>(
|
|||
}
|
||||
|
||||
|
||||
pub fn malloc_raw_dyn_managed<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
t: ty::t,
|
||||
alloc_fn: LangItem,
|
||||
size: ValueRef)
|
||||
-> Result<'a> {
|
||||
pub fn malloc_raw_dyn_managed<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
t: ty::t,
|
||||
alloc_fn: LangItem,
|
||||
size: ValueRef)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("malloc_raw_dyn_managed");
|
||||
let ccx = bcx.ccx();
|
||||
|
||||
|
@ -584,13 +584,12 @@ pub fn maybe_name_value(cx: &CrateContext, v: ValueRef, s: &str) {
|
|||
// Used only for creating scalar comparison glue.
|
||||
pub enum scalar_type { nil_type, signed_int, unsigned_int, floating_point, }
|
||||
|
||||
pub fn compare_scalar_types<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
t: ty::t,
|
||||
op: ast::BinOp)
|
||||
-> Result<'a> {
|
||||
pub fn compare_scalar_types<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
t: ty::t,
|
||||
op: ast::BinOp)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let f = |a| Result::new(cx, compare_scalar_values(cx, lhs, rhs, a, op));
|
||||
|
||||
match ty::get(t).sty {
|
||||
|
@ -606,15 +605,14 @@ pub fn compare_scalar_types<'a>(
|
|||
|
||||
|
||||
// A helper function to do the actual comparison of scalar values.
|
||||
pub fn compare_scalar_values<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
nt: scalar_type,
|
||||
op: ast::BinOp)
|
||||
-> ValueRef {
|
||||
pub fn compare_scalar_values<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
nt: scalar_type,
|
||||
op: ast::BinOp)
|
||||
-> ValueRef {
|
||||
let _icx = push_ctxt("compare_scalar_values");
|
||||
fn die(cx: &Block) -> ! {
|
||||
fn die(cx: Block) -> ! {
|
||||
cx.sess().bug("compare_scalar_values: must be a comparison operator");
|
||||
}
|
||||
match nt {
|
||||
|
@ -668,7 +666,7 @@ fn die(cx: &Block) -> ! {
|
|||
}
|
||||
|
||||
pub fn compare_simd_types(
|
||||
cx: &Block,
|
||||
cx: Block,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
t: ty::t,
|
||||
|
@ -705,28 +703,24 @@ pub fn compare_simd_types(
|
|||
}
|
||||
}
|
||||
|
||||
pub type val_and_ty_fn<'r,'b> =
|
||||
|&'b Block<'b>, ValueRef, ty::t|: 'r -> &'b Block<'b>;
|
||||
pub type val_and_ty_fn<'a, 'blk, 'tcx> =
|
||||
|Block<'blk, 'tcx>, ValueRef, ty::t|: 'a -> Block<'blk, 'tcx>;
|
||||
|
||||
// Iterates through the elements of a structural type.
|
||||
pub fn iter_structural_ty<'r,
|
||||
'b>(
|
||||
cx: &'b Block<'b>,
|
||||
av: ValueRef,
|
||||
t: ty::t,
|
||||
f: val_and_ty_fn<'r,'b>)
|
||||
-> &'b Block<'b> {
|
||||
pub fn iter_structural_ty<'a, 'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
av: ValueRef,
|
||||
t: ty::t,
|
||||
f: val_and_ty_fn<'a, 'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("iter_structural_ty");
|
||||
|
||||
fn iter_variant<'r,
|
||||
'b>(
|
||||
cx: &'b Block<'b>,
|
||||
repr: &adt::Repr,
|
||||
av: ValueRef,
|
||||
variant: &ty::VariantInfo,
|
||||
substs: &subst::Substs,
|
||||
f: val_and_ty_fn<'r,'b>)
|
||||
-> &'b Block<'b> {
|
||||
fn iter_variant<'a, 'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
repr: &adt::Repr,
|
||||
av: ValueRef,
|
||||
variant: &ty::VariantInfo,
|
||||
substs: &subst::Substs,
|
||||
f: val_and_ty_fn<'a, 'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("iter_variant");
|
||||
let tcx = cx.tcx();
|
||||
let mut cx = cx;
|
||||
|
@ -846,8 +840,7 @@ fn iter_variant<'r,
|
|||
return cx;
|
||||
}
|
||||
|
||||
pub fn cast_shift_expr_rhs<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
pub fn cast_shift_expr_rhs(cx: Block,
|
||||
op: ast::BinOp,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef)
|
||||
|
@ -894,14 +887,14 @@ pub fn cast_shift_rhs(op: ast::BinOp,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn fail_if_zero_or_overflows<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
span: Span,
|
||||
divrem: ast::BinOp,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
pub fn fail_if_zero_or_overflows<'blk, 'tcx>(
|
||||
cx: Block<'blk, 'tcx>,
|
||||
span: Span,
|
||||
divrem: ast::BinOp,
|
||||
lhs: ValueRef,
|
||||
rhs: ValueRef,
|
||||
rhs_t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let (zero_text, overflow_text) = if divrem == ast::BiDiv {
|
||||
("attempted to divide by zero",
|
||||
"attempted to divide with overflow")
|
||||
|
@ -998,16 +991,15 @@ pub fn trans_external_path(ccx: &CrateContext, did: ast::DefId, t: ty::t) -> Val
|
|||
}
|
||||
}
|
||||
|
||||
pub fn invoke<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
llfn: ValueRef,
|
||||
llargs: Vec<ValueRef> ,
|
||||
fn_ty: ty::t,
|
||||
call_info: Option<NodeInfo>,
|
||||
// FIXME(15064) is_lang_item is a horrible hack, please remove it
|
||||
// at the soonest opportunity.
|
||||
is_lang_item: bool)
|
||||
-> (ValueRef, &'a Block<'a>) {
|
||||
pub fn invoke<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
llfn: ValueRef,
|
||||
llargs: Vec<ValueRef> ,
|
||||
fn_ty: ty::t,
|
||||
call_info: Option<NodeInfo>,
|
||||
// FIXME(15064) is_lang_item is a horrible hack, please remove it
|
||||
// at the soonest opportunity.
|
||||
is_lang_item: bool)
|
||||
-> (ValueRef, Block<'blk, 'tcx>) {
|
||||
let _icx = push_ctxt("invoke_");
|
||||
if bcx.unreachable.get() {
|
||||
return (C_null(Type::i8(bcx.ccx())), bcx);
|
||||
|
@ -1066,7 +1058,7 @@ pub fn invoke<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn need_invoke(bcx: &Block) -> bool {
|
||||
pub fn need_invoke(bcx: Block) -> bool {
|
||||
if bcx.sess().no_landing_pads() {
|
||||
return false;
|
||||
}
|
||||
|
@ -1079,13 +1071,13 @@ pub fn need_invoke(bcx: &Block) -> bool {
|
|||
bcx.fcx.needs_invoke()
|
||||
}
|
||||
|
||||
pub fn load_if_immediate(cx: &Block, v: ValueRef, t: ty::t) -> ValueRef {
|
||||
pub fn load_if_immediate(cx: Block, v: ValueRef, t: ty::t) -> ValueRef {
|
||||
let _icx = push_ctxt("load_if_immediate");
|
||||
if type_is_immediate(cx.ccx(), t) { return load_ty(cx, v, t); }
|
||||
return v;
|
||||
}
|
||||
|
||||
pub fn load_ty(cx: &Block, ptr: ValueRef, t: ty::t) -> ValueRef {
|
||||
pub fn load_ty(cx: Block, ptr: ValueRef, t: ty::t) -> ValueRef {
|
||||
/*!
|
||||
* Helper for loading values from memory. Does the necessary conversion if
|
||||
* the in-memory type differs from the type used for SSA values. Also
|
||||
|
@ -1105,7 +1097,7 @@ pub fn load_ty(cx: &Block, ptr: ValueRef, t: ty::t) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn store_ty(cx: &Block, v: ValueRef, dst: ValueRef, t: ty::t) {
|
||||
pub fn store_ty(cx: Block, v: ValueRef, dst: ValueRef, t: ty::t) {
|
||||
/*!
|
||||
* Helper for storing values in memory. Does the necessary conversion if
|
||||
* the in-memory type differs from the type used for SSA values.
|
||||
|
@ -1117,33 +1109,31 @@ pub fn store_ty(cx: &Block, v: ValueRef, dst: ValueRef, t: ty::t) {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn ignore_lhs(_bcx: &Block, local: &ast::Local) -> bool {
|
||||
pub fn ignore_lhs(_bcx: Block, local: &ast::Local) -> bool {
|
||||
match local.pat.node {
|
||||
ast::PatWild(ast::PatWildSingle) => true, _ => false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init_local<'a>(bcx: &'a Block<'a>, local: &ast::Local)
|
||||
-> &'a Block<'a> {
|
||||
pub fn init_local<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, local: &ast::Local)
|
||||
-> Block<'blk, 'tcx> {
|
||||
debug!("init_local(bcx={}, local.id={:?})", bcx.to_str(), local.id);
|
||||
let _indenter = indenter();
|
||||
let _icx = push_ctxt("init_local");
|
||||
_match::store_local(bcx, local)
|
||||
}
|
||||
|
||||
pub fn raw_block<'a>(
|
||||
fcx: &'a FunctionContext<'a>,
|
||||
is_lpad: bool,
|
||||
llbb: BasicBlockRef)
|
||||
-> &'a Block<'a> {
|
||||
common::Block::new(llbb, is_lpad, None, fcx)
|
||||
pub fn raw_block<'blk, 'tcx>(fcx: &'blk FunctionContext<'blk, 'tcx>,
|
||||
is_lpad: bool,
|
||||
llbb: BasicBlockRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
common::BlockS::new(llbb, is_lpad, None, fcx)
|
||||
}
|
||||
|
||||
pub fn with_cond<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
val: ValueRef,
|
||||
f: |&'a Block<'a>| -> &'a Block<'a>)
|
||||
-> &'a Block<'a> {
|
||||
pub fn with_cond<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
val: ValueRef,
|
||||
f: |Block<'blk, 'tcx>| -> Block<'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("with_cond");
|
||||
let fcx = bcx.fcx;
|
||||
let next_cx = fcx.new_temp_block("next");
|
||||
|
@ -1156,7 +1146,7 @@ pub fn with_cond<'a>(
|
|||
next_cx
|
||||
}
|
||||
|
||||
pub fn call_lifetime_start(cx: &Block, ptr: ValueRef) {
|
||||
pub fn call_lifetime_start(cx: Block, ptr: ValueRef) {
|
||||
if cx.sess().opts.optimize == config::No {
|
||||
return;
|
||||
}
|
||||
|
@ -1170,7 +1160,7 @@ pub fn call_lifetime_start(cx: &Block, ptr: ValueRef) {
|
|||
Call(cx, lifetime_start, [llsize, ptr], None);
|
||||
}
|
||||
|
||||
pub fn call_lifetime_end(cx: &Block, ptr: ValueRef) {
|
||||
pub fn call_lifetime_end(cx: Block, ptr: ValueRef) {
|
||||
if cx.sess().opts.optimize == config::No {
|
||||
return;
|
||||
}
|
||||
|
@ -1184,7 +1174,7 @@ pub fn call_lifetime_end(cx: &Block, ptr: ValueRef) {
|
|||
Call(cx, lifetime_end, [llsize, ptr], None);
|
||||
}
|
||||
|
||||
pub fn call_memcpy(cx: &Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef, align: u32) {
|
||||
pub fn call_memcpy(cx: Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef, align: u32) {
|
||||
let _icx = push_ctxt("call_memcpy");
|
||||
let ccx = cx.ccx();
|
||||
let key = match ccx.sess().targ_cfg.arch {
|
||||
|
@ -1200,7 +1190,7 @@ pub fn call_memcpy(cx: &Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef,
|
|||
Call(cx, memcpy, [dst_ptr, src_ptr, size, align, volatile], None);
|
||||
}
|
||||
|
||||
pub fn memcpy_ty(bcx: &Block, dst: ValueRef, src: ValueRef, t: ty::t) {
|
||||
pub fn memcpy_ty(bcx: Block, dst: ValueRef, src: ValueRef, t: ty::t) {
|
||||
let _icx = push_ctxt("memcpy_ty");
|
||||
let ccx = bcx.ccx();
|
||||
if ty::type_is_structural(t) {
|
||||
|
@ -1213,7 +1203,7 @@ pub fn memcpy_ty(bcx: &Block, dst: ValueRef, src: ValueRef, t: ty::t) {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn zero_mem(cx: &Block, llptr: ValueRef, t: ty::t) {
|
||||
pub fn zero_mem(cx: Block, llptr: ValueRef, t: ty::t) {
|
||||
if cx.unreachable.get() { return; }
|
||||
let _icx = push_ctxt("zero_mem");
|
||||
let bcx = cx;
|
||||
|
@ -1245,7 +1235,7 @@ fn memzero(b: &Builder, llptr: ValueRef, ty: ty::t) {
|
|||
b.call(llintrinsicfn, [llptr, llzeroval, size, align, volatile], None);
|
||||
}
|
||||
|
||||
pub fn alloc_ty(bcx: &Block, t: ty::t, name: &str) -> ValueRef {
|
||||
pub fn alloc_ty(bcx: Block, t: ty::t, name: &str) -> ValueRef {
|
||||
let _icx = push_ctxt("alloc_ty");
|
||||
let ccx = bcx.ccx();
|
||||
let ty = type_of::type_of(ccx, t);
|
||||
|
@ -1254,13 +1244,13 @@ pub fn alloc_ty(bcx: &Block, t: ty::t, name: &str) -> ValueRef {
|
|||
return val;
|
||||
}
|
||||
|
||||
pub fn alloca(cx: &Block, ty: Type, name: &str) -> ValueRef {
|
||||
pub fn alloca(cx: Block, ty: Type, name: &str) -> ValueRef {
|
||||
let p = alloca_no_lifetime(cx, ty, name);
|
||||
call_lifetime_start(cx, p);
|
||||
p
|
||||
}
|
||||
|
||||
pub fn alloca_no_lifetime(cx: &Block, ty: Type, name: &str) -> ValueRef {
|
||||
pub fn alloca_no_lifetime(cx: Block, ty: Type, name: &str) -> ValueRef {
|
||||
let _icx = push_ctxt("alloca");
|
||||
if cx.unreachable.get() {
|
||||
unsafe {
|
||||
|
@ -1271,7 +1261,7 @@ pub fn alloca_no_lifetime(cx: &Block, ty: Type, name: &str) -> ValueRef {
|
|||
Alloca(cx, ty, name)
|
||||
}
|
||||
|
||||
pub fn alloca_zeroed(cx: &Block, ty: ty::t, name: &str) -> ValueRef {
|
||||
pub fn alloca_zeroed(cx: Block, ty: ty::t, name: &str) -> ValueRef {
|
||||
let llty = type_of::type_of(cx.ccx(), ty);
|
||||
if cx.unreachable.get() {
|
||||
unsafe {
|
||||
|
@ -1285,7 +1275,7 @@ pub fn alloca_zeroed(cx: &Block, ty: ty::t, name: &str) -> ValueRef {
|
|||
p
|
||||
}
|
||||
|
||||
pub fn arrayalloca(cx: &Block, ty: Type, v: ValueRef) -> ValueRef {
|
||||
pub fn arrayalloca(cx: Block, ty: Type, v: ValueRef) -> ValueRef {
|
||||
let _icx = push_ctxt("arrayalloca");
|
||||
if cx.unreachable.get() {
|
||||
unsafe {
|
||||
|
@ -1440,15 +1430,15 @@ fn has_nested_returns(tcx: &ty::ctxt, id: ast::NodeId) -> bool {
|
|||
//
|
||||
// Be warned! You must call `init_function` before doing anything with the
|
||||
// returned function context.
|
||||
pub fn new_fn_ctxt<'a>(ccx: &'a CrateContext,
|
||||
llfndecl: ValueRef,
|
||||
id: ast::NodeId,
|
||||
has_env: bool,
|
||||
output_type: ty::t,
|
||||
param_substs: &'a param_substs,
|
||||
sp: Option<Span>,
|
||||
block_arena: &'a TypedArena<Block<'a>>)
|
||||
-> FunctionContext<'a> {
|
||||
pub fn new_fn_ctxt<'a, 'tcx>(ccx: &'a CrateContext<'a, 'tcx>,
|
||||
llfndecl: ValueRef,
|
||||
id: ast::NodeId,
|
||||
has_env: bool,
|
||||
output_type: ty::t,
|
||||
param_substs: &'a param_substs,
|
||||
sp: Option<Span>,
|
||||
block_arena: &'a TypedArena<common::BlockS<'a, 'tcx>>)
|
||||
-> FunctionContext<'a, 'tcx> {
|
||||
param_substs.validate();
|
||||
|
||||
debug!("new_fn_ctxt(path={}, id={}, param_substs={})",
|
||||
|
@ -1494,9 +1484,9 @@ pub fn new_fn_ctxt<'a>(ccx: &'a CrateContext,
|
|||
|
||||
/// Performs setup on a newly created function, creating the entry scope block
|
||||
/// and allocating space for the return pointer.
|
||||
pub fn init_function<'a>(fcx: &'a FunctionContext<'a>,
|
||||
skip_retptr: bool,
|
||||
output_type: ty::t) -> &'a Block<'a> {
|
||||
pub fn init_function<'a, 'tcx>(fcx: &'a FunctionContext<'a, 'tcx>,
|
||||
skip_retptr: bool,
|
||||
output_type: ty::t) -> Block<'a, 'tcx> {
|
||||
let entry_bcx = fcx.new_temp_block("entry-block");
|
||||
|
||||
// Use a dummy instruction as the insertion point for all allocas.
|
||||
|
@ -1564,9 +1554,8 @@ pub fn create_datums_for_fn_args(fcx: &FunctionContext,
|
|||
/// datums.
|
||||
///
|
||||
/// FIXME(pcwalton): Reduce the amount of code bloat this is responsible for.
|
||||
fn create_datums_for_fn_args_under_call_abi<
|
||||
'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
fn create_datums_for_fn_args_under_call_abi(
|
||||
mut bcx: Block,
|
||||
arg_scope: cleanup::CustomScopeIndex,
|
||||
arg_tys: &[ty::t])
|
||||
-> Vec<RvalueDatum> {
|
||||
|
@ -1632,12 +1621,12 @@ fn create_datums_for_fn_args_under_call_abi<
|
|||
result
|
||||
}
|
||||
|
||||
fn copy_args_to_allocas<'a>(fcx: &FunctionContext<'a>,
|
||||
arg_scope: cleanup::CustomScopeIndex,
|
||||
bcx: &'a Block<'a>,
|
||||
args: &[ast::Arg],
|
||||
arg_datums: Vec<RvalueDatum> )
|
||||
-> &'a Block<'a> {
|
||||
fn copy_args_to_allocas<'blk, 'tcx>(fcx: &FunctionContext<'blk, 'tcx>,
|
||||
arg_scope: cleanup::CustomScopeIndex,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
args: &[ast::Arg],
|
||||
arg_datums: Vec<RvalueDatum> )
|
||||
-> Block<'blk, 'tcx> {
|
||||
debug!("copy_args_to_allocas");
|
||||
|
||||
let _icx = push_ctxt("copy_args_to_allocas");
|
||||
|
@ -1664,13 +1653,13 @@ fn copy_args_to_allocas<'a>(fcx: &FunctionContext<'a>,
|
|||
bcx
|
||||
}
|
||||
|
||||
fn copy_unboxed_closure_args_to_allocas<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
fn copy_unboxed_closure_args_to_allocas<'blk, 'tcx>(
|
||||
mut bcx: Block<'blk, 'tcx>,
|
||||
arg_scope: cleanup::CustomScopeIndex,
|
||||
args: &[ast::Arg],
|
||||
arg_datums: Vec<RvalueDatum>,
|
||||
monomorphized_arg_types: &[ty::t])
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("copy_unboxed_closure_args_to_allocas");
|
||||
let arg_scope_id = cleanup::CustomScope(arg_scope);
|
||||
|
||||
|
@ -1720,9 +1709,9 @@ fn copy_unboxed_closure_args_to_allocas<'a>(
|
|||
|
||||
// Ties up the llstaticallocas -> llloadenv -> lltop edges,
|
||||
// and builds the return block.
|
||||
pub fn finish_fn<'a>(fcx: &'a FunctionContext<'a>,
|
||||
last_bcx: &'a Block<'a>,
|
||||
retty: ty::t) {
|
||||
pub fn finish_fn<'blk, 'tcx>(fcx: &'blk FunctionContext<'blk, 'tcx>,
|
||||
last_bcx: Block<'blk, 'tcx>,
|
||||
retty: ty::t) {
|
||||
let _icx = push_ctxt("finish_fn");
|
||||
|
||||
// This shouldn't need to recompute the return type,
|
||||
|
@ -1744,7 +1733,7 @@ pub fn finish_fn<'a>(fcx: &'a FunctionContext<'a>,
|
|||
}
|
||||
|
||||
// Builds the return block for a function.
|
||||
pub fn build_return_block(fcx: &FunctionContext, ret_cx: &Block, retty: ty::t) {
|
||||
pub fn build_return_block(fcx: &FunctionContext, ret_cx: Block, retty: ty::t) {
|
||||
if fcx.llretslotptr.get().is_none() ||
|
||||
(!fcx.needs_ret_allocas && fcx.caller_expects_out_pointer) {
|
||||
return RetVoid(ret_cx);
|
||||
|
@ -1813,8 +1802,8 @@ pub fn trans_closure(ccx: &CrateContext,
|
|||
abi: Abi,
|
||||
has_env: bool,
|
||||
is_unboxed_closure: IsUnboxedClosureFlag,
|
||||
maybe_load_env: <'a>|&'a Block<'a>, ScopeId|
|
||||
-> &'a Block<'a>) {
|
||||
maybe_load_env: <'blk, 'tcx> |Block<'blk, 'tcx>, ScopeId|
|
||||
-> Block<'blk, 'tcx>) {
|
||||
ccx.stats().n_closures.set(ccx.stats().n_closures.get() + 1);
|
||||
|
||||
let _icx = push_ctxt("trans_closure");
|
||||
|
@ -1980,11 +1969,11 @@ pub fn trans_enum_variant(ccx: &CrateContext,
|
|||
llfndecl);
|
||||
}
|
||||
|
||||
pub fn trans_named_tuple_constructor<'a>(mut bcx: &'a Block<'a>,
|
||||
ctor_ty: ty::t,
|
||||
disr: ty::Disr,
|
||||
args: callee::CallArgs,
|
||||
dest: expr::Dest) -> Result<'a> {
|
||||
pub fn trans_named_tuple_constructor<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
ctor_ty: ty::t,
|
||||
disr: ty::Disr,
|
||||
args: callee::CallArgs,
|
||||
dest: expr::Dest) -> Result<'blk, 'tcx> {
|
||||
|
||||
let ccx = bcx.fcx.ccx;
|
||||
let tcx = ccx.tcx();
|
||||
|
@ -2142,11 +2131,11 @@ fn enum_variant_size_lint(ccx: &CrateContext, enum_def: &ast::EnumDef, sp: Span,
|
|||
}
|
||||
}
|
||||
|
||||
pub struct TransItemVisitor<'a> {
|
||||
pub ccx: &'a CrateContext<'a>,
|
||||
pub struct TransItemVisitor<'a, 'tcx: 'a> {
|
||||
pub ccx: &'a CrateContext<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for TransItemVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for TransItemVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _:()) {
|
||||
trans_item(self.ccx, i);
|
||||
}
|
||||
|
@ -2911,20 +2900,20 @@ pub fn p2i(ccx: &CrateContext, v: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn crate_ctxt_to_encode_parms<'r>(cx: &'r SharedCrateContext,
|
||||
ie: encoder::EncodeInlinedItem<'r>)
|
||||
-> encoder::EncodeParams<'r> {
|
||||
encoder::EncodeParams {
|
||||
diag: cx.sess().diagnostic(),
|
||||
tcx: cx.tcx(),
|
||||
reexports2: cx.exp_map2(),
|
||||
item_symbols: cx.item_symbols(),
|
||||
non_inlineable_statics: cx.non_inlineable_statics(),
|
||||
link_meta: cx.link_meta(),
|
||||
cstore: &cx.sess().cstore,
|
||||
encode_inlined_item: ie,
|
||||
reachable: cx.reachable(),
|
||||
}
|
||||
pub fn crate_ctxt_to_encode_parms<'a, 'tcx>(cx: &'a SharedCrateContext<'tcx>,
|
||||
ie: encoder::EncodeInlinedItem<'a>)
|
||||
-> encoder::EncodeParams<'a, 'tcx> {
|
||||
encoder::EncodeParams {
|
||||
diag: cx.sess().diagnostic(),
|
||||
tcx: cx.tcx(),
|
||||
reexports2: cx.exp_map2(),
|
||||
item_symbols: cx.item_symbols(),
|
||||
non_inlineable_statics: cx.non_inlineable_statics(),
|
||||
link_meta: cx.link_meta(),
|
||||
cstore: &cx.sess().cstore,
|
||||
encode_inlined_item: ie,
|
||||
reachable: cx.reachable(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write_metadata(cx: &SharedCrateContext, krate: &ast::Crate) -> Vec<u8> {
|
||||
|
|
|
@ -23,18 +23,18 @@
|
|||
|
||||
use libc::{c_uint, c_ulonglong, c_char};
|
||||
|
||||
pub fn terminate(cx: &Block, _: &str) {
|
||||
pub fn terminate(cx: Block, _: &str) {
|
||||
debug!("terminate({})", cx.to_str());
|
||||
cx.terminated.set(true);
|
||||
}
|
||||
|
||||
pub fn check_not_terminated(cx: &Block) {
|
||||
pub fn check_not_terminated(cx: Block) {
|
||||
if cx.terminated.get() {
|
||||
fail!("already terminated!");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn B<'a>(cx: &'a Block) -> Builder<'a> {
|
||||
pub fn B<'blk, 'tcx>(cx: Block<'blk, 'tcx>) -> Builder<'blk, 'tcx> {
|
||||
let b = cx.fcx.ccx.builder();
|
||||
b.position_at_end(cx.llbb);
|
||||
b
|
||||
|
@ -48,35 +48,35 @@ pub fn B<'a>(cx: &'a Block) -> Builder<'a> {
|
|||
// for (fail/break/return statements, call to diverging functions, etc), and
|
||||
// further instructions to the block should simply be ignored.
|
||||
|
||||
pub fn RetVoid(cx: &Block) {
|
||||
pub fn RetVoid(cx: Block) {
|
||||
if cx.unreachable.get() { return; }
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "RetVoid");
|
||||
B(cx).ret_void();
|
||||
}
|
||||
|
||||
pub fn Ret(cx: &Block, v: ValueRef) {
|
||||
pub fn Ret(cx: Block, v: ValueRef) {
|
||||
if cx.unreachable.get() { return; }
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "Ret");
|
||||
B(cx).ret(v);
|
||||
}
|
||||
|
||||
pub fn AggregateRet(cx: &Block, ret_vals: &[ValueRef]) {
|
||||
pub fn AggregateRet(cx: Block, ret_vals: &[ValueRef]) {
|
||||
if cx.unreachable.get() { return; }
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "AggregateRet");
|
||||
B(cx).aggregate_ret(ret_vals);
|
||||
}
|
||||
|
||||
pub fn Br(cx: &Block, dest: BasicBlockRef) {
|
||||
pub fn Br(cx: Block, dest: BasicBlockRef) {
|
||||
if cx.unreachable.get() { return; }
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "Br");
|
||||
B(cx).br(dest);
|
||||
}
|
||||
|
||||
pub fn CondBr(cx: &Block,
|
||||
pub fn CondBr(cx: Block,
|
||||
if_: ValueRef,
|
||||
then: BasicBlockRef,
|
||||
else_: BasicBlockRef) {
|
||||
|
@ -86,7 +86,7 @@ pub fn CondBr(cx: &Block,
|
|||
B(cx).cond_br(if_, then, else_);
|
||||
}
|
||||
|
||||
pub fn Switch(cx: &Block, v: ValueRef, else_: BasicBlockRef, num_cases: uint)
|
||||
pub fn Switch(cx: Block, v: ValueRef, else_: BasicBlockRef, num_cases: uint)
|
||||
-> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
check_not_terminated(cx);
|
||||
|
@ -101,14 +101,14 @@ pub fn AddCase(s: ValueRef, on_val: ValueRef, dest: BasicBlockRef) {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn IndirectBr(cx: &Block, addr: ValueRef, num_dests: uint) {
|
||||
pub fn IndirectBr(cx: Block, addr: ValueRef, num_dests: uint) {
|
||||
if cx.unreachable.get() { return; }
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "IndirectBr");
|
||||
B(cx).indirect_br(addr, num_dests);
|
||||
}
|
||||
|
||||
pub fn Invoke(cx: &Block,
|
||||
pub fn Invoke(cx: Block,
|
||||
fn_: ValueRef,
|
||||
args: &[ValueRef],
|
||||
then: BasicBlockRef,
|
||||
|
@ -126,7 +126,7 @@ pub fn Invoke(cx: &Block,
|
|||
B(cx).invoke(fn_, args, then, catch, attributes)
|
||||
}
|
||||
|
||||
pub fn Unreachable(cx: &Block) {
|
||||
pub fn Unreachable(cx: Block) {
|
||||
if cx.unreachable.get() {
|
||||
return
|
||||
}
|
||||
|
@ -143,163 +143,163 @@ pub fn _Undef(val: ValueRef) -> ValueRef {
|
|||
}
|
||||
|
||||
/* Arithmetic */
|
||||
pub fn Add(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Add(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).add(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NSWAdd(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NSWAdd(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nswadd(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NUWAdd(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NUWAdd(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nuwadd(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn FAdd(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn FAdd(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).fadd(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Sub(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Sub(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).sub(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NSWSub(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NSWSub(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nswsub(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NUWSub(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NUWSub(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nuwsub(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn FSub(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn FSub(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).fsub(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Mul(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Mul(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).mul(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NSWMul(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NSWMul(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nswmul(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn NUWMul(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn NUWMul(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).nuwmul(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn FMul(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn FMul(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).fmul(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn UDiv(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn UDiv(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).udiv(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn SDiv(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn SDiv(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).sdiv(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn ExactSDiv(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn ExactSDiv(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).exactsdiv(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn FDiv(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn FDiv(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).fdiv(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn URem(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn URem(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).urem(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn SRem(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn SRem(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).srem(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn FRem(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn FRem(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).frem(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Shl(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Shl(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).shl(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn LShr(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn LShr(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).lshr(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn AShr(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn AShr(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).ashr(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn And(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn And(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).and(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Or(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Or(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).or(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Xor(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn Xor(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).xor(lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn BinOp(cx: &Block, op: Opcode, lhs: ValueRef, rhs: ValueRef)
|
||||
pub fn BinOp(cx: Block, op: Opcode, lhs: ValueRef, rhs: ValueRef)
|
||||
-> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(lhs); }
|
||||
B(cx).binop(op, lhs, rhs)
|
||||
}
|
||||
|
||||
pub fn Neg(cx: &Block, v: ValueRef) -> ValueRef {
|
||||
pub fn Neg(cx: Block, v: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
B(cx).neg(v)
|
||||
}
|
||||
|
||||
pub fn NSWNeg(cx: &Block, v: ValueRef) -> ValueRef {
|
||||
pub fn NSWNeg(cx: Block, v: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
B(cx).nswneg(v)
|
||||
}
|
||||
|
||||
pub fn NUWNeg(cx: &Block, v: ValueRef) -> ValueRef {
|
||||
pub fn NUWNeg(cx: Block, v: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
B(cx).nuwneg(v)
|
||||
}
|
||||
pub fn FNeg(cx: &Block, v: ValueRef) -> ValueRef {
|
||||
pub fn FNeg(cx: Block, v: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
B(cx).fneg(v)
|
||||
}
|
||||
|
||||
pub fn Not(cx: &Block, v: ValueRef) -> ValueRef {
|
||||
pub fn Not(cx: Block, v: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(v); }
|
||||
B(cx).not(v)
|
||||
}
|
||||
|
||||
/* Memory */
|
||||
pub fn Malloc(cx: &Block, ty: Type) -> ValueRef {
|
||||
pub fn Malloc(cx: Block, ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i8p(cx.ccx()).to_ref());
|
||||
|
@ -308,7 +308,7 @@ pub fn Malloc(cx: &Block, ty: Type) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn ArrayMalloc(cx: &Block, ty: Type, val: ValueRef) -> ValueRef {
|
||||
pub fn ArrayMalloc(cx: Block, ty: Type, val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i8p(cx.ccx()).to_ref());
|
||||
|
@ -317,7 +317,7 @@ pub fn ArrayMalloc(cx: &Block, ty: Type, val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn Alloca(cx: &Block, ty: Type, name: &str) -> ValueRef {
|
||||
pub fn Alloca(cx: Block, ty: Type, name: &str) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ty.ptr_to().to_ref()); }
|
||||
AllocaFcx(cx.fcx, ty, name)
|
||||
|
@ -330,7 +330,7 @@ pub fn AllocaFcx(fcx: &FunctionContext, ty: Type, name: &str) -> ValueRef {
|
|||
b.alloca(ty, name)
|
||||
}
|
||||
|
||||
pub fn ArrayAlloca(cx: &Block, ty: Type, val: ValueRef) -> ValueRef {
|
||||
pub fn ArrayAlloca(cx: Block, ty: Type, val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ty.ptr_to().to_ref()); }
|
||||
let b = cx.fcx.ccx.builder();
|
||||
|
@ -339,12 +339,12 @@ pub fn ArrayAlloca(cx: &Block, ty: Type, val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn Free(cx: &Block, pointer_val: ValueRef) {
|
||||
pub fn Free(cx: Block, pointer_val: ValueRef) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).free(pointer_val)
|
||||
}
|
||||
|
||||
pub fn Load(cx: &Block, pointer_val: ValueRef) -> ValueRef {
|
||||
pub fn Load(cx: Block, pointer_val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
let ccx = cx.fcx.ccx;
|
||||
if cx.unreachable.get() {
|
||||
|
@ -360,7 +360,7 @@ pub fn Load(cx: &Block, pointer_val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn VolatileLoad(cx: &Block, pointer_val: ValueRef) -> ValueRef {
|
||||
pub fn VolatileLoad(cx: Block, pointer_val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).to_ref());
|
||||
|
@ -369,7 +369,7 @@ pub fn VolatileLoad(cx: &Block, pointer_val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn AtomicLoad(cx: &Block, pointer_val: ValueRef, order: AtomicOrdering) -> ValueRef {
|
||||
pub fn AtomicLoad(cx: Block, pointer_val: ValueRef, order: AtomicOrdering) -> ValueRef {
|
||||
unsafe {
|
||||
let ccx = cx.fcx.ccx;
|
||||
if cx.unreachable.get() {
|
||||
|
@ -380,7 +380,7 @@ pub fn AtomicLoad(cx: &Block, pointer_val: ValueRef, order: AtomicOrdering) -> V
|
|||
}
|
||||
|
||||
|
||||
pub fn LoadRangeAssert(cx: &Block, pointer_val: ValueRef, lo: c_ulonglong,
|
||||
pub fn LoadRangeAssert(cx: Block, pointer_val: ValueRef, lo: c_ulonglong,
|
||||
hi: c_ulonglong, signed: llvm::Bool) -> ValueRef {
|
||||
if cx.unreachable.get() {
|
||||
let ccx = cx.fcx.ccx;
|
||||
|
@ -398,22 +398,22 @@ pub fn LoadRangeAssert(cx: &Block, pointer_val: ValueRef, lo: c_ulonglong,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn Store(cx: &Block, val: ValueRef, ptr: ValueRef) {
|
||||
pub fn Store(cx: Block, val: ValueRef, ptr: ValueRef) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).store(val, ptr)
|
||||
}
|
||||
|
||||
pub fn VolatileStore(cx: &Block, val: ValueRef, ptr: ValueRef) {
|
||||
pub fn VolatileStore(cx: Block, val: ValueRef, ptr: ValueRef) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).volatile_store(val, ptr)
|
||||
}
|
||||
|
||||
pub fn AtomicStore(cx: &Block, val: ValueRef, ptr: ValueRef, order: AtomicOrdering) {
|
||||
pub fn AtomicStore(cx: Block, val: ValueRef, ptr: ValueRef, order: AtomicOrdering) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).atomic_store(val, ptr, order)
|
||||
}
|
||||
|
||||
pub fn GEP(cx: &Block, pointer: ValueRef, indices: &[ValueRef]) -> ValueRef {
|
||||
pub fn GEP(cx: Block, pointer: ValueRef, indices: &[ValueRef]) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).ptr_to().to_ref());
|
||||
|
@ -425,7 +425,7 @@ pub fn GEP(cx: &Block, pointer: ValueRef, indices: &[ValueRef]) -> ValueRef {
|
|||
// Simple wrapper around GEP that takes an array of ints and wraps them
|
||||
// in C_i32()
|
||||
#[inline]
|
||||
pub fn GEPi(cx: &Block, base: ValueRef, ixs: &[uint]) -> ValueRef {
|
||||
pub fn GEPi(cx: Block, base: ValueRef, ixs: &[uint]) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).ptr_to().to_ref());
|
||||
|
@ -434,7 +434,7 @@ pub fn GEPi(cx: &Block, base: ValueRef, ixs: &[uint]) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn InBoundsGEP(cx: &Block, pointer: ValueRef, indices: &[ValueRef]) -> ValueRef {
|
||||
pub fn InBoundsGEP(cx: Block, pointer: ValueRef, indices: &[ValueRef]) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).ptr_to().to_ref());
|
||||
|
@ -443,7 +443,7 @@ pub fn InBoundsGEP(cx: &Block, pointer: ValueRef, indices: &[ValueRef]) -> Value
|
|||
}
|
||||
}
|
||||
|
||||
pub fn StructGEP(cx: &Block, pointer: ValueRef, idx: uint) -> ValueRef {
|
||||
pub fn StructGEP(cx: Block, pointer: ValueRef, idx: uint) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).ptr_to().to_ref());
|
||||
|
@ -452,7 +452,7 @@ pub fn StructGEP(cx: &Block, pointer: ValueRef, idx: uint) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn GlobalString(cx: &Block, _str: *const c_char) -> ValueRef {
|
||||
pub fn GlobalString(cx: Block, _str: *const c_char) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i8p(cx.ccx()).to_ref());
|
||||
|
@ -461,7 +461,7 @@ pub fn GlobalString(cx: &Block, _str: *const c_char) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn GlobalStringPtr(cx: &Block, _str: *const c_char) -> ValueRef {
|
||||
pub fn GlobalStringPtr(cx: Block, _str: *const c_char) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i8p(cx.ccx()).to_ref());
|
||||
|
@ -471,112 +471,112 @@ pub fn GlobalStringPtr(cx: &Block, _str: *const c_char) -> ValueRef {
|
|||
}
|
||||
|
||||
/* Casts */
|
||||
pub fn Trunc(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn Trunc(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).trunc(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ZExt(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn ZExt(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).zext(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn SExt(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn SExt(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).sext(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn FPToUI(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn FPToUI(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).fptoui(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn FPToSI(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn FPToSI(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).fptosi(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn UIToFP(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn UIToFP(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).uitofp(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn SIToFP(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn SIToFP(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).sitofp(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn FPTrunc(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn FPTrunc(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).fptrunc(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn FPExt(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn FPExt(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).fpext(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn PtrToInt(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn PtrToInt(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).ptrtoint(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn IntToPtr(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn IntToPtr(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).inttoptr(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn BitCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn BitCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).bitcast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ZExtOrBitCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn ZExtOrBitCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).zext_or_bitcast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn SExtOrBitCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn SExtOrBitCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).sext_or_bitcast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn TruncOrBitCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn TruncOrBitCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).trunc_or_bitcast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn Cast(cx: &Block, op: Opcode, val: ValueRef, dest_ty: Type,
|
||||
pub fn Cast(cx: Block, op: Opcode, val: ValueRef, dest_ty: Type,
|
||||
_: *const u8)
|
||||
-> ValueRef {
|
||||
unsafe {
|
||||
|
@ -585,21 +585,21 @@ pub fn Cast(cx: &Block, op: Opcode, val: ValueRef, dest_ty: Type,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn PointerCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn PointerCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).pointercast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn IntCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn IntCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).intcast(val, dest_ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn FPCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
pub fn FPCast(cx: Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(dest_ty.to_ref()); }
|
||||
B(cx).fpcast(val, dest_ty)
|
||||
|
@ -608,7 +608,7 @@ pub fn FPCast(cx: &Block, val: ValueRef, dest_ty: Type) -> ValueRef {
|
|||
|
||||
|
||||
/* Comparisons */
|
||||
pub fn ICmp(cx: &Block, op: IntPredicate, lhs: ValueRef, rhs: ValueRef)
|
||||
pub fn ICmp(cx: Block, op: IntPredicate, lhs: ValueRef, rhs: ValueRef)
|
||||
-> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
|
@ -618,7 +618,7 @@ pub fn ICmp(cx: &Block, op: IntPredicate, lhs: ValueRef, rhs: ValueRef)
|
|||
}
|
||||
}
|
||||
|
||||
pub fn FCmp(cx: &Block, op: RealPredicate, lhs: ValueRef, rhs: ValueRef)
|
||||
pub fn FCmp(cx: Block, op: RealPredicate, lhs: ValueRef, rhs: ValueRef)
|
||||
-> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
|
@ -629,14 +629,14 @@ pub fn FCmp(cx: &Block, op: RealPredicate, lhs: ValueRef, rhs: ValueRef)
|
|||
}
|
||||
|
||||
/* Miscellaneous instructions */
|
||||
pub fn EmptyPhi(cx: &Block, ty: Type) -> ValueRef {
|
||||
pub fn EmptyPhi(cx: Block, ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ty.to_ref()); }
|
||||
B(cx).empty_phi(ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn Phi(cx: &Block, ty: Type, vals: &[ValueRef],
|
||||
pub fn Phi(cx: Block, ty: Type, vals: &[ValueRef],
|
||||
bbs: &[BasicBlockRef]) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ty.to_ref()); }
|
||||
|
@ -651,7 +651,7 @@ pub fn AddIncomingToPhi(phi: ValueRef, val: ValueRef, bb: BasicBlockRef) {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn _UndefReturn(cx: &Block, fn_: ValueRef) -> ValueRef {
|
||||
pub fn _UndefReturn(cx: Block, fn_: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
let ccx = cx.fcx.ccx;
|
||||
let ty = val_ty(fn_);
|
||||
|
@ -665,51 +665,51 @@ pub fn _UndefReturn(cx: &Block, fn_: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn add_span_comment(cx: &Block, sp: Span, text: &str) {
|
||||
pub fn add_span_comment(cx: Block, sp: Span, text: &str) {
|
||||
B(cx).add_span_comment(sp, text)
|
||||
}
|
||||
|
||||
pub fn add_comment(cx: &Block, text: &str) {
|
||||
pub fn add_comment(cx: Block, text: &str) {
|
||||
B(cx).add_comment(text)
|
||||
}
|
||||
|
||||
pub fn InlineAsmCall(cx: &Block, asm: *const c_char, cons: *const c_char,
|
||||
pub fn InlineAsmCall(cx: Block, asm: *const c_char, cons: *const c_char,
|
||||
inputs: &[ValueRef], output: Type,
|
||||
volatile: bool, alignstack: bool,
|
||||
dia: AsmDialect) -> ValueRef {
|
||||
B(cx).inline_asm_call(asm, cons, inputs, output, volatile, alignstack, dia)
|
||||
}
|
||||
|
||||
pub fn Call(cx: &Block, fn_: ValueRef, args: &[ValueRef],
|
||||
pub fn Call(cx: Block, fn_: ValueRef, args: &[ValueRef],
|
||||
attributes: Option<AttrBuilder>) -> ValueRef {
|
||||
if cx.unreachable.get() { return _UndefReturn(cx, fn_); }
|
||||
B(cx).call(fn_, args, attributes)
|
||||
}
|
||||
|
||||
pub fn CallWithConv(cx: &Block, fn_: ValueRef, args: &[ValueRef], conv: CallConv,
|
||||
pub fn CallWithConv(cx: Block, fn_: ValueRef, args: &[ValueRef], conv: CallConv,
|
||||
attributes: Option<AttrBuilder>) -> ValueRef {
|
||||
if cx.unreachable.get() { return _UndefReturn(cx, fn_); }
|
||||
B(cx).call_with_conv(fn_, args, conv, attributes)
|
||||
}
|
||||
|
||||
pub fn AtomicFence(cx: &Block, order: AtomicOrdering) {
|
||||
pub fn AtomicFence(cx: Block, order: AtomicOrdering) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).atomic_fence(order)
|
||||
}
|
||||
|
||||
pub fn Select(cx: &Block, if_: ValueRef, then: ValueRef, else_: ValueRef) -> ValueRef {
|
||||
pub fn Select(cx: Block, if_: ValueRef, then: ValueRef, else_: ValueRef) -> ValueRef {
|
||||
if cx.unreachable.get() { return _Undef(then); }
|
||||
B(cx).select(if_, then, else_)
|
||||
}
|
||||
|
||||
pub fn VAArg(cx: &Block, list: ValueRef, ty: Type) -> ValueRef {
|
||||
pub fn VAArg(cx: Block, list: ValueRef, ty: Type) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ty.to_ref()); }
|
||||
B(cx).va_arg(list, ty)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ExtractElement(cx: &Block, vec_val: ValueRef, index: ValueRef) -> ValueRef {
|
||||
pub fn ExtractElement(cx: Block, vec_val: ValueRef, index: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).to_ref());
|
||||
|
@ -718,7 +718,7 @@ pub fn ExtractElement(cx: &Block, vec_val: ValueRef, index: ValueRef) -> ValueRe
|
|||
}
|
||||
}
|
||||
|
||||
pub fn InsertElement(cx: &Block, vec_val: ValueRef, elt_val: ValueRef,
|
||||
pub fn InsertElement(cx: Block, vec_val: ValueRef, elt_val: ValueRef,
|
||||
index: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
|
@ -728,7 +728,7 @@ pub fn InsertElement(cx: &Block, vec_val: ValueRef, elt_val: ValueRef,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn ShuffleVector(cx: &Block, v1: ValueRef, v2: ValueRef,
|
||||
pub fn ShuffleVector(cx: Block, v1: ValueRef, v2: ValueRef,
|
||||
mask: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
|
@ -738,7 +738,7 @@ pub fn ShuffleVector(cx: &Block, v1: ValueRef, v2: ValueRef,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn VectorSplat(cx: &Block, num_elts: uint, elt_val: ValueRef) -> ValueRef {
|
||||
pub fn VectorSplat(cx: Block, num_elts: uint, elt_val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).to_ref());
|
||||
|
@ -747,7 +747,7 @@ pub fn VectorSplat(cx: &Block, num_elts: uint, elt_val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn ExtractValue(cx: &Block, agg_val: ValueRef, index: uint) -> ValueRef {
|
||||
pub fn ExtractValue(cx: Block, agg_val: ValueRef, index: uint) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).to_ref());
|
||||
|
@ -756,7 +756,7 @@ pub fn ExtractValue(cx: &Block, agg_val: ValueRef, index: uint) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn InsertValue(cx: &Block, agg_val: ValueRef, elt_val: ValueRef, index: uint) -> ValueRef {
|
||||
pub fn InsertValue(cx: Block, agg_val: ValueRef, elt_val: ValueRef, index: uint) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::nil(cx.ccx()).to_ref());
|
||||
|
@ -765,7 +765,7 @@ pub fn InsertValue(cx: &Block, agg_val: ValueRef, elt_val: ValueRef, index: uint
|
|||
}
|
||||
}
|
||||
|
||||
pub fn IsNull(cx: &Block, val: ValueRef) -> ValueRef {
|
||||
pub fn IsNull(cx: Block, val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i1(cx.ccx()).to_ref());
|
||||
|
@ -774,7 +774,7 @@ pub fn IsNull(cx: &Block, val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn IsNotNull(cx: &Block, val: ValueRef) -> ValueRef {
|
||||
pub fn IsNotNull(cx: Block, val: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
if cx.unreachable.get() {
|
||||
return llvm::LLVMGetUndef(Type::i1(cx.ccx()).to_ref());
|
||||
|
@ -783,7 +783,7 @@ pub fn IsNotNull(cx: &Block, val: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn PtrDiff(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
pub fn PtrDiff(cx: Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
||||
unsafe {
|
||||
let ccx = cx.fcx.ccx;
|
||||
if cx.unreachable.get() { return llvm::LLVMGetUndef(ccx.int_type().to_ref()); }
|
||||
|
@ -791,36 +791,36 @@ pub fn PtrDiff(cx: &Block, lhs: ValueRef, rhs: ValueRef) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn Trap(cx: &Block) {
|
||||
pub fn Trap(cx: Block) {
|
||||
if cx.unreachable.get() { return; }
|
||||
B(cx).trap();
|
||||
}
|
||||
|
||||
pub fn LandingPad(cx: &Block, ty: Type, pers_fn: ValueRef,
|
||||
pub fn LandingPad(cx: Block, ty: Type, pers_fn: ValueRef,
|
||||
num_clauses: uint) -> ValueRef {
|
||||
check_not_terminated(cx);
|
||||
assert!(!cx.unreachable.get());
|
||||
B(cx).landing_pad(ty, pers_fn, num_clauses)
|
||||
}
|
||||
|
||||
pub fn SetCleanup(cx: &Block, landing_pad: ValueRef) {
|
||||
pub fn SetCleanup(cx: Block, landing_pad: ValueRef) {
|
||||
B(cx).set_cleanup(landing_pad)
|
||||
}
|
||||
|
||||
pub fn Resume(cx: &Block, exn: ValueRef) -> ValueRef {
|
||||
pub fn Resume(cx: Block, exn: ValueRef) -> ValueRef {
|
||||
check_not_terminated(cx);
|
||||
terminate(cx, "Resume");
|
||||
B(cx).resume(exn)
|
||||
}
|
||||
|
||||
// Atomic Operations
|
||||
pub fn AtomicCmpXchg(cx: &Block, dst: ValueRef,
|
||||
pub fn AtomicCmpXchg(cx: Block, dst: ValueRef,
|
||||
cmp: ValueRef, src: ValueRef,
|
||||
order: AtomicOrdering,
|
||||
failure_order: AtomicOrdering) -> ValueRef {
|
||||
B(cx).atomic_cmpxchg(dst, cmp, src, order, failure_order)
|
||||
}
|
||||
pub fn AtomicRMW(cx: &Block, op: AtomicBinOp,
|
||||
pub fn AtomicRMW(cx: Block, op: AtomicBinOp,
|
||||
dst: ValueRef, src: ValueRef,
|
||||
order: AtomicOrdering) -> ValueRef {
|
||||
B(cx).atomic_rmw(op, dst, src, order)
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
use std::string::String;
|
||||
use syntax::codemap::Span;
|
||||
|
||||
pub struct Builder<'a> {
|
||||
pub struct Builder<'a, 'tcx: 'a> {
|
||||
pub llbuilder: BuilderRef,
|
||||
pub ccx: &'a CrateContext<'a>,
|
||||
pub ccx: &'a CrateContext<'a, 'tcx>,
|
||||
}
|
||||
|
||||
// This is a really awful way to get a zero-length c-string, but better (and a
|
||||
|
@ -35,8 +35,8 @@ pub fn noname() -> *const c_char {
|
|||
&cnull as *const c_char
|
||||
}
|
||||
|
||||
impl<'a> Builder<'a> {
|
||||
pub fn new(ccx: &'a CrateContext) -> Builder<'a> {
|
||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
pub fn new(ccx: &'a CrateContext<'a, 'tcx>) -> Builder<'a, 'tcx> {
|
||||
Builder {
|
||||
llbuilder: ccx.raw_builder(),
|
||||
ccx: ccx,
|
||||
|
|
|
@ -80,12 +80,13 @@ pub enum CalleeData {
|
|||
TraitItem(MethodData)
|
||||
}
|
||||
|
||||
pub struct Callee<'a> {
|
||||
pub bcx: &'a Block<'a>,
|
||||
pub struct Callee<'blk, 'tcx: 'blk> {
|
||||
pub bcx: Block<'blk, 'tcx>,
|
||||
pub data: CalleeData,
|
||||
}
|
||||
|
||||
fn trans<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
||||
fn trans<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, expr: &ast::Expr)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_callee");
|
||||
debug!("callee::trans(expr={})", expr.repr(bcx.tcx()));
|
||||
|
||||
|
@ -100,7 +101,8 @@ fn trans<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
|||
// any other expressions are closures:
|
||||
return datum_callee(bcx, expr);
|
||||
|
||||
fn datum_callee<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
||||
fn datum_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, expr: &ast::Expr)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
let DatumBlock {bcx: mut bcx, datum} = expr::trans(bcx, expr);
|
||||
match ty::get(datum.ty).sty {
|
||||
ty::ty_bare_fn(..) => {
|
||||
|
@ -128,15 +130,16 @@ fn datum_callee<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn fn_callee<'a>(bcx: &'a Block<'a>, llfn: ValueRef) -> Callee<'a> {
|
||||
fn fn_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, llfn: ValueRef)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
return Callee {
|
||||
bcx: bcx,
|
||||
data: Fn(llfn),
|
||||
};
|
||||
}
|
||||
|
||||
fn trans_def<'a>(bcx: &'a Block<'a>, def: def::Def, ref_expr: &ast::Expr)
|
||||
-> Callee<'a> {
|
||||
fn trans_def<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, def: def::Def, ref_expr: &ast::Expr)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
debug!("trans_def(def={}, ref_expr={})", def.repr(bcx.tcx()), ref_expr.repr(bcx.tcx()));
|
||||
let expr_ty = node_id_type(bcx, ref_expr.id);
|
||||
match def {
|
||||
|
@ -214,7 +217,7 @@ fn trans_def<'a>(bcx: &'a Block<'a>, def: def::Def, ref_expr: &ast::Expr)
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_fn_ref(bcx: &Block, def_id: ast::DefId, node: ExprOrMethodCall) -> ValueRef {
|
||||
pub fn trans_fn_ref(bcx: Block, def_id: ast::DefId, node: ExprOrMethodCall) -> ValueRef {
|
||||
/*!
|
||||
* Translates a reference (with id `ref_id`) to the fn/method
|
||||
* with id `def_id` into a function pointer. This may require
|
||||
|
@ -237,12 +240,12 @@ pub fn trans_fn_ref(bcx: &Block, def_id: ast::DefId, node: ExprOrMethodCall) ->
|
|||
trans_fn_ref_with_vtables(bcx, def_id, node, substs, vtables)
|
||||
}
|
||||
|
||||
fn trans_fn_ref_with_vtables_to_callee<'a>(bcx: &'a Block<'a>,
|
||||
def_id: ast::DefId,
|
||||
ref_id: ast::NodeId,
|
||||
substs: subst::Substs,
|
||||
vtables: typeck::vtable_res)
|
||||
-> Callee<'a> {
|
||||
fn trans_fn_ref_with_vtables_to_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
def_id: ast::DefId,
|
||||
ref_id: ast::NodeId,
|
||||
substs: subst::Substs,
|
||||
vtables: typeck::vtable_res)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
Callee {
|
||||
bcx: bcx,
|
||||
data: Fn(trans_fn_ref_with_vtables(bcx,
|
||||
|
@ -253,7 +256,7 @@ fn trans_fn_ref_with_vtables_to_callee<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn resolve_default_method_vtables(bcx: &Block,
|
||||
fn resolve_default_method_vtables(bcx: Block,
|
||||
impl_id: ast::DefId,
|
||||
substs: &subst::Substs,
|
||||
impl_vtables: typeck::vtable_res)
|
||||
|
@ -281,7 +284,7 @@ fn resolve_default_method_vtables(bcx: &Block,
|
|||
|
||||
/// Translates the adapter that deconstructs a `Box<Trait>` object into
|
||||
/// `Trait` so that a by-value self method can be called.
|
||||
pub fn trans_unboxing_shim(bcx: &Block,
|
||||
pub fn trans_unboxing_shim(bcx: Block,
|
||||
llshimmedfn: ValueRef,
|
||||
fty: &ty::BareFnTy,
|
||||
method_id: ast::DefId,
|
||||
|
@ -406,7 +409,7 @@ pub fn trans_unboxing_shim(bcx: &Block,
|
|||
}
|
||||
|
||||
pub fn trans_fn_ref_with_vtables(
|
||||
bcx: &Block, //
|
||||
bcx: Block, //
|
||||
def_id: ast::DefId, // def id of fn
|
||||
node: ExprOrMethodCall, // node id of use of fn; may be zero if N/A
|
||||
substs: subst::Substs, // values for fn's ty params
|
||||
|
@ -625,13 +628,12 @@ pub fn trans_fn_ref_with_vtables(
|
|||
// ______________________________________________________________________
|
||||
// Translating calls
|
||||
|
||||
pub fn trans_call<'a>(
|
||||
in_cx: &'a Block<'a>,
|
||||
call_ex: &ast::Expr,
|
||||
f: &ast::Expr,
|
||||
args: CallArgs,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_call<'blk, 'tcx>(in_cx: Block<'blk, 'tcx>,
|
||||
call_ex: &ast::Expr,
|
||||
f: &ast::Expr,
|
||||
args: CallArgs,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_call");
|
||||
trans_call_inner(in_cx,
|
||||
Some(common::expr_info(call_ex)),
|
||||
|
@ -641,13 +643,12 @@ pub fn trans_call<'a>(
|
|||
Some(dest)).bcx
|
||||
}
|
||||
|
||||
pub fn trans_method_call<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
call_ex: &ast::Expr,
|
||||
rcvr: &ast::Expr,
|
||||
args: CallArgs,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_method_call<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
call_ex: &ast::Expr,
|
||||
rcvr: &ast::Expr,
|
||||
args: CallArgs,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_method_call");
|
||||
debug!("trans_method_call(call_ex={})", call_ex.repr(bcx.tcx()));
|
||||
let method_call = MethodCall::expr(call_ex.id);
|
||||
|
@ -663,12 +664,11 @@ pub fn trans_method_call<'a>(
|
|||
Some(dest)).bcx
|
||||
}
|
||||
|
||||
pub fn trans_lang_call<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
did: ast::DefId,
|
||||
args: &[ValueRef],
|
||||
dest: Option<expr::Dest>)
|
||||
-> Result<'a> {
|
||||
pub fn trans_lang_call<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
did: ast::DefId,
|
||||
args: &[ValueRef],
|
||||
dest: Option<expr::Dest>)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let fty = if did.krate == ast::LOCAL_CRATE {
|
||||
ty::node_id_to_type(bcx.tcx(), did.node)
|
||||
} else {
|
||||
|
@ -688,16 +688,15 @@ pub fn trans_lang_call<'a>(
|
|||
dest)
|
||||
}
|
||||
|
||||
pub fn trans_call_inner<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
call_info: Option<NodeInfo>,
|
||||
callee_ty: ty::t,
|
||||
get_callee: |bcx: &'a Block<'a>,
|
||||
arg_cleanup_scope: cleanup::ScopeId|
|
||||
-> Callee<'a>,
|
||||
args: CallArgs,
|
||||
dest: Option<expr::Dest>)
|
||||
-> Result<'a> {
|
||||
pub fn trans_call_inner<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
call_info: Option<NodeInfo>,
|
||||
callee_ty: ty::t,
|
||||
get_callee: |bcx: Block<'blk, 'tcx>,
|
||||
arg_cleanup_scope: cleanup::ScopeId|
|
||||
-> Callee<'blk, 'tcx>,
|
||||
args: CallArgs,
|
||||
dest: Option<expr::Dest>)
|
||||
-> Result<'blk, 'tcx> {
|
||||
/*!
|
||||
* This behemoth of a function translates function calls.
|
||||
* Unfortunately, in order to generate more efficient LLVM
|
||||
|
@ -920,14 +919,14 @@ pub enum CallArgs<'a> {
|
|||
ArgOverloadedCall(&'a [Gc<ast::Expr>]),
|
||||
}
|
||||
|
||||
fn trans_args_under_call_abi<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
fn trans_args_under_call_abi<'blk, 'tcx>(
|
||||
mut bcx: Block<'blk, 'tcx>,
|
||||
arg_exprs: &[Gc<ast::Expr>],
|
||||
fn_ty: ty::t,
|
||||
llargs: &mut Vec<ValueRef>,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
ignore_self: bool)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
// Translate the `self` argument first.
|
||||
let arg_tys = ty::ty_fn_args(fn_ty);
|
||||
if !ignore_self {
|
||||
|
@ -981,14 +980,14 @@ fn trans_args_under_call_abi<'a>(
|
|||
bcx
|
||||
}
|
||||
|
||||
fn trans_overloaded_call_args<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
fn trans_overloaded_call_args<'blk, 'tcx>(
|
||||
mut bcx: Block<'blk, 'tcx>,
|
||||
arg_exprs: &[Gc<ast::Expr>],
|
||||
fn_ty: ty::t,
|
||||
llargs: &mut Vec<ValueRef>,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
ignore_self: bool)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
// Translate the `self` argument first.
|
||||
let arg_tys = ty::ty_fn_args(fn_ty);
|
||||
if !ignore_self {
|
||||
|
@ -1028,15 +1027,14 @@ fn trans_overloaded_call_args<'a>(
|
|||
bcx
|
||||
}
|
||||
|
||||
pub fn trans_args<'a>(
|
||||
cx: &'a Block<'a>,
|
||||
args: CallArgs,
|
||||
fn_ty: ty::t,
|
||||
llargs: &mut Vec<ValueRef> ,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
ignore_self: bool,
|
||||
abi: synabi::Abi)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_args<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
args: CallArgs,
|
||||
fn_ty: ty::t,
|
||||
llargs: &mut Vec<ValueRef> ,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
ignore_self: bool,
|
||||
abi: synabi::Abi)
|
||||
-> Block<'blk, 'tcx> {
|
||||
debug!("trans_args(abi={})", abi);
|
||||
|
||||
let _icx = push_ctxt("trans_args");
|
||||
|
@ -1124,13 +1122,12 @@ pub enum AutorefArg {
|
|||
DoAutorefArg(ast::NodeId)
|
||||
}
|
||||
|
||||
pub fn trans_arg_datum<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
formal_arg_ty: ty::t,
|
||||
arg_datum: Datum<Expr>,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
autoref_arg: AutorefArg)
|
||||
-> Result<'a> {
|
||||
pub fn trans_arg_datum<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
formal_arg_ty: ty::t,
|
||||
arg_datum: Datum<Expr>,
|
||||
arg_cleanup_scope: cleanup::ScopeId,
|
||||
autoref_arg: AutorefArg)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_arg_datum");
|
||||
let mut bcx = bcx;
|
||||
let ccx = bcx.ccx();
|
||||
|
|
|
@ -25,13 +25,13 @@
|
|||
use syntax::ast;
|
||||
use util::ppaux::Repr;
|
||||
|
||||
pub struct CleanupScope<'a> {
|
||||
pub struct CleanupScope<'blk, 'tcx: 'blk> {
|
||||
// The id of this cleanup scope. If the id is None,
|
||||
// this is a *temporary scope* that is pushed during trans to
|
||||
// cleanup miscellaneous garbage that trans may generate whose
|
||||
// lifetime is a subset of some expression. See module doc for
|
||||
// more details.
|
||||
kind: CleanupScopeKind<'a>,
|
||||
kind: CleanupScopeKind<'blk, 'tcx>,
|
||||
|
||||
// Cleanups to run upon scope exit.
|
||||
cleanups: Vec<CleanupObj>,
|
||||
|
@ -48,10 +48,10 @@ pub struct CustomScopeIndex {
|
|||
pub static EXIT_LOOP: uint = 1;
|
||||
pub static EXIT_MAX: uint = 2;
|
||||
|
||||
pub enum CleanupScopeKind<'a> {
|
||||
pub enum CleanupScopeKind<'blk, 'tcx: 'blk> {
|
||||
CustomScopeKind,
|
||||
AstScopeKind(ast::NodeId),
|
||||
LoopScopeKind(ast::NodeId, [&'a Block<'a>, ..EXIT_MAX])
|
||||
LoopScopeKind(ast::NodeId, [Block<'blk, 'tcx>, ..EXIT_MAX])
|
||||
}
|
||||
|
||||
#[deriving(PartialEq)]
|
||||
|
@ -69,7 +69,7 @@ pub struct CachedEarlyExit {
|
|||
pub trait Cleanup {
|
||||
fn must_unwind(&self) -> bool;
|
||||
fn clean_on_unwind(&self) -> bool;
|
||||
fn trans<'a>(&self, bcx: &'a Block<'a>) -> &'a Block<'a>;
|
||||
fn trans<'blk, 'tcx>(&self, bcx: Block<'blk, 'tcx>) -> Block<'blk, 'tcx>;
|
||||
}
|
||||
|
||||
pub type CleanupObj = Box<Cleanup+'static>;
|
||||
|
@ -79,7 +79,7 @@ pub enum ScopeId {
|
|||
CustomScope(CustomScopeIndex)
|
||||
}
|
||||
|
||||
impl<'a> CleanupMethods<'a> for FunctionContext<'a> {
|
||||
impl<'blk, 'tcx> CleanupMethods<'blk, 'tcx> for FunctionContext<'blk, 'tcx> {
|
||||
fn push_ast_cleanup_scope(&self, id: ast::NodeId) {
|
||||
/*!
|
||||
* Invoked when we start to trans the code contained
|
||||
|
@ -109,7 +109,7 @@ fn push_ast_cleanup_scope(&self, id: ast::NodeId) {
|
|||
|
||||
fn push_loop_cleanup_scope(&self,
|
||||
id: ast::NodeId,
|
||||
exits: [&'a Block<'a>, ..EXIT_MAX]) {
|
||||
exits: [Block<'blk, 'tcx>, ..EXIT_MAX]) {
|
||||
debug!("push_loop_cleanup_scope({})",
|
||||
self.ccx.tcx().map.node_to_string(id));
|
||||
assert_eq!(Some(id), self.top_ast_scope());
|
||||
|
@ -125,9 +125,9 @@ fn push_custom_cleanup_scope(&self) -> CustomScopeIndex {
|
|||
}
|
||||
|
||||
fn pop_and_trans_ast_cleanup_scope(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
cleanup_scope: ast::NodeId)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Removes the cleanup scope for id `cleanup_scope`, which
|
||||
* must be at the top of the cleanup stack, and generates the
|
||||
|
@ -175,9 +175,9 @@ fn pop_custom_cleanup_scope(&self,
|
|||
}
|
||||
|
||||
fn pop_and_trans_custom_cleanup_scope(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
custom_scope: CustomScopeIndex)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Removes the top cleanup scope from the stack, which must be
|
||||
* a temporary scope, and generates the code to do its
|
||||
|
@ -207,7 +207,7 @@ fn top_loop_scope(&self) -> ast::NodeId {
|
|||
self.ccx.sess().bug("no loop scope found");
|
||||
}
|
||||
|
||||
fn normal_exit_block(&'a self,
|
||||
fn normal_exit_block(&'blk self,
|
||||
cleanup_scope: ast::NodeId,
|
||||
exit: uint) -> BasicBlockRef {
|
||||
/*!
|
||||
|
@ -219,7 +219,7 @@ fn normal_exit_block(&'a self,
|
|||
self.trans_cleanups_to_exit_scope(LoopExit(cleanup_scope, exit))
|
||||
}
|
||||
|
||||
fn return_exit_block(&'a self) -> BasicBlockRef {
|
||||
fn return_exit_block(&'blk self) -> BasicBlockRef {
|
||||
/*!
|
||||
* Returns a block to branch to which will perform all pending
|
||||
* cleanups and then return from this function
|
||||
|
@ -426,7 +426,7 @@ fn needs_invoke(&self) -> bool {
|
|||
self.scopes.borrow().iter().rev().any(|s| s.needs_invoke())
|
||||
}
|
||||
|
||||
fn get_landing_pad(&'a self) -> BasicBlockRef {
|
||||
fn get_landing_pad(&'blk self) -> BasicBlockRef {
|
||||
/*!
|
||||
* Returns a basic block to branch to in the event of a failure.
|
||||
* This block will run the failure cleanups and eventually
|
||||
|
@ -464,7 +464,7 @@ fn get_landing_pad(&'a self) -> BasicBlockRef {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> CleanupHelperMethods<'a> for FunctionContext<'a> {
|
||||
impl<'blk, 'tcx> CleanupHelperMethods<'blk, 'tcx> for FunctionContext<'blk, 'tcx> {
|
||||
fn top_ast_scope(&self) -> Option<ast::NodeId> {
|
||||
/*!
|
||||
* Returns the id of the current top-most AST scope, if any.
|
||||
|
@ -496,8 +496,8 @@ fn is_valid_custom_scope(&self, custom_scope: CustomScopeIndex) -> bool {
|
|||
}
|
||||
|
||||
fn trans_scope_cleanups(&self, // cannot borrow self, will recurse
|
||||
bcx: &'a Block<'a>,
|
||||
scope: &CleanupScope) -> &'a Block<'a> {
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
scope: &CleanupScope) -> Block<'blk, 'tcx> {
|
||||
/*! Generates the cleanups for `scope` into `bcx` */
|
||||
|
||||
let mut bcx = bcx;
|
||||
|
@ -513,11 +513,11 @@ fn scopes_len(&self) -> uint {
|
|||
self.scopes.borrow().len()
|
||||
}
|
||||
|
||||
fn push_scope(&self, scope: CleanupScope<'a>) {
|
||||
fn push_scope(&self, scope: CleanupScope<'blk, 'tcx>) {
|
||||
self.scopes.borrow_mut().push(scope)
|
||||
}
|
||||
|
||||
fn pop_scope(&self) -> CleanupScope<'a> {
|
||||
fn pop_scope(&self) -> CleanupScope<'blk, 'tcx> {
|
||||
debug!("popping cleanup scope {}, {} scopes remaining",
|
||||
self.top_scope(|s| s.block_name("")),
|
||||
self.scopes_len() - 1);
|
||||
|
@ -525,11 +525,11 @@ fn pop_scope(&self) -> CleanupScope<'a> {
|
|||
self.scopes.borrow_mut().pop().unwrap()
|
||||
}
|
||||
|
||||
fn top_scope<R>(&self, f: |&CleanupScope<'a>| -> R) -> R {
|
||||
fn top_scope<R>(&self, f: |&CleanupScope<'blk, 'tcx>| -> R) -> R {
|
||||
f(self.scopes.borrow().last().unwrap())
|
||||
}
|
||||
|
||||
fn trans_cleanups_to_exit_scope(&'a self,
|
||||
fn trans_cleanups_to_exit_scope(&'blk self,
|
||||
label: EarlyExitLabel)
|
||||
-> BasicBlockRef {
|
||||
/*!
|
||||
|
@ -691,7 +691,7 @@ fn trans_cleanups_to_exit_scope(&'a self,
|
|||
prev_llbb
|
||||
}
|
||||
|
||||
fn get_or_create_landing_pad(&'a self) -> BasicBlockRef {
|
||||
fn get_or_create_landing_pad(&'blk self) -> BasicBlockRef {
|
||||
/*!
|
||||
* Creates a landing pad for the top scope, if one does not
|
||||
* exist. The landing pad will perform all cleanups necessary
|
||||
|
@ -784,8 +784,8 @@ fn get_or_create_landing_pad(&'a self) -> BasicBlockRef {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> CleanupScope<'a> {
|
||||
fn new(kind: CleanupScopeKind<'a>) -> CleanupScope<'a> {
|
||||
impl<'blk, 'tcx> CleanupScope<'blk, 'tcx> {
|
||||
fn new(kind: CleanupScopeKind<'blk, 'tcx>) -> CleanupScope<'blk, 'tcx> {
|
||||
CleanupScope {
|
||||
kind: kind,
|
||||
cleanups: vec!(),
|
||||
|
@ -836,7 +836,7 @@ fn block_name(&self, prefix: &str) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> CleanupScopeKind<'a> {
|
||||
impl<'blk, 'tcx> CleanupScopeKind<'blk, 'tcx> {
|
||||
fn is_temp(&self) -> bool {
|
||||
match *self {
|
||||
CustomScopeKind => true,
|
||||
|
@ -902,7 +902,7 @@ fn clean_on_unwind(&self) -> bool {
|
|||
self.must_unwind
|
||||
}
|
||||
|
||||
fn trans<'a>(&self, bcx: &'a Block<'a>) -> &'a Block<'a> {
|
||||
fn trans<'blk, 'tcx>(&self, bcx: Block<'blk, 'tcx>) -> Block<'blk, 'tcx> {
|
||||
let bcx = if self.is_immediate {
|
||||
glue::drop_ty_immediate(bcx, self.val, self.ty)
|
||||
} else {
|
||||
|
@ -935,7 +935,7 @@ fn clean_on_unwind(&self) -> bool {
|
|||
true
|
||||
}
|
||||
|
||||
fn trans<'a>(&self, bcx: &'a Block<'a>) -> &'a Block<'a> {
|
||||
fn trans<'blk, 'tcx>(&self, bcx: Block<'blk, 'tcx>) -> Block<'blk, 'tcx> {
|
||||
match self.heap {
|
||||
HeapManaged => {
|
||||
glue::trans_free(bcx, self.ptr)
|
||||
|
@ -963,7 +963,7 @@ fn clean_on_unwind(&self) -> bool {
|
|||
true
|
||||
}
|
||||
|
||||
fn trans<'a>(&self, bcx: &'a Block<'a>) -> &'a Block<'a> {
|
||||
fn trans<'blk, 'tcx>(&self, bcx: Block<'blk, 'tcx>) -> Block<'blk, 'tcx> {
|
||||
match self.heap {
|
||||
HeapManaged => {
|
||||
glue::trans_free(bcx, self.ptr)
|
||||
|
@ -988,7 +988,7 @@ fn clean_on_unwind(&self) -> bool {
|
|||
true
|
||||
}
|
||||
|
||||
fn trans<'a>(&self, bcx: &'a Block<'a>) -> &'a Block<'a> {
|
||||
fn trans<'blk, 'tcx>(&self, bcx: Block<'blk, 'tcx>) -> Block<'blk, 'tcx> {
|
||||
base::call_lifetime_end(bcx, self.ptr);
|
||||
bcx
|
||||
}
|
||||
|
@ -1026,29 +1026,29 @@ fn cleanup_is_suitable_for(c: &Cleanup,
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// These traits just exist to put the methods into this file.
|
||||
|
||||
pub trait CleanupMethods<'a> {
|
||||
pub trait CleanupMethods<'blk, 'tcx> {
|
||||
fn push_ast_cleanup_scope(&self, id: ast::NodeId);
|
||||
fn push_loop_cleanup_scope(&self,
|
||||
id: ast::NodeId,
|
||||
exits: [&'a Block<'a>, ..EXIT_MAX]);
|
||||
exits: [Block<'blk, 'tcx>, ..EXIT_MAX]);
|
||||
fn push_custom_cleanup_scope(&self) -> CustomScopeIndex;
|
||||
fn pop_and_trans_ast_cleanup_scope(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
cleanup_scope: ast::NodeId)
|
||||
-> &'a Block<'a>;
|
||||
-> Block<'blk, 'tcx>;
|
||||
fn pop_loop_cleanup_scope(&self,
|
||||
cleanup_scope: ast::NodeId);
|
||||
fn pop_custom_cleanup_scope(&self,
|
||||
custom_scope: CustomScopeIndex);
|
||||
fn pop_and_trans_custom_cleanup_scope(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
custom_scope: CustomScopeIndex)
|
||||
-> &'a Block<'a>;
|
||||
-> Block<'blk, 'tcx>;
|
||||
fn top_loop_scope(&self) -> ast::NodeId;
|
||||
fn normal_exit_block(&'a self,
|
||||
fn normal_exit_block(&'blk self,
|
||||
cleanup_scope: ast::NodeId,
|
||||
exit: uint) -> BasicBlockRef;
|
||||
fn return_exit_block(&'a self) -> BasicBlockRef;
|
||||
fn return_exit_block(&'blk self) -> BasicBlockRef;
|
||||
fn schedule_lifetime_end(&self,
|
||||
cleanup_scope: ScopeId,
|
||||
val: ValueRef);
|
||||
|
@ -1085,23 +1085,23 @@ fn schedule_clean_in_custom_scope(&self,
|
|||
custom_scope: CustomScopeIndex,
|
||||
cleanup: CleanupObj);
|
||||
fn needs_invoke(&self) -> bool;
|
||||
fn get_landing_pad(&'a self) -> BasicBlockRef;
|
||||
fn get_landing_pad(&'blk self) -> BasicBlockRef;
|
||||
}
|
||||
|
||||
trait CleanupHelperMethods<'a> {
|
||||
trait CleanupHelperMethods<'blk, 'tcx> {
|
||||
fn top_ast_scope(&self) -> Option<ast::NodeId>;
|
||||
fn top_nonempty_cleanup_scope(&self) -> Option<uint>;
|
||||
fn is_valid_to_pop_custom_scope(&self, custom_scope: CustomScopeIndex) -> bool;
|
||||
fn is_valid_custom_scope(&self, custom_scope: CustomScopeIndex) -> bool;
|
||||
fn trans_scope_cleanups(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
scope: &CleanupScope<'a>) -> &'a Block<'a>;
|
||||
fn trans_cleanups_to_exit_scope(&'a self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
scope: &CleanupScope<'blk, 'tcx>) -> Block<'blk, 'tcx>;
|
||||
fn trans_cleanups_to_exit_scope(&'blk self,
|
||||
label: EarlyExitLabel)
|
||||
-> BasicBlockRef;
|
||||
fn get_or_create_landing_pad(&'a self) -> BasicBlockRef;
|
||||
fn get_or_create_landing_pad(&'blk self) -> BasicBlockRef;
|
||||
fn scopes_len(&self) -> uint;
|
||||
fn push_scope(&self, scope: CleanupScope<'a>);
|
||||
fn pop_scope(&self) -> CleanupScope<'a>;
|
||||
fn top_scope<R>(&self, f: |&CleanupScope<'a>| -> R) -> R;
|
||||
fn push_scope(&self, scope: CleanupScope<'blk, 'tcx>);
|
||||
fn pop_scope(&self) -> CleanupScope<'blk, 'tcx>;
|
||||
fn top_scope<R>(&self, f: |&CleanupScope<'blk, 'tcx>| -> R) -> R;
|
||||
}
|
||||
|
|
|
@ -135,10 +135,10 @@ fn tuplify_box_ty(tcx: &ty::ctxt, t: ty::t) -> ty::t {
|
|||
ty::mk_tup(tcx, vec!(ty::mk_uint(), ty::mk_nil_ptr(tcx), ptr, ptr, t))
|
||||
}
|
||||
|
||||
fn allocate_cbox<'a>(bcx: &'a Block<'a>,
|
||||
store: ty::TraitStore,
|
||||
cdata_ty: ty::t)
|
||||
-> Result<'a> {
|
||||
fn allocate_cbox<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
store: ty::TraitStore,
|
||||
cdata_ty: ty::t)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::allocate_cbox");
|
||||
let tcx = bcx.tcx();
|
||||
|
||||
|
@ -155,21 +155,20 @@ fn allocate_cbox<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
pub struct ClosureResult<'a> {
|
||||
pub struct ClosureResult<'blk, 'tcx: 'blk> {
|
||||
llbox: ValueRef, // llvalue of ptr to closure
|
||||
cdata_ty: ty::t, // type of the closure data
|
||||
bcx: &'a Block<'a> // final bcx
|
||||
bcx: Block<'blk, 'tcx> // final bcx
|
||||
}
|
||||
|
||||
// Given a block context and a list of tydescs and values to bind
|
||||
// construct a closure out of them. If copying is true, it is a
|
||||
// heap allocated closure that copies the upvars into environment.
|
||||
// Otherwise, it is stack allocated and copies pointers to the upvars.
|
||||
pub fn store_environment<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
bound_values: Vec<EnvValue> ,
|
||||
store: ty::TraitStore)
|
||||
-> ClosureResult<'a> {
|
||||
pub fn store_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
bound_values: Vec<EnvValue> ,
|
||||
store: ty::TraitStore)
|
||||
-> ClosureResult<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::store_environment");
|
||||
let ccx = bcx.ccx();
|
||||
let tcx = ccx.tcx();
|
||||
|
@ -224,12 +223,11 @@ pub fn store_environment<'a>(
|
|||
|
||||
// Given a context and a list of upvars, build a closure. This just
|
||||
// collects the upvars and packages them up for store_environment.
|
||||
fn build_closure<'a>(bcx0: &'a Block<'a>,
|
||||
freevar_mode: freevars::CaptureMode,
|
||||
freevars: &Vec<freevars::freevar_entry>,
|
||||
store: ty::TraitStore)
|
||||
-> ClosureResult<'a>
|
||||
{
|
||||
fn build_closure<'blk, 'tcx>(bcx0: Block<'blk, 'tcx>,
|
||||
freevar_mode: freevars::CaptureMode,
|
||||
freevars: &Vec<freevars::freevar_entry>,
|
||||
store: ty::TraitStore)
|
||||
-> ClosureResult<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::build_closure");
|
||||
|
||||
// If we need to, package up the iterator body to call
|
||||
|
@ -248,11 +246,11 @@ fn build_closure<'a>(bcx0: &'a Block<'a>,
|
|||
// Given an enclosing block context, a new function context, a closure type,
|
||||
// and a list of upvars, generate code to load and populate the environment
|
||||
// with the upvars and type descriptors.
|
||||
fn load_environment<'a>(bcx: &'a Block<'a>,
|
||||
cdata_ty: ty::t,
|
||||
freevars: &Vec<freevars::freevar_entry>,
|
||||
store: ty::TraitStore)
|
||||
-> &'a Block<'a> {
|
||||
fn load_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
cdata_ty: ty::t,
|
||||
freevars: &Vec<freevars::freevar_entry>,
|
||||
store: ty::TraitStore)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::load_environment");
|
||||
|
||||
// Don't bother to create the block if there's nothing to load
|
||||
|
@ -301,12 +299,12 @@ fn load_environment<'a>(bcx: &'a Block<'a>,
|
|||
bcx
|
||||
}
|
||||
|
||||
fn load_unboxed_closure_environment<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
fn load_unboxed_closure_environment<'blk, 'tcx>(
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
arg_scope_id: ScopeId,
|
||||
freevars: &Vec<freevars::freevar_entry>,
|
||||
closure_id: ast::DefId)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::load_environment");
|
||||
|
||||
if freevars.len() == 0 {
|
||||
|
@ -343,20 +341,19 @@ fn load_unboxed_closure_environment<'a>(
|
|||
bcx
|
||||
}
|
||||
|
||||
fn fill_fn_pair(bcx: &Block, pair: ValueRef, llfn: ValueRef, llenvptr: ValueRef) {
|
||||
fn fill_fn_pair(bcx: Block, pair: ValueRef, llfn: ValueRef, llenvptr: ValueRef) {
|
||||
Store(bcx, llfn, GEPi(bcx, pair, [0u, abi::fn_field_code]));
|
||||
let llenvptr = PointerCast(bcx, llenvptr, Type::i8p(bcx.ccx()));
|
||||
Store(bcx, llenvptr, GEPi(bcx, pair, [0u, abi::fn_field_box]));
|
||||
}
|
||||
|
||||
pub fn trans_expr_fn<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
store: ty::TraitStore,
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block,
|
||||
id: ast::NodeId,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_expr_fn<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
store: ty::TraitStore,
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block,
|
||||
id: ast::NodeId,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
*
|
||||
* Translates the body of a closure expression.
|
||||
|
@ -458,13 +455,13 @@ pub fn get_or_create_declaration_if_unboxed_closure(ccx: &CrateContext,
|
|||
Some(llfn)
|
||||
}
|
||||
|
||||
pub fn trans_unboxed_closure<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
pub fn trans_unboxed_closure<'blk, 'tcx>(
|
||||
mut bcx: Block<'blk, 'tcx>,
|
||||
decl: &ast::FnDecl,
|
||||
body: &ast::Block,
|
||||
id: ast::NodeId,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("closure::trans_unboxed_closure");
|
||||
|
||||
debug!("trans_unboxed_closure()");
|
||||
|
@ -620,11 +617,11 @@ pub fn get_wrapper_for_bare_fn(ccx: &CrateContext,
|
|||
llfn
|
||||
}
|
||||
|
||||
pub fn make_closure_from_bare_fn<'a>(bcx: &'a Block<'a>,
|
||||
closure_ty: ty::t,
|
||||
def: def::Def,
|
||||
fn_ptr: ValueRef)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
pub fn make_closure_from_bare_fn<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
closure_ty: ty::t,
|
||||
def: def::Def,
|
||||
fn_ptr: ValueRef)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let scratch = rvalue_scratch_datum(bcx, closure_ty, "__adjust");
|
||||
let wrapper = get_wrapper_for_bare_fn(bcx.ccx(), closure_ty, def, fn_ptr, true);
|
||||
fill_fn_pair(bcx, scratch.val, wrapper, C_null(Type::i8p(bcx.ccx())));
|
||||
|
|
|
@ -233,7 +233,7 @@ fn substp(&self, tcx: &ty::ctxt, substs: ¶m_substs) -> T {
|
|||
|
||||
// Function context. Every LLVM function we create will have one of
|
||||
// these.
|
||||
pub struct FunctionContext<'a> {
|
||||
pub struct FunctionContext<'a, 'tcx: 'a> {
|
||||
// The ValueRef returned from a call to llvm::LLVMAddFunction; the
|
||||
// address of the first instruction in the sequence of
|
||||
// instructions for this function that will go in the .text
|
||||
|
@ -294,19 +294,19 @@ pub struct FunctionContext<'a> {
|
|||
pub span: Option<Span>,
|
||||
|
||||
// The arena that blocks are allocated from.
|
||||
pub block_arena: &'a TypedArena<Block<'a>>,
|
||||
pub block_arena: &'a TypedArena<BlockS<'a, 'tcx>>,
|
||||
|
||||
// This function's enclosing crate context.
|
||||
pub ccx: &'a CrateContext<'a>,
|
||||
pub ccx: &'a CrateContext<'a, 'tcx>,
|
||||
|
||||
// Used and maintained by the debuginfo module.
|
||||
pub debug_context: debuginfo::FunctionDebugContext,
|
||||
|
||||
// Cleanup scopes.
|
||||
pub scopes: RefCell<Vec<cleanup::CleanupScope<'a>> >,
|
||||
pub scopes: RefCell<Vec<cleanup::CleanupScope<'a, 'tcx>>>,
|
||||
}
|
||||
|
||||
impl<'a> FunctionContext<'a> {
|
||||
impl<'a, 'tcx> FunctionContext<'a, 'tcx> {
|
||||
pub fn arg_pos(&self, arg: uint) -> uint {
|
||||
let arg = self.env_arg_pos() + arg;
|
||||
if self.llenv.is_some() {
|
||||
|
@ -350,7 +350,7 @@ pub fn get_llreturn(&self) -> BasicBlockRef {
|
|||
self.llreturn.get().unwrap()
|
||||
}
|
||||
|
||||
pub fn get_ret_slot(&self, bcx: &Block, ty: ty::t, name: &str) -> ValueRef {
|
||||
pub fn get_ret_slot(&self, bcx: Block, ty: ty::t, name: &str) -> ValueRef {
|
||||
if self.needs_ret_allocas {
|
||||
base::alloca_no_lifetime(bcx, type_of::type_of(bcx.ccx(), ty), name)
|
||||
} else {
|
||||
|
@ -362,34 +362,34 @@ pub fn new_block(&'a self,
|
|||
is_lpad: bool,
|
||||
name: &str,
|
||||
opt_node_id: Option<ast::NodeId>)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'a, 'tcx> {
|
||||
unsafe {
|
||||
let llbb = name.with_c_str(|buf| {
|
||||
llvm::LLVMAppendBasicBlockInContext(self.ccx.llcx(),
|
||||
self.llfn,
|
||||
buf)
|
||||
});
|
||||
Block::new(llbb, is_lpad, opt_node_id, self)
|
||||
BlockS::new(llbb, is_lpad, opt_node_id, self)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_id_block(&'a self,
|
||||
name: &str,
|
||||
node_id: ast::NodeId)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'a, 'tcx> {
|
||||
self.new_block(false, name, Some(node_id))
|
||||
}
|
||||
|
||||
pub fn new_temp_block(&'a self,
|
||||
name: &str)
|
||||
-> &'a Block<'a> {
|
||||
-> Block<'a, 'tcx> {
|
||||
self.new_block(false, name, None)
|
||||
}
|
||||
|
||||
pub fn join_blocks(&'a self,
|
||||
id: ast::NodeId,
|
||||
in_cxs: &[&'a Block<'a>])
|
||||
-> &'a Block<'a> {
|
||||
in_cxs: &[Block<'a, 'tcx>])
|
||||
-> Block<'a, 'tcx> {
|
||||
let out = self.new_id_block("join", id);
|
||||
let mut reachable = false;
|
||||
for bcx in in_cxs.iter() {
|
||||
|
@ -410,7 +410,7 @@ pub fn join_blocks(&'a self,
|
|||
// code. Each basic block we generate is attached to a function, typically
|
||||
// with many basic blocks per function. All the basic blocks attached to a
|
||||
// function are organized as a directed graph.
|
||||
pub struct Block<'a> {
|
||||
pub struct BlockS<'blk, 'tcx: 'blk> {
|
||||
// The BasicBlockRef returned from a call to
|
||||
// llvm::LLVMAppendBasicBlock(llfn, name), which adds a basic
|
||||
// block to the function pointed to by llfn. We insert
|
||||
|
@ -429,17 +429,18 @@ pub struct Block<'a> {
|
|||
|
||||
// The function context for the function to which this block is
|
||||
// attached.
|
||||
pub fcx: &'a FunctionContext<'a>,
|
||||
pub fcx: &'blk FunctionContext<'blk, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> Block<'a> {
|
||||
pub fn new<'a>(
|
||||
llbb: BasicBlockRef,
|
||||
pub type Block<'blk, 'tcx> = &'blk BlockS<'blk, 'tcx>;
|
||||
|
||||
impl<'blk, 'tcx> BlockS<'blk, 'tcx> {
|
||||
pub fn new(llbb: BasicBlockRef,
|
||||
is_lpad: bool,
|
||||
opt_node_id: Option<ast::NodeId>,
|
||||
fcx: &'a FunctionContext<'a>)
|
||||
-> &'a Block<'a> {
|
||||
fcx.block_arena.alloc(Block {
|
||||
fcx: &'blk FunctionContext<'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
fcx.block_arena.alloc(BlockS {
|
||||
llbb: llbb,
|
||||
terminated: Cell::new(false),
|
||||
unreachable: Cell::new(false),
|
||||
|
@ -449,11 +450,13 @@ pub fn new<'a>(
|
|||
})
|
||||
}
|
||||
|
||||
pub fn ccx(&self) -> &'a CrateContext<'a> { self.fcx.ccx }
|
||||
pub fn tcx(&self) -> &'a ty::ctxt {
|
||||
pub fn ccx(&self) -> &'blk CrateContext<'blk, 'tcx> {
|
||||
self.fcx.ccx
|
||||
}
|
||||
pub fn tcx(&self) -> &'blk ty::ctxt<'tcx> {
|
||||
self.fcx.ccx.tcx()
|
||||
}
|
||||
pub fn sess(&self) -> &'a Session { self.fcx.ccx.sess() }
|
||||
pub fn sess(&self) -> &'blk Session { self.fcx.ccx.sess() }
|
||||
|
||||
pub fn ident(&self, ident: Ident) -> String {
|
||||
token::get_ident(ident).get().to_string()
|
||||
|
@ -490,13 +493,12 @@ pub fn ty_to_string(&self, t: ty::t) -> String {
|
|||
}
|
||||
|
||||
pub fn to_str(&self) -> String {
|
||||
let blk: *const Block = self;
|
||||
format!("[block {}]", blk)
|
||||
format!("[block {:p}]", self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> mc::Typer for Block<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'blk, 'tcx> mc::Typer<'tcx> for BlockS<'blk, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.tcx()
|
||||
}
|
||||
|
||||
|
@ -535,13 +537,13 @@ fn capture_mode(&self, closure_expr_id: ast::NodeId)
|
|||
}
|
||||
}
|
||||
|
||||
pub struct Result<'a> {
|
||||
pub bcx: &'a Block<'a>,
|
||||
pub struct Result<'blk, 'tcx: 'blk> {
|
||||
pub bcx: Block<'blk, 'tcx>,
|
||||
pub val: ValueRef
|
||||
}
|
||||
|
||||
impl<'a> Result<'a> {
|
||||
pub fn new(bcx: &'a Block<'a>, val: ValueRef) -> Result<'a> {
|
||||
impl<'b, 'tcx> Result<'b, 'tcx> {
|
||||
pub fn new(bcx: Block<'b, 'tcx>, val: ValueRef) -> Result<'b, 'tcx> {
|
||||
Result {
|
||||
bcx: bcx,
|
||||
val: val,
|
||||
|
@ -746,21 +748,21 @@ pub fn is_null(val: ValueRef) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn monomorphize_type(bcx: &Block, t: ty::t) -> ty::t {
|
||||
pub fn monomorphize_type(bcx: &BlockS, t: ty::t) -> ty::t {
|
||||
t.subst(bcx.tcx(), &bcx.fcx.param_substs.substs)
|
||||
}
|
||||
|
||||
pub fn node_id_type(bcx: &Block, id: ast::NodeId) -> ty::t {
|
||||
pub fn node_id_type(bcx: &BlockS, id: ast::NodeId) -> ty::t {
|
||||
let tcx = bcx.tcx();
|
||||
let t = ty::node_id_to_type(tcx, id);
|
||||
monomorphize_type(bcx, t)
|
||||
}
|
||||
|
||||
pub fn expr_ty(bcx: &Block, ex: &ast::Expr) -> ty::t {
|
||||
pub fn expr_ty(bcx: Block, ex: &ast::Expr) -> ty::t {
|
||||
node_id_type(bcx, ex.id)
|
||||
}
|
||||
|
||||
pub fn expr_ty_adjusted(bcx: &Block, ex: &ast::Expr) -> ty::t {
|
||||
pub fn expr_ty_adjusted(bcx: Block, ex: &ast::Expr) -> ty::t {
|
||||
monomorphize_type(bcx, ty::expr_ty_adjusted(bcx.tcx(), ex))
|
||||
}
|
||||
|
||||
|
@ -774,7 +776,7 @@ pub enum ExprOrMethodCall {
|
|||
MethodCall(typeck::MethodCall)
|
||||
}
|
||||
|
||||
pub fn node_id_substs(bcx: &Block,
|
||||
pub fn node_id_substs(bcx: Block,
|
||||
node: ExprOrMethodCall)
|
||||
-> subst::Substs {
|
||||
let tcx = bcx.tcx();
|
||||
|
@ -799,7 +801,7 @@ pub fn node_id_substs(bcx: &Block,
|
|||
substs.substp(tcx, bcx.fcx.param_substs)
|
||||
}
|
||||
|
||||
pub fn node_vtables(bcx: &Block, id: typeck::MethodCall)
|
||||
pub fn node_vtables(bcx: Block, id: typeck::MethodCall)
|
||||
-> typeck::vtable_res {
|
||||
bcx.tcx().vtable_map.borrow().find(&id).map(|vts| {
|
||||
resolve_vtables_in_fn_ctxt(bcx.fcx, vts)
|
||||
|
@ -877,7 +879,7 @@ pub fn find_vtable(tcx: &ty::ctxt,
|
|||
param_bounds.get(n_bound).clone()
|
||||
}
|
||||
|
||||
pub fn langcall(bcx: &Block,
|
||||
pub fn langcall(bcx: Block,
|
||||
span: Option<Span>,
|
||||
msg: &str,
|
||||
li: LangItem)
|
||||
|
|
|
@ -55,7 +55,7 @@ pub struct Stats {
|
|||
/// per crate. The data here is shared between all compilation units of the
|
||||
/// crate, so it must not contain references to any LLVM data structures
|
||||
/// (aside from metadata-related ones).
|
||||
pub struct SharedCrateContext {
|
||||
pub struct SharedCrateContext<'tcx> {
|
||||
local_ccxs: Vec<LocalCrateContext>,
|
||||
|
||||
metadata_llmod: ModuleRef,
|
||||
|
@ -70,7 +70,7 @@ pub struct SharedCrateContext {
|
|||
/// that is generated
|
||||
non_inlineable_statics: RefCell<NodeSet>,
|
||||
symbol_hasher: RefCell<Sha256>,
|
||||
tcx: ty::ctxt,
|
||||
tcx: ty::ctxt<'tcx>,
|
||||
stats: Stats,
|
||||
|
||||
available_monomorphizations: RefCell<HashSet<String>>,
|
||||
|
@ -152,21 +152,21 @@ pub struct LocalCrateContext {
|
|||
n_llvm_insns: Cell<uint>,
|
||||
}
|
||||
|
||||
pub struct CrateContext<'a> {
|
||||
shared: &'a SharedCrateContext,
|
||||
pub struct CrateContext<'a, 'tcx: 'a> {
|
||||
shared: &'a SharedCrateContext<'tcx>,
|
||||
local: &'a LocalCrateContext,
|
||||
/// The index of `local` in `shared.local_ccxs`. This is used in
|
||||
/// `maybe_iter(true)` to identify the original `LocalCrateContext`.
|
||||
index: uint,
|
||||
}
|
||||
|
||||
pub struct CrateContextIterator<'a> {
|
||||
shared: &'a SharedCrateContext,
|
||||
pub struct CrateContextIterator<'a, 'tcx: 'a> {
|
||||
shared: &'a SharedCrateContext<'tcx>,
|
||||
index: uint,
|
||||
}
|
||||
|
||||
impl<'a> Iterator<CrateContext<'a>> for CrateContextIterator<'a> {
|
||||
fn next(&mut self) -> Option<CrateContext<'a>> {
|
||||
impl<'a, 'tcx> Iterator<CrateContext<'a, 'tcx>> for CrateContextIterator<'a,'tcx> {
|
||||
fn next(&mut self) -> Option<CrateContext<'a, 'tcx>> {
|
||||
if self.index >= self.shared.local_ccxs.len() {
|
||||
return None;
|
||||
}
|
||||
|
@ -183,15 +183,15 @@ fn next(&mut self) -> Option<CrateContext<'a>> {
|
|||
}
|
||||
|
||||
/// The iterator produced by `CrateContext::maybe_iter`.
|
||||
pub struct CrateContextMaybeIterator<'a> {
|
||||
shared: &'a SharedCrateContext,
|
||||
pub struct CrateContextMaybeIterator<'a, 'tcx: 'a> {
|
||||
shared: &'a SharedCrateContext<'tcx>,
|
||||
index: uint,
|
||||
single: bool,
|
||||
origin: uint,
|
||||
}
|
||||
|
||||
impl<'a> Iterator<(CrateContext<'a>, bool)> for CrateContextMaybeIterator<'a> {
|
||||
fn next(&mut self) -> Option<(CrateContext<'a>, bool)> {
|
||||
impl<'a, 'tcx> Iterator<(CrateContext<'a, 'tcx>, bool)> for CrateContextMaybeIterator<'a, 'tcx> {
|
||||
fn next(&mut self) -> Option<(CrateContext<'a, 'tcx>, bool)> {
|
||||
if self.index >= self.shared.local_ccxs.len() {
|
||||
return None;
|
||||
}
|
||||
|
@ -234,15 +234,15 @@ unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (ContextR
|
|||
(llcx, llmod)
|
||||
}
|
||||
|
||||
impl SharedCrateContext {
|
||||
impl<'tcx> SharedCrateContext<'tcx> {
|
||||
pub fn new(crate_name: &str,
|
||||
local_count: uint,
|
||||
tcx: ty::ctxt,
|
||||
tcx: ty::ctxt<'tcx>,
|
||||
emap2: resolve::ExportMap2,
|
||||
symbol_hasher: Sha256,
|
||||
link_meta: LinkMeta,
|
||||
reachable: NodeSet)
|
||||
-> SharedCrateContext {
|
||||
-> SharedCrateContext<'tcx> {
|
||||
let (metadata_llcx, metadata_llmod) = unsafe {
|
||||
create_context_and_module(&tcx.sess, "metadata")
|
||||
};
|
||||
|
@ -293,14 +293,14 @@ pub fn new(crate_name: &str,
|
|||
shared_ccx
|
||||
}
|
||||
|
||||
pub fn iter<'a>(&'a self) -> CrateContextIterator<'a> {
|
||||
pub fn iter<'a>(&'a self) -> CrateContextIterator<'a, 'tcx> {
|
||||
CrateContextIterator {
|
||||
shared: self,
|
||||
index: 0,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_ccx<'a>(&'a self, index: uint) -> CrateContext<'a> {
|
||||
pub fn get_ccx<'a>(&'a self, index: uint) -> CrateContext<'a, 'tcx> {
|
||||
CrateContext {
|
||||
shared: self,
|
||||
local: &self.local_ccxs[index],
|
||||
|
@ -308,7 +308,7 @@ pub fn get_ccx<'a>(&'a self, index: uint) -> CrateContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_smallest_ccx<'a>(&'a self) -> CrateContext<'a> {
|
||||
fn get_smallest_ccx<'a>(&'a self) -> CrateContext<'a, 'tcx> {
|
||||
let (local_ccx, index) =
|
||||
self.local_ccxs
|
||||
.iter()
|
||||
|
@ -355,11 +355,11 @@ pub fn symbol_hasher<'a>(&'a self) -> &'a RefCell<Sha256> {
|
|||
&self.symbol_hasher
|
||||
}
|
||||
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
&self.tcx
|
||||
}
|
||||
|
||||
pub fn take_tcx(self) -> ty::ctxt {
|
||||
pub fn take_tcx(self) -> ty::ctxt<'tcx> {
|
||||
self.tcx
|
||||
}
|
||||
|
||||
|
@ -459,7 +459,8 @@ fn new(shared: &SharedCrateContext,
|
|||
/// This is used in the `LocalCrateContext` constructor to allow calling
|
||||
/// functions that expect a complete `CrateContext`, even before the local
|
||||
/// portion is fully initialized and attached to the `SharedCrateContext`.
|
||||
fn dummy_ccx<'a>(&'a self, shared: &'a SharedCrateContext) -> CrateContext<'a> {
|
||||
fn dummy_ccx<'a, 'tcx>(&'a self, shared: &'a SharedCrateContext<'tcx>)
|
||||
-> CrateContext<'a, 'tcx> {
|
||||
CrateContext {
|
||||
shared: shared,
|
||||
local: self,
|
||||
|
@ -468,8 +469,8 @@ fn dummy_ccx<'a>(&'a self, shared: &'a SharedCrateContext) -> CrateContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'b> CrateContext<'b> {
|
||||
pub fn shared(&self) -> &'b SharedCrateContext {
|
||||
impl<'b, 'tcx> CrateContext<'b, 'tcx> {
|
||||
pub fn shared(&self) -> &'b SharedCrateContext<'tcx> {
|
||||
self.shared
|
||||
}
|
||||
|
||||
|
@ -480,7 +481,7 @@ pub fn local(&self) -> &'b LocalCrateContext {
|
|||
|
||||
/// Get a (possibly) different `CrateContext` from the same
|
||||
/// `SharedCrateContext`.
|
||||
pub fn rotate(&self) -> CrateContext<'b> {
|
||||
pub fn rotate(&self) -> CrateContext<'b, 'tcx> {
|
||||
self.shared.get_smallest_ccx()
|
||||
}
|
||||
|
||||
|
@ -490,7 +491,7 @@ pub fn rotate(&self) -> CrateContext<'b> {
|
|||
/// otherwise. This method is useful for avoiding code duplication in
|
||||
/// cases where it may or may not be necessary to translate code into every
|
||||
/// context.
|
||||
pub fn maybe_iter(&self, iter_all: bool) -> CrateContextMaybeIterator<'b> {
|
||||
pub fn maybe_iter(&self, iter_all: bool) -> CrateContextMaybeIterator<'b, 'tcx> {
|
||||
CrateContextMaybeIterator {
|
||||
shared: self.shared,
|
||||
index: if iter_all { 0 } else { self.index },
|
||||
|
@ -500,7 +501,7 @@ pub fn maybe_iter(&self, iter_all: bool) -> CrateContextMaybeIterator<'b> {
|
|||
}
|
||||
|
||||
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
&self.shared.tcx
|
||||
}
|
||||
|
||||
|
@ -508,7 +509,7 @@ pub fn sess<'a>(&'a self) -> &'a Session {
|
|||
&self.shared.tcx.sess
|
||||
}
|
||||
|
||||
pub fn builder<'a>(&'a self) -> Builder<'a> {
|
||||
pub fn builder<'a>(&'a self) -> Builder<'a, 'tcx> {
|
||||
Builder::new(self)
|
||||
}
|
||||
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
|
||||
use std::gc::Gc;
|
||||
|
||||
pub fn trans_stmt<'a>(cx: &'a Block<'a>,
|
||||
s: &ast::Stmt)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_stmt<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
|
||||
s: &ast::Stmt)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_stmt");
|
||||
let fcx = cx.fcx;
|
||||
debug!("trans_stmt({})", s.repr(cx.tcx()));
|
||||
|
@ -83,7 +83,8 @@ pub fn trans_stmt<'a>(cx: &'a Block<'a>,
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn trans_stmt_semi<'a>(cx: &'a Block<'a>, e: &ast::Expr) -> &'a Block<'a> {
|
||||
pub fn trans_stmt_semi<'blk, 'tcx>(cx: Block<'blk, 'tcx>, e: &ast::Expr)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_stmt_semi");
|
||||
let ty = expr_ty(cx, e);
|
||||
if ty::type_needs_drop(cx.tcx(), ty) {
|
||||
|
@ -93,10 +94,10 @@ pub fn trans_stmt_semi<'a>(cx: &'a Block<'a>, e: &ast::Expr) -> &'a Block<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_block<'a>(bcx: &'a Block<'a>,
|
||||
b: &ast::Block,
|
||||
mut dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_block<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
b: &ast::Block,
|
||||
mut dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_block");
|
||||
let fcx = bcx.fcx;
|
||||
let mut bcx = bcx;
|
||||
|
@ -128,13 +129,13 @@ pub fn trans_block<'a>(bcx: &'a Block<'a>,
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn trans_if<'a>(bcx: &'a Block<'a>,
|
||||
if_id: ast::NodeId,
|
||||
cond: &ast::Expr,
|
||||
thn: ast::P<ast::Block>,
|
||||
els: Option<Gc<ast::Expr>>,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_if<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
if_id: ast::NodeId,
|
||||
cond: &ast::Expr,
|
||||
thn: ast::P<ast::Block>,
|
||||
els: Option<Gc<ast::Expr>>,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
debug!("trans_if(bcx={}, if_id={}, cond={}, thn={:?}, dest={})",
|
||||
bcx.to_str(), if_id, bcx.expr_to_string(cond), thn.id,
|
||||
dest.to_string(bcx.ccx()));
|
||||
|
@ -204,11 +205,11 @@ pub fn trans_if<'a>(bcx: &'a Block<'a>,
|
|||
next_bcx
|
||||
}
|
||||
|
||||
pub fn trans_while<'a>(bcx: &'a Block<'a>,
|
||||
loop_id: ast::NodeId,
|
||||
cond: &ast::Expr,
|
||||
body: &ast::Block)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_while<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
loop_id: ast::NodeId,
|
||||
cond: &ast::Expr,
|
||||
body: &ast::Block)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_while");
|
||||
let fcx = bcx.fcx;
|
||||
|
||||
|
@ -248,13 +249,12 @@ pub fn trans_while<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
|
||||
/// Translates a `for` loop.
|
||||
pub fn trans_for<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
loop_info: NodeInfo,
|
||||
pat: Gc<ast::Pat>,
|
||||
head: &ast::Expr,
|
||||
body: &ast::Block)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_for<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
loop_info: NodeInfo,
|
||||
pat: Gc<ast::Pat>,
|
||||
head: &ast::Expr,
|
||||
body: &ast::Block)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_for");
|
||||
|
||||
// bcx
|
||||
|
@ -369,10 +369,10 @@ pub fn trans_for<'a>(
|
|||
next_bcx_in
|
||||
}
|
||||
|
||||
pub fn trans_loop<'a>(bcx:&'a Block<'a>,
|
||||
loop_id: ast::NodeId,
|
||||
body: &ast::Block)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_loop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
loop_id: ast::NodeId,
|
||||
body: &ast::Block)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_loop");
|
||||
let fcx = bcx.fcx;
|
||||
|
||||
|
@ -405,11 +405,11 @@ pub fn trans_loop<'a>(bcx:&'a Block<'a>,
|
|||
return next_bcx_in;
|
||||
}
|
||||
|
||||
pub fn trans_break_cont<'a>(bcx: &'a Block<'a>,
|
||||
expr_id: ast::NodeId,
|
||||
opt_label: Option<Ident>,
|
||||
exit: uint)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_break_cont<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr_id: ast::NodeId,
|
||||
opt_label: Option<Ident>,
|
||||
exit: uint)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_break_cont");
|
||||
let fcx = bcx.fcx;
|
||||
|
||||
|
@ -438,23 +438,23 @@ pub fn trans_break_cont<'a>(bcx: &'a Block<'a>,
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn trans_break<'a>(bcx: &'a Block<'a>,
|
||||
expr_id: ast::NodeId,
|
||||
label_opt: Option<Ident>)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_break<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr_id: ast::NodeId,
|
||||
label_opt: Option<Ident>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
return trans_break_cont(bcx, expr_id, label_opt, cleanup::EXIT_BREAK);
|
||||
}
|
||||
|
||||
pub fn trans_cont<'a>(bcx: &'a Block<'a>,
|
||||
expr_id: ast::NodeId,
|
||||
label_opt: Option<Ident>)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_cont<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr_id: ast::NodeId,
|
||||
label_opt: Option<Ident>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
return trans_break_cont(bcx, expr_id, label_opt, cleanup::EXIT_LOOP);
|
||||
}
|
||||
|
||||
pub fn trans_ret<'a>(bcx: &'a Block<'a>,
|
||||
e: Option<Gc<ast::Expr>>)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_ret<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
e: Option<Gc<ast::Expr>>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_ret");
|
||||
let fcx = bcx.fcx;
|
||||
let mut bcx = bcx;
|
||||
|
@ -483,11 +483,10 @@ pub fn trans_ret<'a>(bcx: &'a Block<'a>,
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn trans_fail<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
sp: Span,
|
||||
fail_str: InternedString)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_fail<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
sp: Span,
|
||||
fail_str: InternedString)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let ccx = bcx.ccx();
|
||||
let _icx = push_ctxt("trans_fail_value");
|
||||
|
||||
|
@ -508,12 +507,11 @@ pub fn trans_fail<'a>(
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn trans_fail_bounds_check<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
sp: Span,
|
||||
index: ValueRef,
|
||||
len: ValueRef)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_fail_bounds_check<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
sp: Span,
|
||||
index: ValueRef,
|
||||
len: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let ccx = bcx.ccx();
|
||||
let _icx = push_ctxt("trans_fail_bounds_check");
|
||||
|
||||
|
|
|
@ -47,8 +47,8 @@ pub struct Datum<K> {
|
|||
pub kind: K,
|
||||
}
|
||||
|
||||
pub struct DatumBlock<'a, K> {
|
||||
pub bcx: &'a Block<'a>,
|
||||
pub struct DatumBlock<'blk, 'tcx: 'blk, K> {
|
||||
pub bcx: Block<'blk, 'tcx>,
|
||||
pub datum: Datum<K>,
|
||||
}
|
||||
|
||||
|
@ -94,23 +94,23 @@ pub fn immediate_rvalue(val: ValueRef, ty: ty::t) -> Datum<Rvalue> {
|
|||
return Datum::new(val, ty, Rvalue::new(ByValue));
|
||||
}
|
||||
|
||||
pub fn immediate_rvalue_bcx<'a>(bcx: &'a Block<'a>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> DatumBlock<'a, Rvalue> {
|
||||
pub fn immediate_rvalue_bcx<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> DatumBlock<'blk, 'tcx, Rvalue> {
|
||||
return DatumBlock::new(bcx, immediate_rvalue(val, ty))
|
||||
}
|
||||
|
||||
|
||||
pub fn lvalue_scratch_datum<'a, A>(bcx: &'a Block<'a>,
|
||||
ty: ty::t,
|
||||
name: &str,
|
||||
zero: bool,
|
||||
scope: cleanup::ScopeId,
|
||||
arg: A,
|
||||
populate: |A, &'a Block<'a>, ValueRef|
|
||||
-> &'a Block<'a>)
|
||||
-> DatumBlock<'a, Lvalue> {
|
||||
pub fn lvalue_scratch_datum<'blk, 'tcx, A>(bcx: Block<'blk, 'tcx>,
|
||||
ty: ty::t,
|
||||
name: &str,
|
||||
zero: bool,
|
||||
scope: cleanup::ScopeId,
|
||||
arg: A,
|
||||
populate: |A, Block<'blk, 'tcx>, ValueRef|
|
||||
-> Block<'blk, 'tcx>)
|
||||
-> DatumBlock<'blk, 'tcx, Lvalue> {
|
||||
/*!
|
||||
* Allocates temporary space on the stack using alloca() and
|
||||
* returns a by-ref Datum pointing to it. The memory will be
|
||||
|
@ -135,7 +135,7 @@ pub fn lvalue_scratch_datum<'a, A>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, Datum::new(scratch, ty, Lvalue))
|
||||
}
|
||||
|
||||
pub fn rvalue_scratch_datum(bcx: &Block,
|
||||
pub fn rvalue_scratch_datum(bcx: Block,
|
||||
ty: ty::t,
|
||||
name: &str)
|
||||
-> Datum<Rvalue> {
|
||||
|
@ -188,11 +188,11 @@ pub trait KindOps {
|
|||
* Take appropriate action after the value in `datum` has been
|
||||
* stored to a new location.
|
||||
*/
|
||||
fn post_store<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> &'a Block<'a>;
|
||||
fn post_store<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> Block<'blk, 'tcx>;
|
||||
|
||||
/**
|
||||
* True if this mode is a reference mode, meaning that the datum's
|
||||
|
@ -208,11 +208,11 @@ fn post_store<'a>(&self,
|
|||
}
|
||||
|
||||
impl KindOps for Rvalue {
|
||||
fn post_store<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
_val: ValueRef,
|
||||
_ty: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
fn post_store<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
_val: ValueRef,
|
||||
_ty: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
// No cleanup is scheduled for an rvalue, so we don't have
|
||||
// to do anything after a move to cancel or duplicate it.
|
||||
bcx
|
||||
|
@ -228,11 +228,11 @@ fn to_expr_kind(self) -> Expr {
|
|||
}
|
||||
|
||||
impl KindOps for Lvalue {
|
||||
fn post_store<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
fn post_store<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* If an lvalue is moved, we must zero out the memory in which
|
||||
* it resides so as to cancel cleanup. If an @T lvalue is
|
||||
|
@ -263,11 +263,11 @@ fn to_expr_kind(self) -> Expr {
|
|||
}
|
||||
|
||||
impl KindOps for Expr {
|
||||
fn post_store<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
fn post_store<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
val: ValueRef,
|
||||
ty: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
match *self {
|
||||
LvalueExpr => Lvalue.post_store(bcx, val, ty),
|
||||
RvalueExpr(ref r) => r.post_store(bcx, val, ty),
|
||||
|
@ -302,11 +302,11 @@ pub fn add_clean(self,
|
|||
self.val
|
||||
}
|
||||
|
||||
pub fn to_lvalue_datum_in_scope<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
name: &str,
|
||||
scope: cleanup::ScopeId)
|
||||
-> DatumBlock<'a, Lvalue> {
|
||||
pub fn to_lvalue_datum_in_scope<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
name: &str,
|
||||
scope: cleanup::ScopeId)
|
||||
-> DatumBlock<'blk, 'tcx, Lvalue> {
|
||||
/*!
|
||||
* Returns an lvalue datum (that is, a by ref datum with
|
||||
* cleanup scheduled). If `self` is not already an lvalue,
|
||||
|
@ -328,7 +328,8 @@ pub fn to_lvalue_datum_in_scope<'a>(self,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_ref_datum<'a>(self, bcx: &'a Block<'a>) -> DatumBlock<'a, Rvalue> {
|
||||
pub fn to_ref_datum<'blk, 'tcx>(self, bcx: Block<'blk, 'tcx>)
|
||||
-> DatumBlock<'blk, 'tcx, Rvalue> {
|
||||
let mut bcx = bcx;
|
||||
match self.kind.mode {
|
||||
ByRef => DatumBlock::new(bcx, self),
|
||||
|
@ -340,9 +341,9 @@ pub fn to_ref_datum<'a>(self, bcx: &'a Block<'a>) -> DatumBlock<'a, Rvalue> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_appropriate_datum<'a>(self,
|
||||
bcx: &'a Block<'a>)
|
||||
-> DatumBlock<'a, Rvalue> {
|
||||
pub fn to_appropriate_datum<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>)
|
||||
-> DatumBlock<'blk, 'tcx, Rvalue> {
|
||||
match self.appropriate_rvalue_mode(bcx.ccx()) {
|
||||
ByRef => {
|
||||
self.to_ref_datum(bcx)
|
||||
|
@ -381,7 +382,7 @@ fn match_kind<R>(self,
|
|||
}
|
||||
|
||||
#[allow(dead_code)] // potentially useful
|
||||
pub fn assert_lvalue(self, bcx: &Block) -> Datum<Lvalue> {
|
||||
pub fn assert_lvalue(self, bcx: Block) -> Datum<Lvalue> {
|
||||
/*!
|
||||
* Asserts that this datum *is* an lvalue and returns it.
|
||||
*/
|
||||
|
@ -391,7 +392,7 @@ pub fn assert_lvalue(self, bcx: &Block) -> Datum<Lvalue> {
|
|||
|_| bcx.sess().bug("assert_lvalue given rvalue"))
|
||||
}
|
||||
|
||||
pub fn assert_rvalue(self, bcx: &Block) -> Datum<Rvalue> {
|
||||
pub fn assert_rvalue(self, bcx: Block) -> Datum<Rvalue> {
|
||||
/*!
|
||||
* Asserts that this datum *is* an lvalue and returns it.
|
||||
*/
|
||||
|
@ -401,11 +402,11 @@ pub fn assert_rvalue(self, bcx: &Block) -> Datum<Rvalue> {
|
|||
|r| r)
|
||||
}
|
||||
|
||||
pub fn store_to_dest<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
dest: expr::Dest,
|
||||
expr_id: ast::NodeId)
|
||||
-> &'a Block<'a> {
|
||||
pub fn store_to_dest<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
dest: expr::Dest,
|
||||
expr_id: ast::NodeId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
match dest {
|
||||
expr::Ignore => {
|
||||
self.add_clean_if_rvalue(bcx, expr_id);
|
||||
|
@ -417,9 +418,9 @@ pub fn store_to_dest<'a>(self,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn add_clean_if_rvalue<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
expr_id: ast::NodeId) {
|
||||
pub fn add_clean_if_rvalue<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
expr_id: ast::NodeId) {
|
||||
/*!
|
||||
* Arranges cleanup for `self` if it is an rvalue. Use when
|
||||
* you are done working with a value that may need drop.
|
||||
|
@ -433,11 +434,11 @@ pub fn add_clean_if_rvalue<'a>(self,
|
|||
})
|
||||
}
|
||||
|
||||
pub fn clean<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
name: &'static str,
|
||||
expr_id: ast::NodeId)
|
||||
-> &'a Block<'a> {
|
||||
pub fn clean<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
name: &'static str,
|
||||
expr_id: ast::NodeId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Ensures that `self` will get cleaned up, if it is not an lvalue
|
||||
* already.
|
||||
|
@ -446,11 +447,11 @@ pub fn clean<'a>(self,
|
|||
self.to_lvalue_datum(bcx, name, expr_id).bcx
|
||||
}
|
||||
|
||||
pub fn to_lvalue_datum<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
name: &str,
|
||||
expr_id: ast::NodeId)
|
||||
-> DatumBlock<'a, Lvalue> {
|
||||
pub fn to_lvalue_datum<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
name: &str,
|
||||
expr_id: ast::NodeId)
|
||||
-> DatumBlock<'blk, 'tcx, Lvalue> {
|
||||
debug!("to_lvalue_datum self: {}", self.to_string(bcx.ccx()));
|
||||
|
||||
assert!(ty::lltype_is_sized(bcx.tcx(), self.ty),
|
||||
|
@ -463,10 +464,10 @@ pub fn to_lvalue_datum<'a>(self,
|
|||
})
|
||||
}
|
||||
|
||||
pub fn to_rvalue_datum<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
name: &'static str)
|
||||
-> DatumBlock<'a, Rvalue> {
|
||||
pub fn to_rvalue_datum<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
name: &'static str)
|
||||
-> DatumBlock<'blk, 'tcx, Rvalue> {
|
||||
/*!
|
||||
* Ensures that we have an rvalue datum (that is, a datum with
|
||||
* no cleanup scheduled).
|
||||
|
@ -514,11 +515,9 @@ pub fn to_llref(self) -> ValueRef {
|
|||
// datum may also be unsized _without the size information_. It is the
|
||||
// callers responsibility to package the result in some way to make a valid
|
||||
// datum in that case (e.g., by making a fat pointer or opened pair).
|
||||
pub fn get_element<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
ty: ty::t,
|
||||
gep: |ValueRef| -> ValueRef)
|
||||
-> Datum<Lvalue> {
|
||||
pub fn get_element(&self, bcx: Block, ty: ty::t,
|
||||
gep: |ValueRef| -> ValueRef)
|
||||
-> Datum<Lvalue> {
|
||||
let val = match ty::get(self.ty).sty {
|
||||
_ if ty::type_is_sized(bcx.tcx(), self.ty) => gep(self.val),
|
||||
ty::ty_open(_) => {
|
||||
|
@ -536,7 +535,7 @@ pub fn get_element<'a>(&self,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_vec_base_and_len<'a>(&self, bcx: &'a Block<'a>) -> (ValueRef, ValueRef) {
|
||||
pub fn get_vec_base_and_len(&self, bcx: Block) -> (ValueRef, ValueRef) {
|
||||
//! Converts a vector into the slice pair.
|
||||
|
||||
tvec::get_base_and_len(bcx, self.val, self.ty)
|
||||
|
@ -556,10 +555,10 @@ pub fn to_expr_datum(self) -> Datum<Expr> {
|
|||
Datum { val: val, ty: ty, kind: kind.to_expr_kind() }
|
||||
}
|
||||
|
||||
pub fn store_to<'a>(self,
|
||||
bcx: &'a Block<'a>,
|
||||
dst: ValueRef)
|
||||
-> &'a Block<'a> {
|
||||
pub fn store_to<'blk, 'tcx>(self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
dst: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Moves or copies this value into a new home, as appropriate
|
||||
* depending on the type of the datum. This method consumes
|
||||
|
@ -573,10 +572,10 @@ pub fn store_to<'a>(self,
|
|||
self.kind.post_store(bcx, self.val, self.ty)
|
||||
}
|
||||
|
||||
fn shallow_copy<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
dst: ValueRef)
|
||||
-> &'a Block<'a> {
|
||||
fn shallow_copy<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
dst: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Helper function that performs a shallow copy of this value
|
||||
* into `dst`, which should be a pointer to a memory location
|
||||
|
@ -606,10 +605,10 @@ fn shallow_copy<'a>(&self,
|
|||
return bcx;
|
||||
}
|
||||
|
||||
pub fn shallow_copy_and_take<'a>(&self,
|
||||
bcx: &'a Block<'a>,
|
||||
dst: ValueRef)
|
||||
-> &'a Block<'a> {
|
||||
pub fn shallow_copy_and_take<'blk, 'tcx>(&self,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
dst: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Copies the value into a new location and runs any necessary
|
||||
* take glue on the new location. This function always
|
||||
|
@ -638,7 +637,7 @@ pub fn appropriate_rvalue_mode(&self, ccx: &CrateContext) -> RvalueMode {
|
|||
appropriate_rvalue_mode(ccx, self.ty)
|
||||
}
|
||||
|
||||
pub fn to_llscalarish<'a>(self, bcx: &'a Block<'a>) -> ValueRef {
|
||||
pub fn to_llscalarish(self, bcx: Block) -> ValueRef {
|
||||
/*!
|
||||
* Converts `self` into a by-value `ValueRef`. Consumes this
|
||||
* datum (i.e., absolves you of responsibility to cleanup the
|
||||
|
@ -657,33 +656,33 @@ pub fn to_llscalarish<'a>(self, bcx: &'a Block<'a>) -> ValueRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_llbool<'a>(self, bcx: &'a Block<'a>) -> ValueRef {
|
||||
pub fn to_llbool(self, bcx: Block) -> ValueRef {
|
||||
assert!(ty::type_is_bool(self.ty) || ty::type_is_bot(self.ty))
|
||||
self.to_llscalarish(bcx)
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a, K> DatumBlock<'a, K> {
|
||||
pub fn new(bcx: &'a Block<'a>, datum: Datum<K>) -> DatumBlock<'a, K> {
|
||||
impl<'blk, 'tcx, K> DatumBlock<'blk, 'tcx, K> {
|
||||
pub fn new(bcx: Block<'blk, 'tcx>, datum: Datum<K>) -> DatumBlock<'blk, 'tcx, K> {
|
||||
DatumBlock { bcx: bcx, datum: datum }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K:KindOps> DatumBlock<'a, K> {
|
||||
pub fn to_expr_datumblock(self) -> DatumBlock<'a, Expr> {
|
||||
impl<'blk, 'tcx, K:KindOps> DatumBlock<'blk, 'tcx, K> {
|
||||
pub fn to_expr_datumblock(self) -> DatumBlock<'blk, 'tcx, Expr> {
|
||||
DatumBlock::new(self.bcx, self.datum.to_expr_datum())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> DatumBlock<'a, Expr> {
|
||||
impl<'blk, 'tcx> DatumBlock<'blk, 'tcx, Expr> {
|
||||
pub fn store_to_dest(self,
|
||||
dest: expr::Dest,
|
||||
expr_id: ast::NodeId) -> &'a Block<'a> {
|
||||
expr_id: ast::NodeId) -> Block<'blk, 'tcx> {
|
||||
let DatumBlock { bcx, datum } = self;
|
||||
datum.store_to_dest(bcx, dest, expr_id)
|
||||
}
|
||||
|
||||
pub fn to_llbool(self) -> Result<'a> {
|
||||
pub fn to_llbool(self) -> Result<'blk, 'tcx> {
|
||||
let DatumBlock { datum, bcx } = self;
|
||||
Result::new(bcx, datum.to_llbool(bcx))
|
||||
}
|
||||
|
|
|
@ -832,7 +832,7 @@ pub fn create_global_var_metadata(cx: &CrateContext,
|
|||
/// Creates debug information for the given local variable.
|
||||
///
|
||||
/// Adds the created metadata nodes directly to the crate's IR.
|
||||
pub fn create_local_var_metadata(bcx: &Block, local: &ast::Local) {
|
||||
pub fn create_local_var_metadata(bcx: Block, local: &ast::Local) {
|
||||
if fn_should_be_ignored(bcx.fcx) {
|
||||
return;
|
||||
}
|
||||
|
@ -867,7 +867,7 @@ pub fn create_local_var_metadata(bcx: &Block, local: &ast::Local) {
|
|||
/// Creates debug information for a variable captured in a closure.
|
||||
///
|
||||
/// Adds the created metadata nodes directly to the crate's IR.
|
||||
pub fn create_captured_var_metadata(bcx: &Block,
|
||||
pub fn create_captured_var_metadata(bcx: Block,
|
||||
node_id: ast::NodeId,
|
||||
env_data_type: ty::t,
|
||||
env_pointer: ValueRef,
|
||||
|
@ -954,7 +954,7 @@ pub fn create_captured_var_metadata(bcx: &Block,
|
|||
/// match-statement arm.
|
||||
///
|
||||
/// Adds the created metadata nodes directly to the crate's IR.
|
||||
pub fn create_match_binding_metadata(bcx: &Block,
|
||||
pub fn create_match_binding_metadata(bcx: Block,
|
||||
variable_ident: ast::Ident,
|
||||
binding: BindingInfo) {
|
||||
if fn_should_be_ignored(bcx.fcx) {
|
||||
|
@ -994,7 +994,7 @@ pub fn create_match_binding_metadata(bcx: &Block,
|
|||
/// Creates debug information for the given function argument.
|
||||
///
|
||||
/// Adds the created metadata nodes directly to the crate's IR.
|
||||
pub fn create_argument_metadata(bcx: &Block, arg: &ast::Arg) {
|
||||
pub fn create_argument_metadata(bcx: Block, arg: &ast::Arg) {
|
||||
if fn_should_be_ignored(bcx.fcx) {
|
||||
return;
|
||||
}
|
||||
|
@ -1518,7 +1518,7 @@ fn fallback_path(cx: &CrateContext) -> CString {
|
|||
}
|
||||
}
|
||||
|
||||
fn declare_local(bcx: &Block,
|
||||
fn declare_local(bcx: Block,
|
||||
variable_ident: ast::Ident,
|
||||
variable_type: ty::t,
|
||||
scope_metadata: DIScope,
|
||||
|
|
|
@ -100,10 +100,10 @@ pub fn to_string(&self, ccx: &CrateContext) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_into<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_into<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* This function is equivalent to `trans(bcx, expr).store_to_dest(dest)`
|
||||
* but it may generate better optimized LLVM code.
|
||||
|
@ -139,9 +139,9 @@ pub fn trans_into<'a>(bcx: &'a Block<'a>,
|
|||
bcx.fcx.pop_and_trans_ast_cleanup_scope(bcx, expr.id)
|
||||
}
|
||||
|
||||
pub fn trans<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
pub fn trans<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* Translates an expression, returning a datum (and new block)
|
||||
* encapsulating the result. When possible, it is preferred to
|
||||
|
@ -161,18 +161,18 @@ pub fn trans<'a>(bcx: &'a Block<'a>,
|
|||
return DatumBlock::new(bcx, datum);
|
||||
}
|
||||
|
||||
pub fn get_len(bcx: &Block, fat_ptr: ValueRef) -> ValueRef {
|
||||
pub fn get_len(bcx: Block, fat_ptr: ValueRef) -> ValueRef {
|
||||
GEPi(bcx, fat_ptr, [0u, abi::slice_elt_len])
|
||||
}
|
||||
|
||||
pub fn get_dataptr(bcx: &Block, fat_ptr: ValueRef) -> ValueRef {
|
||||
pub fn get_dataptr(bcx: Block, fat_ptr: ValueRef) -> ValueRef {
|
||||
GEPi(bcx, fat_ptr, [0u, abi::slice_elt_base])
|
||||
}
|
||||
|
||||
fn apply_adjustments<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* Helper for trans that apply adjustments from `expr` to `datum`,
|
||||
* which should be the unadjusted translation of `expr`.
|
||||
|
@ -245,11 +245,11 @@ fn apply_adjustments<'a>(bcx: &'a Block<'a>,
|
|||
debug!("after adjustments, datum={}", datum.to_string(bcx.ccx()));
|
||||
return DatumBlock::new(bcx, datum);
|
||||
|
||||
fn apply_autoref<'a>(autoref: &ty::AutoRef,
|
||||
bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn apply_autoref<'blk, 'tcx>(autoref: &ty::AutoRef,
|
||||
bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
let mut datum = datum;
|
||||
|
||||
|
@ -281,10 +281,10 @@ fn apply_autoref<'a>(autoref: &ty::AutoRef,
|
|||
DatumBlock::new(bcx, datum)
|
||||
}
|
||||
|
||||
fn ref_ptr<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn ref_ptr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
if !ty::type_is_sized(bcx.tcx(), datum.ty) {
|
||||
debug!("Taking address of unsized type {}",
|
||||
bcx.ty_to_string(datum.ty));
|
||||
|
@ -303,11 +303,11 @@ fn ref_ptr<'a>(bcx: &'a Block<'a>,
|
|||
// into a type to be destructed. If we want to end up with a Box pointer,
|
||||
// then mk_ty should make a Box pointer (T -> Box<T>), if we want a
|
||||
// borrowed reference then it should be T -> &T.
|
||||
fn unsized_info<'a>(bcx: &'a Block<'a>,
|
||||
kind: &ty::UnsizeKind,
|
||||
id: ast::NodeId,
|
||||
unsized_ty: ty::t,
|
||||
mk_ty: |ty::t| -> ty::t) -> ValueRef {
|
||||
fn unsized_info<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
kind: &ty::UnsizeKind,
|
||||
id: ast::NodeId,
|
||||
unsized_ty: ty::t,
|
||||
mk_ty: |ty::t| -> ty::t) -> ValueRef {
|
||||
match kind {
|
||||
&ty::UnsizeLength(len) => C_uint(bcx.ccx(), len),
|
||||
&ty::UnsizeStruct(box ref k, tp_index) => match ty::get(unsized_ty).sty {
|
||||
|
@ -327,11 +327,11 @@ fn unsized_info<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn unsize_expr<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
k: &ty::UnsizeKind)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn unsize_expr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
k: &ty::UnsizeKind)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let tcx = bcx.tcx();
|
||||
let datum_ty = datum.ty;
|
||||
let unsized_ty = ty::unsize_ty(tcx, datum_ty, k, expr.span);
|
||||
|
@ -361,10 +361,10 @@ fn unsize_expr<'a>(bcx: &'a Block<'a>,
|
|||
into_fat_ptr(bcx, expr, datum, dest_ty, base, info)
|
||||
}
|
||||
|
||||
fn ref_fat_ptr<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn ref_fat_ptr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let tcx = bcx.tcx();
|
||||
let dest_ty = ty::close_type(tcx, datum.ty);
|
||||
let base = |bcx, val| Load(bcx, get_dataptr(bcx, val));
|
||||
|
@ -372,13 +372,13 @@ fn ref_fat_ptr<'a>(bcx: &'a Block<'a>,
|
|||
into_fat_ptr(bcx, expr, datum, dest_ty, base, len)
|
||||
}
|
||||
|
||||
fn into_fat_ptr<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
dest_ty: ty::t,
|
||||
base: |&'a Block<'a>, ValueRef| -> ValueRef,
|
||||
info: |&'a Block<'a>, ValueRef| -> ValueRef)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn into_fat_ptr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
dest_ty: ty::t,
|
||||
base: |Block<'blk, 'tcx>, ValueRef| -> ValueRef,
|
||||
info: |Block<'blk, 'tcx>, ValueRef| -> ValueRef)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
|
||||
// Arrange cleanup
|
||||
|
@ -394,11 +394,11 @@ fn into_fat_ptr<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, scratch.to_expr_datum())
|
||||
}
|
||||
|
||||
fn unsize_unique_vec<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
len: uint)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn unsize_unique_vec<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
len: uint)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
let tcx = bcx.tcx();
|
||||
|
||||
|
@ -440,11 +440,11 @@ fn unsize_unique_vec<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, scratch.to_expr_datum())
|
||||
}
|
||||
|
||||
fn unsize_unique_expr<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
k: &ty::UnsizeKind)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn unsize_unique_expr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
k: &ty::UnsizeKind)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
let tcx = bcx.tcx();
|
||||
|
||||
|
@ -475,10 +475,10 @@ fn unsize_unique_expr<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, scratch.to_expr_datum())
|
||||
}
|
||||
|
||||
fn add_env<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn add_env<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
// This is not the most efficient thing possible; since closures
|
||||
// are two words it'd be better if this were compiled in
|
||||
// 'dest' mode, but I can't find a nice way to structure the
|
||||
|
@ -492,10 +492,10 @@ fn add_env<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_to_lvalue<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
name: &str)
|
||||
-> DatumBlock<'a, Lvalue> {
|
||||
pub fn trans_to_lvalue<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
name: &str)
|
||||
-> DatumBlock<'blk, 'tcx, Lvalue> {
|
||||
/*!
|
||||
* Translates an expression in "lvalue" mode -- meaning that it
|
||||
* returns a reference to the memory that the expr represents.
|
||||
|
@ -512,9 +512,9 @@ pub fn trans_to_lvalue<'a>(bcx: &'a Block<'a>,
|
|||
return datum.to_lvalue_datum(bcx, name, expr.id);
|
||||
}
|
||||
|
||||
fn trans_unadjusted<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* A version of `trans` that ignores adjustments. You almost
|
||||
* certainly do not want to call this directly.
|
||||
|
@ -568,16 +568,17 @@ fn trans_unadjusted<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
};
|
||||
|
||||
fn nil<'a>(bcx: &'a Block<'a>, ty: ty::t) -> DatumBlock<'a, Expr> {
|
||||
fn nil<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ty: ty::t)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let llval = C_undef(type_of::type_of(bcx.ccx(), ty));
|
||||
let datum = immediate_rvalue(llval, ty);
|
||||
DatumBlock::new(bcx, datum.to_expr_datum())
|
||||
}
|
||||
}
|
||||
|
||||
fn trans_datum_unadjusted<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_datum_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
let fcx = bcx.fcx;
|
||||
let _icx = push_ctxt("trans_datum_unadjusted");
|
||||
|
@ -665,10 +666,10 @@ fn trans_datum_unadjusted<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_rec_field<'a>(bcx: &'a Block<'a>,
|
||||
base: &ast::Expr,
|
||||
field: ast::Ident)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_rec_field<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
base: &ast::Expr,
|
||||
field: ast::Ident)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
//! Translates `base.field`.
|
||||
|
||||
let mut bcx = bcx;
|
||||
|
@ -698,12 +699,12 @@ fn trans_rec_field<'a>(bcx: &'a Block<'a>,
|
|||
})
|
||||
}
|
||||
|
||||
fn trans_index<'a>(bcx: &'a Block<'a>,
|
||||
index_expr: &ast::Expr,
|
||||
base: &ast::Expr,
|
||||
idx: &ast::Expr,
|
||||
method_call: MethodCall)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_index<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
index_expr: &ast::Expr,
|
||||
base: &ast::Expr,
|
||||
idx: &ast::Expr,
|
||||
method_call: MethodCall)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
//! Translates `base[idx]`.
|
||||
|
||||
let _icx = push_ctxt("trans_index");
|
||||
|
@ -803,11 +804,10 @@ fn trans_index<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, elt_datum)
|
||||
}
|
||||
|
||||
fn trans_def<'a>(bcx: &'a Block<'a>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def)
|
||||
-> DatumBlock<'a, Expr>
|
||||
{
|
||||
fn trans_def<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
//! Translates a reference to a path.
|
||||
|
||||
let _icx = push_ctxt("trans_def_lvalue");
|
||||
|
@ -830,8 +830,8 @@ fn trans_def<'a>(bcx: &'a Block<'a>,
|
|||
// an external global, and return a pointer to that.
|
||||
let const_ty = expr_ty(bcx, ref_expr);
|
||||
|
||||
fn get_val<'a>(bcx: &'a Block<'a>, did: ast::DefId, const_ty: ty::t)
|
||||
-> ValueRef {
|
||||
fn get_val<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, did: ast::DefId, const_ty: ty::t)
|
||||
-> ValueRef {
|
||||
// For external constants, we don't inline.
|
||||
if did.krate == ast::LOCAL_CRATE {
|
||||
// Case 1 or 2. (The inlining in case 2 produces a new
|
||||
|
@ -880,9 +880,9 @@ fn get_val<'a>(bcx: &'a Block<'a>, did: ast::DefId, const_ty: ty::t)
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_rvalue_stmt_unadjusted<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_rvalue_stmt_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let mut bcx = bcx;
|
||||
let _icx = push_ctxt("trans_rvalue_stmt");
|
||||
|
||||
|
@ -961,10 +961,10 @@ fn trans_rvalue_stmt_unadjusted<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_rvalue_dps_unadjusted<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_rvalue_dps_unadjusted");
|
||||
let mut bcx = bcx;
|
||||
let tcx = bcx.tcx();
|
||||
|
@ -1091,12 +1091,11 @@ fn trans_rvalue_dps_unadjusted<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_def_dps_unadjusted<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def,
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_def_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def,
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_def_dps_unadjusted");
|
||||
|
||||
let lldest = match dest {
|
||||
|
@ -1140,9 +1139,10 @@ fn trans_def_dps_unadjusted<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_def_fn_unadjusted<'a>(bcx: &'a Block<'a>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def) -> DatumBlock<'a, Expr> {
|
||||
fn trans_def_fn_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
ref_expr: &ast::Expr,
|
||||
def: def::Def)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_def_datum_unadjusted");
|
||||
|
||||
let llfn = match def {
|
||||
|
@ -1167,9 +1167,9 @@ fn trans_def_fn_unadjusted<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, Datum::new(llfn, fn_ty, RvalueExpr(Rvalue::new(ByValue))))
|
||||
}
|
||||
|
||||
pub fn trans_local_var<'a>(bcx: &'a Block<'a>,
|
||||
def: def::Def)
|
||||
-> Datum<Lvalue> {
|
||||
pub fn trans_local_var<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
def: def::Def)
|
||||
-> Datum<Lvalue> {
|
||||
/*!
|
||||
* Translates a reference to a local variable or argument.
|
||||
* This always results in an lvalue datum.
|
||||
|
@ -1203,10 +1203,10 @@ pub fn trans_local_var<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
};
|
||||
|
||||
fn take_local<'a>(bcx: &'a Block<'a>,
|
||||
table: &NodeMap<Datum<Lvalue>>,
|
||||
nid: ast::NodeId)
|
||||
-> Datum<Lvalue> {
|
||||
fn take_local<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
table: &NodeMap<Datum<Lvalue>>,
|
||||
nid: ast::NodeId)
|
||||
-> Datum<Lvalue> {
|
||||
let datum = match table.find(&nid) {
|
||||
Some(&v) => v,
|
||||
None => {
|
||||
|
@ -1275,12 +1275,12 @@ pub fn with_field_tys<R>(tcx: &ty::ctxt,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_struct<'a>(bcx: &'a Block<'a>,
|
||||
fields: &[ast::Field],
|
||||
base: Option<Gc<ast::Expr>>,
|
||||
expr_span: codemap::Span,
|
||||
id: ast::NodeId,
|
||||
dest: Dest) -> &'a Block<'a> {
|
||||
fn trans_struct<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
fields: &[ast::Field],
|
||||
base: Option<Gc<ast::Expr>>,
|
||||
expr_span: codemap::Span,
|
||||
id: ast::NodeId,
|
||||
dest: Dest) -> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_rec");
|
||||
|
||||
let ty = node_id_type(bcx, id);
|
||||
|
@ -1350,12 +1350,12 @@ pub struct StructBaseInfo {
|
|||
* - `optbase` contains information on the base struct (if any) from
|
||||
* which remaining fields are copied; see comments on `StructBaseInfo`.
|
||||
*/
|
||||
pub fn trans_adt<'a>(mut bcx: &'a Block<'a>,
|
||||
ty: ty::t,
|
||||
discr: ty::Disr,
|
||||
fields: &[(uint, Gc<ast::Expr>)],
|
||||
optbase: Option<StructBaseInfo>,
|
||||
dest: Dest) -> &'a Block<'a> {
|
||||
pub fn trans_adt<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
ty: ty::t,
|
||||
discr: ty::Disr,
|
||||
fields: &[(uint, Gc<ast::Expr>)],
|
||||
optbase: Option<StructBaseInfo>,
|
||||
dest: Dest) -> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_adt");
|
||||
let fcx = bcx.fcx;
|
||||
let repr = adt::represent_type(bcx.ccx(), ty);
|
||||
|
@ -1419,10 +1419,10 @@ pub fn trans_adt<'a>(mut bcx: &'a Block<'a>,
|
|||
}
|
||||
|
||||
|
||||
fn trans_immediate_lit<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
lit: ast::Lit)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_immediate_lit<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
lit: ast::Lit)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
// must not be a string constant, that is a RvalueDpsExpr
|
||||
let _icx = push_ctxt("trans_immediate_lit");
|
||||
let ty = expr_ty(bcx, expr);
|
||||
|
@ -1430,11 +1430,11 @@ fn trans_immediate_lit<'a>(bcx: &'a Block<'a>,
|
|||
immediate_rvalue_bcx(bcx, v, ty).to_expr_datumblock()
|
||||
}
|
||||
|
||||
fn trans_unary<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::UnOp,
|
||||
sub_expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_unary<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::UnOp,
|
||||
sub_expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let ccx = bcx.ccx();
|
||||
let mut bcx = bcx;
|
||||
let _icx = push_ctxt("trans_unary_datum");
|
||||
|
@ -1481,11 +1481,11 @@ fn trans_unary<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_uniq_expr<'a>(bcx: &'a Block<'a>,
|
||||
box_ty: ty::t,
|
||||
contents: &ast::Expr,
|
||||
contents_ty: ty::t)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_uniq_expr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
box_ty: ty::t,
|
||||
contents: &ast::Expr,
|
||||
contents_ty: ty::t)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_uniq_expr");
|
||||
let fcx = bcx.fcx;
|
||||
assert!(ty::type_is_sized(bcx.tcx(), contents_ty));
|
||||
|
@ -1510,11 +1510,11 @@ fn trans_uniq_expr<'a>(bcx: &'a Block<'a>,
|
|||
immediate_rvalue_bcx(bcx, val, box_ty).to_expr_datumblock()
|
||||
}
|
||||
|
||||
fn trans_managed_expr<'a>(bcx: &'a Block<'a>,
|
||||
box_ty: ty::t,
|
||||
contents: &ast::Expr,
|
||||
contents_ty: ty::t)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_managed_expr<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
box_ty: ty::t,
|
||||
contents: &ast::Expr,
|
||||
contents_ty: ty::t)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_managed_expr");
|
||||
let fcx = bcx.fcx;
|
||||
let ty = type_of::type_of(bcx.ccx(), contents_ty);
|
||||
|
@ -1530,10 +1530,10 @@ fn trans_managed_expr<'a>(bcx: &'a Block<'a>,
|
|||
immediate_rvalue_bcx(bcx, bx, box_ty).to_expr_datumblock()
|
||||
}
|
||||
|
||||
fn trans_addr_of<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
subexpr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_addr_of<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
subexpr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_addr_of");
|
||||
let mut bcx = bcx;
|
||||
let sub_datum = unpack_datum!(bcx, trans_to_lvalue(bcx, subexpr, "addr_of"));
|
||||
|
@ -1563,16 +1563,15 @@ fn trans_addr_of<'a>(bcx: &'a Block<'a>,
|
|||
|
||||
// Important to get types for both lhs and rhs, because one might be _|_
|
||||
// and the other not.
|
||||
fn trans_eager_binop<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
binop_expr: &ast::Expr,
|
||||
binop_ty: ty::t,
|
||||
op: ast::BinOp,
|
||||
lhs_t: ty::t,
|
||||
lhs: ValueRef,
|
||||
rhs_t: ty::t,
|
||||
rhs: ValueRef)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_eager_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
binop_expr: &ast::Expr,
|
||||
binop_ty: ty::t,
|
||||
op: ast::BinOp,
|
||||
lhs_t: ty::t,
|
||||
lhs: ValueRef,
|
||||
rhs_t: ty::t,
|
||||
rhs: ValueRef)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_eager_binop");
|
||||
|
||||
let tcx = bcx.tcx();
|
||||
|
@ -1663,13 +1662,12 @@ enum lazy_binop_ty {
|
|||
lazy_or,
|
||||
}
|
||||
|
||||
fn trans_lazy_binop<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
binop_expr: &ast::Expr,
|
||||
op: lazy_binop_ty,
|
||||
a: &ast::Expr,
|
||||
b: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_lazy_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
binop_expr: &ast::Expr,
|
||||
op: lazy_binop_ty,
|
||||
a: &ast::Expr,
|
||||
b: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_lazy_binop");
|
||||
let binop_ty = expr_ty(bcx, binop_expr);
|
||||
let fcx = bcx.fcx;
|
||||
|
@ -1703,12 +1701,12 @@ fn trans_lazy_binop<'a>(
|
|||
return immediate_rvalue_bcx(join, phi, binop_ty).to_expr_datumblock();
|
||||
}
|
||||
|
||||
fn trans_binary<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::BinOp,
|
||||
lhs: &ast::Expr,
|
||||
rhs: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_binary<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::BinOp,
|
||||
lhs: &ast::Expr,
|
||||
rhs: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_binary");
|
||||
let ccx = bcx.ccx();
|
||||
|
||||
|
@ -1745,14 +1743,13 @@ fn trans_binary<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_overloaded_op<'a, 'b>(
|
||||
bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
method_call: MethodCall,
|
||||
lhs: Datum<Expr>,
|
||||
rhs: Option<(Datum<Expr>, ast::NodeId)>,
|
||||
dest: Option<Dest>)
|
||||
-> Result<'a> {
|
||||
fn trans_overloaded_op<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
method_call: MethodCall,
|
||||
lhs: Datum<Expr>,
|
||||
rhs: Option<(Datum<Expr>, ast::NodeId)>,
|
||||
dest: Option<Dest>)
|
||||
-> Result<'blk, 'tcx> {
|
||||
let method_ty = bcx.tcx().method_map.borrow().get(&method_call).ty;
|
||||
callee::trans_call_inner(bcx,
|
||||
Some(expr_info(expr)),
|
||||
|
@ -1767,13 +1764,12 @@ fn trans_overloaded_op<'a, 'b>(
|
|||
dest)
|
||||
}
|
||||
|
||||
fn trans_overloaded_call<'a>(
|
||||
mut bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
callee: Gc<ast::Expr>,
|
||||
args: &[Gc<ast::Expr>],
|
||||
dest: Option<Dest>)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_overloaded_call<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
callee: Gc<ast::Expr>,
|
||||
args: &[Gc<ast::Expr>],
|
||||
dest: Option<Dest>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let method_call = MethodCall::expr(expr.id);
|
||||
let method_type = bcx.tcx()
|
||||
.method_map
|
||||
|
@ -1800,7 +1796,7 @@ fn trans_overloaded_call<'a>(
|
|||
bcx
|
||||
}
|
||||
|
||||
fn int_cast(bcx: &Block,
|
||||
fn int_cast(bcx: Block,
|
||||
lldsttype: Type,
|
||||
llsrctype: Type,
|
||||
llsrc: ValueRef,
|
||||
|
@ -1822,7 +1818,7 @@ fn int_cast(bcx: &Block,
|
|||
}
|
||||
}
|
||||
|
||||
fn float_cast(bcx: &Block,
|
||||
fn float_cast(bcx: Block,
|
||||
lldsttype: Type,
|
||||
llsrctype: Type,
|
||||
llsrc: ValueRef)
|
||||
|
@ -1879,10 +1875,10 @@ fn cast_is_noop(t_in: ty::t, t_out: ty::t) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
fn trans_imm_cast<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
id: ast::NodeId)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn trans_imm_cast<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
id: ast::NodeId)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let _icx = push_ctxt("trans_cast");
|
||||
let mut bcx = bcx;
|
||||
let ccx = bcx.ccx();
|
||||
|
@ -1971,13 +1967,12 @@ fn trans_imm_cast<'a>(bcx: &'a Block<'a>,
|
|||
return immediate_rvalue_bcx(bcx, newval, t_out).to_expr_datumblock();
|
||||
}
|
||||
|
||||
fn trans_assign_op<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::BinOp,
|
||||
dst: &ast::Expr,
|
||||
src: Gc<ast::Expr>)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_assign_op<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
op: ast::BinOp,
|
||||
dst: &ast::Expr,
|
||||
src: Gc<ast::Expr>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_assign_op");
|
||||
let mut bcx = bcx;
|
||||
|
||||
|
@ -2004,10 +1999,10 @@ fn trans_assign_op<'a>(
|
|||
return result_datum.store_to(bcx, dst_datum.val);
|
||||
}
|
||||
|
||||
fn auto_ref<'a>(bcx: &'a Block<'a>,
|
||||
datum: Datum<Expr>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn auto_ref<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
datum: Datum<Expr>,
|
||||
expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
|
||||
// Ensure cleanup of `datum` if not already scheduled and obtain
|
||||
|
@ -2028,11 +2023,11 @@ fn auto_ref<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock::new(bcx, Datum::new(llref, ptr_ty, RvalueExpr(Rvalue::new(ByValue))))
|
||||
}
|
||||
|
||||
fn deref_multiple<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
times: uint)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn deref_multiple<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
times: uint)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let mut bcx = bcx;
|
||||
let mut datum = datum;
|
||||
for i in range(0, times) {
|
||||
|
@ -2042,11 +2037,11 @@ fn deref_multiple<'a>(bcx: &'a Block<'a>,
|
|||
DatumBlock { bcx: bcx, datum: datum }
|
||||
}
|
||||
|
||||
fn deref_once<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
method_call: MethodCall)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn deref_once<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
method_call: MethodCall)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
let ccx = bcx.ccx();
|
||||
|
||||
debug!("deref_once(expr={}, datum={}, method_call={})",
|
||||
|
@ -2146,11 +2141,11 @@ fn deref_once<'a>(bcx: &'a Block<'a>,
|
|||
|
||||
return r;
|
||||
|
||||
fn deref_owned_pointer<'a>(bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
content_ty: ty::t)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
fn deref_owned_pointer<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
datum: Datum<Expr>,
|
||||
content_ty: ty::t)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* We microoptimize derefs of owned pointers a bit here.
|
||||
* Basically, the idea is to make the deref of an rvalue
|
||||
|
|
|
@ -247,14 +247,13 @@ pub fn register_foreign_item_fn(ccx: &CrateContext, abi: Abi, fty: ty::t,
|
|||
llfn
|
||||
}
|
||||
|
||||
pub fn trans_native_call<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
callee_ty: ty::t,
|
||||
llfn: ValueRef,
|
||||
llretptr: ValueRef,
|
||||
llargs_rust: &[ValueRef],
|
||||
passed_arg_tys: Vec<ty::t> )
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_native_call<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
callee_ty: ty::t,
|
||||
llfn: ValueRef,
|
||||
llretptr: ValueRef,
|
||||
llargs_rust: &[ValueRef],
|
||||
passed_arg_tys: Vec<ty::t> )
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Prepares a call to a native function. This requires adapting
|
||||
* from the Rust argument passing rules to the native rules.
|
||||
|
|
|
@ -45,7 +45,8 @@
|
|||
use syntax::ast;
|
||||
use syntax::parse::token;
|
||||
|
||||
pub fn trans_free<'a>(cx: &'a Block<'a>, v: ValueRef) -> &'a Block<'a> {
|
||||
pub fn trans_free<'blk, 'tcx>(cx: Block<'blk, 'tcx>, v: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_free");
|
||||
callee::trans_lang_call(cx,
|
||||
langcall(cx, None, "", FreeFnLangItem),
|
||||
|
@ -53,8 +54,9 @@ pub fn trans_free<'a>(cx: &'a Block<'a>, v: ValueRef) -> &'a Block<'a> {
|
|||
Some(expr::Ignore)).bcx
|
||||
}
|
||||
|
||||
pub fn trans_exchange_free_dyn<'a>(cx: &'a Block<'a>, v: ValueRef, size: ValueRef,
|
||||
align: ValueRef) -> &'a Block<'a> {
|
||||
pub fn trans_exchange_free_dyn<'blk, 'tcx>(cx: Block<'blk, 'tcx>, v: ValueRef,
|
||||
size: ValueRef, align: ValueRef)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("trans_exchange_free");
|
||||
let ccx = cx.ccx();
|
||||
callee::trans_lang_call(cx,
|
||||
|
@ -63,14 +65,14 @@ pub fn trans_exchange_free_dyn<'a>(cx: &'a Block<'a>, v: ValueRef, size: ValueRe
|
|||
Some(expr::Ignore)).bcx
|
||||
}
|
||||
|
||||
pub fn trans_exchange_free<'a>(cx: &'a Block<'a>, v: ValueRef, size: u64,
|
||||
align: u64) -> &'a Block<'a> {
|
||||
pub fn trans_exchange_free<'blk, 'tcx>(cx: Block<'blk, 'tcx>, v: ValueRef,
|
||||
size: u64, align: u64) -> Block<'blk, 'tcx> {
|
||||
trans_exchange_free_dyn(cx, v, C_uint(cx.ccx(), size as uint),
|
||||
C_uint(cx.ccx(), align as uint))
|
||||
}
|
||||
|
||||
pub fn trans_exchange_free_ty<'a>(bcx: &'a Block<'a>, ptr: ValueRef,
|
||||
content_ty: ty::t) -> &'a Block<'a> {
|
||||
pub fn trans_exchange_free_ty<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ptr: ValueRef,
|
||||
content_ty: ty::t) -> Block<'blk, 'tcx> {
|
||||
assert!(ty::type_is_sized(bcx.ccx().tcx(), content_ty));
|
||||
let sizing_type = sizing_type_of(bcx.ccx(), content_ty);
|
||||
let content_size = llsize_of_alloc(bcx.ccx(), sizing_type);
|
||||
|
@ -84,8 +86,8 @@ pub fn trans_exchange_free_ty<'a>(bcx: &'a Block<'a>, ptr: ValueRef,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn take_ty<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
pub fn take_ty<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, v: ValueRef, t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
// NB: v is an *alias* of type t here, not a direct value.
|
||||
let _icx = push_ctxt("take_ty");
|
||||
match ty::get(t).sty {
|
||||
|
@ -123,8 +125,8 @@ pub fn get_drop_glue_type(ccx: &CrateContext, t: ty::t) -> ty::t {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn drop_ty<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
pub fn drop_ty<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, v: ValueRef, t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
// NB: v is an *alias* of type t here, not a direct value.
|
||||
debug!("drop_ty(t={})", t.repr(bcx.tcx()));
|
||||
let _icx = push_ctxt("drop_ty");
|
||||
|
@ -142,8 +144,8 @@ pub fn drop_ty<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
|||
bcx
|
||||
}
|
||||
|
||||
pub fn drop_ty_immediate<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
pub fn drop_ty_immediate<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, v: ValueRef, t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("drop_ty_immediate");
|
||||
let vp = alloca(bcx, type_of(bcx.ccx(), t), "");
|
||||
Store(bcx, v, vp);
|
||||
|
@ -232,7 +234,7 @@ pub fn lazily_emit_visit_glue(ccx: &CrateContext, ti: &tydesc_info) -> ValueRef
|
|||
}
|
||||
|
||||
// See [Note-arg-mode]
|
||||
pub fn call_visit_glue(bcx: &Block, v: ValueRef, tydesc: ValueRef) {
|
||||
pub fn call_visit_glue(bcx: Block, v: ValueRef, tydesc: ValueRef) {
|
||||
let _icx = push_ctxt("call_visit_glue");
|
||||
|
||||
// Select the glue function to call from the tydesc
|
||||
|
@ -242,8 +244,8 @@ pub fn call_visit_glue(bcx: &Block, v: ValueRef, tydesc: ValueRef) {
|
|||
Call(bcx, llfn, [llrawptr], None);
|
||||
}
|
||||
|
||||
fn make_visit_glue<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
||||
-> &'a Block<'a> {
|
||||
fn make_visit_glue<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, v: ValueRef, t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("make_visit_glue");
|
||||
let mut bcx = bcx;
|
||||
let (visitor_trait, object_ty) = match ty::visitor_object_ty(bcx.tcx(),
|
||||
|
@ -259,13 +261,13 @@ fn make_visit_glue<'a>(bcx: &'a Block<'a>, v: ValueRef, t: ty::t)
|
|||
bcx
|
||||
}
|
||||
|
||||
fn trans_struct_drop_flag<'a>(mut bcx: &'a Block<'a>,
|
||||
t: ty::t,
|
||||
v0: ValueRef,
|
||||
dtor_did: ast::DefId,
|
||||
class_did: ast::DefId,
|
||||
substs: &subst::Substs)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_struct_drop_flag<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
|
||||
t: ty::t,
|
||||
v0: ValueRef,
|
||||
dtor_did: ast::DefId,
|
||||
class_did: ast::DefId,
|
||||
substs: &subst::Substs)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let repr = adt::represent_type(bcx.ccx(), t);
|
||||
let struct_data = if ty::type_is_sized(bcx.tcx(), t) {
|
||||
v0
|
||||
|
@ -279,13 +281,13 @@ fn trans_struct_drop_flag<'a>(mut bcx: &'a Block<'a>,
|
|||
})
|
||||
}
|
||||
|
||||
fn trans_struct_drop<'a>(bcx: &'a Block<'a>,
|
||||
t: ty::t,
|
||||
v0: ValueRef,
|
||||
dtor_did: ast::DefId,
|
||||
class_did: ast::DefId,
|
||||
substs: &subst::Substs)
|
||||
-> &'a Block<'a> {
|
||||
fn trans_struct_drop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
t: ty::t,
|
||||
v0: ValueRef,
|
||||
dtor_did: ast::DefId,
|
||||
class_did: ast::DefId,
|
||||
substs: &subst::Substs)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let repr = adt::represent_type(bcx.ccx(), t);
|
||||
|
||||
// Find and call the actual destructor
|
||||
|
@ -371,7 +373,7 @@ fn trans_struct_drop<'a>(bcx: &'a Block<'a>,
|
|||
})
|
||||
}
|
||||
|
||||
fn size_and_align_of_dst<'a>(bcx: &'a Block<'a>, t :ty::t, info: ValueRef) -> (ValueRef, ValueRef) {
|
||||
fn size_and_align_of_dst(bcx: Block, t :ty::t, info: ValueRef) -> (ValueRef, ValueRef) {
|
||||
debug!("calculate size of DST: {}; with lost info: {}",
|
||||
bcx.ty_to_string(t), bcx.val_to_string(info));
|
||||
if ty::type_is_sized(bcx.tcx(), t) {
|
||||
|
@ -426,7 +428,8 @@ fn size_and_align_of_dst<'a>(bcx: &'a Block<'a>, t :ty::t, info: ValueRef) -> (V
|
|||
}
|
||||
}
|
||||
|
||||
fn make_drop_glue<'a>(bcx: &'a Block<'a>, v0: ValueRef, t: ty::t) -> &'a Block<'a> {
|
||||
fn make_drop_glue<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, v0: ValueRef, t: ty::t)
|
||||
-> Block<'blk, 'tcx> {
|
||||
// NB: v0 is an *alias* of type t here, not a direct value.
|
||||
let _icx = push_ctxt("make_drop_glue");
|
||||
match ty::get(t).sty {
|
||||
|
@ -549,9 +552,9 @@ fn make_drop_glue<'a>(bcx: &'a Block<'a>, v0: ValueRef, t: ty::t) -> &'a Block<'
|
|||
}
|
||||
}
|
||||
|
||||
fn decr_refcnt_maybe_free<'a>(bcx: &'a Block<'a>,
|
||||
box_ptr_ptr: ValueRef,
|
||||
t: ty::t) -> &'a Block<'a> {
|
||||
fn decr_refcnt_maybe_free<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
box_ptr_ptr: ValueRef,
|
||||
t: ty::t) -> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("decr_refcnt_maybe_free");
|
||||
let fcx = bcx.fcx;
|
||||
let ccx = bcx.ccx();
|
||||
|
@ -578,8 +581,8 @@ fn decr_refcnt_maybe_free<'a>(bcx: &'a Block<'a>,
|
|||
next_bcx
|
||||
}
|
||||
|
||||
fn incr_refcnt_of_boxed<'a>(bcx: &'a Block<'a>,
|
||||
box_ptr_ptr: ValueRef) -> &'a Block<'a> {
|
||||
fn incr_refcnt_of_boxed<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
box_ptr_ptr: ValueRef) -> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("incr_refcnt_of_boxed");
|
||||
let ccx = bcx.ccx();
|
||||
let box_ptr = Load(bcx, box_ptr_ptr);
|
||||
|
@ -645,8 +648,8 @@ fn declare_generic_glue(ccx: &CrateContext, t: ty::t, llfnty: Type,
|
|||
fn make_generic_glue(ccx: &CrateContext,
|
||||
t: ty::t,
|
||||
llfn: ValueRef,
|
||||
helper: <'a> |&'a Block<'a>, ValueRef, ty::t|
|
||||
-> &'a Block<'a>,
|
||||
helper: <'blk, 'tcx> |Block<'blk, 'tcx>, ValueRef, ty::t|
|
||||
-> Block<'blk, 'tcx>,
|
||||
name: &str)
|
||||
-> ValueRef {
|
||||
let _icx = push_ctxt("make_generic_glue");
|
||||
|
|
|
@ -134,10 +134,11 @@ pub fn check_intrinsics(ccx: &CrateContext) {
|
|||
ccx.sess().abort_if_errors();
|
||||
}
|
||||
|
||||
pub fn trans_intrinsic_call<'a>(mut bcx: &'a Block<'a>, node: ast::NodeId,
|
||||
callee_ty: ty::t, cleanup_scope: cleanup::CustomScopeIndex,
|
||||
args: callee::CallArgs, dest: expr::Dest,
|
||||
substs: subst::Substs, call_info: NodeInfo) -> Result<'a> {
|
||||
pub fn trans_intrinsic_call<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>, node: ast::NodeId,
|
||||
callee_ty: ty::t, cleanup_scope: cleanup::CustomScopeIndex,
|
||||
args: callee::CallArgs, dest: expr::Dest,
|
||||
substs: subst::Substs, call_info: NodeInfo)
|
||||
-> Result<'blk, 'tcx> {
|
||||
|
||||
let fcx = bcx.fcx;
|
||||
let ccx = fcx.ccx;
|
||||
|
@ -548,7 +549,7 @@ pub fn trans_intrinsic_call<'a>(mut bcx: &'a Block<'a>, node: ast::NodeId,
|
|||
Result::new(bcx, llresult)
|
||||
}
|
||||
|
||||
fn copy_intrinsic(bcx: &Block, allow_overlap: bool, volatile: bool,
|
||||
fn copy_intrinsic(bcx: Block, allow_overlap: bool, volatile: bool,
|
||||
tp_ty: ty::t, dst: ValueRef, src: ValueRef, count: ValueRef) -> ValueRef {
|
||||
let ccx = bcx.ccx();
|
||||
let lltp_ty = type_of::type_of(ccx, tp_ty);
|
||||
|
@ -577,7 +578,7 @@ fn copy_intrinsic(bcx: &Block, allow_overlap: bool, volatile: bool,
|
|||
C_bool(ccx, volatile)], None)
|
||||
}
|
||||
|
||||
fn memset_intrinsic(bcx: &Block, volatile: bool, tp_ty: ty::t,
|
||||
fn memset_intrinsic(bcx: Block, volatile: bool, tp_ty: ty::t,
|
||||
dst: ValueRef, val: ValueRef, count: ValueRef) -> ValueRef {
|
||||
let ccx = bcx.ccx();
|
||||
let lltp_ty = type_of::type_of(ccx, tp_ty);
|
||||
|
@ -596,13 +597,13 @@ fn memset_intrinsic(bcx: &Block, volatile: bool, tp_ty: ty::t,
|
|||
C_bool(ccx, volatile)], None)
|
||||
}
|
||||
|
||||
fn count_zeros_intrinsic(bcx: &Block, name: &'static str, val: ValueRef) -> ValueRef {
|
||||
fn count_zeros_intrinsic(bcx: Block, name: &'static str, val: ValueRef) -> ValueRef {
|
||||
let y = C_bool(bcx.ccx(), false);
|
||||
let llfn = bcx.ccx().get_intrinsic(&name);
|
||||
Call(bcx, llfn, [val, y], None)
|
||||
}
|
||||
|
||||
fn with_overflow_intrinsic(bcx: &Block, name: &'static str, t: ty::t,
|
||||
fn with_overflow_intrinsic(bcx: Block, name: &'static str, t: ty::t,
|
||||
a: ValueRef, b: ValueRef) -> ValueRef {
|
||||
let llfn = bcx.ccx().get_intrinsic(&name);
|
||||
|
||||
|
|
|
@ -102,12 +102,11 @@ pub fn trans_impl(ccx: &CrateContext,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_method_callee<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
method_call: MethodCall,
|
||||
self_expr: Option<&ast::Expr>,
|
||||
arg_cleanup_scope: cleanup::ScopeId)
|
||||
-> Callee<'a> {
|
||||
pub fn trans_method_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
method_call: MethodCall,
|
||||
self_expr: Option<&ast::Expr>,
|
||||
arg_cleanup_scope: cleanup::ScopeId)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("meth::trans_method_callee");
|
||||
|
||||
let (origin, method_ty) = match bcx.tcx().method_map
|
||||
|
@ -166,7 +165,7 @@ pub fn trans_method_callee<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_static_method_callee(bcx: &Block,
|
||||
pub fn trans_static_method_callee(bcx: Block,
|
||||
method_id: ast::DefId,
|
||||
trait_id: ast::DefId,
|
||||
expr_id: ast::NodeId)
|
||||
|
@ -262,13 +261,12 @@ fn method_with_name(ccx: &CrateContext, impl_id: ast::DefId, name: ast::Name)
|
|||
meth_did.def_id()
|
||||
}
|
||||
|
||||
fn trans_monomorphized_callee<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
method_call: MethodCall,
|
||||
trait_id: ast::DefId,
|
||||
n_method: uint,
|
||||
vtbl: typeck::vtable_origin)
|
||||
-> Callee<'a> {
|
||||
fn trans_monomorphized_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
method_call: MethodCall,
|
||||
trait_id: ast::DefId,
|
||||
n_method: uint,
|
||||
vtbl: typeck::vtable_origin)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("meth::trans_monomorphized_callee");
|
||||
match vtbl {
|
||||
typeck::vtable_static(impl_did, rcvr_substs, rcvr_origins) => {
|
||||
|
@ -324,7 +322,7 @@ fn trans_monomorphized_callee<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
fn combine_impl_and_methods_tps(bcx: &Block,
|
||||
fn combine_impl_and_methods_tps(bcx: Block,
|
||||
node: ExprOrMethodCall,
|
||||
rcvr_substs: subst::Substs,
|
||||
rcvr_origins: typeck::vtable_res)
|
||||
|
@ -378,12 +376,12 @@ fn combine_impl_and_methods_tps(bcx: &Block,
|
|||
(ty_substs, vtables)
|
||||
}
|
||||
|
||||
fn trans_trait_callee<'a>(bcx: &'a Block<'a>,
|
||||
method_ty: ty::t,
|
||||
n_method: uint,
|
||||
self_expr: &ast::Expr,
|
||||
arg_cleanup_scope: cleanup::ScopeId)
|
||||
-> Callee<'a> {
|
||||
fn trans_trait_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
method_ty: ty::t,
|
||||
n_method: uint,
|
||||
self_expr: &ast::Expr,
|
||||
arg_cleanup_scope: cleanup::ScopeId)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
/*!
|
||||
* Create a method callee where the method is coming from a trait
|
||||
* object (e.g., Box<Trait> type). In this case, we must pull the fn
|
||||
|
@ -422,11 +420,11 @@ fn trans_trait_callee<'a>(bcx: &'a Block<'a>,
|
|||
trans_trait_callee_from_llval(bcx, method_ty, n_method, llval)
|
||||
}
|
||||
|
||||
pub fn trans_trait_callee_from_llval<'a>(bcx: &'a Block<'a>,
|
||||
callee_ty: ty::t,
|
||||
n_method: uint,
|
||||
llpair: ValueRef)
|
||||
-> Callee<'a> {
|
||||
pub fn trans_trait_callee_from_llval<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
callee_ty: ty::t,
|
||||
n_method: uint,
|
||||
llpair: ValueRef)
|
||||
-> Callee<'blk, 'tcx> {
|
||||
/*!
|
||||
* Same as `trans_trait_callee()` above, except that it is given
|
||||
* a by-ref pointer to the object pair.
|
||||
|
@ -476,7 +474,7 @@ pub fn trans_trait_callee_from_llval<'a>(bcx: &'a Block<'a>,
|
|||
/// Creates the self type and (fake) callee substitutions for an unboxed
|
||||
/// closure with the given def ID. The static region and type parameters are
|
||||
/// lies, but we're in trans so it doesn't matter.
|
||||
fn get_callee_substitutions_for_unboxed_closure(bcx: &Block,
|
||||
fn get_callee_substitutions_for_unboxed_closure(bcx: Block,
|
||||
def_id: ast::DefId)
|
||||
-> subst::Substs {
|
||||
let self_ty = ty::mk_unboxed_closure(bcx.tcx(), def_id, ty::ReStatic);
|
||||
|
@ -495,7 +493,7 @@ fn get_callee_substitutions_for_unboxed_closure(bcx: &Block,
|
|||
|
||||
/// Creates a returns a dynamic vtable for the given type and vtable origin.
|
||||
/// This is used only for objects.
|
||||
fn get_vtable(bcx: &Block,
|
||||
fn get_vtable(bcx: Block,
|
||||
self_ty: ty::t,
|
||||
origins: typeck::vtable_param_res)
|
||||
-> ValueRef
|
||||
|
@ -630,7 +628,7 @@ pub fn make_vtable<I: Iterator<ValueRef>>(ccx: &CrateContext,
|
|||
}
|
||||
}
|
||||
|
||||
fn emit_vtable_methods(bcx: &Block,
|
||||
fn emit_vtable_methods(bcx: Block,
|
||||
impl_id: ast::DefId,
|
||||
substs: subst::Substs,
|
||||
vtables: typeck::vtable_res)
|
||||
|
@ -686,9 +684,9 @@ fn emit_vtable_methods(bcx: &Block,
|
|||
}).collect()
|
||||
}
|
||||
|
||||
pub fn vtable_ptr<'a>(bcx: &'a Block<'a>,
|
||||
id: ast::NodeId,
|
||||
self_ty: ty::t) -> ValueRef {
|
||||
pub fn vtable_ptr(bcx: Block,
|
||||
id: ast::NodeId,
|
||||
self_ty: ty::t) -> ValueRef {
|
||||
let ccx = bcx.ccx();
|
||||
let origins = {
|
||||
let vtable_map = ccx.tcx().vtable_map.borrow();
|
||||
|
@ -706,11 +704,11 @@ pub fn vtable_ptr<'a>(bcx: &'a Block<'a>,
|
|||
get_vtable(bcx, self_ty, origins)
|
||||
}
|
||||
|
||||
pub fn trans_trait_cast<'a>(bcx: &'a Block<'a>,
|
||||
datum: Datum<Expr>,
|
||||
id: ast::NodeId,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_trait_cast<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
datum: Datum<Expr>,
|
||||
id: ast::NodeId,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Generates the code to convert from a pointer (`Box<T>`, `&T`, etc)
|
||||
* into an object (`Box<Trait>`, `&Trait`, etc). This means creating a
|
||||
|
|
|
@ -33,15 +33,15 @@
|
|||
use syntax::parse::token::{InternedString, special_idents};
|
||||
use syntax::parse::token;
|
||||
|
||||
pub struct Reflector<'a, 'b> {
|
||||
pub struct Reflector<'a, 'blk, 'tcx: 'blk> {
|
||||
visitor_val: ValueRef,
|
||||
visitor_items: &'a [ty::ImplOrTraitItem],
|
||||
final_bcx: &'b Block<'b>,
|
||||
final_bcx: Block<'blk, 'tcx>,
|
||||
tydesc_ty: Type,
|
||||
bcx: &'b Block<'b>
|
||||
bcx: Block<'blk, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a, 'b> Reflector<'a, 'b> {
|
||||
impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
|
||||
pub fn c_uint(&mut self, u: uint) -> ValueRef {
|
||||
C_uint(self.bcx.ccx(), u)
|
||||
}
|
||||
|
@ -419,12 +419,11 @@ pub fn visit_sig(&mut self, retval: uint, sig: &ty::FnSig) {
|
|||
}
|
||||
|
||||
// Emit a sequence of calls to visit_ty::visit_foo
|
||||
pub fn emit_calls_to_trait_visit_ty<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
t: ty::t,
|
||||
visitor_val: ValueRef,
|
||||
visitor_trait_id: DefId)
|
||||
-> &'a Block<'a> {
|
||||
pub fn emit_calls_to_trait_visit_ty<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
t: ty::t,
|
||||
visitor_val: ValueRef,
|
||||
visitor_trait_id: DefId)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let fcx = bcx.fcx;
|
||||
let final = fcx.new_temp_block("final");
|
||||
let tydesc_ty = ty::get_tydesc_ty(bcx.tcx()).unwrap();
|
||||
|
|
|
@ -35,29 +35,28 @@
|
|||
use syntax::ast;
|
||||
use syntax::parse::token::InternedString;
|
||||
|
||||
fn get_len(bcx: &Block, vptr: ValueRef) -> ValueRef {
|
||||
fn get_len(bcx: Block, vptr: ValueRef) -> ValueRef {
|
||||
let _icx = push_ctxt("tvec::get_lenl");
|
||||
Load(bcx, expr::get_len(bcx, vptr))
|
||||
}
|
||||
|
||||
fn get_dataptr(bcx: &Block, vptr: ValueRef) -> ValueRef {
|
||||
fn get_dataptr(bcx: Block, vptr: ValueRef) -> ValueRef {
|
||||
let _icx = push_ctxt("tvec::get_dataptr");
|
||||
Load(bcx, expr::get_dataptr(bcx, vptr))
|
||||
}
|
||||
|
||||
pub fn pointer_add_byte(bcx: &Block, ptr: ValueRef, bytes: ValueRef) -> ValueRef {
|
||||
pub fn pointer_add_byte(bcx: Block, ptr: ValueRef, bytes: ValueRef) -> ValueRef {
|
||||
let _icx = push_ctxt("tvec::pointer_add_byte");
|
||||
let old_ty = val_ty(ptr);
|
||||
let bptr = PointerCast(bcx, ptr, Type::i8p(bcx.ccx()));
|
||||
return PointerCast(bcx, InBoundsGEP(bcx, bptr, [bytes]), old_ty);
|
||||
}
|
||||
|
||||
pub fn make_drop_glue_unboxed<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
vptr: ValueRef,
|
||||
unit_ty: ty::t,
|
||||
should_deallocate: bool)
|
||||
-> &'a Block<'a> {
|
||||
pub fn make_drop_glue_unboxed<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
vptr: ValueRef,
|
||||
unit_ty: ty::t,
|
||||
should_deallocate: bool)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let not_null = IsNotNull(bcx, vptr);
|
||||
with_cond(bcx, not_null, |bcx| {
|
||||
let ccx = bcx.ccx();
|
||||
|
@ -105,11 +104,10 @@ pub fn to_string(&self, ccx: &CrateContext) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_fixed_vstore<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
expr: &ast::Expr,
|
||||
dest: expr::Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_fixed_vstore<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
expr: &ast::Expr,
|
||||
dest: expr::Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
//!
|
||||
//
|
||||
// [...] allocates a fixed-size array and moves it around "by value".
|
||||
|
@ -133,10 +131,10 @@ pub fn trans_fixed_vstore<'a>(
|
|||
};
|
||||
}
|
||||
|
||||
pub fn trans_slice_vec<'a>(bcx: &'a Block<'a>,
|
||||
slice_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
pub fn trans_slice_vec<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
slice_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* &[...] allocates memory on the stack and writes the values into it,
|
||||
* returning the vector (the caller must make the reference). "..." is
|
||||
|
@ -207,12 +205,11 @@ pub fn trans_slice_vec<'a>(bcx: &'a Block<'a>,
|
|||
immediate_rvalue_bcx(bcx, llfixed, vec_ty).to_expr_datumblock()
|
||||
}
|
||||
|
||||
pub fn trans_lit_str<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
lit_expr: &ast::Expr,
|
||||
str_lit: InternedString,
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn trans_lit_str<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
lit_expr: &ast::Expr,
|
||||
str_lit: InternedString,
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
/*!
|
||||
* Literal strings translate to slices into static memory. This is
|
||||
* different from trans_slice_vstore() above because it doesn't need to copy
|
||||
|
@ -239,10 +236,10 @@ pub fn trans_lit_str<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trans_uniq_vec<'a>(bcx: &'a Block<'a>,
|
||||
uniq_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr)
|
||||
-> DatumBlock<'a, Expr> {
|
||||
pub fn trans_uniq_vec<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
uniq_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr)
|
||||
-> DatumBlock<'blk, 'tcx, Expr> {
|
||||
/*!
|
||||
* Box<[...]> and "...".to_string() allocate boxes in the exchange heap and write
|
||||
* the array elements into them.
|
||||
|
@ -327,13 +324,12 @@ pub fn trans_uniq_vec<'a>(bcx: &'a Block<'a>,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn write_content<'a>(
|
||||
bcx: &'a Block<'a>,
|
||||
vt: &VecTypes,
|
||||
vstore_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> &'a Block<'a> {
|
||||
pub fn write_content<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
vt: &VecTypes,
|
||||
vstore_expr: &ast::Expr,
|
||||
content_expr: &ast::Expr,
|
||||
dest: Dest)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("tvec::write_content");
|
||||
let fcx = bcx.fcx;
|
||||
let mut bcx = bcx;
|
||||
|
@ -429,12 +425,12 @@ pub fn write_content<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn vec_types_from_expr(bcx: &Block, vec_expr: &ast::Expr) -> VecTypes {
|
||||
pub fn vec_types_from_expr(bcx: Block, vec_expr: &ast::Expr) -> VecTypes {
|
||||
let vec_ty = node_id_type(bcx, vec_expr.id);
|
||||
vec_types(bcx, ty::sequence_element_type(bcx.tcx(), vec_ty))
|
||||
}
|
||||
|
||||
pub fn vec_types(bcx: &Block, unit_ty: ty::t) -> VecTypes {
|
||||
pub fn vec_types(bcx: Block, unit_ty: ty::t) -> VecTypes {
|
||||
let ccx = bcx.ccx();
|
||||
let llunit_ty = type_of::type_of(ccx, unit_ty);
|
||||
let llunit_size = nonzero_llsize_of(ccx, llunit_ty);
|
||||
|
@ -448,7 +444,7 @@ pub fn vec_types(bcx: &Block, unit_ty: ty::t) -> VecTypes {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn elements_required(bcx: &Block, content_expr: &ast::Expr) -> uint {
|
||||
pub fn elements_required(bcx: Block, content_expr: &ast::Expr) -> uint {
|
||||
//! Figure out the number of elements we need to store this content
|
||||
|
||||
match content_expr.node {
|
||||
|
@ -470,7 +466,7 @@ pub fn elements_required(bcx: &Block, content_expr: &ast::Expr) -> uint {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_fixed_base_and_len(bcx: &Block,
|
||||
pub fn get_fixed_base_and_len(bcx: Block,
|
||||
llval: ValueRef,
|
||||
vec_length: uint)
|
||||
-> (ValueRef, ValueRef) {
|
||||
|
@ -486,7 +482,7 @@ pub fn get_fixed_base_and_len(bcx: &Block,
|
|||
(base, len)
|
||||
}
|
||||
|
||||
fn get_slice_base_and_len(bcx: &Block,
|
||||
fn get_slice_base_and_len(bcx: Block,
|
||||
llval: ValueRef)
|
||||
-> (ValueRef, ValueRef) {
|
||||
let base = Load(bcx, GEPi(bcx, llval, [0u, abi::slice_elt_base]));
|
||||
|
@ -494,7 +490,7 @@ fn get_slice_base_and_len(bcx: &Block,
|
|||
(base, len)
|
||||
}
|
||||
|
||||
pub fn get_base_and_len(bcx: &Block,
|
||||
pub fn get_base_and_len(bcx: Block,
|
||||
llval: ValueRef,
|
||||
vec_ty: ty::t)
|
||||
-> (ValueRef, ValueRef) {
|
||||
|
@ -528,17 +524,15 @@ pub fn get_base_and_len(bcx: &Block,
|
|||
}
|
||||
}
|
||||
|
||||
pub type iter_vec_block<'r,'b> =
|
||||
|&'b Block<'b>, ValueRef, ty::t|: 'r -> &'b Block<'b>;
|
||||
pub type iter_vec_block<'a, 'blk, 'tcx> =
|
||||
|Block<'blk, 'tcx>, ValueRef, ty::t|: 'a -> Block<'blk, 'tcx>;
|
||||
|
||||
pub fn iter_vec_loop<'r,
|
||||
'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
data_ptr: ValueRef,
|
||||
vt: &VecTypes,
|
||||
count: ValueRef,
|
||||
f: iter_vec_block<'r,'b>)
|
||||
-> &'b Block<'b> {
|
||||
pub fn iter_vec_loop<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
data_ptr: ValueRef,
|
||||
vt: &VecTypes,
|
||||
count: ValueRef,
|
||||
f: iter_vec_block<'a, 'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("tvec::iter_vec_loop");
|
||||
let fcx = bcx.fcx;
|
||||
|
||||
|
@ -589,14 +583,12 @@ pub fn iter_vec_loop<'r,
|
|||
next_bcx
|
||||
}
|
||||
|
||||
pub fn iter_vec_raw<'r,
|
||||
'b>(
|
||||
bcx: &'b Block<'b>,
|
||||
data_ptr: ValueRef,
|
||||
unit_ty: ty::t,
|
||||
len: ValueRef,
|
||||
f: iter_vec_block<'r,'b>)
|
||||
-> &'b Block<'b> {
|
||||
pub fn iter_vec_raw<'a, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
data_ptr: ValueRef,
|
||||
unit_ty: ty::t,
|
||||
len: ValueRef,
|
||||
f: iter_vec_block<'a, 'blk, 'tcx>)
|
||||
-> Block<'blk, 'tcx> {
|
||||
let _icx = push_ctxt("tvec::iter_vec_raw");
|
||||
let fcx = bcx.fcx;
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ pub fn erase_from_parent(self) {
|
|||
/// This only performs a search for a trivially dominating store. The store
|
||||
/// must be the only user of this value, and there must not be any conditional
|
||||
/// branches between the store and the given block.
|
||||
pub fn get_dominating_store(self, bcx: &Block) -> Option<Value> {
|
||||
pub fn get_dominating_store(self, bcx: Block) -> Option<Value> {
|
||||
match self.get_single_user().and_then(|user| user.as_store_inst()) {
|
||||
Some(store) => {
|
||||
store.get_parent().and_then(|store_bb| {
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
use std::ops;
|
||||
use std::rc::Rc;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use arena::TypedArena;
|
||||
use syntax::abi;
|
||||
use syntax::ast::{CrateNum, DefId, FnStyle, Ident, ItemTrait, LOCAL_CRATE};
|
||||
use syntax::ast::{MutImmutable, MutMutable, Name, NamedField, NodeId};
|
||||
|
@ -418,10 +419,13 @@ pub struct TransmuteRestriction {
|
|||
/// The data structure to keep track of all the information that typechecker
|
||||
/// generates so that so that it can be reused and doesn't have to be redone
|
||||
/// later on.
|
||||
pub struct ctxt {
|
||||
pub struct ctxt<'tcx> {
|
||||
/// The arena that types are allocated from.
|
||||
type_arena: &'tcx TypedArena<t_box_>,
|
||||
|
||||
/// Specifically use a speedy hash algorithm for this hash map, it's used
|
||||
/// quite often.
|
||||
pub interner: RefCell<FnvHashMap<intern_key, Box<t_box_>>>,
|
||||
interner: RefCell<FnvHashMap<intern_key, &'tcx t_box_>>,
|
||||
pub next_id: Cell<uint>,
|
||||
pub sess: Session,
|
||||
pub def_map: resolve::DefMap,
|
||||
|
@ -1373,21 +1377,22 @@ pub fn trait_did(&self, cx: &ctxt) -> ast::DefId {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn mk_ctxt(s: Session,
|
||||
dm: resolve::DefMap,
|
||||
named_region_map: resolve_lifetime::NamedRegionMap,
|
||||
map: ast_map::Map,
|
||||
freevars: freevars::freevar_map,
|
||||
capture_modes: freevars::CaptureModeMap,
|
||||
region_maps: middle::region::RegionMaps,
|
||||
lang_items: middle::lang_items::LanguageItems,
|
||||
stability: stability::Index)
|
||||
-> ctxt {
|
||||
pub fn mk_ctxt<'tcx>(s: Session,
|
||||
type_arena: &'tcx TypedArena<t_box_>,
|
||||
dm: resolve::DefMap,
|
||||
named_region_map: resolve_lifetime::NamedRegionMap,
|
||||
map: ast_map::Map,
|
||||
freevars: freevars::freevar_map,
|
||||
capture_modes: freevars::CaptureModeMap,
|
||||
region_maps: middle::region::RegionMaps,
|
||||
lang_items: middle::lang_items::LanguageItems,
|
||||
stability: stability::Index) -> ctxt<'tcx> {
|
||||
ctxt {
|
||||
type_arena: type_arena,
|
||||
interner: RefCell::new(FnvHashMap::new()),
|
||||
named_region_map: named_region_map,
|
||||
item_variance_map: RefCell::new(DefIdMap::new()),
|
||||
variance_computed: Cell::new(false),
|
||||
interner: RefCell::new(FnvHashMap::new()),
|
||||
next_id: Cell::new(primitives::LAST_PRIMITIVE_ID),
|
||||
sess: s,
|
||||
def_map: dm,
|
||||
|
@ -1554,11 +1559,11 @@ fn flags_for_bounds(bounds: &ExistentialBounds) -> uint {
|
|||
}
|
||||
}
|
||||
|
||||
let t = box t_box_ {
|
||||
let t = cx.type_arena.alloc(t_box_ {
|
||||
sty: st,
|
||||
id: cx.next_id.get(),
|
||||
flags: flags,
|
||||
};
|
||||
});
|
||||
|
||||
let sty_ptr = &t.sty as *const sty;
|
||||
|
||||
|
@ -3463,10 +3468,10 @@ pub fn map_region(&self, f: |Region| -> Region) -> AutoRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn method_call_type_param_defs<T>(typer: &T,
|
||||
origin: typeck::MethodOrigin)
|
||||
-> VecPerParamSpace<TypeParameterDef>
|
||||
where T: mc::Typer {
|
||||
pub fn method_call_type_param_defs<'tcx, T>(typer: &T,
|
||||
origin: typeck::MethodOrigin)
|
||||
-> VecPerParamSpace<TypeParameterDef>
|
||||
where T: mc::Typer<'tcx> {
|
||||
match origin {
|
||||
typeck::MethodStatic(did) => {
|
||||
ty::lookup_item_type(typer.tcx(), did).generics.types.clone()
|
||||
|
@ -4655,10 +4660,10 @@ pub fn normalize_ty(cx: &ctxt, t: t) -> t {
|
|||
let u = TypeNormalizer(cx).fold_ty(t);
|
||||
return u;
|
||||
|
||||
struct TypeNormalizer<'a>(&'a ctxt);
|
||||
struct TypeNormalizer<'a, 'tcx: 'a>(&'a ctxt<'tcx>);
|
||||
|
||||
impl<'a> TypeFolder for TypeNormalizer<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ctxt { let TypeNormalizer(c) = *self; c }
|
||||
impl<'a, 'tcx> TypeFolder<'tcx> for TypeNormalizer<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ctxt<'tcx> { let TypeNormalizer(c) = *self; c }
|
||||
|
||||
fn fold_ty(&mut self, t: ty::t) -> ty::t {
|
||||
match self.tcx().normalized_cache.borrow().find_copy(&t) {
|
||||
|
@ -4697,70 +4702,55 @@ fn fold_sig(&mut self,
|
|||
}
|
||||
}
|
||||
|
||||
pub trait ExprTyProvider {
|
||||
fn expr_ty(&self, ex: &ast::Expr) -> t;
|
||||
fn ty_ctxt<'a>(&'a self) -> &'a ctxt;
|
||||
}
|
||||
|
||||
impl ExprTyProvider for ctxt {
|
||||
fn expr_ty(&self, ex: &ast::Expr) -> t {
|
||||
expr_ty(self, ex)
|
||||
}
|
||||
|
||||
fn ty_ctxt<'a>(&'a self) -> &'a ctxt {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the repeat count for a repeating vector expression.
|
||||
pub fn eval_repeat_count<T: ExprTyProvider>(tcx: &T, count_expr: &ast::Expr) -> uint {
|
||||
pub fn eval_repeat_count(tcx: &ctxt, count_expr: &ast::Expr) -> uint {
|
||||
match const_eval::eval_const_expr_partial(tcx, count_expr) {
|
||||
Ok(ref const_val) => match *const_val {
|
||||
const_eval::const_int(count) => if count < 0 {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found negative integer");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found negative integer");
|
||||
0
|
||||
} else {
|
||||
return count as uint
|
||||
count as uint
|
||||
},
|
||||
const_eval::const_uint(count) => return count as uint,
|
||||
const_eval::const_uint(count) => count as uint,
|
||||
const_eval::const_float(count) => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found float");
|
||||
return count as uint;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found float");
|
||||
count as uint
|
||||
}
|
||||
const_eval::const_str(_) => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found string");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found string");
|
||||
0
|
||||
}
|
||||
const_eval::const_bool(_) => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found boolean");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found boolean");
|
||||
0
|
||||
}
|
||||
const_eval::const_binary(_) => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found binary array");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found binary array");
|
||||
0
|
||||
}
|
||||
const_eval::const_nil => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found ()");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected positive integer for \
|
||||
repeat count, found ()");
|
||||
0
|
||||
}
|
||||
},
|
||||
Err(..) => {
|
||||
tcx.ty_ctxt().sess.span_err(count_expr.span,
|
||||
"expected constant integer for repeat count, \
|
||||
found variable");
|
||||
return 0;
|
||||
tcx.sess.span_err(count_expr.span,
|
||||
"expected constant integer for repeat count, \
|
||||
found variable");
|
||||
0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5397,8 +5387,8 @@ pub fn to_user_str(&self) -> &'static str {
|
|||
}
|
||||
}
|
||||
|
||||
impl mc::Typer for ty::ctxt {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'tcx> mc::Typer<'tcx> for ty::ctxt<'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
/// The TypeFoldable trait is implemented for every type that can be folded.
|
||||
/// Basically, every type that has a corresponding method in TypeFolder.
|
||||
pub trait TypeFoldable {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> Self;
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self;
|
||||
}
|
||||
|
||||
/// The TypeFolder trait defines the actual *folding*. There is a
|
||||
|
@ -33,8 +33,8 @@ pub trait TypeFoldable {
|
|||
/// default implementation that does an "identity" fold. Within each
|
||||
/// identity fold, it should invoke `foo.fold_with(self)` to fold each
|
||||
/// sub-item.
|
||||
pub trait TypeFolder {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt;
|
||||
pub trait TypeFolder<'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx>;
|
||||
|
||||
fn fold_ty(&mut self, t: ty::t) -> ty::t {
|
||||
super_fold_ty(self, t)
|
||||
|
@ -111,97 +111,97 @@ fn fold_item_substs(&mut self, i: ty::ItemSubsts) -> ty::ItemSubsts {
|
|||
// needed.
|
||||
|
||||
impl<T:TypeFoldable> TypeFoldable for Option<T> {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> Option<T> {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Option<T> {
|
||||
self.as_ref().map(|t| t.fold_with(folder))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T:TypeFoldable> TypeFoldable for Rc<T> {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> Rc<T> {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Rc<T> {
|
||||
Rc::new((**self).fold_with(folder))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T:TypeFoldable> TypeFoldable for Vec<T> {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> Vec<T> {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Vec<T> {
|
||||
self.iter().map(|t| t.fold_with(folder)).collect()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T:TypeFoldable> TypeFoldable for OwnedSlice<T> {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> OwnedSlice<T> {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> OwnedSlice<T> {
|
||||
self.iter().map(|t| t.fold_with(folder)).collect()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T:TypeFoldable> TypeFoldable for VecPerParamSpace<T> {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> VecPerParamSpace<T> {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> VecPerParamSpace<T> {
|
||||
self.map(|t| t.fold_with(folder))
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::TraitStore {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::TraitStore {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::TraitStore {
|
||||
folder.fold_trait_store(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::t {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::t {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::t {
|
||||
folder.fold_ty(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::BareFnTy {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::BareFnTy {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::BareFnTy {
|
||||
folder.fold_bare_fn_ty(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::ClosureTy {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ClosureTy {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::ClosureTy {
|
||||
folder.fold_closure_ty(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::mt {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::mt {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::mt {
|
||||
folder.fold_mt(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::FnSig {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::FnSig {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::FnSig {
|
||||
folder.fold_sig(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::sty {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::sty {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::sty {
|
||||
folder.fold_sty(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::TraitRef {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::TraitRef {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::TraitRef {
|
||||
folder.fold_trait_ref(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::Region {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::Region {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::Region {
|
||||
folder.fold_region(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for subst::Substs {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> subst::Substs {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> subst::Substs {
|
||||
folder.fold_substs(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::ItemSubsts {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ItemSubsts {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::ItemSubsts {
|
||||
ty::ItemSubsts {
|
||||
substs: self.substs.fold_with(folder),
|
||||
}
|
||||
|
@ -209,13 +209,13 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ItemSubsts {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::AutoRef {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::AutoRef {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::AutoRef {
|
||||
folder.fold_autoref(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for typeck::vtable_origin {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> typeck::vtable_origin {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> typeck::vtable_origin {
|
||||
match *self {
|
||||
typeck::vtable_static(def_id, ref substs, ref origins) => {
|
||||
let r_substs = substs.fold_with(folder);
|
||||
|
@ -236,19 +236,19 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> typeck::vtable_origin {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::BuiltinBounds {
|
||||
fn fold_with<F:TypeFolder>(&self, _folder: &mut F) -> ty::BuiltinBounds {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, _folder: &mut F) -> ty::BuiltinBounds {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::ExistentialBounds {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ExistentialBounds {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::ExistentialBounds {
|
||||
folder.fold_existential_bounds(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TypeFoldable for ty::ParamBounds {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ParamBounds {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::ParamBounds {
|
||||
ty::ParamBounds {
|
||||
opt_region_bound: self.opt_region_bound.fold_with(folder),
|
||||
builtin_bounds: self.builtin_bounds.fold_with(folder),
|
||||
|
@ -258,7 +258,7 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::ParamBounds {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::TypeParameterDef {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::TypeParameterDef {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::TypeParameterDef {
|
||||
ty::TypeParameterDef {
|
||||
ident: self.ident,
|
||||
def_id: self.def_id,
|
||||
|
@ -271,7 +271,7 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::TypeParameterDef {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::RegionParameterDef {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::RegionParameterDef {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::RegionParameterDef {
|
||||
ty::RegionParameterDef {
|
||||
name: self.name,
|
||||
def_id: self.def_id,
|
||||
|
@ -283,7 +283,7 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::RegionParameterDef {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::Generics {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::Generics {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::Generics {
|
||||
ty::Generics {
|
||||
types: self.types.fold_with(folder),
|
||||
regions: self.regions.fold_with(folder),
|
||||
|
@ -292,7 +292,7 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::Generics {
|
|||
}
|
||||
|
||||
impl TypeFoldable for ty::UnsizeKind {
|
||||
fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::UnsizeKind {
|
||||
fn fold_with<'tcx, F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::UnsizeKind {
|
||||
match *self {
|
||||
ty::UnsizeLength(len) => ty::UnsizeLength(len),
|
||||
ty::UnsizeStruct(box ref k, n) => ty::UnsizeStruct(box k.fold_with(folder), n),
|
||||
|
@ -307,17 +307,16 @@ fn fold_with<F:TypeFolder>(&self, folder: &mut F) -> ty::UnsizeKind {
|
|||
// "super" routines: these are the default implementations for TypeFolder.
|
||||
//
|
||||
// They should invoke `foo.fold_with()` to do recursive folding.
|
||||
|
||||
pub fn super_fold_ty<T:TypeFolder>(this: &mut T,
|
||||
t: ty::t)
|
||||
-> ty::t {
|
||||
pub fn super_fold_ty<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
t: ty::t)
|
||||
-> ty::t {
|
||||
let sty = ty::get(t).sty.fold_with(this);
|
||||
ty::mk_t(this.tcx(), sty)
|
||||
}
|
||||
|
||||
pub fn super_fold_substs<T:TypeFolder>(this: &mut T,
|
||||
substs: &subst::Substs)
|
||||
-> subst::Substs {
|
||||
pub fn super_fold_substs<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
substs: &subst::Substs)
|
||||
-> subst::Substs {
|
||||
let regions = match substs.regions {
|
||||
subst::ErasedRegions => {
|
||||
subst::ErasedRegions
|
||||
|
@ -331,27 +330,27 @@ pub fn super_fold_substs<T:TypeFolder>(this: &mut T,
|
|||
types: substs.types.fold_with(this) }
|
||||
}
|
||||
|
||||
pub fn super_fold_sig<T:TypeFolder>(this: &mut T,
|
||||
sig: &ty::FnSig)
|
||||
-> ty::FnSig {
|
||||
pub fn super_fold_sig<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
sig: &ty::FnSig)
|
||||
-> ty::FnSig {
|
||||
ty::FnSig { binder_id: sig.binder_id,
|
||||
inputs: sig.inputs.fold_with(this),
|
||||
output: sig.output.fold_with(this),
|
||||
variadic: sig.variadic }
|
||||
}
|
||||
|
||||
pub fn super_fold_bare_fn_ty<T:TypeFolder>(this: &mut T,
|
||||
fty: &ty::BareFnTy)
|
||||
-> ty::BareFnTy
|
||||
pub fn super_fold_bare_fn_ty<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
fty: &ty::BareFnTy)
|
||||
-> ty::BareFnTy
|
||||
{
|
||||
ty::BareFnTy { sig: fty.sig.fold_with(this),
|
||||
abi: fty.abi,
|
||||
fn_style: fty.fn_style }
|
||||
}
|
||||
|
||||
pub fn super_fold_closure_ty<T:TypeFolder>(this: &mut T,
|
||||
fty: &ty::ClosureTy)
|
||||
-> ty::ClosureTy
|
||||
pub fn super_fold_closure_ty<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
fty: &ty::ClosureTy)
|
||||
-> ty::ClosureTy
|
||||
{
|
||||
ty::ClosureTy {
|
||||
store: fty.store.fold_with(this),
|
||||
|
@ -362,24 +361,23 @@ pub fn super_fold_closure_ty<T:TypeFolder>(this: &mut T,
|
|||
abi: fty.abi,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_trait_ref<T:TypeFolder>(this: &mut T,
|
||||
t: &ty::TraitRef)
|
||||
-> ty::TraitRef {
|
||||
pub fn super_fold_trait_ref<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
t: &ty::TraitRef)
|
||||
-> ty::TraitRef {
|
||||
ty::TraitRef {
|
||||
def_id: t.def_id,
|
||||
substs: t.substs.fold_with(this),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_mt<T:TypeFolder>(this: &mut T,
|
||||
mt: &ty::mt) -> ty::mt {
|
||||
pub fn super_fold_mt<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
mt: &ty::mt) -> ty::mt {
|
||||
ty::mt {ty: mt.ty.fold_with(this),
|
||||
mutbl: mt.mutbl}
|
||||
}
|
||||
|
||||
pub fn super_fold_sty<T:TypeFolder>(this: &mut T,
|
||||
sty: &ty::sty) -> ty::sty {
|
||||
pub fn super_fold_sty<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
sty: &ty::sty) -> ty::sty {
|
||||
match *sty {
|
||||
ty::ty_box(typ) => {
|
||||
ty::ty_box(typ.fold_with(this))
|
||||
|
@ -437,9 +435,9 @@ pub fn super_fold_sty<T:TypeFolder>(this: &mut T,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_trait_store<T:TypeFolder>(this: &mut T,
|
||||
trait_store: ty::TraitStore)
|
||||
-> ty::TraitStore {
|
||||
pub fn super_fold_trait_store<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
trait_store: ty::TraitStore)
|
||||
-> ty::TraitStore {
|
||||
match trait_store {
|
||||
ty::UniqTraitStore => ty::UniqTraitStore,
|
||||
ty::RegionTraitStore(r, m) => {
|
||||
|
@ -448,18 +446,18 @@ pub fn super_fold_trait_store<T:TypeFolder>(this: &mut T,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_existential_bounds<T:TypeFolder>(this: &mut T,
|
||||
bounds: ty::ExistentialBounds)
|
||||
-> ty::ExistentialBounds {
|
||||
pub fn super_fold_existential_bounds<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
bounds: ty::ExistentialBounds)
|
||||
-> ty::ExistentialBounds {
|
||||
ty::ExistentialBounds {
|
||||
region_bound: bounds.region_bound.fold_with(this),
|
||||
builtin_bounds: bounds.builtin_bounds,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_autoref<T:TypeFolder>(this: &mut T,
|
||||
autoref: &ty::AutoRef)
|
||||
-> ty::AutoRef
|
||||
pub fn super_fold_autoref<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
autoref: &ty::AutoRef)
|
||||
-> ty::AutoRef
|
||||
{
|
||||
match *autoref {
|
||||
ty::AutoPtr(r, m, None) => ty::AutoPtr(this.fold_region(r), m, None),
|
||||
|
@ -475,9 +473,9 @@ pub fn super_fold_autoref<T:TypeFolder>(this: &mut T,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn super_fold_item_substs<T:TypeFolder>(this: &mut T,
|
||||
substs: ty::ItemSubsts)
|
||||
-> ty::ItemSubsts
|
||||
pub fn super_fold_item_substs<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
|
||||
substs: ty::ItemSubsts)
|
||||
-> ty::ItemSubsts
|
||||
{
|
||||
ty::ItemSubsts {
|
||||
substs: substs.substs.fold_with(this),
|
||||
|
@ -487,13 +485,13 @@ pub fn super_fold_item_substs<T:TypeFolder>(this: &mut T,
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// Some sample folders
|
||||
|
||||
pub struct BottomUpFolder<'a> {
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub struct BottomUpFolder<'a, 'tcx: 'a> {
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
pub fldop: |ty::t|: 'a -> ty::t,
|
||||
}
|
||||
|
||||
impl<'a> TypeFolder for BottomUpFolder<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.tcx }
|
||||
impl<'a, 'tcx> TypeFolder<'tcx> for BottomUpFolder<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.tcx }
|
||||
|
||||
fn fold_ty(&mut self, ty: ty::t) -> ty::t {
|
||||
let t1 = super_fold_ty(self, ty);
|
||||
|
@ -516,18 +514,18 @@ fn fold_ty(&mut self, ty: ty::t) -> ty::t {
|
|||
/// (The distinction between "free" and "bound" is represented by
|
||||
/// keeping track of each `FnSig` in the lexical context of the
|
||||
/// current position of the fold.)
|
||||
pub struct RegionFolder<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct RegionFolder<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
fld_t: |ty::t|: 'a -> ty::t,
|
||||
fld_r: |ty::Region|: 'a -> ty::Region,
|
||||
within_binder_ids: Vec<ast::NodeId>,
|
||||
}
|
||||
|
||||
impl<'a> RegionFolder<'a> {
|
||||
pub fn general(tcx: &'a ty::ctxt,
|
||||
impl<'a, 'tcx> RegionFolder<'a, 'tcx> {
|
||||
pub fn general(tcx: &'a ty::ctxt<'tcx>,
|
||||
fld_r: |ty::Region|: 'a -> ty::Region,
|
||||
fld_t: |ty::t|: 'a -> ty::t)
|
||||
-> RegionFolder<'a> {
|
||||
-> RegionFolder<'a, 'tcx> {
|
||||
RegionFolder {
|
||||
tcx: tcx,
|
||||
fld_t: fld_t,
|
||||
|
@ -536,8 +534,8 @@ pub fn general(tcx: &'a ty::ctxt,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn regions(tcx: &'a ty::ctxt, fld_r: |ty::Region|: 'a -> ty::Region)
|
||||
-> RegionFolder<'a> {
|
||||
pub fn regions(tcx: &'a ty::ctxt<'tcx>, fld_r: |ty::Region|: 'a -> ty::Region)
|
||||
-> RegionFolder<'a, 'tcx> {
|
||||
fn noop(t: ty::t) -> ty::t { t }
|
||||
|
||||
RegionFolder {
|
||||
|
@ -559,8 +557,8 @@ fn opt_binder_id_of_function(t: ty::t) -> Option<ast::NodeId> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> TypeFolder for RegionFolder<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.tcx }
|
||||
impl<'a, 'tcx> TypeFolder<'tcx> for RegionFolder<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.tcx }
|
||||
|
||||
fn fold_ty(&mut self, ty: ty::t) -> ty::t {
|
||||
debug!("RegionFolder.fold_ty({})", ty.repr(self.tcx()));
|
||||
|
|
|
@ -71,8 +71,8 @@
|
|||
use syntax::{ast, ast_util};
|
||||
use syntax::codemap::Span;
|
||||
|
||||
pub trait AstConv {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt;
|
||||
pub trait AstConv<'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx>;
|
||||
fn get_item_ty(&self, id: ast::DefId) -> ty::Polytype;
|
||||
fn get_trait_def(&self, id: ast::DefId) -> Rc<ty::TraitDef>;
|
||||
|
||||
|
@ -118,7 +118,7 @@ pub fn ast_region_to_region(tcx: &ty::ctxt, lifetime: &ast::Lifetime)
|
|||
r
|
||||
}
|
||||
|
||||
pub fn opt_ast_region_to_region<AC:AstConv,RS:RegionScope>(
|
||||
pub fn opt_ast_region_to_region<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
default_span: Span,
|
||||
|
@ -152,7 +152,7 @@ pub fn opt_ast_region_to_region<AC:AstConv,RS:RegionScope>(
|
|||
r
|
||||
}
|
||||
|
||||
fn ast_path_substs<AC:AstConv,RS:RegionScope>(
|
||||
fn ast_path_substs<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
decl_generics: &ty::Generics,
|
||||
|
@ -271,7 +271,7 @@ fn ast_path_substs<AC:AstConv,RS:RegionScope>(
|
|||
substs
|
||||
}
|
||||
|
||||
pub fn ast_path_to_trait_ref<AC:AstConv,RS:RegionScope>(
|
||||
pub fn ast_path_to_trait_ref<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
trait_def_id: ast::DefId,
|
||||
|
@ -284,7 +284,7 @@ pub fn ast_path_to_trait_ref<AC:AstConv,RS:RegionScope>(
|
|||
})
|
||||
}
|
||||
|
||||
pub fn ast_path_to_ty<AC:AstConv,RS:RegionScope>(
|
||||
pub fn ast_path_to_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
did: ast::DefId,
|
||||
|
@ -307,7 +307,7 @@ pub fn ast_path_to_ty<AC:AstConv,RS:RegionScope>(
|
|||
/// and/or region variables are substituted.
|
||||
///
|
||||
/// This is used when checking the constructor in struct literals.
|
||||
pub fn ast_path_to_ty_relaxed<AC:AstConv,
|
||||
pub fn ast_path_to_ty_relaxed<'tcx, AC: AstConv<'tcx>,
|
||||
RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
|
@ -412,12 +412,11 @@ pub fn ast_ty_to_prim_ty(tcx: &ty::ctxt, ast_ty: &ast::Ty) -> Option<ty::t> {
|
|||
|
||||
/// Converts the given AST type to a built-in type. A "built-in type" is, at
|
||||
/// present, either a core numeric type, a string, or `Box`.
|
||||
pub fn ast_ty_to_builtin_ty<AC:AstConv,
|
||||
RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
ast_ty: &ast::Ty)
|
||||
-> Option<ty::t> {
|
||||
pub fn ast_ty_to_builtin_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
ast_ty: &ast::Ty)
|
||||
-> Option<ty::t> {
|
||||
match ast_ty_to_prim_ty(this.tcx(), ast_ty) {
|
||||
Some(typ) => return Some(typ),
|
||||
None => {}
|
||||
|
@ -531,7 +530,7 @@ fn default_region(&self) -> ty::Region {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn trait_ref_for_unboxed_function<AC:AstConv,
|
||||
pub fn trait_ref_for_unboxed_function<'tcx, AC: AstConv<'tcx>,
|
||||
RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
|
@ -576,14 +575,13 @@ pub fn trait_ref_for_unboxed_function<AC:AstConv,
|
|||
// Handle `~`, `Box`, and `&` being able to mean strs and vecs.
|
||||
// If a_seq_ty is a str or a vec, make it a str/vec.
|
||||
// Also handle first-class trait types.
|
||||
fn mk_pointer<AC:AstConv,
|
||||
RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
a_seq_ty: &ast::MutTy,
|
||||
ptr_ty: PointerTy,
|
||||
constr: |ty::t| -> ty::t)
|
||||
-> ty::t {
|
||||
fn mk_pointer<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
a_seq_ty: &ast::MutTy,
|
||||
ptr_ty: PointerTy,
|
||||
constr: |ty::t| -> ty::t)
|
||||
-> ty::t {
|
||||
let tcx = this.tcx();
|
||||
debug!("mk_pointer(ptr_ty={})", ptr_ty);
|
||||
|
||||
|
@ -695,8 +693,8 @@ fn mk_pointer<AC:AstConv,
|
|||
|
||||
// Parses the programmer's textual representation of a type into our
|
||||
// internal notion of a type.
|
||||
pub fn ast_ty_to_ty<AC:AstConv, RS:RegionScope>(
|
||||
this: &AC, rscope: &RS, ast_ty: &ast::Ty) -> ty::t {
|
||||
pub fn ast_ty_to_ty<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(
|
||||
this: &AC, rscope: &RS, ast_ty: &ast::Ty) -> ty::t {
|
||||
|
||||
let tcx = this.tcx();
|
||||
|
||||
|
@ -914,8 +912,10 @@ pub fn ast_ty_to_ty<AC:AstConv, RS:RegionScope>(
|
|||
return typ;
|
||||
}
|
||||
|
||||
pub fn ty_of_arg<AC: AstConv, RS: RegionScope>(this: &AC, rscope: &RS, a: &ast::Arg,
|
||||
expected_ty: Option<ty::t>) -> ty::t {
|
||||
pub fn ty_of_arg<'tcx, AC: AstConv<'tcx>, RS: RegionScope>(this: &AC, rscope: &RS,
|
||||
a: &ast::Arg,
|
||||
expected_ty: Option<ty::t>)
|
||||
-> ty::t {
|
||||
match a.ty.node {
|
||||
ast::TyInfer if expected_ty.is_some() => expected_ty.unwrap(),
|
||||
ast::TyInfer => this.ty_infer(a.ty.span),
|
||||
|
@ -928,7 +928,7 @@ struct SelfInfo<'a> {
|
|||
explicit_self: ast::ExplicitSelf,
|
||||
}
|
||||
|
||||
pub fn ty_of_method<AC:AstConv>(
|
||||
pub fn ty_of_method<'tcx, AC: AstConv<'tcx>>(
|
||||
this: &AC,
|
||||
id: ast::NodeId,
|
||||
fn_style: ast::FnStyle,
|
||||
|
@ -951,15 +951,15 @@ pub fn ty_of_method<AC:AstConv>(
|
|||
(bare_fn_ty, optional_explicit_self_category.unwrap())
|
||||
}
|
||||
|
||||
pub fn ty_of_bare_fn<AC:AstConv>(this: &AC, id: ast::NodeId,
|
||||
fn_style: ast::FnStyle, abi: abi::Abi,
|
||||
decl: &ast::FnDecl) -> ty::BareFnTy {
|
||||
pub fn ty_of_bare_fn<'tcx, AC: AstConv<'tcx>>(this: &AC, id: ast::NodeId,
|
||||
fn_style: ast::FnStyle, abi: abi::Abi,
|
||||
decl: &ast::FnDecl) -> ty::BareFnTy {
|
||||
let (bare_fn_ty, _) =
|
||||
ty_of_method_or_bare_fn(this, id, fn_style, abi, None, decl);
|
||||
bare_fn_ty
|
||||
}
|
||||
|
||||
fn ty_of_method_or_bare_fn<AC:AstConv>(
|
||||
fn ty_of_method_or_bare_fn<'tcx, AC: AstConv<'tcx>>(
|
||||
this: &AC,
|
||||
id: ast::NodeId,
|
||||
fn_style: ast::FnStyle,
|
||||
|
@ -1070,7 +1070,7 @@ fn ty_of_method_or_bare_fn<AC:AstConv>(
|
|||
}, explicit_self_category_result)
|
||||
}
|
||||
|
||||
fn determine_explicit_self_category<AC:AstConv,
|
||||
fn determine_explicit_self_category<'tcx, AC: AstConv<'tcx>,
|
||||
RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
|
@ -1145,7 +1145,7 @@ fn determine_explicit_self_category<AC:AstConv,
|
|||
}
|
||||
}
|
||||
|
||||
pub fn ty_of_closure<AC:AstConv>(
|
||||
pub fn ty_of_closure<'tcx, AC: AstConv<'tcx>>(
|
||||
this: &AC,
|
||||
id: ast::NodeId,
|
||||
fn_style: ast::FnStyle,
|
||||
|
@ -1196,7 +1196,7 @@ pub fn ty_of_closure<AC:AstConv>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn conv_existential_bounds<AC:AstConv, RS:RegionScope>(
|
||||
pub fn conv_existential_bounds<'tcx, AC: AstConv<'tcx>, RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
span: Span,
|
||||
|
@ -1330,7 +1330,7 @@ pub fn compute_opt_region_bound(tcx: &ty::ctxt,
|
|||
return Some(r);
|
||||
}
|
||||
|
||||
fn compute_region_bound<AC:AstConv, RS:RegionScope>(
|
||||
fn compute_region_bound<'tcx, AC: AstConv<'tcx>, RS:RegionScope>(
|
||||
this: &AC,
|
||||
rscope: &RS,
|
||||
span: Span,
|
||||
|
|
|
@ -107,8 +107,8 @@ pub fn check_match(fcx: &FnCtxt,
|
|||
fcx.write_ty(expr.id, result_ty);
|
||||
}
|
||||
|
||||
pub struct pat_ctxt<'a> {
|
||||
pub fcx: &'a FnCtxt<'a>,
|
||||
pub struct pat_ctxt<'a, 'tcx: 'a> {
|
||||
pub fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
pub map: PatIdMap,
|
||||
}
|
||||
|
||||
|
|
|
@ -123,8 +123,8 @@ pub enum StaticMethodsFlag {
|
|||
IgnoreStaticMethods,
|
||||
}
|
||||
|
||||
pub fn lookup<'a>(
|
||||
fcx: &'a FnCtxt<'a>,
|
||||
pub fn lookup<'a, 'tcx>(
|
||||
fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
|
||||
// In a call `a.b::<X, Y, ...>(...)`:
|
||||
expr: &ast::Expr, // The expression `a.b(...)`.
|
||||
|
@ -170,8 +170,8 @@ pub fn lookup<'a>(
|
|||
lcx.search(self_ty)
|
||||
}
|
||||
|
||||
pub fn lookup_in_trait<'a>(
|
||||
fcx: &'a FnCtxt<'a>,
|
||||
pub fn lookup_in_trait<'a, 'tcx>(
|
||||
fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
|
||||
// In a call `a.b::<X, Y, ...>(...)`:
|
||||
span: Span, // The expression `a.b(...)`'s span.
|
||||
|
@ -303,8 +303,8 @@ fn construct_transformed_self_ty_for_object(
|
|||
}
|
||||
}
|
||||
|
||||
struct LookupContext<'a> {
|
||||
fcx: &'a FnCtxt<'a>,
|
||||
struct LookupContext<'a, 'tcx: 'a> {
|
||||
fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
span: Span,
|
||||
|
||||
// The receiver to the method call. Only `None` in the case of
|
||||
|
@ -350,7 +350,7 @@ pub enum RcvrMatchCondition {
|
|||
RcvrMatchesIfSubtype(ty::t),
|
||||
}
|
||||
|
||||
impl<'a> LookupContext<'a> {
|
||||
impl<'a, 'tcx> LookupContext<'a, 'tcx> {
|
||||
fn search(&self, self_ty: ty::t) -> Option<MethodCallee> {
|
||||
let span = self.self_expr.map_or(self.span, |e| e.span);
|
||||
let self_expr_id = self.self_expr.map(|e| e.id);
|
||||
|
@ -1615,11 +1615,11 @@ fn report_trait_candidate(&self, idx: uint, did: DefId) {
|
|||
idx + 1u, ty::item_path_str(self.tcx(), did));
|
||||
}
|
||||
|
||||
fn infcx(&'a self) -> &'a infer::InferCtxt<'a> {
|
||||
fn infcx(&'a self) -> &'a infer::InferCtxt<'a, 'tcx> {
|
||||
&self.fcx.inh.infcx
|
||||
}
|
||||
|
||||
fn tcx(&self) -> &'a ty::ctxt {
|
||||
fn tcx(&self) -> &'a ty::ctxt<'tcx> {
|
||||
self.fcx.tcx()
|
||||
}
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@
|
|||
use middle::subst::{Subst, Substs, VecPerParamSpace, ParamSpace};
|
||||
use middle::ty::{FnSig, VariantInfo};
|
||||
use middle::ty::{Polytype};
|
||||
use middle::ty::{Disr, ExprTyProvider, ParamTy, ParameterEnvironment};
|
||||
use middle::ty::{Disr, ParamTy, ParameterEnvironment};
|
||||
use middle::ty;
|
||||
use middle::ty_fold::TypeFolder;
|
||||
use middle::typeck::astconv::AstConv;
|
||||
|
@ -159,8 +159,8 @@
|
|||
/// Here, the function `foo()` and the closure passed to
|
||||
/// `bar()` will each have their own `FnCtxt`, but they will
|
||||
/// share the inherited fields.
|
||||
pub struct Inherited<'a> {
|
||||
infcx: infer::InferCtxt<'a>,
|
||||
pub struct Inherited<'a, 'tcx: 'a> {
|
||||
infcx: infer::InferCtxt<'a, 'tcx>,
|
||||
locals: RefCell<NodeMap<ty::t>>,
|
||||
param_env: ty::ParameterEnvironment,
|
||||
|
||||
|
@ -267,7 +267,7 @@ enum IsBinopAssignment{
|
|||
}
|
||||
|
||||
#[deriving(Clone)]
|
||||
pub struct FnCtxt<'a> {
|
||||
pub struct FnCtxt<'a, 'tcx: 'a> {
|
||||
body_id: ast::NodeId,
|
||||
|
||||
// This flag is set to true if, during the writeback phase, we encounter
|
||||
|
@ -284,13 +284,13 @@ pub struct FnCtxt<'a> {
|
|||
|
||||
ps: RefCell<FnStyleState>,
|
||||
|
||||
inh: &'a Inherited<'a>,
|
||||
inh: &'a Inherited<'a, 'tcx>,
|
||||
|
||||
ccx: &'a CrateCtxt<'a>,
|
||||
ccx: &'a CrateCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a> mem_categorization::Typer for FnCtxt<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'a, 'tcx> mem_categorization::Typer<'tcx> for FnCtxt<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.ccx.tcx
|
||||
}
|
||||
fn node_ty(&self, id: ast::NodeId) -> McResult<ty::t> {
|
||||
|
@ -322,10 +322,10 @@ fn unboxed_closures<'a>(&'a self)
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Inherited<'a> {
|
||||
fn new(tcx: &'a ty::ctxt,
|
||||
impl<'a, 'tcx> Inherited<'a, 'tcx> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>,
|
||||
param_env: ty::ParameterEnvironment)
|
||||
-> Inherited<'a> {
|
||||
-> Inherited<'a, 'tcx> {
|
||||
Inherited {
|
||||
infcx: infer::new_infer_ctxt(tcx),
|
||||
locals: RefCell::new(NodeMap::new()),
|
||||
|
@ -344,12 +344,11 @@ fn new(tcx: &'a ty::ctxt,
|
|||
}
|
||||
|
||||
// Used by check_const and check_enum_variants
|
||||
pub fn blank_fn_ctxt<'a>(
|
||||
ccx: &'a CrateCtxt<'a>,
|
||||
inh: &'a Inherited<'a>,
|
||||
rty: ty::t,
|
||||
body_id: ast::NodeId)
|
||||
-> FnCtxt<'a> {
|
||||
pub fn blank_fn_ctxt<'a, 'tcx>(ccx: &'a CrateCtxt<'a, 'tcx>,
|
||||
inh: &'a Inherited<'a, 'tcx>,
|
||||
rty: ty::t,
|
||||
body_id: ast::NodeId)
|
||||
-> FnCtxt<'a, 'tcx> {
|
||||
FnCtxt {
|
||||
body_id: body_id,
|
||||
writeback_errors: Cell::new(false),
|
||||
|
@ -361,7 +360,8 @@ pub fn blank_fn_ctxt<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
fn static_inherited_fields<'a>(ccx: &'a CrateCtxt<'a>) -> Inherited<'a> {
|
||||
fn static_inherited_fields<'a, 'tcx>(ccx: &'a CrateCtxt<'a, 'tcx>)
|
||||
-> Inherited<'a, 'tcx> {
|
||||
// It's kind of a kludge to manufacture a fake function context
|
||||
// and statement context, but we might as well do write the code only once
|
||||
let param_env = ty::ParameterEnvironment {
|
||||
|
@ -372,37 +372,29 @@ fn static_inherited_fields<'a>(ccx: &'a CrateCtxt<'a>) -> Inherited<'a> {
|
|||
Inherited::new(ccx.tcx, param_env)
|
||||
}
|
||||
|
||||
impl<'a> ExprTyProvider for FnCtxt<'a> {
|
||||
fn expr_ty(&self, ex: &ast::Expr) -> ty::t {
|
||||
self.expr_ty(ex)
|
||||
}
|
||||
struct CheckItemTypesVisitor<'a, 'tcx: 'a> { ccx: &'a CrateCtxt<'a, 'tcx> }
|
||||
struct CheckTypeWellFormedVisitor<'a, 'tcx: 'a> { ccx: &'a CrateCtxt<'a, 'tcx> }
|
||||
|
||||
fn ty_ctxt<'a>(&'a self) -> &'a ty::ctxt {
|
||||
self.ccx.tcx
|
||||
}
|
||||
}
|
||||
|
||||
struct CheckTypeWellFormedVisitor<'a> { ccx: &'a CrateCtxt<'a> }
|
||||
|
||||
impl<'a> Visitor<()> for CheckTypeWellFormedVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for CheckTypeWellFormedVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
||||
check_type_well_formed(self.ccx, i);
|
||||
visit::walk_item(self, i, ());
|
||||
}
|
||||
}
|
||||
|
||||
struct CheckItemTypesVisitor<'a> { ccx: &'a CrateCtxt<'a> }
|
||||
|
||||
impl<'a> Visitor<()> for CheckItemTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for CheckItemTypesVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
||||
check_item(self.ccx, i);
|
||||
visit::walk_item(self, i, ());
|
||||
}
|
||||
}
|
||||
|
||||
struct CheckItemSizedTypesVisitor<'a> { ccx: &'a CrateCtxt<'a> }
|
||||
struct CheckItemSizedTypesVisitor<'a, 'tcx: 'a> {
|
||||
ccx: &'a CrateCtxt<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for CheckItemSizedTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for CheckItemSizedTypesVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
||||
check_item_sized(self.ccx, i);
|
||||
visit::walk_item(self, i, ());
|
||||
|
@ -451,11 +443,11 @@ fn check_bare_fn(ccx: &CrateCtxt,
|
|||
}
|
||||
}
|
||||
|
||||
struct GatherLocalsVisitor<'a> {
|
||||
fcx: &'a FnCtxt<'a>
|
||||
struct GatherLocalsVisitor<'a, 'tcx: 'a> {
|
||||
fcx: &'a FnCtxt<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> GatherLocalsVisitor<'a> {
|
||||
impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
||||
fn assign(&mut self, nid: ast::NodeId, ty_opt: Option<ty::t>) {
|
||||
match ty_opt {
|
||||
None => {
|
||||
|
@ -472,7 +464,7 @@ fn assign(&mut self, nid: ast::NodeId, ty_opt: Option<ty::t>) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for GatherLocalsVisitor<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for GatherLocalsVisitor<'a, 'tcx> {
|
||||
// Add explicitly-declared locals.
|
||||
fn visit_local(&mut self, local: &ast::Local, _: ()) {
|
||||
let o_ty = match local.ty.node {
|
||||
|
@ -530,17 +522,15 @@ fn visit_item(&mut self, _: &ast::Item, _: ()) { }
|
|||
|
||||
}
|
||||
|
||||
fn check_fn<'a>(
|
||||
ccx: &'a CrateCtxt<'a>,
|
||||
fn_style: ast::FnStyle,
|
||||
fn_style_id: ast::NodeId,
|
||||
fn_sig: &ty::FnSig,
|
||||
decl: &ast::FnDecl,
|
||||
fn_id: ast::NodeId,
|
||||
body: &ast::Block,
|
||||
inherited: &'a Inherited<'a>)
|
||||
-> FnCtxt<'a>
|
||||
{
|
||||
fn check_fn<'a, 'tcx>(ccx: &'a CrateCtxt<'a, 'tcx>,
|
||||
fn_style: ast::FnStyle,
|
||||
fn_style_id: ast::NodeId,
|
||||
fn_sig: &ty::FnSig,
|
||||
decl: &ast::FnDecl,
|
||||
fn_id: ast::NodeId,
|
||||
body: &ast::Block,
|
||||
inherited: &'a Inherited<'a, 'tcx>)
|
||||
-> FnCtxt<'a, 'tcx> {
|
||||
/*!
|
||||
* Helper used by check_bare_fn and check_expr_fn. Does the
|
||||
* grungy work of checking a function body and returns the
|
||||
|
@ -1563,8 +1553,8 @@ fn types_compatible(fcx: &FnCtxt, sp: Span,
|
|||
fcx.write_ty(id, t_1);
|
||||
}
|
||||
|
||||
impl<'a> AstConv for FnCtxt<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.ccx.tcx }
|
||||
impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.ccx.tcx }
|
||||
|
||||
fn get_item_ty(&self, id: ast::DefId) -> ty::Polytype {
|
||||
ty::lookup_item_type(self.tcx(), id)
|
||||
|
@ -1579,10 +1569,10 @@ fn ty_infer(&self, _span: Span) -> ty::t {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> FnCtxt<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.ccx.tcx }
|
||||
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.ccx.tcx }
|
||||
|
||||
pub fn infcx<'b>(&'b self) -> &'b infer::InferCtxt<'a> {
|
||||
pub fn infcx<'b>(&'b self) -> &'b infer::InferCtxt<'a, 'tcx> {
|
||||
&self.inh.infcx
|
||||
}
|
||||
|
||||
|
@ -1590,7 +1580,7 @@ pub fn err_count_since_creation(&self) -> uint {
|
|||
self.ccx.tcx.sess.err_count() - self.err_count_on_creation
|
||||
}
|
||||
|
||||
pub fn vtable_context<'a>(&'a self) -> VtableContext<'a> {
|
||||
pub fn vtable_context<'a>(&'a self) -> VtableContext<'a, 'tcx> {
|
||||
VtableContext {
|
||||
infcx: self.infcx(),
|
||||
param_env: &self.inh.param_env,
|
||||
|
@ -1599,7 +1589,7 @@ pub fn vtable_context<'a>(&'a self) -> VtableContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> RegionScope for infer::InferCtxt<'a> {
|
||||
impl<'a, 'tcx> RegionScope for infer::InferCtxt<'a, 'tcx> {
|
||||
fn default_region_bound(&self, span: Span) -> Option<ty::Region> {
|
||||
Some(self.next_region_var(infer::MiscVariable(span)))
|
||||
}
|
||||
|
@ -1612,7 +1602,7 @@ fn anon_regions(&self, span: Span, count: uint)
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> FnCtxt<'a> {
|
||||
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
pub fn tag(&self) -> String {
|
||||
format!("{}", self as *const FnCtxt)
|
||||
}
|
||||
|
@ -3919,7 +3909,7 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
|
|||
}
|
||||
ast::ExprRepeat(ref element, ref count_expr) => {
|
||||
check_expr_has_type(fcx, &**count_expr, ty::mk_uint());
|
||||
let count = ty::eval_repeat_count(fcx, &**count_expr);
|
||||
let count = ty::eval_repeat_count(fcx.tcx(), &**count_expr);
|
||||
|
||||
let uty = match expected {
|
||||
ExpectHasType(uty) => {
|
||||
|
|
|
@ -196,8 +196,8 @@ macro_rules! ignore_err(
|
|||
)
|
||||
)
|
||||
|
||||
pub struct Rcx<'a> {
|
||||
fcx: &'a FnCtxt<'a>,
|
||||
pub struct Rcx<'a, 'tcx: 'a> {
|
||||
fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
|
||||
region_param_pairs: Vec<(ty::Region, ty::ParamTy)>,
|
||||
|
||||
|
@ -250,15 +250,15 @@ fn region_of_def(fcx: &FnCtxt, def: def::Def) -> ty::Region {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Rcx<'a> {
|
||||
pub fn new(fcx: &'a FnCtxt<'a>,
|
||||
initial_repeating_scope: ast::NodeId) -> Rcx<'a> {
|
||||
impl<'a, 'tcx> Rcx<'a, 'tcx> {
|
||||
pub fn new(fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
initial_repeating_scope: ast::NodeId) -> Rcx<'a, 'tcx> {
|
||||
Rcx { fcx: fcx,
|
||||
repeating_scope: initial_repeating_scope,
|
||||
region_param_pairs: Vec::new() }
|
||||
}
|
||||
|
||||
pub fn tcx(&self) -> &'a ty::ctxt {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt<'tcx> {
|
||||
self.fcx.ccx.tcx
|
||||
}
|
||||
|
||||
|
@ -438,8 +438,8 @@ fn relate_free_regions(&mut self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'fcx> mc::Typer for Rcx<'fcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'fcx, 'tcx> mc::Typer<'tcx> for Rcx<'fcx, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.fcx.ccx.tcx
|
||||
}
|
||||
|
||||
|
@ -479,7 +479,7 @@ fn unboxed_closures<'a>(&'a self)
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for Rcx<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for Rcx<'a, 'tcx> {
|
||||
// (..) FIXME(#3238) should use visit_pat, not visit_arm/visit_local,
|
||||
// However, right now we run into an issue whereby some free
|
||||
// regions are not properly related if they appear within the
|
||||
|
|
|
@ -51,8 +51,8 @@ pub enum WfConstraint {
|
|||
RegionSubParamConstraint(Option<ty::t>, ty::Region, ty::ParamTy),
|
||||
}
|
||||
|
||||
struct Wf<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct Wf<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
stack: Vec<(ty::Region, Option<ty::t>)>,
|
||||
out: Vec<WfConstraint>,
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ pub fn region_wf_constraints(
|
|||
wf.out
|
||||
}
|
||||
|
||||
impl<'a> Wf<'a> {
|
||||
impl<'a, 'tcx> Wf<'a, 'tcx> {
|
||||
fn accumulate_from_ty(&mut self, ty: ty::t) {
|
||||
debug!("Wf::accumulate_from_ty(ty={})",
|
||||
ty.repr(self.tcx));
|
||||
|
|
|
@ -68,14 +68,14 @@
|
|||
|
||||
/// A vtable context includes an inference context, a parameter environment,
|
||||
/// and a list of unboxed closure types.
|
||||
pub struct VtableContext<'a> {
|
||||
pub infcx: &'a infer::InferCtxt<'a>,
|
||||
pub struct VtableContext<'a, 'tcx: 'a> {
|
||||
pub infcx: &'a infer::InferCtxt<'a, 'tcx>,
|
||||
pub param_env: &'a ty::ParameterEnvironment,
|
||||
pub unboxed_closures: &'a RefCell<DefIdMap<ty::UnboxedClosure>>,
|
||||
}
|
||||
|
||||
impl<'a> VtableContext<'a> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt { self.infcx.tcx }
|
||||
impl<'a, 'tcx> VtableContext<'a, 'tcx> {
|
||||
pub fn tcx(&self) -> &'a ty::ctxt<'tcx> { self.infcx.tcx }
|
||||
}
|
||||
|
||||
fn lookup_vtables(vcx: &VtableContext,
|
||||
|
@ -1025,7 +1025,7 @@ pub fn trans_resolve_method(tcx: &ty::ctxt, id: ast::NodeId,
|
|||
false)
|
||||
}
|
||||
|
||||
impl<'a, 'b> visit::Visitor<()> for &'a FnCtxt<'b> {
|
||||
impl<'a, 'b, 'tcx> visit::Visitor<()> for &'a FnCtxt<'b, 'tcx> {
|
||||
fn visit_expr(&mut self, ex: &ast::Expr, _: ()) {
|
||||
early_resolve_expr(ex, *self, false);
|
||||
visit::walk_expr(self, ex, ());
|
||||
|
|
|
@ -84,16 +84,16 @@ pub fn resolve_impl_res(infcx: &infer::InferCtxt,
|
|||
// there, it applies a few ad-hoc checks that were not convenient to
|
||||
// do elsewhere.
|
||||
|
||||
struct WritebackCx<'cx> {
|
||||
fcx: &'cx FnCtxt<'cx>,
|
||||
struct WritebackCx<'cx, 'tcx: 'cx> {
|
||||
fcx: &'cx FnCtxt<'cx, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'cx> WritebackCx<'cx> {
|
||||
fn new(fcx: &'cx FnCtxt) -> WritebackCx<'cx> {
|
||||
impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
|
||||
fn new(fcx: &'cx FnCtxt<'cx, 'tcx>) -> WritebackCx<'cx, 'tcx> {
|
||||
WritebackCx { fcx: fcx }
|
||||
}
|
||||
|
||||
fn tcx(&self) -> &'cx ty::ctxt {
|
||||
fn tcx(&self) -> &'cx ty::ctxt<'tcx> {
|
||||
self.fcx.tcx()
|
||||
}
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ fn tcx(&self) -> &'cx ty::ctxt {
|
|||
// below. In general, a function is made into a `visitor` if it must
|
||||
// traffic in node-ids or update tables in the type context etc.
|
||||
|
||||
impl<'cx> Visitor<()> for WritebackCx<'cx> {
|
||||
impl<'cx, 'tcx> Visitor<()> for WritebackCx<'cx, 'tcx> {
|
||||
fn visit_item(&mut self, _: &ast::Item, _: ()) {
|
||||
// Ignore items
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ fn visit_ty(&mut self, t: &ast::Ty, _: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'cx> WritebackCx<'cx> {
|
||||
impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
|
||||
fn visit_upvar_borrow_map(&self) {
|
||||
if self.fcx.writeback_errors.get() {
|
||||
return;
|
||||
|
@ -400,17 +400,17 @@ fn resolve_in(&self, resolver: &mut Resolver) -> T {
|
|||
// The Resolver. This is the type folding engine that detects
|
||||
// unresolved types and so forth.
|
||||
|
||||
struct Resolver<'cx> {
|
||||
tcx: &'cx ty::ctxt,
|
||||
infcx: &'cx infer::InferCtxt<'cx>,
|
||||
struct Resolver<'cx, 'tcx: 'cx> {
|
||||
tcx: &'cx ty::ctxt<'tcx>,
|
||||
infcx: &'cx infer::InferCtxt<'cx, 'tcx>,
|
||||
writeback_errors: &'cx Cell<bool>,
|
||||
reason: ResolveReason,
|
||||
}
|
||||
|
||||
impl<'cx> Resolver<'cx> {
|
||||
fn new(fcx: &'cx FnCtxt<'cx>,
|
||||
impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
|
||||
fn new(fcx: &'cx FnCtxt<'cx, 'tcx>,
|
||||
reason: ResolveReason)
|
||||
-> Resolver<'cx>
|
||||
-> Resolver<'cx, 'tcx>
|
||||
{
|
||||
Resolver { infcx: fcx.infcx(),
|
||||
tcx: fcx.tcx(),
|
||||
|
@ -418,10 +418,10 @@ fn new(fcx: &'cx FnCtxt<'cx>,
|
|||
reason: reason }
|
||||
}
|
||||
|
||||
fn from_infcx(infcx: &'cx infer::InferCtxt<'cx>,
|
||||
fn from_infcx(infcx: &'cx infer::InferCtxt<'cx, 'tcx>,
|
||||
writeback_errors: &'cx Cell<bool>,
|
||||
reason: ResolveReason)
|
||||
-> Resolver<'cx>
|
||||
-> Resolver<'cx, 'tcx>
|
||||
{
|
||||
Resolver { infcx: infcx,
|
||||
tcx: infcx.tcx,
|
||||
|
@ -475,8 +475,8 @@ fn report_error(&self, e: infer::fixup_err) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'cx> TypeFolder for Resolver<'cx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'cx, 'tcx> TypeFolder<'tcx> for Resolver<'cx, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.tcx
|
||||
}
|
||||
|
||||
|
|
|
@ -182,16 +182,16 @@ fn get_base_type_def_id(inference_context: &InferCtxt,
|
|||
}
|
||||
}
|
||||
|
||||
struct CoherenceChecker<'a> {
|
||||
crate_context: &'a CrateCtxt<'a>,
|
||||
inference_context: InferCtxt<'a>,
|
||||
struct CoherenceChecker<'a, 'tcx: 'a> {
|
||||
crate_context: &'a CrateCtxt<'a, 'tcx>,
|
||||
inference_context: InferCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
||||
struct CoherenceCheckVisitor<'a> {
|
||||
cc: &'a CoherenceChecker<'a>
|
||||
struct CoherenceCheckVisitor<'a, 'tcx: 'a> {
|
||||
cc: &'a CoherenceChecker<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for CoherenceCheckVisitor<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for CoherenceCheckVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &Item, _: ()) {
|
||||
|
||||
//debug!("(checking coherence) item '{}'", token::get_ident(item.ident));
|
||||
|
@ -214,9 +214,11 @@ fn visit_item(&mut self, item: &Item, _: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
struct PrivilegedScopeVisitor<'a> { cc: &'a CoherenceChecker<'a> }
|
||||
struct PrivilegedScopeVisitor<'a, 'tcx: 'a> {
|
||||
cc: &'a CoherenceChecker<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for PrivilegedScopeVisitor<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for PrivilegedScopeVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &Item, _: ()) {
|
||||
|
||||
match item.node {
|
||||
|
@ -263,7 +265,7 @@ fn visit_item(&mut self, item: &Item, _: ()) {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> CoherenceChecker<'a> {
|
||||
impl<'a, 'tcx> CoherenceChecker<'a, 'tcx> {
|
||||
fn check(&self, krate: &Crate) {
|
||||
// Check implementations and traits. This populates the tables
|
||||
// containing the inherent methods and extension methods. It also
|
||||
|
|
|
@ -95,11 +95,11 @@ fn collect_intrinsic_type(ccx: &CrateCtxt,
|
|||
// of type parameters and supertraits. This is information we need to
|
||||
// know later when parsing field defs.
|
||||
|
||||
struct CollectTraitDefVisitor<'a> {
|
||||
ccx: &'a CrateCtxt<'a>
|
||||
struct CollectTraitDefVisitor<'a, 'tcx: 'a> {
|
||||
ccx: &'a CrateCtxt<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for CollectTraitDefVisitor<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for CollectTraitDefVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
||||
match i.node {
|
||||
ast::ItemTrait(..) => {
|
||||
|
@ -116,11 +116,11 @@ fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// Second phase: collection proper.
|
||||
|
||||
struct CollectItemTypesVisitor<'a> {
|
||||
ccx: &'a CrateCtxt<'a>
|
||||
struct CollectItemTypesVisitor<'a, 'tcx: 'a> {
|
||||
ccx: &'a CrateCtxt<'a, 'tcx>
|
||||
}
|
||||
|
||||
impl<'a> visit::Visitor<()> for CollectItemTypesVisitor<'a> {
|
||||
impl<'a, 'tcx> visit::Visitor<()> for CollectItemTypesVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, i: &ast::Item, _: ()) {
|
||||
convert(self.ccx, i);
|
||||
visit::walk_item(self, i, ());
|
||||
|
@ -138,14 +138,14 @@ pub trait ToTy {
|
|||
fn to_ty<RS:RegionScope>(&self, rs: &RS, ast_ty: &ast::Ty) -> ty::t;
|
||||
}
|
||||
|
||||
impl<'a> ToTy for CrateCtxt<'a> {
|
||||
impl<'a, 'tcx> ToTy for CrateCtxt<'a, 'tcx> {
|
||||
fn to_ty<RS:RegionScope>(&self, rs: &RS, ast_ty: &ast::Ty) -> ty::t {
|
||||
ast_ty_to_ty(self, rs, ast_ty)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> AstConv for CrateCtxt<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt { self.tcx }
|
||||
impl<'a, 'tcx> AstConv<'tcx> for CrateCtxt<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.tcx }
|
||||
|
||||
fn get_item_ty(&self, id: ast::DefId) -> ty::Polytype {
|
||||
if id.krate != ast::LOCAL_CRATE {
|
||||
|
|
|
@ -82,10 +82,10 @@ fn foo<A>(a: A, b: A) { ... }
|
|||
// Note: Coerce is not actually a combiner, in that it does not
|
||||
// conform to the same interface, though it performs a similar
|
||||
// function.
|
||||
pub struct Coerce<'f>(pub CombineFields<'f>);
|
||||
pub struct Coerce<'f, 'tcx: 'f>(pub CombineFields<'f, 'tcx>);
|
||||
|
||||
impl<'f> Coerce<'f> {
|
||||
pub fn get_ref<'a>(&'a self) -> &'a CombineFields<'f> {
|
||||
impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||
pub fn get_ref<'a>(&'a self) -> &'a CombineFields<'f, 'tcx> {
|
||||
let Coerce(ref v) = *self; v
|
||||
}
|
||||
|
||||
|
|
|
@ -57,16 +57,16 @@
|
|||
use syntax::ast;
|
||||
use syntax::abi;
|
||||
|
||||
pub trait Combine {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a>;
|
||||
pub trait Combine<'tcx> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx>;
|
||||
fn tag(&self) -> String;
|
||||
fn a_is_expected(&self) -> bool;
|
||||
fn trace(&self) -> TypeTrace;
|
||||
|
||||
fn equate<'a>(&'a self) -> Equate<'a>;
|
||||
fn sub<'a>(&'a self) -> Sub<'a>;
|
||||
fn lub<'a>(&'a self) -> Lub<'a>;
|
||||
fn glb<'a>(&'a self) -> Glb<'a>;
|
||||
fn equate<'a>(&'a self) -> Equate<'a, 'tcx>;
|
||||
fn sub<'a>(&'a self) -> Sub<'a, 'tcx>;
|
||||
fn lub<'a>(&'a self) -> Lub<'a, 'tcx>;
|
||||
fn glb<'a>(&'a self) -> Glb<'a, 'tcx>;
|
||||
|
||||
fn mts(&self, a: &ty::mt, b: &ty::mt) -> cres<ty::mt>;
|
||||
fn contratys(&self, a: ty::t, b: ty::t) -> cres<ty::t>;
|
||||
|
@ -138,13 +138,12 @@ fn substs(&self,
|
|||
|
||||
return Ok(substs);
|
||||
|
||||
fn relate_region_params<C:Combine>(this: &C,
|
||||
item_def_id: ast::DefId,
|
||||
variances: &[ty::Variance],
|
||||
a_rs: &[ty::Region],
|
||||
b_rs: &[ty::Region])
|
||||
-> cres<Vec<ty::Region>>
|
||||
{
|
||||
fn relate_region_params<'tcx, C: Combine<'tcx>>(this: &C,
|
||||
item_def_id: ast::DefId,
|
||||
variances: &[ty::Variance],
|
||||
a_rs: &[ty::Region],
|
||||
b_rs: &[ty::Region])
|
||||
-> cres<Vec<ty::Region>> {
|
||||
let tcx = this.infcx().tcx;
|
||||
let num_region_params = variances.len();
|
||||
|
||||
|
@ -305,13 +304,13 @@ fn trait_refs(&self,
|
|||
}
|
||||
|
||||
#[deriving(Clone)]
|
||||
pub struct CombineFields<'a> {
|
||||
pub infcx: &'a InferCtxt<'a>,
|
||||
pub struct CombineFields<'a, 'tcx: 'a> {
|
||||
pub infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
pub a_is_expected: bool,
|
||||
pub trace: TypeTrace,
|
||||
}
|
||||
|
||||
pub fn expected_found<C:Combine,T>(
|
||||
pub fn expected_found<'tcx, C: Combine<'tcx>, T>(
|
||||
this: &C, a: T, b: T) -> ty::expected_found<T> {
|
||||
if this.a_is_expected() {
|
||||
ty::expected_found {expected: a, found: b}
|
||||
|
@ -320,9 +319,15 @@ pub fn expected_found<C:Combine,T>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn super_fn_sigs<C:Combine>(this: &C, a: &ty::FnSig, b: &ty::FnSig) -> cres<ty::FnSig> {
|
||||
pub fn super_fn_sigs<'tcx, C: Combine<'tcx>>(this: &C,
|
||||
a: &ty::FnSig,
|
||||
b: &ty::FnSig)
|
||||
-> cres<ty::FnSig> {
|
||||
|
||||
fn argvecs<C:Combine>(this: &C, a_args: &[ty::t], b_args: &[ty::t]) -> cres<Vec<ty::t> > {
|
||||
fn argvecs<'tcx, C: Combine<'tcx>>(this: &C,
|
||||
a_args: &[ty::t],
|
||||
b_args: &[ty::t])
|
||||
-> cres<Vec<ty::t>> {
|
||||
if a_args.len() == b_args.len() {
|
||||
result::collect(a_args.iter().zip(b_args.iter())
|
||||
.map(|(a, b)| this.args(*a, *b)))
|
||||
|
@ -345,18 +350,18 @@ fn argvecs<C:Combine>(this: &C, a_args: &[ty::t], b_args: &[ty::t]) -> cres<Vec<
|
|||
variadic: a.variadic})
|
||||
}
|
||||
|
||||
pub fn super_tys<C:Combine>(this: &C, a: ty::t, b: ty::t) -> cres<ty::t> {
|
||||
pub fn super_tys<'tcx, C: Combine<'tcx>>(this: &C, a: ty::t, b: ty::t) -> cres<ty::t> {
|
||||
|
||||
// This is a horrible hack - historically, [T] was not treated as a type,
|
||||
// so, for example, &T and &[U] should not unify. In fact the only thing
|
||||
// &[U] should unify with is &[T]. We preserve that behaviour with this
|
||||
// check.
|
||||
fn check_ptr_to_unsized<C:Combine>(this: &C,
|
||||
a: ty::t,
|
||||
b: ty::t,
|
||||
a_inner: ty::t,
|
||||
b_inner: ty::t,
|
||||
result: ty::t) -> cres<ty::t> {
|
||||
fn check_ptr_to_unsized<'tcx, C: Combine<'tcx>>(this: &C,
|
||||
a: ty::t,
|
||||
b: ty::t,
|
||||
a_inner: ty::t,
|
||||
b_inner: ty::t,
|
||||
result: ty::t) -> cres<ty::t> {
|
||||
match (&ty::get(a_inner).sty, &ty::get(b_inner).sty) {
|
||||
(&ty::ty_vec(_, None), &ty::ty_vec(_, None)) |
|
||||
(&ty::ty_str, &ty::ty_str) |
|
||||
|
@ -547,7 +552,7 @@ fn check_ptr_to_unsized<C:Combine>(this: &C,
|
|||
_ => Err(ty::terr_sorts(expected_found(this, a, b)))
|
||||
};
|
||||
|
||||
fn unify_integral_variable<C:Combine>(
|
||||
fn unify_integral_variable<'tcx, C: Combine<'tcx>>(
|
||||
this: &C,
|
||||
vid_is_expected: bool,
|
||||
vid: ty::IntVid,
|
||||
|
@ -560,7 +565,7 @@ fn unify_integral_variable<C:Combine>(
|
|||
}
|
||||
}
|
||||
|
||||
fn unify_float_variable<C:Combine>(
|
||||
fn unify_float_variable<'tcx, C: Combine<'tcx>>(
|
||||
this: &C,
|
||||
vid_is_expected: bool,
|
||||
vid: ty::FloatVid,
|
||||
|
@ -571,19 +576,19 @@ fn unify_float_variable<C:Combine>(
|
|||
}
|
||||
}
|
||||
|
||||
impl<'f> CombineFields<'f> {
|
||||
pub fn switch_expected(&self) -> CombineFields<'f> {
|
||||
impl<'f, 'tcx> CombineFields<'f, 'tcx> {
|
||||
pub fn switch_expected(&self) -> CombineFields<'f, 'tcx> {
|
||||
CombineFields {
|
||||
a_is_expected: !self.a_is_expected,
|
||||
..(*self).clone()
|
||||
}
|
||||
}
|
||||
|
||||
fn equate(&self) -> Equate<'f> {
|
||||
fn equate(&self) -> Equate<'f, 'tcx> {
|
||||
Equate((*self).clone())
|
||||
}
|
||||
|
||||
fn sub(&self) -> Sub<'f> {
|
||||
fn sub(&self) -> Sub<'f, 'tcx> {
|
||||
Sub((*self).clone())
|
||||
}
|
||||
|
||||
|
|
|
@ -23,25 +23,25 @@
|
|||
|
||||
use syntax::ast::{Onceness, FnStyle};
|
||||
|
||||
pub struct Equate<'f> {
|
||||
fields: CombineFields<'f>
|
||||
pub struct Equate<'f, 'tcx: 'f> {
|
||||
fields: CombineFields<'f, 'tcx>
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn Equate<'f>(cf: CombineFields<'f>) -> Equate<'f> {
|
||||
pub fn Equate<'f, 'tcx>(cf: CombineFields<'f, 'tcx>) -> Equate<'f, 'tcx> {
|
||||
Equate { fields: cf }
|
||||
}
|
||||
|
||||
impl<'f> Combine for Equate<'f> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a> { self.fields.infcx }
|
||||
impl<'f, 'tcx> Combine<'tcx> for Equate<'f, 'tcx> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx> { self.fields.infcx }
|
||||
fn tag(&self) -> String { "eq".to_string() }
|
||||
fn a_is_expected(&self) -> bool { self.fields.a_is_expected }
|
||||
fn trace(&self) -> TypeTrace { self.fields.trace.clone() }
|
||||
|
||||
fn equate<'a>(&'a self) -> Equate<'a> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a> { Glb(self.fields.clone()) }
|
||||
fn equate<'a>(&'a self) -> Equate<'a, 'tcx> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a, 'tcx> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a, 'tcx> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a, 'tcx> { Glb(self.fields.clone()) }
|
||||
|
||||
fn contratys(&self, a: ty::t, b: ty::t) -> cres<ty::t> {
|
||||
self.tys(a, b)
|
||||
|
|
|
@ -166,7 +166,7 @@ fn give_expl_lifetime_param(&self,
|
|||
span: codemap::Span);
|
||||
}
|
||||
|
||||
impl<'a> ErrorReporting for InferCtxt<'a> {
|
||||
impl<'a, 'tcx> ErrorReporting for InferCtxt<'a, 'tcx> {
|
||||
fn report_region_errors(&self,
|
||||
errors: &Vec<RegionResolutionError>) {
|
||||
let p_errors = self.process_errors(errors);
|
||||
|
@ -900,8 +900,8 @@ struct RebuildPathInfo<'a> {
|
|||
region_names: &'a HashSet<ast::Name>
|
||||
}
|
||||
|
||||
struct Rebuilder<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct Rebuilder<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
fn_decl: ast::P<ast::FnDecl>,
|
||||
expl_self_opt: Option<ast::ExplicitSelf_>,
|
||||
generics: &'a ast::Generics,
|
||||
|
@ -916,14 +916,14 @@ enum FreshOrKept {
|
|||
Kept
|
||||
}
|
||||
|
||||
impl<'a> Rebuilder<'a> {
|
||||
fn new(tcx: &'a ty::ctxt,
|
||||
impl<'a, 'tcx> Rebuilder<'a, 'tcx> {
|
||||
fn new(tcx: &'a ty::ctxt<'tcx>,
|
||||
fn_decl: ast::P<ast::FnDecl>,
|
||||
expl_self_opt: Option<ast::ExplicitSelf_>,
|
||||
generics: &'a ast::Generics,
|
||||
same_regions: &'a [SameRegions],
|
||||
life_giver: &'a LifeGiver)
|
||||
-> Rebuilder<'a> {
|
||||
-> Rebuilder<'a, 'tcx> {
|
||||
Rebuilder {
|
||||
tcx: tcx,
|
||||
fn_decl: fn_decl,
|
||||
|
@ -1403,7 +1403,7 @@ fn rebuild_path(&self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> ErrorReportingHelpers for InferCtxt<'a> {
|
||||
impl<'a, 'tcx> ErrorReportingHelpers for InferCtxt<'a, 'tcx> {
|
||||
fn give_expl_lifetime_param(&self,
|
||||
decl: &ast::FnDecl,
|
||||
fn_style: ast::FnStyle,
|
||||
|
|
|
@ -30,25 +30,25 @@
|
|||
use util::ppaux::Repr;
|
||||
|
||||
/// "Greatest lower bound" (common subtype)
|
||||
pub struct Glb<'f> {
|
||||
fields: CombineFields<'f>
|
||||
pub struct Glb<'f, 'tcx: 'f> {
|
||||
fields: CombineFields<'f, 'tcx>
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn Glb<'f>(cf: CombineFields<'f>) -> Glb<'f> {
|
||||
pub fn Glb<'f, 'tcx>(cf: CombineFields<'f, 'tcx>) -> Glb<'f, 'tcx> {
|
||||
Glb { fields: cf }
|
||||
}
|
||||
|
||||
impl<'f> Combine for Glb<'f> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a> { self.fields.infcx }
|
||||
impl<'f, 'tcx> Combine<'tcx> for Glb<'f, 'tcx> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx> { self.fields.infcx }
|
||||
fn tag(&self) -> String { "glb".to_string() }
|
||||
fn a_is_expected(&self) -> bool { self.fields.a_is_expected }
|
||||
fn trace(&self) -> TypeTrace { self.fields.trace.clone() }
|
||||
|
||||
fn equate<'a>(&'a self) -> Equate<'a> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a> { Glb(self.fields.clone()) }
|
||||
fn equate<'a>(&'a self) -> Equate<'a, 'tcx> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a, 'tcx> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a, 'tcx> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a, 'tcx> { Glb(self.fields.clone()) }
|
||||
|
||||
fn mts(&self, a: &ty::mt, b: &ty::mt) -> cres<ty::mt> {
|
||||
let tcx = self.fields.infcx.tcx;
|
||||
|
|
|
@ -51,7 +51,7 @@ pub trait LatticeDir {
|
|||
fn relate_bound<'a>(&'a self, v: ty::t, a: ty::t, b: ty::t) -> cres<()>;
|
||||
}
|
||||
|
||||
impl<'a> LatticeDir for Lub<'a> {
|
||||
impl<'a, 'tcx> LatticeDir for Lub<'a, 'tcx> {
|
||||
fn ty_bot(&self, t: ty::t) -> cres<ty::t> {
|
||||
Ok(t)
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ fn relate_bound<'a>(&'a self, v: ty::t, a: ty::t, b: ty::t) -> cres<()> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> LatticeDir for Glb<'a> {
|
||||
impl<'a, 'tcx> LatticeDir for Glb<'a, 'tcx> {
|
||||
fn ty_bot(&self, _: ty::t) -> cres<ty::t> {
|
||||
Ok(ty::mk_bot())
|
||||
}
|
||||
|
@ -77,10 +77,10 @@ fn relate_bound<'a>(&'a self, v: ty::t, a: ty::t, b: ty::t) -> cres<()> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn super_lattice_tys<L:LatticeDir+Combine>(this: &L,
|
||||
a: ty::t,
|
||||
b: ty::t)
|
||||
-> cres<ty::t>
|
||||
pub fn super_lattice_tys<'tcx, L:LatticeDir+Combine<'tcx>>(this: &L,
|
||||
a: ty::t,
|
||||
b: ty::t)
|
||||
-> cres<ty::t>
|
||||
{
|
||||
debug!("{}.lattice_tys({}, {})",
|
||||
this.tag(),
|
||||
|
@ -115,9 +115,9 @@ pub fn super_lattice_tys<L:LatticeDir+Combine>(this: &L,
|
|||
// Random utility functions used by LUB/GLB when computing LUB/GLB of
|
||||
// fn types
|
||||
|
||||
pub fn var_ids<T:Combine>(this: &T,
|
||||
map: &HashMap<ty::BoundRegion, ty::Region>)
|
||||
-> Vec<RegionVid> {
|
||||
pub fn var_ids<'tcx, T: Combine<'tcx>>(this: &T,
|
||||
map: &HashMap<ty::BoundRegion, ty::Region>)
|
||||
-> Vec<RegionVid> {
|
||||
map.iter().map(|(_, r)| match *r {
|
||||
ty::ReInfer(ty::ReVar(r)) => { r }
|
||||
r => {
|
||||
|
|
|
@ -29,25 +29,25 @@
|
|||
use util::ppaux::Repr;
|
||||
|
||||
/// "Least upper bound" (common supertype)
|
||||
pub struct Lub<'f> {
|
||||
fields: CombineFields<'f>
|
||||
pub struct Lub<'f, 'tcx: 'f> {
|
||||
fields: CombineFields<'f, 'tcx>
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn Lub<'f>(cf: CombineFields<'f>) -> Lub<'f> {
|
||||
pub fn Lub<'f, 'tcx>(cf: CombineFields<'f, 'tcx>) -> Lub<'f, 'tcx> {
|
||||
Lub { fields: cf }
|
||||
}
|
||||
|
||||
impl<'f> Combine for Lub<'f> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a> { self.fields.infcx }
|
||||
impl<'f, 'tcx> Combine<'tcx> for Lub<'f, 'tcx> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx> { self.fields.infcx }
|
||||
fn tag(&self) -> String { "lub".to_string() }
|
||||
fn a_is_expected(&self) -> bool { self.fields.a_is_expected }
|
||||
fn trace(&self) -> TypeTrace { self.fields.trace.clone() }
|
||||
|
||||
fn equate<'a>(&'a self) -> Equate<'a> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a> { Glb(self.fields.clone()) }
|
||||
fn equate<'a>(&'a self) -> Equate<'a, 'tcx> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a, 'tcx> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a, 'tcx> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a, 'tcx> { Glb(self.fields.clone()) }
|
||||
|
||||
fn mts(&self, a: &ty::mt, b: &ty::mt) -> cres<ty::mt> {
|
||||
let tcx = self.fields.infcx.tcx;
|
||||
|
|
|
@ -75,8 +75,8 @@ pub struct Bounds<T> {
|
|||
pub type fres<T> = Result<T, fixup_err>; // "fixup result"
|
||||
pub type CoerceResult = cres<Option<ty::AutoAdjustment>>;
|
||||
|
||||
pub struct InferCtxt<'a> {
|
||||
pub tcx: &'a ty::ctxt,
|
||||
pub struct InferCtxt<'a, 'tcx: 'a> {
|
||||
pub tcx: &'a ty::ctxt<'tcx>,
|
||||
|
||||
// We instantiate UnificationTable with bounds<ty::t> because the
|
||||
// types that might instantiate a general type variable have an
|
||||
|
@ -93,7 +93,7 @@ pub struct InferCtxt<'a> {
|
|||
|
||||
// For region variables.
|
||||
region_vars:
|
||||
RegionVarBindings<'a>,
|
||||
RegionVarBindings<'a, 'tcx>,
|
||||
}
|
||||
|
||||
/// Why did we require that the two types be related?
|
||||
|
@ -291,7 +291,8 @@ pub fn fixup_err_to_string(f: fixup_err) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn new_infer_ctxt<'a>(tcx: &'a ty::ctxt) -> InferCtxt<'a> {
|
||||
pub fn new_infer_ctxt<'a, 'tcx>(tcx: &'a ty::ctxt<'tcx>)
|
||||
-> InferCtxt<'a, 'tcx> {
|
||||
InferCtxt {
|
||||
tcx: tcx,
|
||||
type_variables: RefCell::new(type_variable::TypeVariableTable::new()),
|
||||
|
@ -518,23 +519,23 @@ pub struct CombinedSnapshot {
|
|||
region_vars_snapshot: RegionSnapshot,
|
||||
}
|
||||
|
||||
impl<'a> InferCtxt<'a> {
|
||||
impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
pub fn combine_fields<'a>(&'a self, a_is_expected: bool, trace: TypeTrace)
|
||||
-> CombineFields<'a> {
|
||||
-> CombineFields<'a, 'tcx> {
|
||||
CombineFields {infcx: self,
|
||||
a_is_expected: a_is_expected,
|
||||
trace: trace}
|
||||
}
|
||||
|
||||
pub fn equate<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Equate<'a> {
|
||||
pub fn equate<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Equate<'a, 'tcx> {
|
||||
Equate(self.combine_fields(a_is_expected, trace))
|
||||
}
|
||||
|
||||
pub fn sub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Sub<'a> {
|
||||
pub fn sub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Sub<'a, 'tcx> {
|
||||
Sub(self.combine_fields(a_is_expected, trace))
|
||||
}
|
||||
|
||||
pub fn lub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Lub<'a> {
|
||||
pub fn lub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Lub<'a, 'tcx> {
|
||||
Lub(self.combine_fields(a_is_expected, trace))
|
||||
}
|
||||
|
||||
|
@ -635,7 +636,7 @@ pub fn add_given(&self,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> InferCtxt<'a> {
|
||||
impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
pub fn next_ty_var_id(&self) -> TyVid {
|
||||
self.type_variables
|
||||
.borrow_mut()
|
||||
|
|
|
@ -151,8 +151,8 @@ pub fn push(&mut self, other: BoundRegion) {
|
|||
|
||||
pub type CombineMap = HashMap<TwoRegions, RegionVid>;
|
||||
|
||||
pub struct RegionVarBindings<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
pub struct RegionVarBindings<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
var_origins: RefCell<Vec<RegionVariableOrigin>>,
|
||||
|
||||
// Constraints of the form `A <= B` introduced by the region
|
||||
|
@ -217,8 +217,8 @@ pub struct RegionMark {
|
|||
length: uint
|
||||
}
|
||||
|
||||
impl<'a> RegionVarBindings<'a> {
|
||||
pub fn new(tcx: &'a ty::ctxt) -> RegionVarBindings<'a> {
|
||||
impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
|
||||
pub fn new(tcx: &'a ty::ctxt<'tcx>) -> RegionVarBindings<'a, 'tcx> {
|
||||
RegionVarBindings {
|
||||
tcx: tcx,
|
||||
var_origins: RefCell::new(Vec::new()),
|
||||
|
@ -711,9 +711,7 @@ pub fn resolve_regions(&self) -> Vec<RegionResolutionError> {
|
|||
*self.values.borrow_mut() = Some(v);
|
||||
errors
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> RegionVarBindings<'a> {
|
||||
fn is_subregion_of(&self, sub: Region, sup: Region) -> bool {
|
||||
self.tcx.region_maps.is_subregion_of(sub, sup)
|
||||
}
|
||||
|
@ -959,7 +957,7 @@ struct RegionAndOrigin {
|
|||
|
||||
type RegionGraph = graph::Graph<(), Constraint>;
|
||||
|
||||
impl<'a> RegionVarBindings<'a> {
|
||||
impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
|
||||
fn infer_variable_values(&self,
|
||||
errors: &mut Vec<RegionResolutionError>)
|
||||
-> Vec<VarValue>
|
||||
|
|
|
@ -74,18 +74,18 @@
|
|||
pub static resolve_and_force_all_but_regions: uint =
|
||||
(resolve_all | force_all) & not_regions;
|
||||
|
||||
pub struct ResolveState<'a> {
|
||||
infcx: &'a InferCtxt<'a>,
|
||||
pub struct ResolveState<'a, 'tcx: 'a> {
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
modes: uint,
|
||||
err: Option<fixup_err>,
|
||||
v_seen: Vec<TyVid> ,
|
||||
type_depth: uint,
|
||||
}
|
||||
|
||||
pub fn resolver<'a>(infcx: &'a InferCtxt,
|
||||
modes: uint,
|
||||
_: Option<Span>)
|
||||
-> ResolveState<'a> {
|
||||
pub fn resolver<'a, 'tcx>(infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
modes: uint,
|
||||
_: Option<Span>)
|
||||
-> ResolveState<'a, 'tcx> {
|
||||
ResolveState {
|
||||
infcx: infcx,
|
||||
modes: modes,
|
||||
|
@ -95,8 +95,8 @@ pub fn resolver<'a>(infcx: &'a InferCtxt,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> ty_fold::TypeFolder for ResolveState<'a> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
impl<'a, 'tcx> ty_fold::TypeFolder<'tcx> for ResolveState<'a, 'tcx> {
|
||||
fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
self.infcx.tcx
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> ResolveState<'a> {
|
||||
impl<'a, 'tcx> ResolveState<'a, 'tcx> {
|
||||
pub fn should(&mut self, mode: uint) -> bool {
|
||||
(self.modes & mode) == mode
|
||||
}
|
||||
|
|
|
@ -28,25 +28,25 @@
|
|||
|
||||
|
||||
/// "Greatest lower bound" (common subtype)
|
||||
pub struct Sub<'f> {
|
||||
fields: CombineFields<'f>
|
||||
pub struct Sub<'f, 'tcx: 'f> {
|
||||
fields: CombineFields<'f, 'tcx>
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn Sub<'f>(cf: CombineFields<'f>) -> Sub<'f> {
|
||||
pub fn Sub<'f, 'tcx>(cf: CombineFields<'f, 'tcx>) -> Sub<'f, 'tcx> {
|
||||
Sub { fields: cf }
|
||||
}
|
||||
|
||||
impl<'f> Combine for Sub<'f> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a> { self.fields.infcx }
|
||||
impl<'f, 'tcx> Combine<'tcx> for Sub<'f, 'tcx> {
|
||||
fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx> { self.fields.infcx }
|
||||
fn tag(&self) -> String { "sub".to_string() }
|
||||
fn a_is_expected(&self) -> bool { self.fields.a_is_expected }
|
||||
fn trace(&self) -> TypeTrace { self.fields.trace.clone() }
|
||||
|
||||
fn equate<'a>(&'a self) -> Equate<'a> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a> { Glb(self.fields.clone()) }
|
||||
fn equate<'a>(&'a self) -> Equate<'a, 'tcx> { Equate(self.fields.clone()) }
|
||||
fn sub<'a>(&'a self) -> Sub<'a, 'tcx> { Sub(self.fields.clone()) }
|
||||
fn lub<'a>(&'a self) -> Lub<'a, 'tcx> { Lub(self.fields.clone()) }
|
||||
fn glb<'a>(&'a self) -> Glb<'a, 'tcx> { Glb(self.fields.clone()) }
|
||||
|
||||
fn contratys(&self, a: ty::t, b: ty::t) -> cres<ty::t> {
|
||||
Sub(self.fields.switch_expected()).tys(b, a)
|
||||
|
|
|
@ -39,10 +39,11 @@
|
|||
use syntax::ast;
|
||||
use util::ppaux::{ty_to_string, UserString};
|
||||
|
||||
struct Env<'a> {
|
||||
use arena::TypedArena;
|
||||
|
||||
struct Env<'a, 'tcx: 'a> {
|
||||
krate: ast::Crate,
|
||||
tcx: &'a ty::ctxt,
|
||||
infcx: &'a infer::InferCtxt<'a>,
|
||||
infcx: &'a infer::InferCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
||||
struct RH<'a> {
|
||||
|
@ -129,7 +130,9 @@ fn test_env(_test_name: &str,
|
|||
let named_region_map = resolve_lifetime::krate(&sess, &krate);
|
||||
let region_map = region::resolve_crate(&sess, &krate);
|
||||
let stability_index = stability::Index::build(&krate);
|
||||
let type_arena = TypedArena::new();
|
||||
let tcx = ty::mk_ctxt(sess,
|
||||
&type_arena,
|
||||
def_map,
|
||||
named_region_map,
|
||||
ast_map,
|
||||
|
@ -139,19 +142,20 @@ fn test_env(_test_name: &str,
|
|||
lang_items,
|
||||
stability_index);
|
||||
let infcx = infer::new_infer_ctxt(&tcx);
|
||||
let env = Env {krate: krate,
|
||||
tcx: &tcx,
|
||||
infcx: &infcx};
|
||||
let env = Env {
|
||||
krate: krate,
|
||||
infcx: &infcx
|
||||
};
|
||||
body(env);
|
||||
infcx.resolve_regions_and_report_errors();
|
||||
assert_eq!(tcx.sess.err_count(), expected_err_count);
|
||||
}
|
||||
|
||||
impl<'a> Env<'a> {
|
||||
impl<'a, 'tcx> Env<'a, 'tcx> {
|
||||
pub fn create_region_hierarchy(&self, rh: &RH) {
|
||||
for child_rh in rh.sub.iter() {
|
||||
self.create_region_hierarchy(child_rh);
|
||||
self.tcx.region_maps.record_encl_scope(child_rh.id, rh.id);
|
||||
self.infcx.tcx.region_maps.record_encl_scope(child_rh.id, rh.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -181,7 +185,7 @@ fn search_mod(this: &Env,
|
|||
-> Option<ast::NodeId> {
|
||||
assert!(idx < names.len());
|
||||
for item in m.items.iter() {
|
||||
if item.ident.user_string(this.tcx) == names[idx] {
|
||||
if item.ident.user_string(this.infcx.tcx) == names[idx] {
|
||||
return search(this, &**item, idx+1, names);
|
||||
}
|
||||
}
|
||||
|
@ -220,7 +224,7 @@ pub fn make_subtype(&self, a: ty::t, b: ty::t) -> bool {
|
|||
match infer::mk_subty(self.infcx, true, infer::Misc(DUMMY_SP), a, b) {
|
||||
Ok(_) => true,
|
||||
Err(ref e) => fail!("Encountered error: {}",
|
||||
ty::type_err_to_str(self.tcx, e))
|
||||
ty::type_err_to_str(self.infcx.tcx, e))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,7 +257,7 @@ pub fn assert_eq(&self, a: ty::t, b: ty::t) {
|
|||
}
|
||||
|
||||
pub fn ty_to_string(&self, a: ty::t) -> String {
|
||||
ty_to_string(self.tcx, a)
|
||||
ty_to_string(self.infcx.tcx, a)
|
||||
}
|
||||
|
||||
pub fn t_fn(&self,
|
||||
|
@ -262,7 +266,7 @@ pub fn t_fn(&self,
|
|||
output_ty: ty::t)
|
||||
-> ty::t
|
||||
{
|
||||
ty::mk_ctor_fn(self.tcx, binder_id, input_tys, output_ty)
|
||||
ty::mk_ctor_fn(self.infcx.tcx, binder_id, input_tys, output_ty)
|
||||
}
|
||||
|
||||
pub fn t_int(&self) -> ty::t {
|
||||
|
@ -270,23 +274,23 @@ pub fn t_int(&self) -> ty::t {
|
|||
}
|
||||
|
||||
pub fn t_rptr_late_bound(&self, binder_id: ast::NodeId, id: uint) -> ty::t {
|
||||
ty::mk_imm_rptr(self.tcx, ty::ReLateBound(binder_id, ty::BrAnon(id)),
|
||||
ty::mk_imm_rptr(self.infcx.tcx, ty::ReLateBound(binder_id, ty::BrAnon(id)),
|
||||
self.t_int())
|
||||
}
|
||||
|
||||
pub fn t_rptr_scope(&self, id: ast::NodeId) -> ty::t {
|
||||
ty::mk_imm_rptr(self.tcx, ty::ReScope(id), self.t_int())
|
||||
ty::mk_imm_rptr(self.infcx.tcx, ty::ReScope(id), self.t_int())
|
||||
}
|
||||
|
||||
pub fn t_rptr_free(&self, nid: ast::NodeId, id: uint) -> ty::t {
|
||||
ty::mk_imm_rptr(self.tcx,
|
||||
ty::mk_imm_rptr(self.infcx.tcx,
|
||||
ty::ReFree(ty::FreeRegion {scope_id: nid,
|
||||
bound_region: ty::BrAnon(id)}),
|
||||
self.t_int())
|
||||
}
|
||||
|
||||
pub fn t_rptr_static(&self) -> ty::t {
|
||||
ty::mk_imm_rptr(self.tcx, ty::ReStatic, self.t_int())
|
||||
ty::mk_imm_rptr(self.infcx.tcx, ty::ReStatic, self.t_int())
|
||||
}
|
||||
|
||||
pub fn dummy_type_trace(&self) -> infer::TypeTrace {
|
||||
|
@ -299,12 +303,12 @@ pub fn dummy_type_trace(&self) -> infer::TypeTrace {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn lub(&self) -> Lub<'a> {
|
||||
pub fn lub(&self) -> Lub<'a, 'tcx> {
|
||||
let trace = self.dummy_type_trace();
|
||||
Lub(self.infcx.combine_fields(true, trace))
|
||||
}
|
||||
|
||||
pub fn glb(&self) -> Glb<'a> {
|
||||
pub fn glb(&self) -> Glb<'a, 'tcx> {
|
||||
let trace = self.dummy_type_trace();
|
||||
Glb(self.infcx.combine_fields(true, trace))
|
||||
}
|
||||
|
@ -317,7 +321,7 @@ pub fn make_lub_ty(&self, t1: ty::t, t2: ty::t) -> ty::t {
|
|||
match self.lub().tys(t1, t2) {
|
||||
Ok(t) => t,
|
||||
Err(ref e) => fail!("unexpected error computing LUB: {:?}",
|
||||
ty::type_err_to_str(self.tcx, e))
|
||||
ty::type_err_to_str(self.infcx.tcx, e))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -329,7 +333,7 @@ pub fn check_lub(&self, t1: ty::t, t2: ty::t, t_lub: ty::t) {
|
|||
}
|
||||
Err(ref e) => {
|
||||
fail!("unexpected error in LUB: {}",
|
||||
ty::type_err_to_str(self.tcx, e))
|
||||
ty::type_err_to_str(self.infcx.tcx, e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -288,8 +288,8 @@ fn simple_var_t(&self,
|
|||
-> ures;
|
||||
}
|
||||
|
||||
impl<'tcx,V:SimplyUnifiable,K:UnifyKey<Option<V>>>
|
||||
InferCtxtMethodsForSimplyUnifiableTypes<V,K> for InferCtxt<'tcx>
|
||||
impl<'a,'tcx,V:SimplyUnifiable,K:UnifyKey<Option<V>>>
|
||||
InferCtxtMethodsForSimplyUnifiableTypes<V,K> for InferCtxt<'a, 'tcx>
|
||||
{
|
||||
fn simple_vars(&self,
|
||||
a_is_expected: bool,
|
||||
|
|
|
@ -281,10 +281,10 @@ fn repr(&self, tcx: &ty::ctxt) -> String {
|
|||
|
||||
pub type impl_vtable_map = RefCell<DefIdMap<vtable_res>>;
|
||||
|
||||
pub struct CrateCtxt<'a> {
|
||||
pub struct CrateCtxt<'a, 'tcx: 'a> {
|
||||
// A mapping from method call sites to traits that have that method.
|
||||
trait_map: resolve::TraitMap,
|
||||
tcx: &'a ty::ctxt
|
||||
tcx: &'a ty::ctxt<'tcx>
|
||||
}
|
||||
|
||||
// Functions that write types into the node type table
|
||||
|
|
|
@ -254,8 +254,8 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|||
* The first pass over the crate simply builds up the set of inferreds.
|
||||
*/
|
||||
|
||||
struct TermsContext<'a> {
|
||||
tcx: &'a ty::ctxt,
|
||||
struct TermsContext<'a, 'tcx: 'a> {
|
||||
tcx: &'a ty::ctxt<'tcx>,
|
||||
arena: &'a Arena,
|
||||
|
||||
empty_variances: Rc<ty::ItemVariances>,
|
||||
|
@ -283,10 +283,10 @@ struct InferredInfo<'a> {
|
|||
term: VarianceTermPtr<'a>,
|
||||
}
|
||||
|
||||
fn determine_parameters_to_be_inferred<'a>(tcx: &'a ty::ctxt,
|
||||
arena: &'a mut Arena,
|
||||
krate: &ast::Crate)
|
||||
-> TermsContext<'a> {
|
||||
fn determine_parameters_to_be_inferred<'a, 'tcx>(tcx: &'a ty::ctxt<'tcx>,
|
||||
arena: &'a mut Arena,
|
||||
krate: &ast::Crate)
|
||||
-> TermsContext<'a, 'tcx> {
|
||||
let mut terms_cx = TermsContext {
|
||||
tcx: tcx,
|
||||
arena: arena,
|
||||
|
@ -306,7 +306,7 @@ fn determine_parameters_to_be_inferred<'a>(tcx: &'a ty::ctxt,
|
|||
terms_cx
|
||||
}
|
||||
|
||||
impl<'a> TermsContext<'a> {
|
||||
impl<'a, 'tcx> TermsContext<'a, 'tcx> {
|
||||
fn add_inferred(&mut self,
|
||||
item_id: ast::NodeId,
|
||||
kind: ParamKind,
|
||||
|
@ -337,7 +337,7 @@ fn num_inferred(&self) -> uint {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for TermsContext<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for TermsContext<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
debug!("add_inferreds for item {}", item.repr(self.tcx));
|
||||
|
||||
|
@ -402,8 +402,8 @@ fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
|||
* We walk the set of items and, for each member, generate new constraints.
|
||||
*/
|
||||
|
||||
struct ConstraintContext<'a> {
|
||||
terms_cx: TermsContext<'a>,
|
||||
struct ConstraintContext<'a, 'tcx: 'a> {
|
||||
terms_cx: TermsContext<'a, 'tcx>,
|
||||
|
||||
// These are the def-id of the std::kinds::marker::InvariantType,
|
||||
// std::kinds::marker::InvariantLifetime, and so on. The arrays
|
||||
|
@ -431,9 +431,9 @@ struct Constraint<'a> {
|
|||
variance: &'a VarianceTerm<'a>,
|
||||
}
|
||||
|
||||
fn add_constraints_from_crate<'a>(terms_cx: TermsContext<'a>,
|
||||
krate: &ast::Crate)
|
||||
-> ConstraintContext<'a> {
|
||||
fn add_constraints_from_crate<'a, 'tcx>(terms_cx: TermsContext<'a, 'tcx>,
|
||||
krate: &ast::Crate)
|
||||
-> ConstraintContext<'a, 'tcx> {
|
||||
let mut invariant_lang_items = [None, ..2];
|
||||
let mut covariant_lang_items = [None, ..2];
|
||||
let mut contravariant_lang_items = [None, ..2];
|
||||
|
@ -477,7 +477,7 @@ fn add_constraints_from_crate<'a>(terms_cx: TermsContext<'a>,
|
|||
constraint_cx
|
||||
}
|
||||
|
||||
impl<'a> Visitor<()> for ConstraintContext<'a> {
|
||||
impl<'a, 'tcx> Visitor<()> for ConstraintContext<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item, _: ()) {
|
||||
let did = ast_util::local_def(item.id);
|
||||
let tcx = self.terms_cx.tcx;
|
||||
|
@ -546,8 +546,8 @@ fn is_lifetime(map: &ast_map::Map, param_id: ast::NodeId) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> ConstraintContext<'a> {
|
||||
fn tcx(&self) -> &'a ty::ctxt {
|
||||
impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||
fn tcx(&self) -> &'a ty::ctxt<'tcx> {
|
||||
self.terms_cx.tcx
|
||||
}
|
||||
|
||||
|
@ -942,8 +942,8 @@ fn add_constraints_from_mt(&mut self,
|
|||
* inferred is then written into the `variance_map` in the tcx.
|
||||
*/
|
||||
|
||||
struct SolveContext<'a> {
|
||||
terms_cx: TermsContext<'a>,
|
||||
struct SolveContext<'a, 'tcx: 'a> {
|
||||
terms_cx: TermsContext<'a, 'tcx>,
|
||||
constraints: Vec<Constraint<'a>> ,
|
||||
|
||||
// Maps from an InferredIndex to the inferred value for that variable.
|
||||
|
@ -961,7 +961,7 @@ fn solve_constraints(constraints_cx: ConstraintContext) {
|
|||
solutions_cx.write();
|
||||
}
|
||||
|
||||
impl<'a> SolveContext<'a> {
|
||||
impl<'a, 'tcx> SolveContext<'a, 'tcx> {
|
||||
fn solve(&mut self) {
|
||||
// Propagate constraints until a fixed point is reached. Note
|
||||
// that the maximum number of iterations is 2C where C is the
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
use rustc::middle::subst;
|
||||
use rustc::middle::stability;
|
||||
|
||||
use core;
|
||||
use core::DocContext;
|
||||
use doctree;
|
||||
use clean;
|
||||
|
||||
|
@ -39,12 +39,11 @@
|
|||
///
|
||||
/// The returned value is `None` if the `id` could not be inlined, and `Some`
|
||||
/// of a vector of items if it was successfully expanded.
|
||||
pub fn try_inline(id: ast::NodeId, into: Option<ast::Ident>)
|
||||
pub fn try_inline(cx: &DocContext, id: ast::NodeId, into: Option<ast::Ident>)
|
||||
-> Option<Vec<clean::Item>> {
|
||||
let cx = ::ctxtkey.get().unwrap();
|
||||
let tcx = match cx.maybe_typed {
|
||||
core::Typed(ref tycx) => tycx,
|
||||
core::NotTyped(_) => return None,
|
||||
let tcx = match cx.tcx_opt() {
|
||||
Some(tcx) => tcx,
|
||||
None => return None,
|
||||
};
|
||||
let def = match tcx.def_map.borrow().find(&id) {
|
||||
Some(def) => *def,
|
||||
|
@ -52,11 +51,11 @@ pub fn try_inline(id: ast::NodeId, into: Option<ast::Ident>)
|
|||
};
|
||||
let did = def.def_id();
|
||||
if ast_util::is_local(did) { return None }
|
||||
try_inline_def(&**cx, tcx, def).map(|vec| {
|
||||
try_inline_def(cx, tcx, def).map(|vec| {
|
||||
vec.move_iter().map(|mut item| {
|
||||
match into {
|
||||
Some(into) if item.name.is_some() => {
|
||||
item.name = Some(into.clean());
|
||||
item.name = Some(into.clean(cx));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
@ -65,15 +64,14 @@ pub fn try_inline(id: ast::NodeId, into: Option<ast::Ident>)
|
|||
})
|
||||
}
|
||||
|
||||
fn try_inline_def(cx: &core::DocContext,
|
||||
tcx: &ty::ctxt,
|
||||
fn try_inline_def(cx: &DocContext, tcx: &ty::ctxt,
|
||||
def: def::Def) -> Option<Vec<clean::Item>> {
|
||||
let mut ret = Vec::new();
|
||||
let did = def.def_id();
|
||||
let inner = match def {
|
||||
def::DefTrait(did) => {
|
||||
record_extern_fqn(cx, did, clean::TypeTrait);
|
||||
clean::TraitItem(build_external_trait(tcx, did))
|
||||
clean::TraitItem(build_external_trait(cx, tcx, did))
|
||||
}
|
||||
def::DefFn(did, style) => {
|
||||
// If this function is a tuple struct constructor, we just skip it
|
||||
|
@ -82,17 +80,17 @@ fn try_inline_def(cx: &core::DocContext,
|
|||
return None
|
||||
}
|
||||
record_extern_fqn(cx, did, clean::TypeFunction);
|
||||
clean::FunctionItem(build_external_function(tcx, did, style))
|
||||
clean::FunctionItem(build_external_function(cx, tcx, did, style))
|
||||
}
|
||||
def::DefStruct(did) => {
|
||||
record_extern_fqn(cx, did, clean::TypeStruct);
|
||||
ret.extend(build_impls(cx, tcx, did).move_iter());
|
||||
clean::StructItem(build_struct(tcx, did))
|
||||
clean::StructItem(build_struct(cx, tcx, did))
|
||||
}
|
||||
def::DefTy(did) => {
|
||||
record_extern_fqn(cx, did, clean::TypeEnum);
|
||||
ret.extend(build_impls(cx, tcx, did).move_iter());
|
||||
build_type(tcx, did)
|
||||
build_type(cx, tcx, did)
|
||||
}
|
||||
// Assume that the enum type is reexported next to the variant, and
|
||||
// variants don't show up in documentation specially.
|
||||
|
@ -103,7 +101,7 @@ fn try_inline_def(cx: &core::DocContext,
|
|||
}
|
||||
def::DefStatic(did, mtbl) => {
|
||||
record_extern_fqn(cx, did, clean::TypeStatic);
|
||||
clean::StaticItem(build_static(tcx, did, mtbl))
|
||||
clean::StaticItem(build_static(cx, tcx, did, mtbl))
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
|
@ -112,20 +110,21 @@ fn try_inline_def(cx: &core::DocContext,
|
|||
ret.push(clean::Item {
|
||||
source: clean::Span::empty(),
|
||||
name: Some(fqn.last().unwrap().to_string()),
|
||||
attrs: load_attrs(tcx, did),
|
||||
attrs: load_attrs(cx, tcx, did),
|
||||
inner: inner,
|
||||
visibility: Some(ast::Public),
|
||||
stability: stability::lookup(tcx, did).clean(),
|
||||
stability: stability::lookup(tcx, did).clean(cx),
|
||||
def_id: did,
|
||||
});
|
||||
Some(ret)
|
||||
}
|
||||
|
||||
pub fn load_attrs(tcx: &ty::ctxt, did: ast::DefId) -> Vec<clean::Attribute> {
|
||||
pub fn load_attrs(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId) -> Vec<clean::Attribute> {
|
||||
let mut attrs = Vec::new();
|
||||
csearch::get_item_attrs(&tcx.sess.cstore, did, |v| {
|
||||
attrs.extend(v.move_iter().map(|a| {
|
||||
a.clean()
|
||||
a.clean(cx)
|
||||
}));
|
||||
});
|
||||
attrs
|
||||
|
@ -135,22 +134,21 @@ pub fn load_attrs(tcx: &ty::ctxt, did: ast::DefId) -> Vec<clean::Attribute> {
|
|||
///
|
||||
/// These names are used later on by HTML rendering to generate things like
|
||||
/// source links back to the original item.
|
||||
pub fn record_extern_fqn(cx: &core::DocContext,
|
||||
did: ast::DefId,
|
||||
kind: clean::TypeKind) {
|
||||
match cx.maybe_typed {
|
||||
core::Typed(ref tcx) => {
|
||||
pub fn record_extern_fqn(cx: &DocContext, did: ast::DefId, kind: clean::TypeKind) {
|
||||
match cx.tcx_opt() {
|
||||
Some(tcx) => {
|
||||
let fqn = csearch::get_item_path(tcx, did);
|
||||
let fqn = fqn.move_iter().map(|i| i.to_string()).collect();
|
||||
cx.external_paths.borrow_mut().as_mut().unwrap().insert(did, (fqn, kind));
|
||||
}
|
||||
core::NotTyped(..) => {}
|
||||
None => {}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build_external_trait(tcx: &ty::ctxt, did: ast::DefId) -> clean::Trait {
|
||||
pub fn build_external_trait(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId) -> clean::Trait {
|
||||
let def = ty::lookup_trait_def(tcx, did);
|
||||
let trait_items = ty::trait_items(tcx, did).clean();
|
||||
let trait_items = ty::trait_items(tcx, did).clean(cx);
|
||||
let provided = ty::provided_trait_methods(tcx, did);
|
||||
let mut items = trait_items.move_iter().map(|trait_item| {
|
||||
if provided.iter().any(|a| a.def_id == trait_item.def_id) {
|
||||
|
@ -160,29 +158,29 @@ pub fn build_external_trait(tcx: &ty::ctxt, did: ast::DefId) -> clean::Trait {
|
|||
}
|
||||
});
|
||||
let trait_def = ty::lookup_trait_def(tcx, did);
|
||||
let bounds = trait_def.bounds.clean();
|
||||
let bounds = trait_def.bounds.clean(cx);
|
||||
clean::Trait {
|
||||
generics: (&def.generics, subst::TypeSpace).clean(),
|
||||
generics: (&def.generics, subst::TypeSpace).clean(cx),
|
||||
items: items.collect(),
|
||||
bounds: bounds,
|
||||
}
|
||||
}
|
||||
|
||||
fn build_external_function(tcx: &ty::ctxt,
|
||||
fn build_external_function(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId,
|
||||
style: ast::FnStyle) -> clean::Function {
|
||||
let t = ty::lookup_item_type(tcx, did);
|
||||
clean::Function {
|
||||
decl: match ty::get(t.ty).sty {
|
||||
ty::ty_bare_fn(ref f) => (did, &f.sig).clean(),
|
||||
ty::ty_bare_fn(ref f) => (did, &f.sig).clean(cx),
|
||||
_ => fail!("bad function"),
|
||||
},
|
||||
generics: (&t.generics, subst::FnSpace).clean(),
|
||||
generics: (&t.generics, subst::FnSpace).clean(cx),
|
||||
fn_style: style,
|
||||
}
|
||||
}
|
||||
|
||||
fn build_struct(tcx: &ty::ctxt, did: ast::DefId) -> clean::Struct {
|
||||
fn build_struct(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> clean::Struct {
|
||||
use syntax::parse::token::special_idents::unnamed_field;
|
||||
|
||||
let t = ty::lookup_item_type(tcx, did);
|
||||
|
@ -195,33 +193,32 @@ fn build_struct(tcx: &ty::ctxt, did: ast::DefId) -> clean::Struct {
|
|||
[ref f, ..] if f.name == unnamed_field.name => doctree::Tuple,
|
||||
_ => doctree::Plain,
|
||||
},
|
||||
generics: (&t.generics, subst::TypeSpace).clean(),
|
||||
fields: fields.clean(),
|
||||
generics: (&t.generics, subst::TypeSpace).clean(cx),
|
||||
fields: fields.clean(cx),
|
||||
fields_stripped: false,
|
||||
}
|
||||
}
|
||||
|
||||
fn build_type(tcx: &ty::ctxt, did: ast::DefId) -> clean::ItemEnum {
|
||||
fn build_type(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> clean::ItemEnum {
|
||||
let t = ty::lookup_item_type(tcx, did);
|
||||
match ty::get(t.ty).sty {
|
||||
ty::ty_enum(edid, _) if !csearch::is_typedef(&tcx.sess.cstore, did) => {
|
||||
return clean::EnumItem(clean::Enum {
|
||||
generics: (&t.generics, subst::TypeSpace).clean(),
|
||||
generics: (&t.generics, subst::TypeSpace).clean(cx),
|
||||
variants_stripped: false,
|
||||
variants: ty::enum_variants(tcx, edid).clean(),
|
||||
variants: ty::enum_variants(tcx, edid).clean(cx),
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
clean::TypedefItem(clean::Typedef {
|
||||
type_: t.ty.clean(),
|
||||
generics: (&t.generics, subst::TypeSpace).clean(),
|
||||
type_: t.ty.clean(cx),
|
||||
generics: (&t.generics, subst::TypeSpace).clean(cx),
|
||||
})
|
||||
}
|
||||
|
||||
fn build_impls(cx: &core::DocContext,
|
||||
tcx: &ty::ctxt,
|
||||
fn build_impls(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId) -> Vec<clean::Item> {
|
||||
ty::populate_implementations_for_type_if_necessary(tcx, did);
|
||||
let mut impls = Vec::new();
|
||||
|
@ -248,8 +245,7 @@ fn build_impls(cx: &core::DocContext,
|
|||
populate_impls(cx, tcx, def, &mut impls)
|
||||
});
|
||||
|
||||
fn populate_impls(cx: &core::DocContext,
|
||||
tcx: &ty::ctxt,
|
||||
fn populate_impls(cx: &DocContext, tcx: &ty::ctxt,
|
||||
def: decoder::DefLike,
|
||||
impls: &mut Vec<Option<clean::Item>>) {
|
||||
match def {
|
||||
|
@ -269,8 +265,7 @@ fn populate_impls(cx: &core::DocContext,
|
|||
impls.move_iter().filter_map(|a| a).collect()
|
||||
}
|
||||
|
||||
fn build_impl(cx: &core::DocContext,
|
||||
tcx: &ty::ctxt,
|
||||
fn build_impl(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId) -> Option<clean::Item> {
|
||||
if !cx.inlined.borrow_mut().as_mut().unwrap().insert(did) {
|
||||
return None
|
||||
|
@ -280,7 +275,7 @@ fn build_impl(cx: &core::DocContext,
|
|||
// If this is an impl for a #[doc(hidden)] trait, be sure to not inline it.
|
||||
match associated_trait {
|
||||
Some(ref t) => {
|
||||
let trait_attrs = load_attrs(tcx, t.def_id);
|
||||
let trait_attrs = load_attrs(cx, tcx, t.def_id);
|
||||
if trait_attrs.iter().any(|a| is_doc_hidden(a)) {
|
||||
return None
|
||||
}
|
||||
|
@ -288,7 +283,7 @@ fn build_impl(cx: &core::DocContext,
|
|||
None => {}
|
||||
}
|
||||
|
||||
let attrs = load_attrs(tcx, did);
|
||||
let attrs = load_attrs(cx, tcx, did);
|
||||
let ty = ty::lookup_item_type(tcx, did);
|
||||
let trait_items = csearch::get_impl_items(&tcx.sess.cstore, did)
|
||||
.iter()
|
||||
|
@ -300,7 +295,7 @@ fn build_impl(cx: &core::DocContext,
|
|||
if method.vis != ast::Public && associated_trait.is_none() {
|
||||
return None
|
||||
}
|
||||
let mut item = method.clean();
|
||||
let mut item = method.clean(cx);
|
||||
item.inner = match item.inner.clone() {
|
||||
clean::TyMethodItem(clean::TyMethod {
|
||||
fn_style, decl, self_, generics
|
||||
|
@ -321,21 +316,21 @@ fn build_impl(cx: &core::DocContext,
|
|||
return Some(clean::Item {
|
||||
inner: clean::ImplItem(clean::Impl {
|
||||
derived: clean::detect_derived(attrs.as_slice()),
|
||||
trait_: associated_trait.clean().map(|bound| {
|
||||
trait_: associated_trait.clean(cx).map(|bound| {
|
||||
match bound {
|
||||
clean::TraitBound(ty) => ty,
|
||||
clean::RegionBound => unreachable!(),
|
||||
}
|
||||
}),
|
||||
for_: ty.ty.clean(),
|
||||
generics: (&ty.generics, subst::TypeSpace).clean(),
|
||||
for_: ty.ty.clean(cx),
|
||||
generics: (&ty.generics, subst::TypeSpace).clean(cx),
|
||||
items: trait_items,
|
||||
}),
|
||||
source: clean::Span::empty(),
|
||||
name: None,
|
||||
attrs: attrs,
|
||||
visibility: Some(ast::Inherited),
|
||||
stability: stability::lookup(tcx, did).clean(),
|
||||
stability: stability::lookup(tcx, did).clean(cx),
|
||||
def_id: did,
|
||||
});
|
||||
|
||||
|
@ -354,7 +349,7 @@ fn is_doc_hidden(a: &clean::Attribute) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
fn build_module(cx: &core::DocContext, tcx: &ty::ctxt,
|
||||
fn build_module(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId) -> clean::Module {
|
||||
let mut items = Vec::new();
|
||||
fill_in(cx, tcx, did, &mut items);
|
||||
|
@ -365,7 +360,7 @@ fn build_module(cx: &core::DocContext, tcx: &ty::ctxt,
|
|||
|
||||
// FIXME: this doesn't handle reexports inside the module itself.
|
||||
// Should they be handled?
|
||||
fn fill_in(cx: &core::DocContext, tcx: &ty::ctxt, did: ast::DefId,
|
||||
fn fill_in(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId,
|
||||
items: &mut Vec<clean::Item>) {
|
||||
csearch::each_child_of_item(&tcx.sess.cstore, did, |def, _, vis| {
|
||||
match def {
|
||||
|
@ -387,11 +382,11 @@ fn fill_in(cx: &core::DocContext, tcx: &ty::ctxt, did: ast::DefId,
|
|||
}
|
||||
}
|
||||
|
||||
fn build_static(tcx: &ty::ctxt,
|
||||
fn build_static(cx: &DocContext, tcx: &ty::ctxt,
|
||||
did: ast::DefId,
|
||||
mutable: bool) -> clean::Static {
|
||||
clean::Static {
|
||||
type_: ty::lookup_item_type(tcx, did).ty.clean(),
|
||||
type_: ty::lookup_item_type(tcx, did).ty.clean(cx),
|
||||
mutability: if mutable {clean::Mutable} else {clean::Immutable},
|
||||
expr: "\n\n\n".to_string(), // trigger the "[definition]" links
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -22,23 +22,24 @@
|
|||
use std::gc::GC;
|
||||
use std::os;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use arena::TypedArena;
|
||||
|
||||
use visit_ast::RustdocVisitor;
|
||||
use clean;
|
||||
use clean::Clean;
|
||||
|
||||
/// Are we generating documentation (`Typed`) or tests (`NotTyped`)?
|
||||
pub enum MaybeTyped {
|
||||
Typed(middle::ty::ctxt),
|
||||
pub enum MaybeTyped<'tcx> {
|
||||
Typed(middle::ty::ctxt<'tcx>),
|
||||
NotTyped(driver::session::Session)
|
||||
}
|
||||
|
||||
pub type ExternalPaths = RefCell<Option<HashMap<ast::DefId,
|
||||
(Vec<String>, clean::TypeKind)>>>;
|
||||
|
||||
pub struct DocContext {
|
||||
pub struct DocContext<'tcx> {
|
||||
pub krate: ast::Crate,
|
||||
pub maybe_typed: MaybeTyped,
|
||||
pub maybe_typed: MaybeTyped<'tcx>,
|
||||
pub src: Path,
|
||||
pub external_paths: ExternalPaths,
|
||||
pub external_traits: RefCell<Option<HashMap<ast::DefId, clean::Trait>>>,
|
||||
|
@ -47,7 +48,7 @@ pub struct DocContext {
|
|||
pub populated_crate_impls: RefCell<HashSet<ast::CrateNum>>,
|
||||
}
|
||||
|
||||
impl DocContext {
|
||||
impl<'tcx> DocContext<'tcx> {
|
||||
pub fn sess<'a>(&'a self) -> &'a driver::session::Session {
|
||||
match self.maybe_typed {
|
||||
Typed(ref tcx) => &tcx.sess,
|
||||
|
@ -55,14 +56,14 @@ pub fn sess<'a>(&'a self) -> &'a driver::session::Session {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn tcx_opt<'a>(&'a self) -> Option<&'a ty::ctxt> {
|
||||
pub fn tcx_opt<'a>(&'a self) -> Option<&'a ty::ctxt<'tcx>> {
|
||||
match self.maybe_typed {
|
||||
Typed(ref tcx) => Some(tcx),
|
||||
NotTyped(_) => None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt {
|
||||
pub fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> {
|
||||
let tcx_opt = self.tcx_opt();
|
||||
tcx_opt.expect("tcx not present")
|
||||
}
|
||||
|
@ -80,9 +81,10 @@ pub struct CrateAnalysis {
|
|||
pub type Externs = HashMap<String, Vec<String>>;
|
||||
|
||||
/// Parses, resolves, and typechecks the given crate
|
||||
fn get_ast_and_resolve(cpath: &Path, libs: Vec<Path>, cfgs: Vec<String>,
|
||||
externs: Externs, triple: Option<String>)
|
||||
-> (DocContext, CrateAnalysis) {
|
||||
fn get_ast_and_resolve<'tcx>(cpath: &Path, libs: Vec<Path>, cfgs: Vec<String>,
|
||||
externs: Externs, triple: Option<String>,
|
||||
type_arena: &'tcx TypedArena<ty::t_box_>)
|
||||
-> (DocContext<'tcx>, CrateAnalysis) {
|
||||
use syntax::codemap::dummy_spanned;
|
||||
use rustc::driver::driver::{FileInput,
|
||||
phase_1_parse_input,
|
||||
|
@ -131,7 +133,7 @@ fn get_ast_and_resolve(cpath: &Path, libs: Vec<Path>, cfgs: Vec<String>,
|
|||
|
||||
let driver::driver::CrateAnalysis {
|
||||
exported_items, public_items, ty_cx, ..
|
||||
} = phase_3_run_analysis_passes(sess, &krate, ast_map, name);
|
||||
} = phase_3_run_analysis_passes(sess, &krate, ast_map, type_arena, name);
|
||||
|
||||
debug!("crate: {:?}", krate);
|
||||
(DocContext {
|
||||
|
@ -156,14 +158,14 @@ fn get_ast_and_resolve(cpath: &Path, libs: Vec<Path>, cfgs: Vec<String>,
|
|||
pub fn run_core(libs: Vec<Path>, cfgs: Vec<String>, externs: Externs,
|
||||
path: &Path, triple: Option<String>)
|
||||
-> (clean::Crate, CrateAnalysis) {
|
||||
let (ctxt, analysis) = get_ast_and_resolve(path, libs, cfgs, externs, triple);
|
||||
let ctxt = box(GC) ctxt;
|
||||
super::ctxtkey.replace(Some(ctxt));
|
||||
let type_arena = TypedArena::new();
|
||||
let (ctxt, analysis) = get_ast_and_resolve(path, libs, cfgs, externs,
|
||||
triple, &type_arena);
|
||||
|
||||
let krate = {
|
||||
let mut v = RustdocVisitor::new(&*ctxt, Some(&analysis));
|
||||
let mut v = RustdocVisitor::new(&ctxt, Some(&analysis));
|
||||
v.visit(&ctxt.krate);
|
||||
v.clean()
|
||||
v.clean(&ctxt)
|
||||
};
|
||||
|
||||
let external_paths = ctxt.external_paths.borrow_mut().take();
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#![feature(globs, struct_variant, managed_boxes, macro_rules, phase)]
|
||||
|
||||
extern crate arena;
|
||||
extern crate debug;
|
||||
extern crate getopts;
|
||||
extern crate libc;
|
||||
|
@ -29,7 +30,6 @@
|
|||
|
||||
use std::io;
|
||||
use std::io::{File, MemWriter};
|
||||
use std::gc::Gc;
|
||||
use std::collections::HashMap;
|
||||
use serialize::{json, Decodable, Encodable};
|
||||
use externalfiles::ExternalHtml;
|
||||
|
@ -83,7 +83,6 @@ pub mod html {
|
|||
"unindent-comments",
|
||||
];
|
||||
|
||||
local_data_key!(pub ctxtkey: Gc<core::DocContext>)
|
||||
local_data_key!(pub analysiskey: core::CrateAnalysis)
|
||||
|
||||
type Output = (clean::Crate, Vec<plugins::PluginJson> );
|
||||
|
|
|
@ -74,7 +74,7 @@ pub fn run(input: &str,
|
|||
"rustdoc-test", None)
|
||||
.expect("phase_2_configure_and_expand aborted in rustdoc!");
|
||||
|
||||
let ctx = box(GC) core::DocContext {
|
||||
let ctx = core::DocContext {
|
||||
krate: krate,
|
||||
maybe_typed: core::NotTyped(sess),
|
||||
src: input_path,
|
||||
|
@ -84,11 +84,10 @@ pub fn run(input: &str,
|
|||
inlined: RefCell::new(None),
|
||||
populated_crate_impls: RefCell::new(HashSet::new()),
|
||||
};
|
||||
super::ctxtkey.replace(Some(ctx));
|
||||
|
||||
let mut v = RustdocVisitor::new(&*ctx, None);
|
||||
let mut v = RustdocVisitor::new(&ctx, None);
|
||||
v.visit(&ctx.krate);
|
||||
let mut krate = v.clean();
|
||||
let mut krate = v.clean(&ctx);
|
||||
match crate_name {
|
||||
Some(name) => krate.name = name,
|
||||
None => {}
|
||||
|
|
|
@ -34,16 +34,16 @@
|
|||
// also, is there some reason that this doesn't use the 'visit'
|
||||
// framework from syntax?
|
||||
|
||||
pub struct RustdocVisitor<'a> {
|
||||
pub struct RustdocVisitor<'a, 'tcx: 'a> {
|
||||
pub module: Module,
|
||||
pub attrs: Vec<ast::Attribute>,
|
||||
pub cx: &'a core::DocContext,
|
||||
pub cx: &'a core::DocContext<'tcx>,
|
||||
pub analysis: Option<&'a core::CrateAnalysis>,
|
||||
}
|
||||
|
||||
impl<'a> RustdocVisitor<'a> {
|
||||
pub fn new<'b>(cx: &'b core::DocContext,
|
||||
analysis: Option<&'b core::CrateAnalysis>) -> RustdocVisitor<'b> {
|
||||
impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||
pub fn new(cx: &'a core::DocContext<'tcx>,
|
||||
analysis: Option<&'a core::CrateAnalysis>) -> RustdocVisitor<'a, 'tcx> {
|
||||
RustdocVisitor {
|
||||
module: Module::new(None),
|
||||
attrs: Vec::new(),
|
||||
|
@ -53,11 +53,7 @@ pub fn new<'b>(cx: &'b core::DocContext,
|
|||
}
|
||||
|
||||
fn stability(&self, id: ast::NodeId) -> Option<attr::Stability> {
|
||||
let tcx = match self.cx.maybe_typed {
|
||||
core::Typed(ref tcx) => tcx,
|
||||
core::NotTyped(_) => return None
|
||||
};
|
||||
stability::lookup(tcx, ast_util::local_def(id))
|
||||
self.cx.tcx_opt().and_then(|tcx| stability::lookup(tcx, ast_util::local_def(id)))
|
||||
}
|
||||
|
||||
pub fn visit(&mut self, krate: &ast::Crate) {
|
||||
|
@ -225,9 +221,9 @@ fn visit_view_path(&mut self, path: Gc<ast::ViewPath>,
|
|||
|
||||
fn resolve_id(&mut self, id: ast::NodeId, renamed: Option<ast::Ident>,
|
||||
glob: bool, om: &mut Module, please_inline: bool) -> bool {
|
||||
let tcx = match self.cx.maybe_typed {
|
||||
core::Typed(ref tcx) => tcx,
|
||||
core::NotTyped(_) => return false
|
||||
let tcx = match self.cx.tcx_opt() {
|
||||
Some(tcx) => tcx,
|
||||
None => return false
|
||||
};
|
||||
let def = (*tcx.def_map.borrow())[id].def_id();
|
||||
if !ast_util::is_local(def) { return false }
|
||||
|
|
Loading…
Reference in a new issue