]> git.lizzy.rs Git - rust.git/commitdiff
librustc: Emit tuple struct constructor at callsite instead of via a call to a function.
authorLuqman Aden <me@luqman.ca>
Thu, 10 Jul 2014 07:20:28 +0000 (00:20 -0700)
committerLuqman Aden <me@luqman.ca>
Fri, 18 Jul 2014 18:46:03 +0000 (11:46 -0700)
src/librustc/middle/trans/base.rs
src/librustc/middle/trans/callee.rs

index 84db9e5335a1504509e40cc420c87b50d87b25ef..ec4b8d0e40bdbf01d421b2125ae94a66ebf65093 100644 (file)
@@ -1704,11 +1704,11 @@ pub fn trans_enum_variant(ccx: &CrateContext,
         llfndecl);
 }
 
-pub fn trans_enum_variant_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<'a>(mut bcx: &'a Block<'a>,
+                                         ctor_ty: ty::t,
+                                         disr: ty::Disr,
+                                         args: callee::CallArgs,
+                                         dest: expr::Dest) -> Result<'a> {
 
     let ccx = bcx.fcx.ccx;
     let tcx = &ccx.tcx;
index 608710a250825a8335106c09677e653775378988..ac3f357791596259ebabd491ae6592d1e1e7390a 100644 (file)
@@ -54,6 +54,7 @@
 
 use std::gc::Gc;
 use syntax::ast;
+use syntax::ast_map;
 use synabi = syntax::abi;
 
 pub struct MethodData {
@@ -66,7 +67,7 @@ pub enum CalleeData {
 
     // Constructor for enum variant/tuple-like-struct
     // i.e. Some, Ok
-    TupleVariantConstructor(subst::Substs, ty::Disr),
+    NamedTupleConstructor(subst::Substs, ty::Disr),
 
     // Represents a (possibly monomorphized) top-level fn item or method
     // item. Note that this is just the fn-ptr and is not a Rust closure
@@ -138,6 +139,23 @@ fn trans_def<'a>(bcx: &'a Block<'a>, def: def::Def, ref_expr: &ast::Expr)
         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 {
+            def::DefFn(did, _) if {
+                let def_id = if did.krate != ast::LOCAL_CRATE {
+                    inline::maybe_instantiate_inline(bcx.ccx(), did)
+                } else {
+                    did
+                };
+                match bcx.tcx().map.find(def_id.node) {
+                    Some(ast_map::NodeStructCtor(_)) => true,
+                    _ => false
+                }
+            } => {
+                let substs = node_id_substs(bcx, ExprId(ref_expr.id));
+                Callee {
+                    bcx: bcx,
+                    data: NamedTupleConstructor(substs, 0)
+                }
+            }
             def::DefFn(did, _) if match ty::get(expr_ty).sty {
                 ty::ty_bare_fn(ref f) => f.abi == synabi::RustIntrinsic,
                 _ => false
@@ -170,11 +188,15 @@ fn trans_def<'a>(bcx: &'a Block<'a>, def: def::Def, ref_expr: &ast::Expr)
 
                 Callee {
                     bcx: bcx,
-                    data: TupleVariantConstructor(substs, vinfo.disr_val)
+                    data: NamedTupleConstructor(substs, vinfo.disr_val)
                 }
             }
-            def::DefStruct(def_id) => {
-                fn_callee(bcx, trans_fn_ref(bcx, def_id, ExprId(ref_expr.id)))
+            def::DefStruct(_) => {
+                let substs = node_id_substs(bcx, ExprId(ref_expr.id));
+                Callee {
+                    bcx: bcx,
+                    data: NamedTupleConstructor(substs, 0)
+                }
             }
             def::DefStatic(..) |
             def::DefArg(..) |
@@ -719,13 +741,13 @@ pub fn trans_call_inner<'a>(
                                                    arg_cleanup_scope, args,
                                                    dest.unwrap(), substs);
         }
-        TupleVariantConstructor(substs, disr) => {
+        NamedTupleConstructor(substs, disr) => {
             assert!(dest.is_some());
             fcx.pop_custom_cleanup_scope(arg_cleanup_scope);
 
             let ctor_ty = callee_ty.subst(bcx.tcx(), &substs);
-            return base::trans_enum_variant_constructor(bcx, ctor_ty, disr,
-                                                        args, dest.unwrap());
+            return base::trans_named_tuple_constructor(bcx, ctor_ty, disr,
+                                                       args, dest.unwrap());
         }
     };