@@ -861,37 +861,24 @@ def _decompose(flag, value):
861861 # _decompose is only called if the value is not named
862862 not_covered = value
863863 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- ]
881864 members = []
882- for member , member_value in flags_to_check :
865+ for member in flag :
866+ member_value = member .value
883867 if member_value and member_value & value == member_value :
884868 members .append (member )
885869 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
886878 if not members and value in flag ._value2member_map_ :
887879 members .append (flag ._value2member_map_ [value ])
888880 members .sort (key = lambda m : m ._value_ , reverse = True )
889881 if len (members ) > 1 and members [0 ].value == value :
890882 # we have the breakdown, don't need the value member itself
891883 members .pop (0 )
892884 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