@@ -1641,13 +1641,24 @@ impure fn trans_field(@block_ctxt cx, &ast.span sp, @ast.expr base,
1641
1641
case ( typeck. ty_tup( ?fields) ) {
1642
1642
let uint ix = typeck. field_num( cx. fcx. ccx. sess, sp, field) ;
1643
1643
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 ) ;
1645
1645
}
1646
1646
case ( typeck. ty_rec( ?fields) ) {
1647
1647
let uint ix = typeck. field_idx( cx. fcx. ccx. sess, sp,
1648
1648
field, fields) ;
1649
1649
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 ) ;
1651
1662
}
1652
1663
case ( _) { cx. fcx. ccx. sess. unimpl( "field variant in trans_field" ) ; }
1653
1664
}
@@ -1798,12 +1809,15 @@ impure fn trans_args(@block_ctxt cx, &vec[@ast.expr] es, @typeck.ty fn_ty)
1798
1809
impure fn trans_call( @block_ctxt cx, @ast. expr f,
1799
1810
vec[ @ast. expr] args, & ast. ann ann) -> result {
1800
1811
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
+ }
1802
1816
auto fn_ty = typeck. expr_ty( f) ;
1803
1817
auto ret_ty = typeck. ann_to_type( ann) ;
1804
1818
auto args_res = trans_args( f_res. _0. bcx, args, fn_ty) ;
1805
1819
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) ;
1807
1821
auto retval;
1808
1822
if ( typeck. type_is_nil( ret_ty) ) {
1809
1823
retval = C_nil ( ) ;
0 commit comments