@@ -891,6 +891,26 @@ fn dynamic_size_of(@block_ctxt cx, @ty.t t) -> result {
891
891
}
892
892
ret align_elements( cx, tys) ;
893
893
}
894
+ case ( ty. ty_tag( ?tid, ?tps) ) {
895
+ auto bcx = cx;
896
+
897
+ // Compute max(variant sizes).
898
+ let ValueRef max_size = bcx. build. Alloca ( T_int ( ) ) ;
899
+ bcx. build. Store ( C_int ( 0 ) , max_size) ;
900
+
901
+ auto variants = tag_variants( bcx. fcx. ccx, tid) ;
902
+ for ( ast. variant variant in variants) {
903
+ let vec[ @ty. t] tys = variant_types( bcx. fcx. ccx, variant) ;
904
+ auto rslt = align_elements( bcx, tys) ;
905
+ bcx = rslt. bcx;
906
+
907
+ auto this_size = rslt. val;
908
+ auto old_max_size = bcx. build. Load ( max_size) ;
909
+ bcx. build. Store ( umax( bcx, this_size, old_max_size) , max_size) ;
910
+ }
911
+
912
+ ret res( bcx, bcx. build. Load ( max_size) ) ;
913
+ }
894
914
}
895
915
}
896
916
@@ -1450,16 +1470,25 @@ fn decr_refcnt_and_if_zero(@block_ctxt cx,
1450
1470
1451
1471
// Tag information
1452
1472
1453
- fn type_of_variant ( @crate_ctxt cx, & ast. variant v) -> TypeRef {
1454
- let vec[ TypeRef ] lltys = vec( ) ;
1473
+ fn variant_types ( @crate_ctxt cx, & ast. variant v) -> vec [ @ty . t ] {
1474
+ let vec[ @ty . t ] tys = vec( ) ;
1455
1475
alt ( ty. ann_to_type( v. ann) . struct ) {
1456
1476
case ( ty. ty_fn( _, ?args, _) ) {
1457
1477
for ( ty. arg arg in args) {
1458
- lltys += vec( type_of ( cx , arg. ty) ) ;
1478
+ tys += vec( arg. ty) ;
1459
1479
}
1460
1480
}
1461
1481
case ( _) { fail; }
1462
1482
}
1483
+ ret tys;
1484
+ }
1485
+
1486
+ fn type_of_variant( @crate_ctxt cx, & ast. variant v) -> TypeRef {
1487
+ let vec[ TypeRef ] lltys = vec( ) ;
1488
+ auto tys = variant_types( cx, v) ;
1489
+ for ( @ty. t typ in tys) {
1490
+ lltys += vec( type_of( cx, typ) ) ;
1491
+ }
1463
1492
ret T_struct ( lltys) ;
1464
1493
}
1465
1494
0 commit comments