Skip to content

Commit 966b499

Browse files
committed
---
yaml --- r: 1125 b: refs/heads/master c: 399929b h: refs/heads/master i: 1123: 296984c v: v3
1 parent 80244c9 commit 966b499

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 86188da3483b35ffd3d118600d55437c5233438c
2+
refs/heads/master: 399929ba0bfd02b458d99bac7ef49b0e50731754

trunk/src/comp/middle/trans.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,13 +1641,24 @@ impure fn trans_field(@block_ctxt cx, &ast.span sp, @ast.expr base,
16411641
case (typeck.ty_tup(?fields)) {
16421642
let uint ix = typeck.field_num(cx.fcx.ccx.sess, sp, field);
16431643
auto v = r.bcx.build.GEP(r.val, vec(C_int(0), C_int(ix as int)));
1644-
ret tup(res(r.bcx, v), lv._1);
1644+
ret tup(res(r.bcx, v), true);
16451645
}
16461646
case (typeck.ty_rec(?fields)) {
16471647
let uint ix = typeck.field_idx(cx.fcx.ccx.sess, sp,
16481648
field, fields);
16491649
auto v = r.bcx.build.GEP(r.val, vec(C_int(0), C_int(ix as int)));
1650-
ret tup(res(r.bcx, v), lv._1);
1650+
ret tup(res(r.bcx, v), true);
1651+
}
1652+
case (typeck.ty_obj(?methods)) {
1653+
let uint ix = typeck.method_idx(cx.fcx.ccx.sess, sp,
1654+
field, methods);
1655+
auto vtbl = r.bcx.build.GEP(r.val,
1656+
vec(C_int(0),
1657+
C_int(abi.obj_field_vtbl)));
1658+
vtbl = r.bcx.build.Load(vtbl);
1659+
auto v = r.bcx.build.GEP(vtbl, vec(C_int(0),
1660+
C_int(ix as int)));
1661+
ret tup(res(r.bcx, v), true);
16511662
}
16521663
case (_) { cx.fcx.ccx.sess.unimpl("field variant in trans_field"); }
16531664
}
@@ -1798,12 +1809,15 @@ impure fn trans_args(@block_ctxt cx, &vec[@ast.expr] es, @typeck.ty fn_ty)
17981809
impure fn trans_call(@block_ctxt cx, @ast.expr f,
17991810
vec[@ast.expr] args, &ast.ann ann) -> result {
18001811
auto f_res = trans_lval(cx, f);
1801-
check (! f_res._1);
1812+
auto faddr = f_res._0.val;
1813+
if (f_res._1) {
1814+
faddr = f_res._0.bcx.build.Load(faddr);
1815+
}
18021816
auto fn_ty = typeck.expr_ty(f);
18031817
auto ret_ty = typeck.ann_to_type(ann);
18041818
auto args_res = trans_args(f_res._0.bcx, args, fn_ty);
18051819

1806-
auto real_retval = args_res._0.build.FastCall(f_res._0.val, args_res._1);
1820+
auto real_retval = args_res._0.build.FastCall(faddr, args_res._1);
18071821
auto retval;
18081822
if (typeck.type_is_nil(ret_ty)) {
18091823
retval = C_nil();

0 commit comments

Comments
 (0)