Skip to content

Commit b4de6f9

Browse files
committed
---
yaml --- r: 1446 b: refs/heads/master c: 699eb69 h: refs/heads/master v: v3
1 parent 0e6f59c commit b4de6f9

File tree

2 files changed

+23
-38
lines changed

2 files changed

+23
-38
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: 9c928fcf8c584659274bdb9095e47f2fa963d05c
2+
refs/heads/master: 699eb69cc85f663d62200ee64ec9f2a606fcf440

trunk/src/comp/middle/trans.rs

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ type glue_fns = rec(ValueRef activate_glue,
6161

6262
tag arity { nullary; n_ary; }
6363
type tag_info = rec(type_handle th,
64-
mutable vec[tup(ast.def_id,arity)] variants,
6564
mutable uint size,
6665
vec[ast.ty_param] ty_params);
6766

@@ -2384,11 +2383,12 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
23842383

23852384
auto vdef = option.get[ast.variant_def](vdef_opt);
23862385
auto variant_id = vdef._1;
2387-
auto tinfo = cx.fcx.ccx.tags.get(vdef._0);
23882386
auto variant_tag = 0;
2387+
2388+
auto variants = tag_variants(cx.fcx.ccx, vdef._0);
23892389
auto i = 0;
2390-
for (tup(ast.def_id,arity) vinfo in tinfo.variants) {
2391-
auto this_variant_id = vinfo._0;
2390+
for (ast.variant v in variants) {
2391+
auto this_variant_id = v.id;
23922392
if (variant_id._0 == this_variant_id._0 &&
23932393
variant_id._1 == this_variant_id._1) {
23942394
variant_tag = i;
@@ -4436,9 +4436,7 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
44364436
case (ast.item_tag(_, ?variants, ?tps, ?tag_id)) {
44374437
auto vi = new_def_hash[uint]();
44384438
auto navi = new_def_hash[uint]();
4439-
let vec[tup(ast.def_id,arity)] variant_info = vec();
44404439
cx.tags.insert(tag_id, @rec(th=mk_type_handle(),
4441-
mutable variants=variant_info,
44424440
mutable size=0u,
44434441
ty_params=tps));
44444442
cx.items.insert(tag_id, i);
@@ -4502,10 +4500,8 @@ fn resolve_tag_types_for_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
45024500
auto max_size = 0u;
45034501

45044502
auto info = cx.tags.get(tag_id);
4505-
let vec[tup(ast.def_id,arity)] variant_info = vec();
45064503

45074504
for (ast.variant variant in variants) {
4508-
auto arity_info;
45094505
if (_vec.len[ast.variant_arg](variant.args) > 0u) {
45104506
auto llvariantty = type_of_variant(cx, variant);
45114507
auto align =
@@ -4516,16 +4512,9 @@ fn resolve_tag_types_for_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
45164512
llvariantty) as uint;
45174513
if (max_align < align) { max_align = align; }
45184514
if (max_size < size) { max_size = size; }
4519-
4520-
arity_info = n_ary;
4521-
} else {
4522-
arity_info = nullary;
45234515
}
4524-
4525-
variant_info += vec(tup(variant.id, arity_info));
45264516
}
45274517

4528-
info.variants = variant_info;
45294518
info.size = max_size;
45304519

45314520
// FIXME: alignment is wrong here, manually insert padding I
@@ -4566,28 +4555,24 @@ fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
45664555
auto union_ty = elts.(1);
45674556

45684557
auto i = 0u;
4569-
while (i < _vec.len[tup(ast.def_id,arity)](info.variants)) {
4570-
auto variant_info = info.variants.(i);
4571-
alt (variant_info._1) {
4572-
case (nullary) {
4573-
// Nullary tags become constants.
4574-
auto union_val = C_zero_byte_arr(info.size as uint);
4575-
auto val = C_struct(vec(C_int(i as int), union_val));
4576-
4577-
// FIXME: better name
4578-
auto gvar = llvm.LLVMAddGlobal(cx.llmod, val_ty(val),
4579-
_str.buf("tag"));
4580-
llvm.LLVMSetInitializer(gvar, val);
4581-
llvm.LLVMSetGlobalConstant(gvar, True);
4582-
llvm.LLVMSetLinkage(gvar,
4583-
lib.llvm.LLVMPrivateLinkage
4584-
as llvm.Linkage);
4585-
cx.item_ids.insert(variant_info._0, gvar);
4586-
}
4587-
case (n_ary) {
4588-
// N-ary tags are treated as functions and generated
4589-
// later.
4590-
}
4558+
auto n_variants = _vec.len[ast.variant](variants);
4559+
while (i < n_variants) {
4560+
auto variant = variants.(i);
4561+
if (_vec.len[ast.variant_arg](variant.args) == 0u) {
4562+
// Nullary tags become constants. (N-ary tags are treated
4563+
// as functions and generated later.)
4564+
4565+
auto union_val = C_zero_byte_arr(info.size as uint);
4566+
auto val = C_struct(vec(C_int(i as int), union_val));
4567+
4568+
// FIXME: better name
4569+
auto gvar = llvm.LLVMAddGlobal(cx.llmod, val_ty(val),
4570+
_str.buf("tag"));
4571+
llvm.LLVMSetInitializer(gvar, val);
4572+
llvm.LLVMSetGlobalConstant(gvar, True);
4573+
llvm.LLVMSetLinkage(gvar, lib.llvm.LLVMPrivateLinkage
4574+
as llvm.Linkage);
4575+
cx.item_ids.insert(variant.id, gvar);
45914576
}
45924577

45934578
i += 1u;

0 commit comments

Comments
 (0)