aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-17 00:31:41 -0800
committerGraydon Hoare <[email protected]>2010-12-17 00:31:41 -0800
commit56e040e61a382a831faa5c563c46ffee2f4d7333 (patch)
tree1915c1108bfc61037aa0f78ae72a89bcc83527f7 /src
parentRemove calltup fields from ABI, add binding fields. (diff)
downloadrust-56e040e61a382a831faa5c563c46ffee2f4d7333.tar.xz
rust-56e040e61a382a831faa5c563c46ffee2f4d7333.zip
Trans methods more correctly, and store vtbl pointer in pair returned from obj ctor.
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index e8225677..6a926b9d 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2310,14 +2310,20 @@ impure fn trans_fn(@crate_ctxt cx, &ast._fn f, ast.def_id fid,
impure fn trans_vtbl(@crate_ctxt cx, &ast._obj ob) -> ValueRef {
let vec[ValueRef] methods = vec();
for (@ast.method m in ob.methods) {
+
+ auto llfnty = node_type(cx, m.node.ann);
+ let str s = cx.names.next("_rust_method") + "." + cx.path;
+ let ValueRef llfn = decl_fastcall_fn(cx.llmod, s, llfnty);
+ cx.item_ids.insert(m.node.id, llfn);
+
trans_fn(cx, m.node.meth, m.node.id, m.node.ann);
- methods += cx.item_ids.get(m.node.id);
+ methods += llfn;
}
ret C_struct(methods);
}
-fn trans_obj(@crate_ctxt cx, &ast._obj ob, ast.def_id oid,
- &ast.ann ann) {
+impure fn trans_obj(@crate_ctxt cx, &ast._obj ob, ast.def_id oid,
+ &ast.ann ann) {
auto llctor_decl = cx.item_ids.get(oid);
cx.item_names.insert(cx.path, llctor_decl);
@@ -2339,7 +2345,11 @@ fn trans_obj(@crate_ctxt cx, &ast._obj ob, ast.def_id oid,
copy_args_to_allocas(bcx, fn_args, arg_tys_of_fn(ann));
auto pair = bcx.build.Alloca(type_of(cx, ret_ty_of_fn(ann)));
-
+ auto vtbl = trans_vtbl(cx, ob);
+ auto pair_vtbl = bcx.build.GEP(pair,
+ vec(C_int(0),
+ C_int(abi.obj_field_vtbl)));
+ bcx.build.Store(vtbl, pair_vtbl);
bcx.build.Ret(pair);
}