Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(795)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/world.dart

Issue 12299006: Start tracking all registered elements in one big full function set (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Register fields. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of dart2js; 5 part of dart2js;
6 6
7 class World { 7 class World {
8 final Compiler compiler; 8 final Compiler compiler;
9 final Map<ClassElement, Set<ClassElement>> subtypes; 9 final Map<ClassElement, Set<ClassElement>> subtypes;
10 final Map<ClassElement, Set<MixinApplicationElement>> mixinUses; 10 final Map<ClassElement, Set<MixinApplicationElement>> mixinUses;
11 final Map<ClassElement, Set<ClassElement>> typesImplementedBySubclasses; 11 final Map<ClassElement, Set<ClassElement>> typesImplementedBySubclasses;
12 final Set<ClassElement> classesNeedingRti; 12 final Set<ClassElement> classesNeedingRti;
13 final Map<ClassElement, Set<ClassElement>> rtiDependencies; 13 final Map<ClassElement, Set<ClassElement>> rtiDependencies;
14 final FunctionSet userDefinedGetters; 14 final FullFunctionSet allFunctions;
15 final FunctionSet userDefinedSetters;
16 15
17 World(Compiler compiler) 16 World(Compiler compiler)
18 : subtypes = new Map<ClassElement, Set<ClassElement>>(), 17 : subtypes = new Map<ClassElement, Set<ClassElement>>(),
19 mixinUses = new Map<ClassElement, Set<MixinApplicationElement>>(), 18 mixinUses = new Map<ClassElement, Set<MixinApplicationElement>>(),
20 typesImplementedBySubclasses = 19 typesImplementedBySubclasses =
21 new Map<ClassElement, Set<ClassElement>>(), 20 new Map<ClassElement, Set<ClassElement>>(),
22 userDefinedGetters = new FunctionSet(compiler),
23 userDefinedSetters = new FunctionSet(compiler),
24 classesNeedingRti = new Set<ClassElement>(), 21 classesNeedingRti = new Set<ClassElement>(),
25 rtiDependencies = new Map<ClassElement, Set<ClassElement>>(), 22 rtiDependencies = new Map<ClassElement, Set<ClassElement>>(),
23 allFunctions = new FullFunctionSet(compiler),
26 this.compiler = compiler; 24 this.compiler = compiler;
27 25
28 void populate() { 26 void populate() {
29 void addSubtypes(ClassElement cls) { 27 void addSubtypes(ClassElement cls) {
30 if (cls.resolutionState != STATE_DONE) { 28 if (cls.resolutionState != STATE_DONE) {
31 compiler.internalErrorOnElement( 29 compiler.internalErrorOnElement(
32 cls, 'Class "${cls.name.slowToString()}" is not resolved.'); 30 cls, 'Class "${cls.name.slowToString()}" is not resolved.');
33 } 31 }
34 32
35 for (DartType type in cls.allSupertypes) { 33 for (DartType type in cls.allSupertypes) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 if (!element.isClass() || !dependency.isClass()) return; 108 if (!element.isClass() || !dependency.isClass()) return;
111 Set<ClassElement> classes = 109 Set<ClassElement> classes =
112 rtiDependencies.putIfAbsent(element, () => new Set<ClassElement>()); 110 rtiDependencies.putIfAbsent(element, () => new Set<ClassElement>());
113 classes.add(dependency); 111 classes.add(dependency);
114 } 112 }
115 113
116 bool needsRti(ClassElement cls) { 114 bool needsRti(ClassElement cls) {
117 return classesNeedingRti.contains(cls) || compiler.enabledRuntimeType; 115 return classesNeedingRti.contains(cls) || compiler.enabledRuntimeType;
118 } 116 }
119 117
120 void recordUserDefinedGetter(Element element) {
121 assert(element.isGetter());
122 userDefinedGetters.add(element);
123 }
124
125 void recordUserDefinedSetter(Element element) {
126 assert(element.isSetter());
127 userDefinedSetters.add(element);
128 }
129
130 bool hasAnyUserDefinedGetter(Selector selector) { 118 bool hasAnyUserDefinedGetter(Selector selector) {
131 return !userDefinedGetters.filter(selector).isEmpty; 119 return allFunctions.filter(selector).any((each) => each.isGetter());
132 } 120 }
133 121
134 bool hasAnyUserDefinedSetter(Selector selector) { 122 bool hasAnyUserDefinedSetter(Selector selector) {
135 return !userDefinedSetters.filter(selector).isEmpty; 123 return allFunctions.filter(selector).any((each) => each.isSetter());
136 } 124 }
137 125
138 // Returns whether a subclass of [superclass] implements [type]. 126 // Returns whether a subclass of [superclass] implements [type].
139 bool hasAnySubclassThatImplements(ClassElement superclass, DartType type) { 127 bool hasAnySubclassThatImplements(ClassElement superclass, DartType type) {
140 Set<ClassElement> subclasses = typesImplementedBySubclasses[superclass]; 128 Set<ClassElement> subclasses = typesImplementedBySubclasses[superclass];
141 if (subclasses == null) return false; 129 if (subclasses == null) return false;
142 return subclasses.contains(type.element); 130 return subclasses.contains(type.element);
143 } 131 }
144 132
145 bool hasNoOverridingMember(Element element) {
146 ClassElement cls = element.getEnclosingClass();
147 Set<ClassElement> subclasses = compiler.world.subtypes[cls];
148 // TODO(ngeoffray): Implement the full thing.
149 return subclasses == null || subclasses.isEmpty;
150 }
151
152 void registerUsedElement(Element element) { 133 void registerUsedElement(Element element) {
153 if (element.isInstanceMember() && !element.isAbstract(compiler)) { 134 if (element.isInstanceMember() && !element.isAbstract(compiler)) {
154 if (element.isGetter()) { 135 allFunctions.add(element);
155 // We're collecting user-defined getters to let the codegen know which
156 // field accesses might have side effects.
157 recordUserDefinedGetter(element);
158 } else if (element.isSetter()) {
159 recordUserDefinedSetter(element);
160 }
161 } 136 }
162 } 137 }
163 138
164 /** 139 VariableElement locateSingleField(Selector selector) {
165 * Returns a [MemberSet] that contains the possible targets of the given 140 Element result = locateSingleElement(selector);
166 * [selector] on a receiver with the given [type]. This includes all sub 141 return (result != null && result.isField()) ? result : null;
167 * types.
168 */
169 MemberSet _memberSetFor(DartType type, Selector selector) {
170 assert(compiler != null);
171 ClassElement cls = type.element;
172 SourceString name = selector.name;
173 LibraryElement library = selector.library;
174 MemberSet result = new MemberSet(name);
175 Element element = cls.implementation.lookupSelector(selector);
176 if (element != null) result.add(element);
177
178 bool isPrivate = name.isPrivate();
179 Set<ClassElement> subtypesOfCls = subtypes[cls];
180 if (subtypesOfCls != null) {
181 for (ClassElement sub in subtypesOfCls) {
182 // Private members from a different library are not visible.
183 if (isPrivate && sub.getLibrary() != library) continue;
184 element = sub.implementation.lookupLocalMember(name);
185 if (element != null) result.add(element);
186 }
187 }
188 return result;
189 } 142 }
190 143
191 /** 144 Element locateSingleElement(Selector selector) {
192 * Returns the field in [type] described by the given [selector]. 145 Iterable<Element> targets = allFunctions.filter(selector);
193 * If no such field exists, or a subclass overrides the field 146 if (targets.length != 1) return null;
194 * returns [:null:]. 147 Element result = targets.first;
195 */ 148 ClassElement enclosing = result.getEnclosingClass();
196 VariableElement locateSingleField(DartType type, Selector selector) { 149 DartType receiverType = selector.receiverType;
197 ClassElement cls = type.element; 150 ClassElement receiverTypeElement = (receiverType == null)
198 Element result = cls.implementation.lookupSelector(selector); 151 ? compiler.objectClass
199 if (result == null) return null; 152 : receiverType.element;
200 if (!result.isField()) return null; 153 // We only return the found element if it is guaranteed to be
201 154 // implemented on the exact receiver type. It could be found in a
202 // Verify that no subclass overrides the field. 155 // subclass or in an inheritance-wise unrelated class in case of
203 MemberSet memberSet = _memberSetFor(type, selector); 156 // subtype selectors.
204 if (memberSet.elements.length != 1) return null; 157 return (receiverTypeElement.isSubclassOf(enclosing)) ? result : null;
205 assert(memberSet.elements.contains(result));
206 return result;
207 } 158 }
208 159
209 Set<ClassElement> findNoSuchMethodHolders(DartType type) { 160 Iterable<ClassElement> locateNoSuchMethodHolders(Selector selector) {
210 Set<ClassElement> result = new Set<ClassElement>();
211 Selector noSuchMethodSelector = new Selector.noSuchMethod(); 161 Selector noSuchMethodSelector = new Selector.noSuchMethod();
212 MemberSet memberSet = _memberSetFor(type, noSuchMethodSelector); 162 DartType receiverType = selector.receiverType;
213 for (Element element in memberSet.elements) { 163 if (receiverType != null) {
214 ClassElement holder = element.getEnclosingClass(); 164 noSuchMethodSelector = new TypedSelector(
215 if (!identical(holder, compiler.objectClass) && 165 receiverType, selector.typeKind, noSuchMethodSelector);
216 noSuchMethodSelector.applies(element, compiler)) {
217 result.add(holder);
218 }
219 } 166 }
220 return result; 167 ClassElement objectClass = compiler.objectClass;
168 return allFunctions
169 .filter(noSuchMethodSelector)
170 .map((Element member) => member.getEnclosingClass())
171 .where((ClassElement holder) => !identical(holder, objectClass));
221 } 172 }
222 } 173 }
223
224 /**
225 * A [MemberSet] contains all the possible targets for a selector.
226 */
227 class MemberSet {
228 final Set<Element> elements;
229 final SourceString name;
230
231 MemberSet(SourceString this.name) : elements = new Set<Element>();
232
233 void add(Element element) {
234 elements.add(element);
235 }
236
237 bool get isEmpty => elements.isEmpty;
238 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/ssa/types.dart ('k') | tests/language/language_dart2js.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698