Skip to content

Commit cfb97b3

Browse files
committed
Begin sketching translation of bind_expr. No captures yet, also crashy.
1 parent d151747 commit cfb97b3

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

src/comp/middle/trans.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ fn T_fn(vec[TypeRef] inputs, TypeRef output) -> TypeRef {
193193
False);
194194
}
195195

196+
fn T_closure(TypeRef tfn) -> TypeRef {
197+
ret T_struct(vec(tfn,
198+
T_ptr(T_opaque())));
199+
}
200+
196201
fn T_ptr(TypeRef t) -> TypeRef {
197202
ret llvm.LLVMPointerType(t, 0u);
198203
}
@@ -1932,12 +1937,42 @@ impure fn trans_args(@block_ctxt cx, option.t[ValueRef] llobj,
19321937
ret tup(bcx, vs);
19331938
}
19341939

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+
19351958
impure fn trans_call(@block_ctxt cx, @ast.expr f,
19361959
vec[@ast.expr] args, &ast.ann ann) -> result {
19371960
auto f_res = trans_lval(cx, f);
19381961
auto faddr = f_res.res.val;
19391962
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+
}
19411976
}
19421977
auto fn_ty = ty.expr_ty(f);
19431978
auto ret_ty = ty.ann_to_type(ann);
@@ -2110,6 +2145,10 @@ impure fn trans_expr(@block_ctxt cx, @ast.expr e) -> result {
21102145
ret copy_ty(rhs_res.bcx, false, lhs_res.res.val, v, t);
21112146
}
21122147

2148+
case (ast.expr_bind(?f, ?args, ?ann)) {
2149+
ret trans_bind(cx, f, args, ann);
2150+
}
2151+
21132152
case (ast.expr_call(?f, ?args, ?ann)) {
21142153
ret trans_call(cx, f, args, ann);
21152154
}

0 commit comments

Comments
 (0)