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

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: code review fixes 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.
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
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;
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 11 matching lines...) Expand all
193 } 201 }
194 } else if (member.kind == ElementKind.GETTER) { 202 } else if (member.kind == ElementKind.GETTER) {
195 if (universe.hasInvokedGetter(member, compiler)) { 203 if (universe.hasInvokedGetter(member, compiler)) {
196 return addToWorkList(member); 204 return addToWorkList(member);
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 (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 (member.kind == ElementKind.FIELD &&
216 member.enclosingElement.isNative()) {
217 if (universe.hasInvokedGetter(member, compiler) ||
218 universe.hasInvocation(member, compiler)) {
219 nativeEnqueuer.registerFieldLoad(member);
220 }
221 if (universe.hasInvokedSetter(member, compiler)) {
222 nativeEnqueuer.registerFieldStore(member);
223 }
207 } 224 }
208 } 225 }
209 226
210 void onRegisterInstantiatedClass(ClassElement cls) { 227 void onRegisterInstantiatedClass(ClassElement cls) {
211 task.measure(() { 228 task.measure(() {
212 // The class must be resolved to compute the set of all 229 // The class must be resolved to compute the set of all
213 // supertypes. 230 // supertypes.
214 cls.ensureResolved(compiler); 231 cls.ensureResolved(compiler);
215 232
216 for (Link<DartType> supertypes = cls.allSupertypesAndSelf; 233 for (Link<DartType> supertypes = cls.allSupertypesAndSelf;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 for (; !members.isEmpty; members = members.tail) { 303 for (; !members.isEmpty; members = members.tail) {
287 if (!f(members.head)) remaining.addLast(members.head); 304 if (!f(members.head)) remaining.addLast(members.head);
288 } 305 }
289 instanceMembersByName[memberName] = remaining.toLink(); 306 instanceMembersByName[memberName] = remaining.toLink();
290 } 307 }
291 } 308 }
292 309
293 void handleUnseenSelector(SourceString methodName, Selector selector) { 310 void handleUnseenSelector(SourceString methodName, Selector selector) {
294 processInstanceMembers(methodName, (Element member) { 311 processInstanceMembers(methodName, (Element member) {
295 if (selector.applies(member, compiler)) { 312 if (selector.applies(member, compiler)) {
296 addToWorkList(member); 313 // print('unseen $selector add $member ${member.kind}');
ngeoffray 2012/11/15 12:49:57 Remove print
314 if (member.isField() && member.enclosingElement.isNative()) {
315 if (selector.isGetter() || selector.isCall()) {
316 nativeEnqueuer.registerFieldLoad(member);
317 // We have to also handle storing to the field because we only get
318 // one look at each member and there might be a store we have not
319 // seen yet.
320 // TODO(sra): Process fields for storing separately.
321 nativeEnqueuer.registerFieldStore(member);
322 } else {
323 nativeEnqueuer.registerFieldStore(member);
324 // We have to also handle loading from the field because we only get
325 // one look at each member and there might be a load we have not
326 // seen yet.
327 // TODO(sra): Process fields for storing separately.
328 nativeEnqueuer.registerFieldLoad(member);
329 }
330 } else {
331 addToWorkList(member);
332 }
297 return true; 333 return true;
298 } 334 }
299 return false; 335 return false;
300 }); 336 });
301 } 337 }
302 338
303 /** 339 /**
304 * Documentation wanted -- johnniwinther 340 * Documentation wanted -- johnniwinther
305 * 341 *
306 * Invariant: [element] must be a declaration element. 342 * Invariant: [element] must be a declaration element.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 } 396 }
361 397
362 void forEach(f(WorkItem work)) { 398 void forEach(f(WorkItem work)) {
363 while (!queue.isEmpty) { 399 while (!queue.isEmpty) {
364 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst? 400 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst?
365 } 401 }
366 } 402 }
367 403
368 String toString() => 'Enqueuer($name)'; 404 String toString() => 'Enqueuer($name)';
369 405
406 void logSummary(log(message)) {
407 log(isResolutionQueue
408 ? 'Resolved ${resolvedElements.length} elements.'
409 : 'Compiled ${universe.generatedCode.length} methods.');
410 nativeEnqueuer.logSummary(log);
411 }
412
370 registerUsedSelector(Selector selector) { 413 registerUsedSelector(Selector selector) {
371 Element interceptor = compiler.backend.getInterceptor(selector); 414 Element interceptor = compiler.backend.getInterceptor(selector);
372 if (interceptor != null) { 415 if (interceptor != null) {
373 registerStaticUse(interceptor); 416 registerStaticUse(interceptor);
374 } 417 }
375 } 418 }
376 } 419 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698