@@ -193,6 +193,11 @@ fn T_fn(vec[TypeRef] inputs, TypeRef output) -> TypeRef {
193
193
False ) ;
194
194
}
195
195
196
+ fn T_closure ( TypeRef tfn) -> TypeRef {
197
+ ret T_struct ( vec ( tfn,
198
+ T_ptr ( T_opaque ( ) ) ) ) ;
199
+ }
200
+
196
201
fn T_ptr ( TypeRef t) -> TypeRef {
197
202
ret llvm. LLVMPointerType ( t, 0 u) ;
198
203
}
@@ -1932,12 +1937,42 @@ impure fn trans_args(@block_ctxt cx, option.t[ValueRef] llobj,
1932
1937
ret tup( bcx, vs) ;
1933
1938
}
1934
1939
1940
+ impure fn trans_bind( @block_ctxt cx, @ast. expr f,
1941
+ vec[ option. t[ @ast. expr] ] args,
1942
+ & ast. ann ann) -> result {
1943
+ auto f_res = trans_lval( cx, f) ;
1944
+ auto bcx = f_res. res. bcx;
1945
+ auto pair_t = T_closure ( node_type( cx. fcx. ccx, ann) ) ;
1946
+ auto pair_v = bcx. build. Alloca ( pair_t) ;
1947
+ if ( f_res. is_mem) {
1948
+ cx. fcx. ccx. sess. unimpl( "re-binding existing function" ) ;
1949
+ } else {
1950
+ auto code_cell =
1951
+ bcx. build. GEP ( pair_v, vec( C_int ( 0 ) ,
1952
+ C_int ( abi. fn_field_code) ) ) ;
1953
+ bcx. build. Store ( f_res. res. val, code_cell) ;
1954
+ }
1955
+ ret res( bcx, pair_v) ;
1956
+ }
1957
+
1935
1958
impure fn trans_call( @block_ctxt cx, @ast. expr f,
1936
1959
vec[ @ast. expr] args, & ast. ann ann) -> result {
1937
1960
auto f_res = trans_lval( cx, f) ;
1938
1961
auto faddr = f_res. res. val;
1939
1962
if ( f_res. is_mem) {
1940
- faddr = f_res. res. bcx. build. Load ( faddr) ;
1963
+ alt ( f_res. llobj) {
1964
+ case ( some[ ValueRef ] ( _) ) {
1965
+ // It's a vtbl entry.
1966
+ faddr = f_res. res. bcx. build. Load ( faddr) ;
1967
+ }
1968
+ case ( none[ ValueRef ] ) {
1969
+ // It's a closure.
1970
+ auto bcx = f_res. res. bcx;
1971
+ faddr = bcx. build. GEP ( faddr, vec( C_int ( 0 ) ,
1972
+ C_int ( abi. fn_field_code) ) ) ;
1973
+ faddr = bcx. build. Load ( faddr) ;
1974
+ }
1975
+ }
1941
1976
}
1942
1977
auto fn_ty = ty. expr_ty( f) ;
1943
1978
auto ret_ty = ty. ann_to_type( ann) ;
@@ -2110,6 +2145,10 @@ impure fn trans_expr(@block_ctxt cx, @ast.expr e) -> result {
2110
2145
ret copy_ty( rhs_res. bcx, false , lhs_res. res. val, v, t) ;
2111
2146
}
2112
2147
2148
+ case ( ast. expr_bind( ?f, ?args, ?ann) ) {
2149
+ ret trans_bind( cx, f, args, ann) ;
2150
+ }
2151
+
2113
2152
case ( ast. expr_call( ?f, ?args, ?ann) ) {
2114
2153
ret trans_call( cx, f, args, ann) ;
2115
2154
}
0 commit comments