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

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: 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 } 164 }
161 165
162 /** 166 /**
163 * Documentation wanted -- johnniwinther 167 * Documentation wanted -- johnniwinther
164 */ 168 */
165 void processInstantiatedClassMember(ClassElement cls, Element member) { 169 void processInstantiatedClassMember(ClassElement cls, Element member) {
166 assert(invariant(member, member.isDeclaration)); 170 assert(invariant(member, member.isDeclaration));
167 if (universe.generatedCode.containsKey(member)) return; 171 if (universe.generatedCode.containsKey(member)) return;
168 if (resolvedElements[member] != null) return; 172 if (resolvedElements[member] != null) return;
169 if (!member.isInstanceMember()) return; 173 if (!member.isInstanceMember()) return;
170 if (member.isField()) return; 174 if (member.isField()) {
175 // Native fields need to go into instanceMembersByName as they are virtual
176 // instantiation points and escape points.
177 if (!member.enclosingElement.isNative()) return;
178 }
171 179
172 String memberName = member.name.slowToString(); 180 String memberName = member.name.slowToString();
173 Link<Element> members = instanceMembersByName.putIfAbsent( 181 Link<Element> members = instanceMembersByName.putIfAbsent(
174 memberName, () => const Link<Element>()); 182 memberName, () => const Link<Element>());
175 instanceMembersByName[memberName] = members.prepend(member); 183 instanceMembersByName[memberName] = members.prepend(member);
176 184
177 if (member.kind == ElementKind.FUNCTION) { 185 if (member.kind == ElementKind.FUNCTION) {
178 if (member.name == Compiler.NO_SUCH_METHOD) { 186 if (member.name == Compiler.NO_SUCH_METHOD) {
179 compiler.enableNoSuchMethod(member); 187 compiler.enableNoSuchMethod(member);
180 } 188 }
(...skipping 15 matching lines...) Expand all
196 } 204 }
197 // We don't know what selectors the returned closure accepts. If 205 // We don't know what selectors the returned closure accepts. If
198 // the set contains any selector we have to assume that it matches. 206 // the set contains any selector we have to assume that it matches.
199 if (universe.hasInvocation(member, compiler)) { 207 if (universe.hasInvocation(member, compiler)) {
200 return addToWorkList(member); 208 return addToWorkList(member);
201 } 209 }
202 } else if (identical(member.kind, ElementKind.SETTER)) { 210 } else if (identical(member.kind, ElementKind.SETTER)) {
203 if (universe.hasInvokedSetter(member, compiler)) { 211 if (universe.hasInvokedSetter(member, compiler)) {
204 return addToWorkList(member); 212 return addToWorkList(member);
205 } 213 }
214 } else if (identical(member.kind, ElementKind.FIELD)) {
215 if (member.enclosingElement.isNative()) {
216 // print('process $member');
217 // print(' $memberName: ${instanceMembersByName[memberName]}');
218 if (universe.hasInvokedGetter(member, compiler) ||
219 universe.hasInvocation(member, compiler)) {
220 nativeEnqueuer.registerFieldLoad(member);
221 }
222 if (universe.hasInvokedSetter(member, compiler)) {
223 nativeEnqueuer.registerFieldStore(member);
224 }
225 }
206 } 226 }
207 } 227 }
208 228
209 void onRegisterInstantiatedClass(ClassElement cls) { 229 void onRegisterInstantiatedClass(ClassElement cls) {
210 task.measure(() { 230 task.measure(() {
211 // The class must be resolved to compute the set of all 231 // The class must be resolved to compute the set of all
212 // supertypes. 232 // supertypes.
213 cls.ensureResolved(compiler); 233 cls.ensureResolved(compiler);
214 234
215 for (Link<DartType> supertypes = cls.allSupertypesAndSelf; 235 for (Link<DartType> supertypes = cls.allSupertypesAndSelf;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 for (; !members.isEmpty; members = members.tail) { 305 for (; !members.isEmpty; members = members.tail) {
286 if (!f(members.head)) remaining.addLast(members.head); 306 if (!f(members.head)) remaining.addLast(members.head);
287 } 307 }
288 instanceMembersByName[memberName] = remaining.toLink(); 308 instanceMembersByName[memberName] = remaining.toLink();
289 } 309 }
290 } 310 }
291 311
292 void handleUnseenSelector(SourceString methodName, Selector selector) { 312 void handleUnseenSelector(SourceString methodName, Selector selector) {
293 processInstanceMembers(methodName, (Element member) { 313 processInstanceMembers(methodName, (Element member) {
294 if (selector.applies(member, compiler)) { 314 if (selector.applies(member, compiler)) {
295 addToWorkList(member); 315 // print('unseen $selector add $member ${member.kind}');
316 if (member.isField() && member.enclosingElement.isNative()) {
317 if (selector.isGetter() || selector.isCall()) {
318 nativeEnqueuer.registerFieldLoad(member);
319 nativeEnqueuer.registerFieldStore(member);
320 } else {
321 nativeEnqueuer.registerFieldStore(member);
322 nativeEnqueuer.registerFieldLoad(member);
323 }
324 } else {
325 addToWorkList(member);
326 }
296 return true; 327 return true;
297 } 328 }
298 return false; 329 return false;
299 }); 330 });
300 } 331 }
301 332
302 /** 333 /**
303 * Documentation wanted -- johnniwinther 334 * Documentation wanted -- johnniwinther
304 * 335 *
305 * Invariant: [element] must be a declaration element. 336 * Invariant: [element] must be a declaration element.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 397
367 String toString() => 'Enqueuer($name)'; 398 String toString() => 'Enqueuer($name)';
368 399
369 registerUsedSelector(Selector selector) { 400 registerUsedSelector(Selector selector) {
370 Element interceptor = compiler.backend.getInterceptor(selector); 401 Element interceptor = compiler.backend.getInterceptor(selector);
371 if (interceptor != null) { 402 if (interceptor != null) {
372 registerStaticUse(interceptor); 403 registerStaticUse(interceptor);
373 } 404 }
374 } 405 }
375 } 406 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698