Skip to content

Commit 0a13d9b

Browse files
committed
---
yaml --- r: 1232 b: refs/heads/master c: 2aa3677 h: refs/heads/master v: v3
1 parent acdc02b commit 0a13d9b

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 59c9e6caffadcfee9216ac289ae0b306fc2e55eb
2+
refs/heads/master: 2aa36777f1da8383cd62be6f75ecdaed283b253d

trunk/src/comp/middle/trans.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,8 +1772,8 @@ fn lval_val(@block_ctxt cx, ValueRef val) -> lval_result {
17721772
llobj=none[ValueRef]);
17731773
}
17741774

1775-
fn trans_name(@block_ctxt cx, &ast.name n, &option.t[ast.def] dopt)
1776-
-> lval_result {
1775+
fn trans_name(@block_ctxt cx, &ast.name n, &option.t[ast.def] dopt,
1776+
&ast.ann ann) -> lval_result {
17771777
alt (dopt) {
17781778
case (some[ast.def](?def)) {
17791779
alt (def) {
@@ -1795,6 +1795,15 @@ fn trans_name(@block_ctxt cx, &ast.name n, &option.t[ast.def] dopt)
17951795
}
17961796
case (ast.def_fn(?did)) {
17971797
check (cx.fcx.ccx.fn_pairs.contains_key(did));
1798+
check (cx.fcx.ccx.item_ids.contains_key(did));
1799+
1800+
auto fn_item = cx.fcx.ccx.items.get(did);
1801+
auto monoty = node_ann_type(cx.fcx.ccx, ann);
1802+
auto tys = ty.resolve_ty_params(fn_item, monoty);
1803+
1804+
// TODO: build a closure with the type parameters that
1805+
// result
1806+
17981807
ret lval_val(cx, cx.fcx.ccx.fn_pairs.get(did));
17991808
}
18001809
case (ast.def_obj(?did)) {
@@ -1897,8 +1906,8 @@ impure fn trans_index(@block_ctxt cx, &ast.span sp, @ast.expr base,
18971906

18981907
impure fn trans_lval(@block_ctxt cx, @ast.expr e) -> lval_result {
18991908
alt (e.node) {
1900-
case (ast.expr_name(?n, ?dopt, _)) {
1901-
ret trans_name(cx, n, dopt);
1909+
case (ast.expr_name(?n, ?dopt, ?ann)) {
1910+
ret trans_name(cx, n, dopt, ann);
19021911
}
19031912
case (ast.expr_field(?base, ?ident, ?ann)) {
19041913
ret trans_field(cx, e.span, base, ident, ann);

trunk/src/comp/middle/ty.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import front.ast;
1212
import front.ast.mutability;
1313
import util.common;
1414
import util.common.append;
15+
import util.common.new_def_hash;
1516
import util.common.span;
1617

1718
// Data types
@@ -1194,3 +1195,46 @@ fn type_err_to_str(&ty.type_err err) -> str {
11941195
}
11951196
}
11961197

1198+
// Type parameter resolution, used in translation
1199+
1200+
fn resolve_ty_params(@ast.item item, @t monoty) -> vec[@t] {
1201+
obj resolve_ty_params_handler(@hashmap[ast.def_id,@t] bindings) {
1202+
fn resolve_local(ast.def_id id) -> @t { log "resolve local"; fail; }
1203+
fn record_local(ast.def_id id, @t ty) { log "record local"; fail; }
1204+
fn unify_expected_param(ast.def_id id, @t expected, @t actual)
1205+
-> unify_result {
1206+
bindings.insert(id, actual);
1207+
ret ures_ok(actual);
1208+
}
1209+
fn unify_actual_param(ast.def_id id, @t expected, @t actual)
1210+
-> unify_result {
1211+
bindings.insert(id, expected);
1212+
ret ures_ok(expected);
1213+
}
1214+
}
1215+
1216+
auto ty_params_and_polyty = item_ty(item);
1217+
1218+
auto bindings = @new_def_hash[@t]();
1219+
auto handler = resolve_ty_params_handler(bindings);
1220+
1221+
auto unify_res = unify(ty_params_and_polyty._1, monoty, handler);
1222+
alt (unify_res) {
1223+
case (ures_ok(_)) { /* fall through */ }
1224+
case (ures_err(_,?exp,?act)) {
1225+
log "resolve_ty_params mismatch: " + ty_to_str(exp) + " " +
1226+
ty_to_str(act);
1227+
fail;
1228+
}
1229+
}
1230+
1231+
let vec[@t] result_tys = vec();
1232+
auto ty_param_ids = ty_params_and_polyty._0;
1233+
for (ast.def_id tp in ty_param_ids) {
1234+
check (bindings.contains_key(tp));
1235+
result_tys += vec(bindings.get(tp));
1236+
}
1237+
1238+
ret result_tys;
1239+
}
1240+

0 commit comments

Comments
 (0)