about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-01-28 15:45:13 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-01-28 15:45:13 -0800
commitbf9cebfc0637b8c9937bbf77fcdc12265b18ce9c (patch)
treebaa2cfc182a50ce75dcae7934e7371dc317004ed /src
parentcaa5b92985e6df582a0d33d10cf41e2835ef11b1 (diff)
downloadrust-bf9cebfc0637b8c9937bbf77fcdc12265b18ce9c.tar.gz
rust-bf9cebfc0637b8c9937bbf77fcdc12265b18ce9c.zip
Fix a bug in linearize and get the captured tydescs type right.
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index a4eb945bf3e..ee695b881fd 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -240,12 +240,12 @@ fn T_tydesc() -> TypeRef {
 
     auto th = mk_type_handle();
     auto abs_tydesc = llvm.LLVMResolveTypeHandle(th.llth);
-
+    auto tydescpp = T_ptr(T_ptr(abs_tydesc));
     auto pvoid = T_ptr(T_i8());
     auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(),
-                                     T_ptr(abs_tydesc),
+                                     tydescpp,
                                      pvoid), T_void()));
-    auto tydesc = T_struct(vec(T_ptr(abs_tydesc), // first_param
+    auto tydesc = T_struct(vec(tydescpp,          // first_param
                                T_int(),           // size
                                T_int(),           // align
                                glue_fn_ty,        // take_glue_off
@@ -907,8 +907,8 @@ fn linearize_ty_params(@block_ctxt cx, @ty.t t)
     let vec[ValueRef] param_vals = vec();
     let vec[ast.def_id] param_defs = vec();
     type rr = rec(@block_ctxt cx,
-                 mutable vec[ValueRef] vals,
-                 mutable vec[ast.def_id] defs);
+                  mutable vec[ValueRef] vals,
+                  mutable vec[ast.def_id] defs);
 
     state obj folder(@rr r) {
         fn fold_simple_ty(@ty.t t) -> @ty.t {
@@ -921,7 +921,7 @@ fn linearize_ty_params(@block_ctxt cx, @ty.t t)
                         }
                     }
                     if (!seen) {
-                        r.vals += cx.fcx.lltydescs.get(pid);
+                        r.vals += r.cx.fcx.lltydescs.get(pid);
                         r.defs += pid;
                     }
                 }
@@ -957,6 +957,8 @@ fn get_tydesc(&@block_ctxt cx, @ty.t t) -> ValueRef {
             make_tydesc(cx.fcx.ccx, t, tys._0);
         }
 
+        auto root = cx.fcx.ccx.tydescs.get(t);
+
         cx.fcx.ccx.sess.unimpl("derived type descriptors");
     }
 
@@ -977,9 +979,9 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t, vec[ast.def_id] typaram_defs) {
     auto llty = type_of(cx, t);
     auto pvoid = T_ptr(T_i8());
     auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(),
-                                     T_ptr(T_tydesc()),
+                                     T_ptr(T_ptr(T_tydesc())),
                                      pvoid), T_void()));
-    auto tydesc = C_struct(vec(C_null(T_ptr(T_tydesc())),
+    auto tydesc = C_struct(vec(C_null(T_ptr(T_ptr(T_tydesc()))),
                                llsize_of(llty),
                                llalign_of(llty),
                                take_glue,             // take_glue_off
@@ -1003,7 +1005,7 @@ fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
                      val_and_ty_fn helper,
                      vec[ast.def_id] typaram_defs) -> ValueRef {
     auto llfnty = T_fn(vec(T_taskptr(),
-                           T_ptr(T_tydesc()),
+                           T_ptr(T_ptr(T_tydesc())),
                            T_ptr(T_i8())), T_void());
 
     auto fn_name = cx.names.next("_rust_" + name) + "." + ty.ty_to_str(t);