substs: &subst::Substs)
-> ValueRef {
let _icx = push_ctxt("trans_res_dtor");
- let did = if did.krate != ast::LOCAL_CRATE {
- inline::maybe_instantiate_inline(ccx, did)
- } else {
- did
- };
+ let did = inline::maybe_instantiate_inline(ccx, did);
if !substs.types.is_empty() {
assert_eq!(did.krate, ast::LOCAL_CRATE);
let expr_ty = node_id_type(bcx, ref_expr.id);
match def {
def::DefFn(did, _) if {
- let def_id = if did.krate != ast::LOCAL_CRATE {
- inline::maybe_instantiate_inline(bcx.ccx(), did)
- } else {
- did
- };
+ let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did);
match bcx.tcx().map.find(def_id.node) {
Some(ast_map::NodeStructCtor(_)) => true,
_ => false
_ => false
} => {
let substs = node_id_substs(bcx, ExprId(ref_expr.id));
- let def_id = if did.krate != ast::LOCAL_CRATE {
- inline::maybe_instantiate_inline(bcx.ccx(), did)
- } else {
- did
- };
+ let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did);
Callee { bcx: bcx, data: Intrinsic(def_id.node, substs) }
}
def::DefFn(did, _) |
// Check whether this fn has an inlined copy and, if so, redirect
// def_id to the local id of the inlined copy.
- let def_id = {
- if def_id.krate != ast::LOCAL_CRATE {
- inline::maybe_instantiate_inline(ccx, def_id)
- } else {
- def_id
- }
- };
+ let def_id = inline::maybe_instantiate_inline(ccx, def_id);
// We must monomorphise if the fn has type parameters, is a default method,
// or is a named tuple constructor.
// an external global, and return a pointer to that.
let const_ty = expr_ty(bcx, ref_expr);
- fn get_did(ccx: &CrateContext, did: ast::DefId)
- -> ast::DefId {
- if did.krate != ast::LOCAL_CRATE {
- // Case 2 or 3. Which one we're in is determined by
- // whether the DefId produced by `maybe_instantiate_inline`
- // is in the LOCAL_CRATE or not.
- inline::maybe_instantiate_inline(ccx, did)
- } else {
- // Case 1.
- did
- }
- }
-
fn get_val<'a>(bcx: &'a Block<'a>, did: ast::DefId, const_ty: ty::t)
-> ValueRef {
// For external constants, we don't inline.
}
}
}
-
- let did = get_did(bcx.ccx(), did);
+ // The DefId produced by `maybe_instantiate_inline`
+ // may be in the LOCAL_CRATE or not.
+ let did = inline::maybe_instantiate_inline(bcx.ccx(), did);
let val = get_val(bcx, did, const_ty);
DatumBlock::new(bcx, Datum::new(val, const_ty, LvalueExpr))
}
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
use syntax::ast_util::{local_def, PostExpansionMethod};
use syntax::ast_util;
-pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
- -> ast::DefId {
+fn instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
+ -> Option<ast::DefId> {
let _icx = push_ctxt("maybe_instantiate_inline");
match ccx.external().borrow().find(&fn_id) {
Some(&Some(node_id)) => {
// Already inline
debug!("maybe_instantiate_inline({}): already inline as node id {}",
ty::item_path_str(ccx.tcx(), fn_id), node_id);
- return local_def(node_id);
+ return Some(local_def(node_id));
}
Some(&None) => {
- return fn_id; // Not inlinable
+ return None; // Not inlinable
}
None => {
// Not seen yet
csearch::maybe_get_item_ast(
ccx.tcx(), fn_id,
|a,b,c,d| astencode::decode_inlined_item(a, b, c, d));
- return match csearch_result {
+
+ let inline_def = match csearch_result {
csearch::not_found => {
ccx.external().borrow_mut().insert(fn_id, None);
- fn_id
+ return None;
}
csearch::found(ast::IIItem(item)) => {
ccx.external().borrow_mut().insert(fn_id, Some(item.id));
}
}
};
+
+ return Some(inline_def);
+}
+
+pub fn get_local_instance(ccx: &CrateContext, fn_id: ast::DefId)
+ -> Option<ast::DefId> {
+ if fn_id.krate == ast::LOCAL_CRATE {
+ Some(fn_id)
+ } else {
+ instantiate_inline(ccx, fn_id)
+ }
+}
+
+pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId) -> ast::DefId {
+ get_local_instance(ccx, fn_id).unwrap_or(fn_id)
}