diff options
| author | Graydon Hoare <[email protected]> | 2010-12-20 16:48:28 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-12-20 16:48:28 -0800 |
| commit | 399929ba0bfd02b458d99bac7ef49b0e50731754 (patch) | |
| tree | 443e3a3d4ddce9dfb67436c4aab2f2689027097d | |
| parent | Mop up cases of s/copy/take/, remove 'binding' terminology, whitespace police... (diff) | |
| download | rust-399929ba0bfd02b458d99bac7ef49b0e50731754.tar.xz rust-399929ba0bfd02b458d99bac7ef49b0e50731754.zip | |
Support ty_obj in trans_field; simple-obj.rs compiles (but crashes).
| -rw-r--r-- | src/comp/middle/trans.rs | 22 |
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(); |