about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/comp/middle/trans.rs47
1 files changed, 21 insertions, 26 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index fab199926e7..cecbe9eb75f 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -163,6 +163,16 @@ fn type_of_fn(cx: &@crate_ctxt, sp: &span, proto: ast::proto,
     ret type_of_fn_full(cx, sp, proto, false, inputs, output, ty_param_count);
 }
 
+// Given a function type and a count of ty params, construct an llvm type
+fn type_of_fn_from_ty(cx: &@crate_ctxt, sp: &span,
+                      fty: &ty::t, ty_param_count: uint) -> TypeRef {
+    ret type_of_fn(cx, sp,
+                   ty::ty_fn_proto(cx.tcx, fty),
+                   ty::ty_fn_args(cx.tcx, fty),
+                   ty::ty_fn_ret(cx.tcx, fty),
+                   ty_param_count);
+}
+
 fn type_of_native_fn(cx: &@crate_ctxt, sp: &span, abi: ast::native_abi,
                      inputs: &ty::arg[], output: &ty::t, ty_param_count: uint)
    -> TypeRef {
@@ -231,8 +241,8 @@ fn type_of_inner(cx: &@crate_ctxt, sp: &span, t: &ty::t) -> TypeRef {
         }
         llty = T_struct(tys);
       }
-      ty::ty_fn(proto, args, out, _, _) {
-        llty = T_fn_pair(*cx, type_of_fn(cx, sp, proto, args, out, 0u));
+      ty::ty_fn(_, _, _, _, _) {
+        llty = T_fn_pair(*cx, type_of_fn_from_ty(cx, sp, t, 0u));
       }
       ty::ty_native_fn(abi, args, out) {
         let nft = native_fn_wrapper_type(cx, sp, 0u, t);
@@ -276,7 +286,6 @@ fn type_of_arg(cx: @local_ctxt, sp: &span, arg: &ty::arg) -> TypeRef {
       }
       _ {
         // fall through
-
       }
     }
     let typ;
@@ -289,14 +298,12 @@ fn type_of_arg(cx: @local_ctxt, sp: &span, arg: &ty::arg) -> TypeRef {
 fn type_of_ty_param_count_and_ty(lcx: @local_ctxt, sp: &span,
                                  tpt: &ty::ty_param_count_and_ty) -> TypeRef {
     alt ty::struct(lcx.ccx.tcx, tpt.ty) {
-      ty::ty_fn(proto, inputs, output, _, _) {
-        let llfnty =
-            type_of_fn(lcx.ccx, sp, proto, inputs, output, tpt.count);
+      ty::ty_fn(_, _, _, _, _) {
+        let llfnty = type_of_fn_from_ty(lcx.ccx, sp, tpt.ty, tpt.count);
         ret T_fn_pair(*lcx.ccx, llfnty);
       }
       _ {
         // fall through
-
       }
     }
     ret type_of(lcx.ccx, sp, tpt.ty);
@@ -3967,9 +3974,7 @@ fn lval_generic_fn(cx: &@block_ctxt, tpt: &ty::ty_param_count_and_ty,
             tydescs += ~[td.val];
         }
         let gen = {item_type: tpt.ty, static_tis: tis, tydescs: tydescs};
-        lv =
-            {res: rslt(bcx, lv.res.val), generic: some[generic_info](gen)
-                with lv};
+        lv = {res: rslt(bcx, lv.res.val), generic: some(gen) with lv};
     }
     ret lv;
 }
@@ -4512,9 +4517,7 @@ fn trans_bind_thunk(cx: &@local_ctxt, sp: &span, incoming_fty: &ty::t,
     // Cast the outgoing function to the appropriate type (see the comments in
     // trans_bind below for why this is necessary).
     let lltargetty =
-        type_of_fn(bcx_ccx(bcx), sp,
-                   ty::ty_fn_proto(bcx_tcx(bcx), outgoing_fty), outgoing_args,
-                   outgoing_ret_ty, ty_param_count);
+        type_of_fn_from_ty(bcx_ccx(bcx), sp, outgoing_fty, ty_param_count);
     lltargetfn = bcx.build.PointerCast(lltargetfn, T_ptr(T_ptr(lltargetty)));
     lltargetfn = bcx.build.Load(lltargetfn);
     bcx.build.FastCall(lltargetfn, llargs);
@@ -4575,7 +4578,6 @@ fn trans_bind_1(cx: &@block_ctxt, f: &@ast::expr, f_res: &lval_result,
     // First, synthesize a tuple type containing the types of all the
     // bound expressions.
     // bindings_ty = ~[bound_ty1, bound_ty2, ...]
-
     let bindings_ty: ty::t = ty::mk_imm_tup(bcx_tcx(cx), bound_tys);
 
     // NB: keep this in sync with T_closure_ptr; we're making
@@ -4629,11 +4631,8 @@ fn trans_bind_1(cx: &@block_ctxt, f: &@ast::expr, f_res: &lval_result,
     // specifically, we know how many type descriptors the outgoing
     // function has, which type_of() doesn't, as only we know which
     // item the function refers to.
-    let llfnty =
-        type_of_fn(bcx_ccx(bcx), cx.sp,
-                   ty::ty_fn_proto(bcx_tcx(bcx), outgoing_fty),
-                   ty::ty_fn_args(bcx_tcx(bcx), outgoing_fty),
-                   ty::ty_fn_ret(bcx_tcx(bcx), outgoing_fty), ty_param_count);
+    let llfnty = type_of_fn_from_ty(bcx_ccx(bcx), cx.sp,
+                                    outgoing_fty, ty_param_count);
     let llclosurety = T_ptr(T_fn_pair(*bcx_ccx(bcx), llfnty));
 
     // Store thunk-target.
@@ -4658,7 +4657,6 @@ fn trans_bind_1(cx: &@block_ctxt, f: &@ast::expr, f_res: &lval_result,
     alt f_res.generic {
       none. {/* nothing to do */ }
       some(ginfo) {
-        lazily_emit_all_generic_info_tydesc_glues(cx, ginfo);
         let ty_params_slot =
             bcx.build.GEP(closure,
                           ~[C_int(0), C_int(abi::closure_elt_ty_params)]);
@@ -5163,11 +5161,7 @@ fn trans_expr_out(cx: &@block_ctxt, e: &@ast::expr, output: out_method) ->
       ast::expr_fn(f) {
         let ccx = bcx_ccx(cx);
         let llfnty: TypeRef =
-            alt ty::struct(ccx.tcx, node_id_type(ccx, e.id)) {
-              ty::ty_fn(proto, inputs, output, _, _) {
-                type_of_fn_full(ccx, e.span, proto, false, inputs, output, 0u)
-              }
-            };
+            type_of_fn_from_ty(ccx, e.span, node_id_type(ccx, e.id), 0u);
         let sub_cx = extend_path(cx.fcx.lcx, ccx.names.next("anon"));
         let s = mangle_internal_name_by_path(ccx, sub_cx.path);
         let llfn = decl_internal_fastcall_fn(ccx.llmod, s, llfnty);
@@ -7362,7 +7356,8 @@ fn decl_fn_and_pair(ccx: &@crate_ctxt, sp: &span, path: &str[], flav: str,
 fn decl_fn_and_pair_full(ccx: &@crate_ctxt, sp: &span, path: &str[],
                          flav: str, ty_params: &ast::ty_param[],
                          node_id: ast::node_id, node_type: ty::t) {
-    let llfty;
+    let llfty = type_of_fn_from_ty(ccx, sp, node_type,
+                                   std::ivec::len(ty_params));
     alt ty::struct(ccx.tcx, node_type) {
       ty::ty_fn(proto, inputs, output, _, _) {
         llfty =