@@ -861,37 +861,24 @@ def _decompose(flag, value):
861
861
# _decompose is only called if the value is not named
862
862
not_covered = value
863
863
negative = value < 0
864
- # issue29167: wrap accesses to _value2member_map_ in a list to avoid race
865
- # conditions between iterating over it and having more pseudo-
866
- # members added to it
867
- if negative :
868
- # only check for named flags
869
- flags_to_check = [
870
- (m , v )
871
- for v , m in list (flag ._value2member_map_ .items ())
872
- if m .name is not None
873
- ]
874
- else :
875
- # check for named flags and powers-of-two flags
876
- flags_to_check = [
877
- (m , v )
878
- for v , m in list (flag ._value2member_map_ .items ())
879
- if m .name is not None or _power_of_two (v )
880
- ]
881
864
members = []
882
- for member , member_value in flags_to_check :
865
+ for member in flag :
866
+ member_value = member .value
883
867
if member_value and member_value & value == member_value :
884
868
members .append (member )
885
869
not_covered &= ~ member_value
870
+ if not negative :
871
+ tmp = not_covered
872
+ while tmp :
873
+ flag_value = 2 ** _high_bit (tmp )
874
+ if flag_value in flag ._value2member_map_ :
875
+ members .append (flag ._value2member_map_ [flag_value ])
876
+ not_covered &= ~ flag_value
877
+ tmp &= ~ flag_value
886
878
if not members and value in flag ._value2member_map_ :
887
879
members .append (flag ._value2member_map_ [value ])
888
880
members .sort (key = lambda m : m ._value_ , reverse = True )
889
881
if len (members ) > 1 and members [0 ].value == value :
890
882
# we have the breakdown, don't need the value member itself
891
883
members .pop (0 )
892
884
return members , not_covered
893
-
894
- def _power_of_two (value ):
895
- if value < 1 :
896
- return False
897
- return value == 2 ** _high_bit (value )
0 commit comments