@@ -43,7 +43,8 @@ type glue_fns = rec(ValueRef activate_glue,
43
43
state type trans_ctxt = rec ( session. session sess,
44
44
ModuleRef llmod,
45
45
hashmap[ str, ValueRef ] upcalls,
46
- hashmap[ str, ValueRef ] fns,
46
+ hashmap[ str, ValueRef ] fn_names,
47
+ hashmap[ ast. def_id , ValueRef ] fn_ids,
47
48
@glue_fns glues,
48
49
namegen names,
49
50
str path) ;
@@ -667,6 +668,9 @@ fn trans_lval(@block_ctxt cx, &ast.expr e) -> result {
667
668
case ( ast. def_local ( ?did) ) {
668
669
ret res ( cx, cx. fcx . lllocals . get ( did) ) ;
669
670
}
671
+ case ( ast. def_fn ( ?did) ) {
672
+ ret res ( cx, cx. fcx . tcx . fn_ids . get ( did) ) ;
673
+ }
670
674
case ( _) {
671
675
cx. fcx . tcx . sess . unimpl ( "def variant in trans" ) ;
672
676
}
@@ -682,6 +686,20 @@ fn trans_lval(@block_ctxt cx, &ast.expr e) -> result {
682
686
fail;
683
687
}
684
688
689
+ fn trans_exprs ( @block_ctxt cx , & vec[ @ast. expr] es)
690
+ -> tup( @block_ctxt, vec[ ValueRef ] ) {
691
+ let vec[ ValueRef ] vs = vec( ) ;
692
+ let @block_ctxt bcx = cx;
693
+
694
+ for ( @ast. expr e in es ) {
695
+ auto res = trans_expr ( bcx, * e) ;
696
+ vs += res. val ;
697
+ bcx = res. bcx ;
698
+ }
699
+
700
+ ret tup( bcx, vs) ;
701
+ }
702
+
685
703
fn trans_expr ( @block_ctxt cx , & ast . expr e) -> result {
686
704
alt ( e. node ) {
687
705
case ( ast. expr_lit ( ?lit, _) ) {
@@ -723,6 +741,16 @@ fn trans_expr(@block_ctxt cx, &ast.expr e) -> result {
723
741
cx. build . Store ( rhs_res. val , lhs_res. val ) ) ;
724
742
}
725
743
744
+ case ( ast. expr_call ( ?f, ?args, _) ) {
745
+ auto f_res = trans_lval ( cx, * f) ;
746
+ auto args_res = trans_exprs ( f_res. bcx , args) ;
747
+ auto llargs = vec ( cx. fcx . lloutptr ,
748
+ cx. fcx . lltaskptr ) ;
749
+ llargs += args_res. _1 ;
750
+ ret res ( args_res. _0 ,
751
+ cx. build . Call ( f_res. val , llargs) ) ;
752
+ }
753
+
726
754
}
727
755
cx. fcx . tcx . sess . unimpl ( "expr variant in trans_expr" ) ;
728
756
fail;
@@ -895,14 +923,16 @@ fn trans_block(@block_ctxt cx, &ast.block b) -> result {
895
923
896
924
fn new_fn_ctxt ( @trans_ctxt cx ,
897
925
str name ,
926
+ ast. def_id fid ,
898
927
TypeRef T_out ,
899
928
vec[ TypeRef ] T_explicit_args ) -> @fn_ctxt {
900
929
let vec[ TypeRef ] args = vec ( T_ptr ( T_out ) , // outptr.
901
930
T_taskptr ( ) // taskptr
902
931
) ;
903
932
args += T_explicit_args ;
904
933
let ValueRef llfn = decl_cdecl_fn ( cx. llmod , name, args, T_void ( ) ) ;
905
- cx. fns . insert ( cx. path , llfn) ;
934
+ cx. fn_names . insert ( cx. path , llfn) ;
935
+ cx. fn_ids . insert ( fid, llfn) ;
906
936
let ValueRef lloutptr = llvm. LLVMGetParam ( llfn, 0 u) ;
907
937
let ValueRef lltaskptr = llvm. LLVMGetParam ( llfn, 1 u) ;
908
938
let hashmap[ ast. def_id , ValueRef ] lllocals = new_def_hash[ ValueRef ] ( ) ;
@@ -913,20 +943,20 @@ fn new_fn_ctxt(@trans_ctxt cx,
913
943
tcx=cx) ;
914
944
}
915
945
916
- fn trans_fn ( @trans_ctxt cx , & ast . _fn f) {
946
+ fn trans_fn ( @trans_ctxt cx , & ast . _fn f, ast . def_id fid ) {
917
947
let TypeRef out = T_int ( ) ;
918
948
let vec[ TypeRef ] args = vec ( ) ;
919
949
920
- auto fcx = new_fn_ctxt ( cx, cx. path , out, args) ;
950
+ auto fcx = new_fn_ctxt ( cx, cx. path , fid , out, args) ;
921
951
922
952
trans_block ( new_top_block_ctxt ( fcx) , f. body ) ;
923
953
}
924
954
925
955
fn trans_item ( @trans_ctxt cx , & ast . item item) {
926
956
alt ( item. node ) {
927
- case ( ast. item_fn ( ?name, ?f, _ ) ) {
957
+ case ( ast. item_fn ( ?name, ?f, ?fid ) ) {
928
958
auto sub_cx = @rec ( path=cx. path + "." + name with * cx) ;
929
- trans_fn ( sub_cx, f) ;
959
+ trans_fn ( sub_cx, f, fid ) ;
930
960
}
931
961
case ( ast. item_mod ( ?name, ?m, _) ) {
932
962
auto sub_cx = @rec ( path=cx. path + "." + name with * cx) ;
@@ -1014,7 +1044,7 @@ fn trans_main_fn(@trans_ctxt cx, ValueRef llcrate) {
1014
1044
1015
1045
auto llargc = llvm. LLVMGetParam ( llmain, 0 u) ;
1016
1046
auto llargv = llvm. LLVMGetParam ( llmain, 1 u) ;
1017
- auto llrust_main = cx. fns . get ( "_rust.main" ) ;
1047
+ auto llrust_main = cx. fn_names . get ( "_rust.main" ) ;
1018
1048
1019
1049
//
1020
1050
// Emit the moral equivalent of:
@@ -1067,7 +1097,8 @@ fn trans_crate(session.session sess, @ast.crate crate) {
1067
1097
auto cx = @rec ( sess = sess,
1068
1098
llmod = llmod,
1069
1099
upcalls = new_str_hash[ ValueRef ] ( ) ,
1070
- fns = new_str_hash[ ValueRef ] ( ) ,
1100
+ fn_names = new_str_hash[ ValueRef ] ( ) ,
1101
+ fn_ids = new_def_hash[ ValueRef ] ( ) ,
1071
1102
glues = glues,
1072
1103
names = namegen ( 0 ) ,
1073
1104
path = "_rust" ) ;
0 commit comments