# HG changeset patch # User Paul Boddie # Date 1489097983 -3600 # Node ID e1c5d2360c5ce9fc16d09f0fb57a03e1a8c05489 # Parent 300df9719aec05e1bb901b46aec95721bbd1e17e Avoid recomputing reference attribute information when making access plans. diff -r 300df9719aec -r e1c5d2360c5c deducer.py --- a/deducer.py Thu Mar 09 21:53:55 2017 +0100 +++ b/deducer.py Thu Mar 09 23:19:43 2017 +0100 @@ -131,7 +131,8 @@ # access/attribute-specific accessor tests. self.reference_all_attrs = {} - self.reference_all_attrtypes = {} + self.reference_all_providers = {} + self.reference_all_provider_kinds = {} self.reference_all_accessor_types = {} self.reference_all_accessor_general_types = {} self.reference_test_types = {} @@ -604,17 +605,24 @@ attrname = get_attrname_from_location(location) - all_accessed_attrs = set() - all_providers = set() + self.reference_all_attrs[location] = all_accessed_attrs = [] + self.reference_all_providers[location] = all_providers = [] + self.reference_all_provider_kinds[location] = all_provider_kinds = set() # Obtain provider and attribute details for this kind of # object. for attrtype, object_type, attr in referenced_attrs: - all_accessed_attrs.add(attr) - all_providers.add(object_type) - - self.reference_all_attrs[location] = all_accessed_attrs + all_accessed_attrs.append(attr) + all_providers.append(object_type) + all_provider_kinds.add(attrtype) + + # Obtain reference and provider information as sets for the + # operations below, retaining the list forms for use with + # instruction plan preparation. + + all_accessed_attrs = set(all_accessed_attrs) + all_providers = set(all_providers) all_general_providers = self.get_most_general_types(all_providers) # Determine which attributes would be provided by the @@ -1974,17 +1982,11 @@ remaining = attrnames.split(".") attrname = remaining[0] - # Obtain reference and accessor information, retaining also distinct - # provider kind details. - - attrs = [] - objtypes = [] - provider_kinds = set() - - for attrtype, objtype, attr in self.referenced_attrs[location]: - attrs.append(attr) - objtypes.append(objtype) - provider_kinds.add(attrtype) + # Obtain reference, provider and provider kind information. + + attrs = self.reference_all_attrs[location] + provider_types = self.reference_all_providers[location] + provider_kinds = self.reference_all_provider_kinds[location] # Obtain accessor type and kind information. @@ -2016,10 +2018,10 @@ base = None dynamic_base = None - # Constant accesses have static accessors. + # Constant accesses have static providers. if const_access: - base = len(objtypes) == 1 and first(objtypes) + base = len(provider_types) == 1 and first(provider_types) # Name-based accesses.