# HG changeset patch # User Paul Boddie # Date 1320090040 -3600 # Node ID 22dca03fcccba5781c0475903c276f8668268b87 # Parent a6ddb1e042ea1384adb2baf579a04d82c5804150 Preserved empty usage observations when lists of object sets are combined and when mapping dictionaries are updated. diff -r a6ddb1e042ea -r 22dca03fcccb micropython/common.py --- a/micropython/common.py Mon Oct 31 19:09:47 2011 +0100 +++ b/micropython/common.py Mon Oct 31 20:40:40 2011 +0100 @@ -62,6 +62,14 @@ def __nonzero__(self): return self.objects != {} + # List methods. + + def __add__(self, other): + obj = ObjectSet(self) + for key in other: + obj.add(key) + return obj + # Set membership and comparisons. def __hash__(self): @@ -131,7 +139,7 @@ if value is None: new_dict[key] = None else: - new_dict[key] = set([value]) + new_dict[key] = ObjectSet([value]) return new_dict def merge_mapping_dicts(dicts): @@ -148,11 +156,20 @@ for old_dict in dicts: for key, value in old_dict.items(): - if value is not None: - if not new_dict.has_key(key): + if not new_dict.has_key(key): + if value is not None: new_dict[key] = ObjectSet(value) else: + new_dict[key] = None + elif new_dict[key] is not None: + if value is not None: new_dict[key].update(value) + else: + new_dict[key].add(value) + else: + if value is not None: + objset = new_dict[key] = ObjectSet(value) + objset.add(None) def combine_mapping_dicts(d1, d2): @@ -186,14 +203,17 @@ in 'd1' will not be added to 'd1'. """ - d2_keys = d2.keys() + if d2 is not None: + d2_keys = d2.keys() - for key in d2_keys: - if not d1.has_key(key): - if not only_d1_keys: - combined[key] = d2[key] - else: - combined[key] = combine_op(d1[key], d2[key]) + for key in d2_keys: + if not d1.has_key(key): + if not only_d1_keys: + combined[key] = d2[key] + else: + combined[key] = combine_op(d1[key], d2[key]) + else: + d2_keys = () for key in d1.keys(): if key not in d2_keys: @@ -212,11 +232,11 @@ if l2 is None: return None else: - return l2 + return l2 + [None] elif l2 is None: - return l1 + return l1 + [None] - combined = set([]) + combined = ObjectSet() for i1 in l1: for i2 in l2: combined.add(i1.merge(i2)) @@ -292,6 +312,7 @@ all_objtypes = set() for attrnames in usage: + attrnames = attrnames or () objtypes = objtable.all_possible_objects_plus_status(attrnames) if not objtypes: print "Warning: usage in %r for %r finds no object supporting all attributes %r" % (