aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-20 16:48:28 -0800
committerGraydon Hoare <[email protected]>2010-12-20 16:48:28 -0800
commit399929ba0bfd02b458d99bac7ef49b0e50731754 (patch)
tree443e3a3d4ddce9dfb67436c4aab2f2689027097d /src/comp
parentMop up cases of s/copy/take/, remove 'binding' terminology, whitespace police... (diff)
downloadrust-399929ba0bfd02b458d99bac7ef49b0e50731754.tar.xz
rust-399929ba0bfd02b458d99bac7ef49b0e50731754.zip
Support ty_obj in trans_field; simple-obj.rs compiles (but crashes).
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index af314843..d0c13005 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1641,13 +1641,24 @@ impure fn trans_field(@block_ctxt cx, &ast.span sp, @ast.expr base,
case (typeck.ty_tup(?fields)) {
let uint ix = typeck.field_num(cx.fcx.ccx.sess, sp, field);
auto v = r.bcx.build.GEP(r.val, vec(C_int(0), C_int(ix as int)));
- ret tup(res(r.bcx, v), lv._1);
+ ret tup(res(r.bcx, v), true);
}
case (typeck.ty_rec(?fields)) {
let uint ix = typeck.field_idx(cx.fcx.ccx.sess, sp,
field, fields);
auto v = r.bcx.build.GEP(r.val, vec(C_int(0), C_int(ix as int)));
- ret tup(res(r.bcx, v), lv._1);
+ ret tup(res(r.bcx, v), true);
+ }
+ case (typeck.ty_obj(?methods)) {
+ let uint ix = typeck.method_idx(cx.fcx.ccx.sess, sp,
+ field, methods);
+ auto vtbl = r.bcx.build.GEP(r.val,
+ vec(C_int(0),
+ C_int(abi.obj_field_vtbl)));
+ vtbl = r.bcx.build.Load(vtbl);
+ auto v = r.bcx.build.GEP(vtbl, vec(C_int(0),
+ C_int(ix as int)));
+ ret tup(res(r.bcx, v), true);
}
case (_) { cx.fcx.ccx.sess.unimpl("field variant in trans_field"); }
}
@@ -1798,12 +1809,15 @@ impure fn trans_args(@block_ctxt cx, &vec[@ast.expr] es, @typeck.ty fn_ty)
impure fn trans_call(@block_ctxt cx, @ast.expr f,
vec[@ast.expr] args, &ast.ann ann) -> result {
auto f_res = trans_lval(cx, f);
- check (! f_res._1);
+ auto faddr = f_res._0.val;
+ if (f_res._1) {
+ faddr = f_res._0.bcx.build.Load(faddr);
+ }
auto fn_ty = typeck.expr_ty(f);
auto ret_ty = typeck.ann_to_type(ann);
auto args_res = trans_args(f_res._0.bcx, args, fn_ty);
- auto real_retval = args_res._0.build.FastCall(f_res._0.val, args_res._1);
+ auto real_retval = args_res._0.build.FastCall(faddr, args_res._1);
auto retval;
if (typeck.type_is_nil(ret_ty)) {
retval = C_nil();