| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library kernel.class_hierarchy_basic; | 5 library kernel.class_hierarchy_basic; |
| 6 | 6 |
| 7 import 'package:kernel/class_hierarchy.dart'; | 7 import 'package:kernel/class_hierarchy.dart'; |
| 8 import 'package:kernel/type_algebra.dart'; | 8 import 'package:kernel/type_algebra.dart'; |
| 9 import 'package:kernel/ast.dart'; | 9 import 'package:kernel/ast.dart'; |
| 10 | 10 |
| 11 /// A simple implementation of the class hierarchy interface using | 11 /// A simple implementation of the class hierarchy interface using |
| 12 /// hash tables for everything. | 12 /// hash tables for everything. |
| 13 class BasicClassHierarchy implements ClassHierarchy { | 13 class BasicClassHierarchy implements ClassHierarchy { |
| 14 final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{}; | 14 final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{}; |
| 15 final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{}; | 15 final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{}; |
| 16 final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{}; | 16 final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{}; |
| 17 final Map<Class, Map<Class, InterfaceType>> supertypeInstantiations = | 17 final Map<Class, Map<Class, Supertype>> supertypeInstantiations = |
| 18 <Class, Map<Class, InterfaceType>>{}; | 18 <Class, Map<Class, Supertype>>{}; |
| 19 final Map<Class, Map<Name, Member>> gettersAndCalls = | 19 final Map<Class, Map<Name, Member>> gettersAndCalls = |
| 20 <Class, Map<Name, Member>>{}; | 20 <Class, Map<Name, Member>>{}; |
| 21 final Map<Class, Map<Name, Member>> setters = <Class, Map<Name, Member>>{}; | 21 final Map<Class, Map<Name, Member>> setters = <Class, Map<Name, Member>>{}; |
| 22 final Map<Class, Map<Name, List<Member>>> interfaceGettersAndCalls = | 22 final Map<Class, Map<Name, List<Member>>> interfaceGettersAndCalls = |
| 23 <Class, Map<Name, List<Member>>>{}; | 23 <Class, Map<Name, List<Member>>>{}; |
| 24 final Map<Class, Map<Name, List<Member>>> interfaceSetters = | 24 final Map<Class, Map<Name, List<Member>>> interfaceSetters = |
| 25 <Class, Map<Name, List<Member>>>{}; | 25 <Class, Map<Name, List<Member>>>{}; |
| 26 final List<Class> classes = <Class>[]; | 26 final List<Class> classes = <Class>[]; |
| 27 final Map<Class, int> classIndex = <Class, int>{}; | 27 final Map<Class, int> classIndex = <Class, int>{}; |
| 28 | 28 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 for (var supertype in node.implementedTypes) { | 105 for (var supertype in node.implementedTypes) { |
| 106 buildSuperTypeSets(supertype.classNode); | 106 buildSuperTypeSets(supertype.classNode); |
| 107 supertypes[node].addAll(supertypes[supertype.classNode]); | 107 supertypes[node].addAll(supertypes[supertype.classNode]); |
| 108 } | 108 } |
| 109 classes.add(node); | 109 classes.add(node); |
| 110 classIndex[node] = classes.length - 1; | 110 classIndex[node] = classes.length - 1; |
| 111 } | 111 } |
| 112 | 112 |
| 113 void buildSuperTypeInstantiations(Class node) { | 113 void buildSuperTypeInstantiations(Class node) { |
| 114 if (supertypeInstantiations.containsKey(node)) return; | 114 if (supertypeInstantiations.containsKey(node)) return; |
| 115 supertypeInstantiations[node] = <Class, InterfaceType>{node: node.thisType}; | 115 supertypeInstantiations[node] = <Class, Supertype>{ |
| 116 node: node.asThisSupertype |
| 117 }; |
| 116 for (var supertype in node.supers) { | 118 for (var supertype in node.supers) { |
| 117 var superclass = supertype.classNode; | 119 var superclass = supertype.classNode; |
| 118 buildSuperTypeInstantiations(superclass); | 120 buildSuperTypeInstantiations(superclass); |
| 119 var substitution = new Map<TypeParameter, DartType>.fromIterables( | 121 var substitution = Substitution.fromPairs( |
| 120 superclass.typeParameters, supertype.typeArguments); | 122 superclass.typeParameters, supertype.typeArguments); |
| 121 supertypeInstantiations[superclass].forEach((key, type) { | 123 supertypeInstantiations[superclass].forEach((key, type) { |
| 122 supertypeInstantiations[node][key] = substitute(type, substitution); | 124 supertypeInstantiations[node][key] = |
| 125 substitution.substituteSupertype(type); |
| 123 }); | 126 }); |
| 124 } | 127 } |
| 125 } | 128 } |
| 126 | 129 |
| 127 void buildDispatchTable(Class node) { | 130 void buildDispatchTable(Class node) { |
| 128 if (gettersAndCalls.containsKey(node)) return; | 131 if (gettersAndCalls.containsKey(node)) return; |
| 129 gettersAndCalls[node] = <Name, Member>{}; | 132 gettersAndCalls[node] = <Name, Member>{}; |
| 130 setters[node] = <Name, Member>{}; | 133 setters[node] = <Name, Member>{}; |
| 131 if (node.supertype != null) { | 134 if (node.supertype != null) { |
| 132 buildDispatchTable(node.supertype.classNode); | 135 buildDispatchTable(node.supertype.classNode); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 156 Map<Name, List<Member>> source, Map<Name, List<Member>> destination) { | 159 Map<Name, List<Member>> source, Map<Name, List<Member>> destination) { |
| 157 for (var name in source.keys) { | 160 for (var name in source.keys) { |
| 158 destination.putIfAbsent(name, () => <Member>[]).addAll(source[name]); | 161 destination.putIfAbsent(name, () => <Member>[]).addAll(source[name]); |
| 159 } | 162 } |
| 160 } | 163 } |
| 161 | 164 |
| 162 void buildInterfaceTable(Class node) { | 165 void buildInterfaceTable(Class node) { |
| 163 if (interfaceGettersAndCalls.containsKey(node)) return; | 166 if (interfaceGettersAndCalls.containsKey(node)) return; |
| 164 interfaceGettersAndCalls[node] = <Name, List<Member>>{}; | 167 interfaceGettersAndCalls[node] = <Name, List<Member>>{}; |
| 165 interfaceSetters[node] = <Name, List<Member>>{}; | 168 interfaceSetters[node] = <Name, List<Member>>{}; |
| 166 void inheritFrom(InterfaceType type) { | 169 void inheritFrom(Supertype type) { |
| 167 if (type == null) return; | 170 if (type == null) return; |
| 168 buildInterfaceTable(type.classNode); | 171 buildInterfaceTable(type.classNode); |
| 169 mergeMaps(interfaceGettersAndCalls[type.classNode], | 172 mergeMaps(interfaceGettersAndCalls[type.classNode], |
| 170 interfaceGettersAndCalls[node]); | 173 interfaceGettersAndCalls[node]); |
| 171 mergeMaps(interfaceSetters[type.classNode], interfaceSetters[node]); | 174 mergeMaps(interfaceSetters[type.classNode], interfaceSetters[node]); |
| 172 } | 175 } |
| 173 inheritFrom(node.supertype); | 176 inheritFrom(node.supertype); |
| 174 inheritFrom(node.mixedInType); | 177 inheritFrom(node.mixedInType); |
| 175 node.implementedTypes.forEach(inheritFrom); | 178 node.implementedTypes.forEach(inheritFrom); |
| 176 // Overwrite map entries with declared members. | 179 // Overwrite map entries with declared members. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 196 } | 199 } |
| 197 | 200 |
| 198 bool isSubmixtureOf(Class subtype, Class supertype) { | 201 bool isSubmixtureOf(Class subtype, Class supertype) { |
| 199 return superMixtures[subtype].contains(supertype); | 202 return superMixtures[subtype].contains(supertype); |
| 200 } | 203 } |
| 201 | 204 |
| 202 bool isSubtypeOf(Class subtype, Class supertype) { | 205 bool isSubtypeOf(Class subtype, Class supertype) { |
| 203 return supertypes[subtype].contains(supertype); | 206 return supertypes[subtype].contains(supertype); |
| 204 } | 207 } |
| 205 | 208 |
| 206 InterfaceType getClassAsInstanceOf(Class type, Class supertype) { | 209 Supertype getClassAsInstanceOf(Class type, Class supertype) { |
| 207 return supertypeInstantiations[type][supertype]; | 210 return supertypeInstantiations[type][supertype]; |
| 208 } | 211 } |
| 209 | 212 |
| 210 Member getDispatchTarget(Class class_, Name name, {bool setter: false}) { | 213 Member getDispatchTarget(Class class_, Name name, {bool setter: false}) { |
| 211 return setter ? setters[class_][name] : gettersAndCalls[class_][name]; | 214 return setter ? setters[class_][name] : gettersAndCalls[class_][name]; |
| 212 } | 215 } |
| 213 | 216 |
| 214 Iterable<Member> getDispatchTargets(Class class_, {bool setters: false}) { | 217 Iterable<Member> getDispatchTargets(Class class_, {bool setters: false}) { |
| 215 return setters | 218 return setters |
| 216 ? this.setters[class_].values | 219 ? this.setters[class_].values |
| (...skipping 25 matching lines...) Expand all Loading... |
| 242 int getClassIndex(Class node) { | 245 int getClassIndex(Class node) { |
| 243 return classIndex[node]; | 246 return classIndex[node]; |
| 244 } | 247 } |
| 245 | 248 |
| 246 List<int> getExpenseHistogram() => <int>[]; | 249 List<int> getExpenseHistogram() => <int>[]; |
| 247 double getCompressionRatio() => 0.0; | 250 double getCompressionRatio() => 0.0; |
| 248 int getSuperTypeHashTableSize() => 0; | 251 int getSuperTypeHashTableSize() => 0; |
| 249 | 252 |
| 250 noSuchMethod(inv) => super.noSuchMethod(inv); | 253 noSuchMethod(inv) => super.noSuchMethod(inv); |
| 251 } | 254 } |
| OLD | NEW |