Skip to content

Commit 655790d

Browse files
committed
---
yaml --- r: 3853 b: refs/heads/master c: 12d5532 h: refs/heads/master i: 3851: 68a8d8b v: v3
1 parent d318add commit 655790d

File tree

5 files changed

+434
-220
lines changed

5 files changed

+434
-220
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: 1ea449e2f6eea837137771fa486a2e3f69cc6fd0
2+
refs/heads/master: 12d553216663b80a6c10921ab52558253ba56920

trunk/src/comp/middle/trans.rs

Lines changed: 5 additions & 219 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import back::link;
3232
import back::x86;
3333
import back::abi;
3434
import back::upcall;
35-
import middle::ty::pat_ty;
3635
import syntax::visit;
3736
import visit::vt;
3837
import util::common;
@@ -3370,7 +3369,7 @@ fn move_val_if_temp(@block_ctxt cx, copy_action action, ValueRef dst,
33703369
}
33713370
}
33723371

3373-
fn trans_lit(&@crate_ctxt cx, &ast::lit lit, ast::node_id id) -> ValueRef {
3372+
fn trans_lit(&@crate_ctxt cx, &ast::lit lit) -> ValueRef {
33743373
alt (lit.node) {
33753374
case (ast::lit_int(?i)) { ret C_int(i); }
33763375
case (ast::lit_uint(?u)) { ret C_int(u as int); }
@@ -4742,219 +4741,6 @@ fn trans_do_while(&@block_ctxt cx, &ast::block body, &@ast::expr cond) ->
47424741
ret rslt(next_cx, body_res.val);
47434742
}
47444743

4745-
4746-
// Pattern matching translation
4747-
fn trans_pat_match(&@block_ctxt cx, &@ast::pat pat, ValueRef llval,
4748-
&@block_ctxt next_cx) -> result {
4749-
alt (pat.node) {
4750-
case (ast::pat_wild) { ret rslt(cx, llval); }
4751-
case (ast::pat_bind(_)) { ret rslt(cx, llval); }
4752-
case (ast::pat_lit(?lt)) {
4753-
auto lllit = trans_lit(cx.fcx.lcx.ccx, *lt, pat.id);
4754-
auto lltype = ty::node_id_to_type(cx.fcx.lcx.ccx.tcx, pat.id);
4755-
auto lleq = trans_compare(cx, ast::eq, lltype, llval, lllit);
4756-
auto matched_cx = new_sub_block_ctxt(lleq.bcx, "matched_cx");
4757-
lleq.bcx.build.CondBr(lleq.val, matched_cx.llbb, next_cx.llbb);
4758-
ret rslt(matched_cx, llval);
4759-
}
4760-
case (ast::pat_tag(?ident, ?subpats)) {
4761-
auto vdef;
4762-
alt (cx.fcx.lcx.ccx.tcx.def_map.find(pat.id)) {
4763-
case (some(?x)) { vdef = ast::variant_def_ids(x); }
4764-
case (_) {
4765-
cx.fcx.lcx.ccx.sess.span_fatal(pat.span,
4766-
"trans_pat_match: unbound var");
4767-
}
4768-
}
4769-
4770-
auto variants = ty::tag_variants(cx.fcx.lcx.ccx.tcx, vdef._0);
4771-
auto matched_cx = new_sub_block_ctxt(cx, "matched_cx");
4772-
auto llblobptr = llval;
4773-
4774-
if (std::ivec::len(variants) == 1u) {
4775-
cx.build.Br(matched_cx.llbb);
4776-
} else {
4777-
auto lltagptr =
4778-
cx.build.PointerCast(llval,
4779-
T_opaque_tag_ptr(cx.fcx.lcx.ccx.tn));
4780-
auto lldiscrimptr = cx.build.GEP(lltagptr,
4781-
~[C_int(0), C_int(0)]);
4782-
auto lldiscrim = cx.build.Load(lldiscrimptr);
4783-
auto variant_tag = 0;
4784-
auto i = 0;
4785-
for (ty::variant_info v in variants) {
4786-
auto this_variant_id = v.id;
4787-
if (vdef._1._0 == this_variant_id._0 &&
4788-
vdef._1._1 == this_variant_id._1) {
4789-
variant_tag = i;
4790-
}
4791-
i += 1;
4792-
}
4793-
auto lleq =
4794-
cx.build.ICmp(lib::llvm::LLVMIntEQ, lldiscrim,
4795-
C_int(variant_tag));
4796-
cx.build.CondBr(lleq, matched_cx.llbb, next_cx.llbb);
4797-
if (std::ivec::len(subpats) > 0u) {
4798-
llblobptr =
4799-
matched_cx.build.GEP(lltagptr, ~[C_int(0), C_int(1)]);
4800-
}
4801-
}
4802-
4803-
auto ty_params = ty::node_id_to_type_params
4804-
(cx.fcx.lcx.ccx.tcx, pat.id);
4805-
if (std::ivec::len(subpats) > 0u) {
4806-
auto i = 0;
4807-
for (@ast::pat subpat in subpats) {
4808-
auto rslt =
4809-
GEP_tag(matched_cx, llblobptr, vdef._0, vdef._1,
4810-
ty_params, i);
4811-
auto llsubvalptr = rslt.val;
4812-
matched_cx = rslt.bcx;
4813-
auto llsubval =
4814-
load_if_immediate(matched_cx, llsubvalptr,
4815-
pat_ty(cx.fcx.lcx.ccx.tcx, subpat));
4816-
auto subpat_res =
4817-
trans_pat_match(matched_cx, subpat, llsubval,
4818-
next_cx);
4819-
matched_cx = subpat_res.bcx;
4820-
i += 1;
4821-
}
4822-
}
4823-
ret rslt(matched_cx, llval);
4824-
}
4825-
case (ast::pat_rec(?field_pats, _)) {
4826-
auto bcx = cx;
4827-
auto ccx = cx.fcx.lcx.ccx;
4828-
auto rec_ty = pat_ty(ccx.tcx, pat);
4829-
auto fields = alt (ty::struct(ccx.tcx, rec_ty)) {
4830-
ty::ty_rec(?fields) { fields }
4831-
};
4832-
for (ast::field_pat f in field_pats) {
4833-
let uint ix = ty::field_idx(ccx.sess, f.pat.span,
4834-
f.ident, fields);
4835-
auto r = GEP_tup_like(bcx, rec_ty, llval, ~[0, ix as int]);
4836-
auto v = load_if_immediate(r.bcx, r.val,
4837-
pat_ty(ccx.tcx, f.pat));
4838-
bcx = trans_pat_match(r.bcx, f.pat, v, next_cx).bcx;
4839-
}
4840-
ret rslt(bcx, llval);
4841-
}
4842-
}
4843-
}
4844-
4845-
type bind_map = hashmap[ast::ident, result];
4846-
4847-
fn trans_pat_binding(&@block_ctxt cx, &@ast::pat pat, ValueRef llval,
4848-
bool is_mem, &bind_map bound) -> result {
4849-
alt (pat.node) {
4850-
case (ast::pat_wild) { ret rslt(cx, llval); }
4851-
case (ast::pat_lit(_)) { ret rslt(cx, llval); }
4852-
case (ast::pat_bind(?name)) {
4853-
auto val = llval;
4854-
if (!is_mem) {
4855-
val = spill_if_immediate
4856-
(cx, llval, node_id_type(cx.fcx.lcx.ccx, pat.id));
4857-
}
4858-
auto r = rslt(cx, val);
4859-
bound.insert(name, r);
4860-
ret r;
4861-
}
4862-
case (ast::pat_tag(_, ?subpats)) {
4863-
if (std::ivec::len[@ast::pat](subpats) == 0u) {
4864-
ret rslt(cx, llval);
4865-
}
4866-
4867-
// Get the appropriate variant for this tag.
4868-
auto vdef;
4869-
alt (cx.fcx.lcx.ccx.tcx.def_map.find(pat.id)) {
4870-
case (some(?x)) { vdef = ast::variant_def_ids(x); }
4871-
case (_) { cx.fcx.lcx.ccx.sess.span_fatal(pat.span,
4872-
"trans_pat_binding: internal error, unbound var"); }
4873-
}
4874-
auto llblobptr = llval;
4875-
if (std::ivec::len(ty::tag_variants(cx.fcx.lcx.ccx.tcx, vdef._0))
4876-
!= 1u) {
4877-
auto lltagptr = cx.build.PointerCast
4878-
(llval, T_opaque_tag_ptr(cx.fcx.lcx.ccx.tn));
4879-
llblobptr = cx.build.GEP(lltagptr, ~[C_int(0), C_int(1)]);
4880-
}
4881-
4882-
auto ty_param_substs =
4883-
ty::node_id_to_type_params(cx.fcx.lcx.ccx.tcx, pat.id);
4884-
4885-
auto this_cx = cx;
4886-
auto i = 0;
4887-
for (@ast::pat subpat in subpats) {
4888-
auto rslt =
4889-
GEP_tag(this_cx, llblobptr, vdef._0, vdef._1,
4890-
ty_param_substs, i);
4891-
this_cx = rslt.bcx;
4892-
auto subpat_res =
4893-
trans_pat_binding(this_cx, subpat, rslt.val, true, bound);
4894-
this_cx = subpat_res.bcx;
4895-
i += 1;
4896-
}
4897-
ret rslt(this_cx, llval);
4898-
}
4899-
case (ast::pat_rec(?field_pats, _)) {
4900-
auto bcx = cx;
4901-
auto ccx = cx.fcx.lcx.ccx;
4902-
auto rec_ty = pat_ty(ccx.tcx, pat);
4903-
auto fields = alt (ty::struct(ccx.tcx, rec_ty)) {
4904-
ty::ty_rec(?fields) { fields }
4905-
};
4906-
for (ast::field_pat f in field_pats) {
4907-
let uint ix = ty::field_idx(ccx.sess, f.pat.span,
4908-
f.ident, fields);
4909-
auto r = GEP_tup_like(bcx, rec_ty, llval, ~[0, ix as int]);
4910-
bcx = trans_pat_binding(bcx, f.pat, r.val, true, bound).bcx;
4911-
}
4912-
ret rslt(bcx, llval);
4913-
}
4914-
}
4915-
}
4916-
4917-
fn trans_alt(&@block_ctxt cx, &@ast::expr expr, &ast::arm[] arms,
4918-
ast::node_id id, &out_method output) -> result {
4919-
auto expr_res = trans_expr(cx, expr);
4920-
auto this_cx = expr_res.bcx;
4921-
let result[] arm_results = ~[];
4922-
for (ast::arm arm in arms) {
4923-
auto bind_maps = ~[];
4924-
auto block_cx = new_scope_block_ctxt(expr_res.bcx, "case block");
4925-
for (@ast::pat pat in arm.pats) {
4926-
auto next_cx = new_sub_block_ctxt(expr_res.bcx, "next");
4927-
auto match_res =
4928-
trans_pat_match(this_cx, pat, expr_res.val, next_cx);
4929-
auto bind_map = new_str_hash[result]();
4930-
auto binding_res = trans_pat_binding
4931-
(match_res.bcx, pat, expr_res.val, false, bind_map);
4932-
bind_maps += ~[bind_map];
4933-
binding_res.bcx.build.Br(block_cx.llbb);
4934-
this_cx = next_cx;
4935-
}
4936-
// Go over the names and node_ids of the bound variables, add a Phi
4937-
// node for each and register the bindings.
4938-
for each (@tup(ast::ident, ast::node_id) item in
4939-
ast::pat_id_map(arm.pats.(0)).items()) {
4940-
auto vals = ~[]; auto llbbs = ~[];
4941-
for (bind_map map in bind_maps) {
4942-
auto rslt = map.get(item._0);
4943-
vals += ~[rslt.val];
4944-
llbbs += ~[rslt.bcx.llbb];
4945-
}
4946-
auto phi = block_cx.build.Phi(val_ty(vals.(0)), vals, llbbs);
4947-
block_cx.fcx.lllocals.insert(item._1, phi);
4948-
}
4949-
auto block_res = trans_block(block_cx, arm.block, output);
4950-
arm_results += ~[block_res];
4951-
}
4952-
auto default_cx = this_cx;
4953-
trans_fail(default_cx, some[span](expr.span),
4954-
"non-exhaustive match failure");
4955-
ret rslt(join_branches(cx, arm_results), C_nil());
4956-
}
4957-
49584744
type generic_info =
49594745
rec(ty::t item_type,
49604746
(option::t[@tydesc_info])[] static_tis,
@@ -6224,10 +6010,9 @@ fn trans_expr(&@block_ctxt cx, &@ast::expr e) -> result {
62246010
fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
62256011
result {
62266012
// FIXME Fill in cx.sp
6227-
62286013
alt (e.node) {
62296014
case (ast::expr_lit(?lit)) {
6230-
ret rslt(cx, trans_lit(cx.fcx.lcx.ccx, *lit, e.id));
6015+
ret rslt(cx, trans_lit(cx.fcx.lcx.ccx, *lit));
62316016
}
62326017
case (ast::expr_unary(?op, ?x)) {
62336018
if (op != ast::deref) { ret trans_unary(cx, op, x, e.id); }
@@ -6259,7 +6044,8 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
62596044
ret trans_do_while(cx, body, cond);
62606045
}
62616046
case (ast::expr_alt(?expr, ?arms)) {
6262-
ret with_out_method(bind trans_alt(cx, expr, arms, e.id, _),
6047+
ret with_out_method(bind trans_alt::trans_alt(cx, expr,
6048+
arms, e.id, _),
62636049
cx, e.id, output);
62646050
}
62656051
case (ast::expr_fn(?f)) {
@@ -8692,7 +8478,7 @@ fn trans_tag_variant(@local_ctxt cx, ast::node_id tag_id,
86928478
// that does so later on?
86938479
fn trans_const_expr(&@crate_ctxt cx, @ast::expr e) -> ValueRef {
86948480
alt (e.node) {
8695-
case (ast::expr_lit(?lit)) { ret trans_lit(cx, *lit, e.id); }
8481+
case (ast::expr_lit(?lit)) { ret trans_lit(cx, *lit); }
86968482
case (_) {
86978483
cx.sess.span_unimpl(e.span, "consts that's not a plain literal");
86988484
}

0 commit comments

Comments
 (0)