@@ -61,7 +61,6 @@ type glue_fns = rec(ValueRef activate_glue,
61
61
62
62
tag arity { nullary; n_ary; }
63
63
type tag_info = rec ( type_handle th,
64
- mutable vec[ tup( ast. def_id, arity) ] variants ,
65
64
mutable uint size,
66
65
vec[ ast. ty_param] ty_params ) ;
67
66
@@ -2384,11 +2383,12 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
2384
2383
2385
2384
auto vdef = option. get[ ast. variant_def] ( vdef_opt) ;
2386
2385
auto variant_id = vdef. _1;
2387
- auto tinfo = cx. fcx. ccx. tags. get( vdef. _0) ;
2388
2386
auto variant_tag = 0 ;
2387
+
2388
+ auto variants = tag_variants( cx. fcx. ccx, vdef. _0) ;
2389
2389
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 ;
2392
2392
if ( variant_id. _0 == this_variant_id. _0 &&
2393
2393
variant_id. _1 == this_variant_id. _1) {
2394
2394
variant_tag = i;
@@ -4436,9 +4436,7 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
4436
4436
case ( ast. item_tag( _, ?variants, ?tps, ?tag_id) ) {
4437
4437
auto vi = new_def_hash[ uint] ( ) ;
4438
4438
auto navi = new_def_hash[ uint] ( ) ;
4439
- let vec[ tup( ast. def_id, arity) ] variant_info = vec( ) ;
4440
4439
cx. tags. insert( tag_id, @rec( th=mk_type_handle( ) ,
4441
- mutable variants=variant_info,
4442
4440
mutable size=0 u,
4443
4441
ty_params=tps) ) ;
4444
4442
cx. items. insert( tag_id, i) ;
@@ -4502,10 +4500,8 @@ fn resolve_tag_types_for_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
4502
4500
auto max_size = 0 u;
4503
4501
4504
4502
auto info = cx. tags. get( tag_id) ;
4505
- let vec[ tup( ast. def_id, arity) ] variant_info = vec( ) ;
4506
4503
4507
4504
for ( ast. variant variant in variants) {
4508
- auto arity_info;
4509
4505
if ( _vec. len [ ast. variant_arg ] ( variant. args ) > 0 u) {
4510
4506
auto llvariantty = type_of_variant ( cx, variant) ;
4511
4507
auto align =
@@ -4516,16 +4512,9 @@ fn resolve_tag_types_for_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
4516
4512
llvariantty) as uint ;
4517
4513
if ( max_align < align) { max_align = align; }
4518
4514
if ( max_size < size) { max_size = size; }
4519
-
4520
- arity_info = n_ary;
4521
- } else {
4522
- arity_info = nullary;
4523
4515
}
4524
-
4525
- variant_info += vec ( tup ( variant. id , arity_info) ) ;
4526
4516
}
4527
4517
4528
- info. variants = variant_info;
4529
4518
info. size = max_size;
4530
4519
4531
4520
// FIXME: alignment is wrong here, manually insert padding I
@@ -4566,28 +4555,24 @@ fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
4566
4555
auto union_ty = elts. ( 1 ) ;
4567
4556
4568
4557
auto i = 0 u;
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 ) == 0 u) {
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) ;
4591
4576
}
4592
4577
4593
4578
i += 1 u;
0 commit comments