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

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

Issue 11304021: Add NativeEnqueuer to work with the Enqueuer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add --enable-native-live-type-analysis Created 8 years, 1 month 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 EnqueueTask extends CompilerTask { 7 class EnqueueTask extends CompilerTask {
8 final Enqueuer codegen; 8 final Enqueuer codegen;
9 final Enqueuer resolution; 9 final Enqueuer resolution;
10 10
(...skipping 23 matching lines...) Expand all
34 * Map from declaration elements to the [TreeElements] object holding the 34 * Map from declaration elements to the [TreeElements] object holding the
35 * resolution mapping for the element implementation. 35 * resolution mapping for the element implementation.
36 * 36 *
37 * Invariant: Key elements are declaration elements. 37 * Invariant: Key elements are declaration elements.
38 */ 38 */
39 final Map<Element, TreeElements> resolvedElements; 39 final Map<Element, TreeElements> resolvedElements;
40 40
41 bool queueIsClosed = false; 41 bool queueIsClosed = false;
42 EnqueueTask task; 42 EnqueueTask task;
43 43
44 native.NativeEnqueuer nativeEnqueuer; // Set by compiler.
ngeoffray 2012/11/14 21:17:39 Why not by this class?
sra1 2012/11/15 00:09:10 This class has two instances. I can use isResoluti
45
44 Enqueuer(this.name, this.compiler, 46 Enqueuer(this.name, this.compiler,
45 ItemCompilationContext itemCompilationContextCreator()) 47 ItemCompilationContext itemCompilationContextCreator())
46 : this.itemCompilationContextCreator = itemCompilationContextCreator, 48 : this.itemCompilationContextCreator = itemCompilationContextCreator,
47 instanceMembersByName = new Map<String, Link<Element>>(), 49 instanceMembersByName = new Map<String, Link<Element>>(),
48 seenClasses = new Set<ClassElement>(), 50 seenClasses = new Set<ClassElement>(),
49 universe = new Universe(), 51 universe = new Universe(),
50 queue = new Queue<WorkItem>(), 52 queue = new Queue<WorkItem>(),
51 resolvedElements = new Map<Element, TreeElements>(); 53 resolvedElements = new Map<Element, TreeElements>();
52 54
53 bool get isResolutionQueue => identical(compiler.enqueuer.resolution, this); 55 bool get isResolutionQueue => identical(compiler.enqueuer.resolution, this);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 compiler.enabledInvokeOn = true; 111 compiler.enabledInvokeOn = true;
110 } 112 }
111 113
112 // Enable isolate support if we start using something from the 114 // Enable isolate support if we start using something from the
113 // isolate library. 115 // isolate library.
114 LibraryElement library = element.getLibrary(); 116 LibraryElement library = element.getLibrary();
115 if (!compiler.hasIsolateSupport() 117 if (!compiler.hasIsolateSupport()
116 && library.uri.toString() == 'dart:isolate') { 118 && library.uri.toString() == 'dart:isolate') {
117 compiler.enableIsolateSupport(library); 119 compiler.enableIsolateSupport(library);
118 } 120 }
121
122 nativeEnqueuer.registerElement(element);
119 } 123 }
120 124
121 /** 125 /**
122 * Documentation wanted -- johnniwinther 126 * Documentation wanted -- johnniwinther
123 * 127 *
124 * Invariant: [element] must be a declaration element. 128 * Invariant: [element] must be a declaration element.
125 */ 129 */
126 void eagerRecompile(Element element) { 130 void eagerRecompile(Element element) {
127 assert(invariant(element, element.isDeclaration)); 131 assert(invariant(element, element.isDeclaration));
128 universe.generatedCode.remove(element); 132 universe.generatedCode.remove(element);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 cls.implementation.forEachMember(processInstantiatedClassMember); 164 cls.implementation.forEachMember(processInstantiatedClassMember);
161 } 165 }
162 166
163 /** 167 /**
164 * Documentation wanted -- johnniwinther 168 * Documentation wanted -- johnniwinther
165 */ 169 */
166 void processInstantiatedClassMember(ClassElement cls, Element member) { 170 void processInstantiatedClassMember(ClassElement cls, Element member) {
167 assert(invariant(member, member.isDeclaration)); 171 assert(invariant(member, member.isDeclaration));
168 if (universe.generatedCode.containsKey(member)) return; 172 if (universe.generatedCode.containsKey(member)) return;
169 if (resolvedElements[member] != null) return; 173 if (resolvedElements[member] != null) return;
170 if (!member.isInstanceMember()) return; 174 if (!member.isInstanceMember()) return;
ngeoffray 2012/11/14 21:17:39 How about just doing nativeEnqueuer.processInstant
sra1 2012/11/15 00:09:10 I think it will be too complicated. Names need to
171 if (member.isField()) return; 175 if (member.isField()) {
176 // Native fields need to go into instanceMembersByName as they are virtual
177 // instantiation points and escape points.
178 if (!member.enclosingElement.isNative()) return;
179 }
172 180
173 String memberName = member.name.slowToString(); 181 String memberName = member.name.slowToString();
174 Link<Element> members = instanceMembersByName.putIfAbsent( 182 Link<Element> members = instanceMembersByName.putIfAbsent(
175 memberName, () => const Link<Element>()); 183 memberName, () => const Link<Element>());
176 instanceMembersByName[memberName] = members.prepend(member); 184 instanceMembersByName[memberName] = members.prepend(member);
177 185
178 if (member.kind == ElementKind.FUNCTION) { 186 if (member.kind == ElementKind.FUNCTION) {
179 if (member.name == Compiler.NO_SUCH_METHOD) { 187 if (member.name == Compiler.NO_SUCH_METHOD) {
180 compiler.enableNoSuchMethod(member); 188 compiler.enableNoSuchMethod(member);
181 } 189 }
(...skipping 15 matching lines...) Expand all
197 } 205 }
198 // We don't know what selectors the returned closure accepts. If 206 // We don't know what selectors the returned closure accepts. If
199 // the set contains any selector we have to assume that it matches. 207 // the set contains any selector we have to assume that it matches.
200 if (universe.hasInvocation(member, compiler)) { 208 if (universe.hasInvocation(member, compiler)) {
201 return addToWorkList(member); 209 return addToWorkList(member);
202 } 210 }
203 } else if (identical(member.kind, ElementKind.SETTER)) { 211 } else if (identical(member.kind, ElementKind.SETTER)) {
204 if (universe.hasInvokedSetter(member, compiler)) { 212 if (universe.hasInvokedSetter(member, compiler)) {
205 return addToWorkList(member); 213 return addToWorkList(member);
206 } 214 }
215 } else if (identical(member.kind, ElementKind.FIELD)) {
ahe 2012/11/14 13:51:30 I think we are slowly moving towards using == inst
216 if (member.enclosingElement.isNative()) {
ahe 2012/11/14 13:51:30 Assert the condition instead?
217 // print('process $member');
218 // print(' $memberName: ${instanceMembersByName[memberName]}');
ngeoffray 2012/11/14 21:17:39 Remove debugging code
sra1 2012/11/15 00:09:10 Done.
219 if (universe.hasInvokedGetter(member, compiler) ||
220 universe.hasInvocation(member, compiler)) {
221 nativeEnqueuer.registerFieldLoad(member);
222 }
223 if (universe.hasInvokedSetter(member, compiler)) {
224 nativeEnqueuer.registerFieldStore(member);
225 }
226 }
207 } 227 }
208 } 228 }
209 229
210 void onRegisterInstantiatedClass(ClassElement cls) { 230 void onRegisterInstantiatedClass(ClassElement cls) {
211 task.measure(() { 231 task.measure(() {
212 // The class must be resolved to compute the set of all 232 // The class must be resolved to compute the set of all
213 // supertypes. 233 // supertypes.
214 cls.ensureResolved(compiler); 234 cls.ensureResolved(compiler);
215 235
216 for (Link<DartType> supertypes = cls.allSupertypesAndSelf; 236 for (Link<DartType> supertypes = cls.allSupertypesAndSelf;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); 305 LinkBuilder<Element> remaining = new LinkBuilder<Element>();
286 for (; !members.isEmpty; members = members.tail) { 306 for (; !members.isEmpty; members = members.tail) {
287 if (!f(members.head)) remaining.addLast(members.head); 307 if (!f(members.head)) remaining.addLast(members.head);
288 } 308 }
289 instanceMembersByName[memberName] = remaining.toLink(); 309 instanceMembersByName[memberName] = remaining.toLink();
290 } 310 }
291 } 311 }
292 312
293 void handleUnseenSelector(SourceString methodName, Selector selector) { 313 void handleUnseenSelector(SourceString methodName, Selector selector) {
294 processInstanceMembers(methodName, (Element member) { 314 processInstanceMembers(methodName, (Element member) {
295 if (selector.applies(member, compiler)) { 315 if (selector.applies(member, compiler)) {
ngeoffray 2012/11/14 21:17:39 Same comment, nativeEnqueuer.handleUnseenMember.
sra1 2012/11/15 00:09:10 Same response - keep the cross-product as the resp
296 addToWorkList(member); 316 // print('unseen $selector add $member ${member.kind}');
317 if (member.isField() && member.enclosingElement.isNative()) {
318 if (selector.isGetter() || selector.isCall()) {
319 nativeEnqueuer.registerFieldLoad(member);
ahe 2012/11/14 13:51:30 Does order matter here?
sra1 2012/11/15 00:09:10 Added comments to answer the questions here.
320 nativeEnqueuer.registerFieldStore(member);
ahe 2012/11/14 13:51:30 Why also store?
sra1 2012/11/15 00:09:10 See new comments.
321 } else {
322 nativeEnqueuer.registerFieldStore(member);
323 nativeEnqueuer.registerFieldLoad(member);
ahe 2012/11/14 13:51:30 Why load?
sra1 2012/11/15 00:09:10 See new comments.
324 }
325 } else {
326 addToWorkList(member);
327 }
297 return true; 328 return true;
298 } 329 }
299 return false; 330 return false;
300 }); 331 });
301 } 332 }
302 333
303 /** 334 /**
304 * Documentation wanted -- johnniwinther 335 * Documentation wanted -- johnniwinther
305 * 336 *
306 * Invariant: [element] must be a declaration element. 337 * Invariant: [element] must be a declaration element.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 398
368 String toString() => 'Enqueuer($name)'; 399 String toString() => 'Enqueuer($name)';
369 400
370 registerUsedSelector(Selector selector) { 401 registerUsedSelector(Selector selector) {
371 Element interceptor = compiler.backend.getInterceptor(selector); 402 Element interceptor = compiler.backend.getInterceptor(selector);
372 if (interceptor != null) { 403 if (interceptor != null) {
373 registerStaticUse(interceptor); 404 registerStaticUse(interceptor);
374 } 405 }
375 } 406 }
376 } 407 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698