]> git.lizzy.rs Git - rust.git/commitdiff
resurrect tps_fn() and put it to use this time.
authorNiko Matsakis <niko@alum.mit.edu>
Thu, 15 Dec 2011 05:02:47 +0000 (21:02 -0800)
committerNiko Matsakis <niko@alum.mit.edu>
Thu, 15 Dec 2011 21:44:06 +0000 (13:44 -0800)
src/comp/middle/trans.rs
src/comp/middle/trans_closure.rs

index 39b280274281d4e49cca3115b9e73fcb9c9ea734..ce106c78eace7bc47e8ff7f269d93e62a2f8f7a8 100644 (file)
@@ -937,7 +937,7 @@ fn trans_stack_local_derived_tydesc(cx: @block_ctxt, llsz: ValueRef,
 
 // Objects and closures store their type parameters differently (in the object
 // or closure itself rather than in the type descriptor).
-tag ty_param_storage { tps_normal; tps_obj(uint); }
+tag ty_param_storage { tps_normal; tps_obj(uint); tps_fn(uint); }
 
 fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
                       storage: ty_param_storage,
@@ -958,7 +958,7 @@ fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
     let is_obj_body;
     alt storage {
         tps_normal. { is_obj_body = false; }
-        tps_obj(_) { is_obj_body = true; }
+        tps_obj(_) | tps_fn(_) { is_obj_body = true; }
     }
 
     bcx_ccx(cx).stats.n_derived_tydescs += 1u;
@@ -1006,6 +1006,7 @@ fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
     alt storage {
       tps_normal. { obj_params = 0u; }
       tps_obj(np) { obj_params = np; }
+      tps_fn(np) { obj_params = 0x80000000u | np; }
     }
 
     let v;
index 93cbbb6ae3c989e36220fdcf6e6a9ec269fc6d30..8db1852357ed6901767d667019472e6d2c33eb89 100644 (file)
@@ -131,8 +131,9 @@ fn clone_tydesc(bcx: @block_ctxt,
       for_closure. | for_send. {
         let bound_tydesc = GEPi(bcx, closure, [0, abi::closure_elt_tydesc]);
         let ti = none;
+        let tps = tps_fn(vec::len(lltydescs));
         let {result:bindings_tydesc, _} =
-            trans::get_tydesc(bcx, bindings_ty, true, trans::tps_normal, ti);
+            trans::get_tydesc(bcx, bindings_ty, true, tps, ti);
         trans::lazily_emit_tydesc_glue(bcx, abi::tydesc_field_drop_glue, ti);
         trans::lazily_emit_tydesc_glue(bcx, abi::tydesc_field_free_glue, ti);
         bcx = bindings_tydesc.bcx;