@@ -589,22 +589,33 @@ pub struct ctxt<'tcx> {
589
589
// through the type during type construction, so that we can quickly
590
590
// check whether the type has various kinds of types in it without
591
591
// recursing over the type itself.
592
- const HAS_PARAMS : uint = 1 ;
593
- const HAS_SELF : uint = 2 ;
594
- const HAS_TY_INFER : uint = 4 ;
595
- const HAS_RE_INFER : uint = 8 ;
596
- const HAS_REGIONS : uint = 16 ;
597
- const HAS_TY_ERR : uint = 32 ;
598
- const HAS_TY_BOT : uint = 64 ;
599
- const NEEDS_SUBST : uint = HAS_PARAMS | HAS_SELF | HAS_REGIONS ;
592
+ bitflags ! {
593
+ flags TypeFlags : u32 {
594
+ const NO_TYPE_FLAGS = 0b0 ,
595
+ const HAS_PARAMS = 0b1 ,
596
+ const HAS_SELF = 0b10 ,
597
+ const HAS_TY_INFER = 0b100 ,
598
+ const HAS_RE_INFER = 0b1000 ,
599
+ const HAS_REGIONS = 0b10000 ,
600
+ const HAS_TY_ERR = 0b100000 ,
601
+ const HAS_TY_BOT = 0b1000000 ,
602
+ const NEEDS_SUBST = HAS_PARAMS . bits | HAS_SELF . bits | HAS_REGIONS . bits,
603
+ }
604
+ }
600
605
601
606
pub type t_box = & ' static t_box_ ;
602
607
603
608
#[ deriving( Show ) ]
604
609
pub struct t_box_ {
605
610
pub sty : sty ,
606
611
pub id : uint ,
607
- pub flags : uint ,
612
+ pub flags : TypeFlags ,
613
+ }
614
+
615
+ impl fmt:: Show for TypeFlags {
616
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
617
+ write ! ( f, "{}" , self . bits)
618
+ }
608
619
}
609
620
610
621
// To reduce refcounting cost, we're representing types as unsafe pointers
@@ -631,8 +642,8 @@ pub fn get(t: t) -> t_box {
631
642
}
632
643
}
633
644
634
- fn tbox_has_flag ( tb : t_box , flag : uint ) -> bool {
635
- ( tb. flags & flag) != 0 u
645
+ fn tbox_has_flag ( tb : t_box , flag : TypeFlags ) -> bool {
646
+ tb. flags . intersects ( flag)
636
647
}
637
648
pub fn type_has_params ( t : t ) -> bool {
638
649
tbox_has_flag ( get ( t) , HAS_PARAMS )
@@ -887,7 +898,7 @@ mod primitives {
887
898
pub static $name: t_box_ = t_box_ {
888
899
sty: $sty,
889
900
id: $id,
890
- flags: 0 ,
901
+ flags: super :: NO_TYPE_FLAGS ,
891
902
} ;
892
903
)
893
904
)
@@ -1578,32 +1589,32 @@ pub fn mk_t(cx: &ctxt, st: sty) -> t {
1578
1589
_ => ( )
1579
1590
}
1580
1591
1581
- let mut flags = 0 u ;
1582
- fn rflags ( r : Region ) -> uint {
1592
+ let mut flags = NO_TYPE_FLAGS ;
1593
+ fn rflags ( r : Region ) -> TypeFlags {
1583
1594
HAS_REGIONS | {
1584
1595
match r {
1585
1596
ty:: ReInfer ( _) => HAS_RE_INFER ,
1586
- _ => 0 u
1597
+ _ => NO_TYPE_FLAGS ,
1587
1598
}
1588
1599
}
1589
1600
}
1590
- fn sflags ( substs : & Substs ) -> uint {
1591
- let mut f = 0 u ;
1601
+ fn sflags ( substs : & Substs ) -> TypeFlags {
1602
+ let mut f = NO_TYPE_FLAGS ;
1592
1603
let mut i = substs. types . iter ( ) ;
1593
1604
for tt in i {
1594
- f |= get ( * tt) . flags ;
1605
+ f = f | get ( * tt) . flags ;
1595
1606
}
1596
1607
match substs. regions {
1597
1608
subst:: ErasedRegions => { }
1598
1609
subst:: NonerasedRegions ( ref regions) => {
1599
1610
for r in regions. iter ( ) {
1600
- f |= rflags ( * r)
1611
+ f = f | rflags ( * r)
1601
1612
}
1602
1613
}
1603
1614
}
1604
1615
return f;
1605
1616
}
1606
- fn flags_for_bounds ( bounds : & ExistentialBounds ) -> uint {
1617
+ fn flags_for_bounds ( bounds : & ExistentialBounds ) -> TypeFlags {
1607
1618
rflags ( bounds. region_bound )
1608
1619
}
1609
1620
match & st {
@@ -1616,53 +1627,53 @@ pub fn mk_t(cx: &ctxt, st: sty) -> t {
1616
1627
// But doing so caused sporadic memory corruption, and
1617
1628
// neither I (tjc) nor nmatsakis could figure out why,
1618
1629
// so we're doing it this way.
1619
- & ty_bot => flags |= HAS_TY_BOT ,
1620
- & ty_err => flags |= HAS_TY_ERR ,
1630
+ & ty_bot => flags = flags | HAS_TY_BOT ,
1631
+ & ty_err => flags = flags | HAS_TY_ERR ,
1621
1632
& ty_param( ref p) => {
1622
1633
if p. space == subst:: SelfSpace {
1623
- flags |= HAS_SELF ;
1634
+ flags = flags | HAS_SELF ;
1624
1635
} else {
1625
- flags |= HAS_PARAMS ;
1636
+ flags = flags | HAS_PARAMS ;
1626
1637
}
1627
1638
}
1628
- & ty_unboxed_closure( _, ref region) => flags |= rflags ( * region) ,
1629
- & ty_infer( _) => flags |= HAS_TY_INFER ,
1639
+ & ty_unboxed_closure( _, ref region) => flags = flags | rflags ( * region) ,
1640
+ & ty_infer( _) => flags = flags | HAS_TY_INFER ,
1630
1641
& ty_enum( _, ref substs) | & ty_struct( _, ref substs) => {
1631
- flags |= sflags ( substs) ;
1642
+ flags = flags | sflags ( substs) ;
1632
1643
}
1633
1644
& ty_trait( box TyTrait { ref substs, ref bounds, .. } ) => {
1634
- flags |= sflags ( substs) ;
1635
- flags |= flags_for_bounds ( bounds) ;
1645
+ flags = flags | sflags ( substs) ;
1646
+ flags = flags | flags_for_bounds ( bounds) ;
1636
1647
}
1637
1648
& ty_uniq( tt) | & ty_vec( tt, _) | & ty_open( tt) => {
1638
- flags |= get ( tt) . flags
1649
+ flags = flags | get ( tt) . flags
1639
1650
}
1640
1651
& ty_ptr( ref m) => {
1641
- flags |= get ( m. ty ) . flags ;
1652
+ flags = flags | get ( m. ty ) . flags ;
1642
1653
}
1643
1654
& ty_rptr( r, ref m) => {
1644
- flags |= rflags ( r) ;
1645
- flags |= get ( m. ty ) . flags ;
1655
+ flags = flags | rflags ( r) ;
1656
+ flags = flags | get ( m. ty ) . flags ;
1646
1657
}
1647
- & ty_tup( ref ts) => for tt in ts. iter ( ) { flags |= get ( * tt) . flags ; } ,
1658
+ & ty_tup( ref ts) => for tt in ts. iter ( ) { flags = flags | get ( * tt) . flags ; } ,
1648
1659
& ty_bare_fn( ref f) => {
1649
- for a in f. sig . inputs . iter ( ) { flags |= get ( * a) . flags ; }
1650
- flags |= get ( f. sig . output ) . flags ;
1660
+ for a in f. sig . inputs . iter ( ) { flags = flags | get ( * a) . flags ; }
1661
+ flags = flags | get ( f. sig . output ) . flags ;
1651
1662
// T -> _|_ is *not* _|_ !
1652
- flags &= ! HAS_TY_BOT ;
1663
+ flags = flags - HAS_TY_BOT ;
1653
1664
}
1654
1665
& ty_closure( ref f) => {
1655
1666
match f. store {
1656
1667
RegionTraitStore ( r, _) => {
1657
- flags |= rflags ( r) ;
1668
+ flags = flags | rflags ( r) ;
1658
1669
}
1659
1670
_ => { }
1660
1671
}
1661
- for a in f. sig . inputs . iter ( ) { flags |= get ( * a) . flags ; }
1662
- flags |= get ( f. sig . output ) . flags ;
1672
+ for a in f. sig . inputs . iter ( ) { flags = flags | get ( * a) . flags ; }
1673
+ flags = flags | get ( f. sig . output ) . flags ;
1663
1674
// T -> _|_ is *not* _|_ !
1664
- flags &= ! HAS_TY_BOT ;
1665
- flags |= flags_for_bounds ( & f. bounds ) ;
1675
+ flags = flags - HAS_TY_BOT ;
1676
+ flags = flags | flags_for_bounds ( & f. bounds ) ;
1666
1677
}
1667
1678
}
1668
1679
@@ -1977,14 +1988,16 @@ impl ItemSubsts {
1977
1988
1978
1989
// Type utilities
1979
1990
1980
- pub fn type_is_nil ( ty : t ) -> bool { get ( ty) . sty == ty_nil }
1991
+ pub fn type_is_nil ( ty : t ) -> bool {
1992
+ get ( ty) . sty == ty_nil
1993
+ }
1981
1994
1982
1995
pub fn type_is_bot ( ty : t ) -> bool {
1983
- ( get ( ty) . flags & HAS_TY_BOT ) != 0
1996
+ get ( ty) . flags . intersects ( HAS_TY_BOT )
1984
1997
}
1985
1998
1986
1999
pub fn type_is_error ( ty : t ) -> bool {
1987
- ( get ( ty) . flags & HAS_TY_ERR ) != 0
2000
+ get ( ty) . flags . intersects ( HAS_TY_ERR )
1988
2001
}
1989
2002
1990
2003
pub fn type_needs_subst ( ty : t ) -> bool {
0 commit comments