Skip to content

Commit 1337340

Browse files
committed
---
yaml --- r: 1325 b: refs/heads/master c: ef50d0e h: refs/heads/master i: 1323: 864640b v: v3
1 parent cdf82ba commit 1337340

File tree

5 files changed

+56
-51
lines changed

5 files changed

+56
-51
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: c848ed1e9862a527e0a6f16ef235b41f98baa419
2+
refs/heads/master: ef50d0e668635824cc5ed86aaa385dd6f3181b53

trunk/src/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,6 @@ TEST_XFAILS_RUSTC := $(filter-out \
447447
div-mod.rs \
448448
drop-bind-thunk-args.rs \
449449
drop-on-ret.rs \
450-
else-if.rs \
451450
fact.rs \
452451
fn-lval.rs \
453452
fun-call-variants.rs \

trunk/src/comp/front/parser.rs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,8 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
895895
hi = thn.span;
896896
alt (p.peek()) {
897897
case (token.ELSE) {
898-
auto eblk = parse_else_block(p);
898+
p.bump();
899+
auto eblk = parse_block(p);
899900
els = some(eblk);
900901
hi = eblk.span;
901902
}
@@ -904,21 +905,6 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
904905
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
905906
}
906907

907-
impure fn parse_else_block(parser p) -> ast.block {
908-
expect(p, token.ELSE);
909-
alt (p.peek()) {
910-
case (token.IF) {
911-
let vec[@ast.stmt] stmts = vec();
912-
auto ifexpr = parse_if_expr(p);
913-
auto bloc = index_block(stmts, some(ifexpr));
914-
ret spanned(ifexpr.span, ifexpr.span, bloc);
915-
}
916-
case (_) {
917-
ret parse_block(p);
918-
}
919-
}
920-
}
921-
922908
impure fn parse_head_local(parser p) -> @ast.decl {
923909
auto lo = p.get_span();
924910
let @ast.local local;

trunk/src/comp/middle/trans.rs

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ fn get_tydesc(&@block_ctxt cx, @ty.t t) -> result {
997997
vec(p2i(bcx.fcx.ccx.crate_ptr),
998998
sz.val,
999999
align.val,
1000-
C_int(n_params as int),
1000+
C_int((1u + n_params) as int),
10011001
bcx.build.PtrToInt(tydescs, T_int())));
10021002

10031003
ret res(v.bcx, v.bcx.build.IntToPtr(v.val, T_ptr(T_tydesc())));
@@ -2193,6 +2193,34 @@ fn lval_val(@block_ctxt cx, ValueRef val) -> lval_result {
21932193
llobj=none[ValueRef]);
21942194
}
21952195

2196+
fn lval_generic_fn(@block_ctxt cx,
2197+
ty.ty_params_and_ty tpt,
2198+
ast.def_id fn_id,
2199+
&ast.ann ann)
2200+
-> lval_result {
2201+
2202+
check (cx.fcx.ccx.fn_pairs.contains_key(fn_id));
2203+
auto lv = lval_val(cx, cx.fcx.ccx.fn_pairs.get(fn_id));
2204+
auto monoty = node_ann_type(cx.fcx.ccx, ann);
2205+
auto tys = ty.resolve_ty_params(tpt, monoty);
2206+
2207+
if (_vec.len[@ty.t](tys) != 0u) {
2208+
auto bcx = cx;
2209+
let vec[ValueRef] tydescs = vec();
2210+
for (@ty.t t in tys) {
2211+
auto td = get_tydesc(bcx, t);
2212+
bcx = td.bcx;
2213+
append[ValueRef](tydescs, td.val);
2214+
}
2215+
auto gen = rec( item_type = tpt._1,
2216+
tydescs = tydescs );
2217+
lv = rec(res = res(bcx, lv.res.val),
2218+
generic = some[generic_info](gen)
2219+
with lv);
2220+
}
2221+
ret lv;
2222+
}
2223+
21962224
fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
21972225
&ast.ann ann) -> lval_result {
21982226
alt (dopt) {
@@ -2215,39 +2243,33 @@ fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
22152243
ret lval_mem(cx, cx.fcx.llobjfields.get(did));
22162244
}
22172245
case (ast.def_fn(?did)) {
2218-
check (cx.fcx.ccx.fn_pairs.contains_key(did));
2219-
check (cx.fcx.ccx.item_ids.contains_key(did));
2220-
2246+
check (cx.fcx.ccx.items.contains_key(did));
22212247
auto fn_item = cx.fcx.ccx.items.get(did);
2222-
auto lv = lval_val(cx, cx.fcx.ccx.fn_pairs.get(did));
2223-
auto monoty = node_ann_type(cx.fcx.ccx, ann);
2224-
auto tys = ty.resolve_ty_params(fn_item, monoty);
2225-
2226-
if (_vec.len[@ty.t](tys) != 0u) {
2227-
auto bcx = cx;
2228-
let vec[ValueRef] tydescs = vec();
2229-
for (@ty.t t in tys) {
2230-
auto td = get_tydesc(bcx, t);
2231-
bcx = td.bcx;
2232-
append[ValueRef](tydescs, td.val);
2233-
}
2234-
auto gen = rec( item_type = ty.item_ty(fn_item)._1,
2235-
tydescs = tydescs );
2236-
lv = rec(res = res(bcx, lv.res.val),
2237-
generic = some[generic_info](gen)
2238-
with lv);
2239-
}
2240-
2241-
ret lv;
2248+
ret lval_generic_fn(cx, ty.item_ty(fn_item), did, ann);
22422249
}
22432250
case (ast.def_obj(?did)) {
2244-
check (cx.fcx.ccx.fn_pairs.contains_key(did));
2245-
ret lval_val(cx, cx.fcx.ccx.fn_pairs.get(did));
2251+
check (cx.fcx.ccx.items.contains_key(did));
2252+
auto fn_item = cx.fcx.ccx.items.get(did);
2253+
ret lval_generic_fn(cx, ty.item_ty(fn_item), did, ann);
22462254
}
22472255
case (ast.def_variant(?tid, ?vid)) {
22482256
check (cx.fcx.ccx.tags.contains_key(tid));
22492257
if (cx.fcx.ccx.fn_pairs.contains_key(vid)) {
2250-
ret lval_val(cx, cx.fcx.ccx.fn_pairs.get(vid));
2258+
check (cx.fcx.ccx.items.contains_key(tid));
2259+
auto tag_item = cx.fcx.ccx.items.get(tid);
2260+
auto params = ty.item_ty(tag_item)._0;
2261+
auto fty = ty.plain_ty(ty.ty_nil);
2262+
alt (tag_item.node) {
2263+
case (ast.item_tag(_, ?variants, _, _)) {
2264+
for (ast.variant v in variants) {
2265+
if (v.id == vid) {
2266+
fty = node_ann_type(cx.fcx.ccx,
2267+
v.ann);
2268+
}
2269+
}
2270+
}
2271+
}
2272+
ret lval_generic_fn(cx, tup(params, fty), vid, ann);
22512273
} else {
22522274
// Nullary variants are just scalar constants.
22532275
check (cx.fcx.ccx.item_ids.contains_key(vid));
@@ -3798,15 +3820,13 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
37983820

37993821
alt (i.node) {
38003822
case (ast.item_fn(?name, ?f, _, ?fid, ?ann)) {
3801-
// TODO: type-params
38023823
cx.items.insert(fid, i);
38033824
if (! cx.obj_methods.contains_key(fid)) {
38043825
decl_fn_and_pair(cx, "fn", name, ann, fid);
38053826
}
38063827
}
38073828

38083829
case (ast.item_obj(?name, ?ob, _, ?oid, ?ann)) {
3809-
// TODO: type-params
38103830
cx.items.insert(oid, i);
38113831
decl_fn_and_pair(cx, "obj_ctor", name, ann, oid);
38123832
for (@ast.method m in ob.methods) {

trunk/src/comp/middle/ty.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,8 @@ fn is_fn_ty(@t fty) -> bool {
571571

572572
// Given an item, returns the associated type as well as a list of the IDs of
573573
// its type parameters.
574-
fn item_ty(@ast.item it) -> tup(vec[ast.def_id], @t) {
574+
type ty_params_and_ty = tup(vec[ast.def_id], @t);
575+
fn item_ty(@ast.item it) -> ty_params_and_ty {
575576
let vec[ast.ty_param] ty_params;
576577
auto result_ty;
577578
alt (it.node) {
@@ -1233,7 +1234,8 @@ fn type_err_to_str(&ty.type_err err) -> str {
12331234

12341235
// Type parameter resolution, used in translation
12351236

1236-
fn resolve_ty_params(@ast.item item, @t monoty) -> vec[@t] {
1237+
fn resolve_ty_params(ty_params_and_ty ty_params_and_polyty,
1238+
@t monoty) -> vec[@t] {
12371239
obj resolve_ty_params_handler(@hashmap[ast.def_id,@t] bindings) {
12381240
fn resolve_local(ast.def_id id) -> @t { log "resolve local"; fail; }
12391241
fn record_local(ast.def_id id, @t ty) { log "record local"; fail; }
@@ -1249,8 +1251,6 @@ fn resolve_ty_params(@ast.item item, @t monoty) -> vec[@t] {
12491251
}
12501252
}
12511253

1252-
auto ty_params_and_polyty = item_ty(item);
1253-
12541254
auto bindings = @new_def_hash[@t]();
12551255
auto handler = resolve_ty_params_handler(bindings);
12561256

0 commit comments

Comments
 (0)