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

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

Issue 11421049: Fix missing classes in native emitters superclass info. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years 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
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 library native; 5 library native;
6 6
7 import 'dart:uri'; 7 import 'dart:uri';
8 import 'dart2jslib.dart' hide SourceString; 8 import 'dart2jslib.dart' hide SourceString;
9 import 'elements/elements.dart'; 9 import 'elements/elements.dart';
10 import 'js_backend/js_backend.dart'; 10 import 'js_backend/js_backend.dart';
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 log('Resolved ${registeredClasses.length} native elements used, ' 289 log('Resolved ${registeredClasses.length} native elements used, '
290 '${unusedClasses.length} native elements dead.'); 290 '${unusedClasses.length} native elements dead.');
291 } 291 }
292 } 292 }
293 293
294 294
295 class NativeCodegenEnqueuer extends NativeEnqueuerBase { 295 class NativeCodegenEnqueuer extends NativeEnqueuerBase {
296 296
297 final CodeEmitterTask emitter; 297 final CodeEmitterTask emitter;
298 298
299 final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>();
300
299 NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter) 301 NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter)
300 : super(world, compiler, compiler.enableNativeLiveTypeAnalysis); 302 : super(world, compiler, compiler.enableNativeLiveTypeAnalysis);
301 303
302 void processNativeClasses(Collection<LibraryElement> libraries) { 304 void processNativeClasses(Collection<LibraryElement> libraries) {
303 super.processNativeClasses(libraries); 305 super.processNativeClasses(libraries);
304 306
305 // HACK HACK - add all the resolved classes. 307 // HACK HACK - add all the resolved classes.
306 NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer; 308 NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
307 for (final classElement in enqueuer.registeredClasses) { 309 for (final classElement in enqueuer.registeredClasses) {
308 if (unusedClasses.contains(classElement)) { 310 if (unusedClasses.contains(classElement)) {
309 enqueueClass(classElement, 'was resolved'); 311 enqueueClass(classElement, 'was resolved');
310 } 312 }
311 } 313 }
312 flushQueue(); 314 flushQueue();
313 } 315 }
314 316
315 processClass(ClassElement classElement, cause) { 317 processClass(ClassElement classElement, cause) {
316 super.processClass(classElement, cause); 318 super.processClass(classElement, cause);
317 // Add the information that this class is a subtype of its supertypes. The 319 // Add the information that this class is a subtype of its supertypes. The
318 // code emitter and the ssa builder use that information. 320 // code emitter and the ssa builder use that information.
319 addSubtypes(classElement, emitter.nativeEmitter); 321 addSubtypes(classElement, emitter.nativeEmitter);
320 } 322 }
321 323
322 void addSubtypes(ClassElement cls, NativeEmitter emitter) { 324 void addSubtypes(ClassElement cls, NativeEmitter emitter) {
325 if (!cls.isNative()) return;
326 if (doneAddSubtypes.contains(cls)) return;
327 doneAddSubtypes.add(cls);
328
329 // Walk the superclass chain since classes on the superclass chain might not
330 // be instantiated (abstract or simply unused).
331 addSubtypes(cls.superclass, emitter);
332
323 for (DartType type in cls.allSupertypes) { 333 for (DartType type in cls.allSupertypes) {
324 List<Element> subtypes = emitter.subtypes.putIfAbsent( 334 List<Element> subtypes = emitter.subtypes.putIfAbsent(
325 type.element, 335 type.element,
326 () => <ClassElement>[]); 336 () => <ClassElement>[]);
327 subtypes.add(cls); 337 subtypes.add(cls);
328 } 338 }
329 339
330 List<Element> directSubtypes = emitter.directSubtypes.putIfAbsent( 340 List<Element> directSubtypes = emitter.directSubtypes.putIfAbsent(
331 cls.superclass, 341 cls.superclass,
332 () => <ClassElement>[]); 342 () => <ClassElement>[]);
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 String parameters) { 845 String parameters) {
836 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty"); 846 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty");
837 buffer.add("('$methodName')) {\n"); 847 buffer.add("('$methodName')) {\n");
838 buffer.add(" $code"); 848 buffer.add(" $code");
839 buffer.add(" } else {\n"); 849 buffer.add(" } else {\n");
840 buffer.add(" return Object.prototype.$methodName.call(this"); 850 buffer.add(" return Object.prototype.$methodName.call(this");
841 buffer.add(parameters == '' ? '' : ', $parameters'); 851 buffer.add(parameters == '' ? '' : ', $parameters');
842 buffer.add(");\n"); 852 buffer.add(");\n");
843 buffer.add(" }\n"); 853 buffer.add(" }\n");
844 } 854 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698