| OLD | NEW |
| 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 ResolutionEnqueuer resolution; | 8 final ResolutionEnqueuer resolution; |
| 9 final CodegenEnqueuer codegen; | 9 final CodegenEnqueuer codegen; |
| 10 | 10 |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 processClass(cls); | 290 processClass(cls); |
| 291 for (Link<DartType> supertypes = cls.allSupertypes; | 291 for (Link<DartType> supertypes = cls.allSupertypes; |
| 292 !supertypes.isEmpty; supertypes = supertypes.tail) { | 292 !supertypes.isEmpty; supertypes = supertypes.tail) { |
| 293 processClass(supertypes.head.element); | 293 processClass(supertypes.head.element); |
| 294 } | 294 } |
| 295 }); | 295 }); |
| 296 } | 296 } |
| 297 | 297 |
| 298 void registerNewSelector(SourceString name, | 298 void registerNewSelector(Selector selector, |
| 299 Selector selector, | |
| 300 Map<SourceString, Set<Selector>> selectorsMap) { | 299 Map<SourceString, Set<Selector>> selectorsMap) { |
| 301 if (name != selector.name) { | 300 SourceString name = selector.name; |
| 302 String message = "$name != ${selector.name} (${selector.kind})"; | |
| 303 compiler.internalError("Wrong selector name: $message."); | |
| 304 } | |
| 305 Set<Selector> selectors = | 301 Set<Selector> selectors = |
| 306 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); | 302 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); |
| 307 if (!selectors.contains(selector)) { | 303 if (!selectors.contains(selector)) { |
| 308 selectors.add(selector); | 304 selectors.add(selector); |
| 309 handleUnseenSelector(name, selector); | 305 handleUnseenSelector(name, selector); |
| 310 } | 306 } |
| 311 } | 307 } |
| 312 | 308 |
| 313 void registerInvocation(SourceString methodName, Selector selector) { | 309 void registerInvocation(Selector selector) { |
| 314 task.measure(() { | 310 task.measure(() { |
| 315 registerNewSelector(methodName, selector, universe.invokedNames); | 311 registerNewSelector(selector, universe.invokedNames); |
| 316 }); | 312 }); |
| 317 } | 313 } |
| 318 | 314 |
| 319 void registerInvokedGetter(SourceString getterName, Selector selector) { | 315 void registerInvokedGetter(Selector selector) { |
| 320 task.measure(() { | 316 task.measure(() { |
| 321 registerNewSelector(getterName, selector, universe.invokedGetters); | 317 registerNewSelector(selector, universe.invokedGetters); |
| 322 }); | 318 }); |
| 323 } | 319 } |
| 324 | 320 |
| 325 void registerInvokedSetter(SourceString setterName, Selector selector) { | 321 void registerInvokedSetter(Selector selector) { |
| 326 task.measure(() { | 322 task.measure(() { |
| 327 registerNewSelector(setterName, selector, universe.invokedSetters); | 323 registerNewSelector(selector, universe.invokedSetters); |
| 328 }); | 324 }); |
| 329 } | 325 } |
| 330 | 326 |
| 331 /// Called when [:const Symbol(name):] is seen. | 327 /// Called when [:const Symbol(name):] is seen. |
| 332 void registerConstSymbol(String name, TreeElements elements) { | 328 void registerConstSymbol(String name, TreeElements elements) { |
| 333 // If dart:mirrors is loaded, a const symbol may be used to call a | 329 // If dart:mirrors is loaded, a const symbol may be used to call a |
| 334 // static/top-level method or accessor, instantiate a class, call | 330 // static/top-level method or accessor, instantiate a class, call |
| 335 // an instance method or accessor with the given name. | 331 // an instance method or accessor with the given name. |
| 336 if (!compiler.mirrorsEnabled) return; | 332 if (!compiler.mirrorsEnabled) return; |
| 337 | 333 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 357 } else if (element.impliesType()) { | 353 } else if (element.impliesType()) { |
| 358 // Don't enqueue classes, typedefs, and type variables. | 354 // Don't enqueue classes, typedefs, and type variables. |
| 359 } else if (Elements.isStaticOrTopLevel(element)) { | 355 } else if (Elements.isStaticOrTopLevel(element)) { |
| 360 registerStaticUse(element.declaration); | 356 registerStaticUse(element.declaration); |
| 361 } else if (element.isInstanceMember()) { | 357 } else if (element.isInstanceMember()) { |
| 362 if (element.isFunction()) { | 358 if (element.isFunction()) { |
| 363 int arity = | 359 int arity = |
| 364 element.asFunctionElement().requiredParameterCount(compiler); | 360 element.asFunctionElement().requiredParameterCount(compiler); |
| 365 Selector selector = | 361 Selector selector = |
| 366 new Selector.call(element.name, element.getLibrary(), arity); | 362 new Selector.call(element.name, element.getLibrary(), arity); |
| 367 registerInvocation(element.name, selector); | 363 registerInvocation(selector); |
| 368 } else if (element.isSetter()) { | 364 } else if (element.isSetter()) { |
| 369 Selector selector = | 365 Selector selector = |
| 370 new Selector.setter(element.name, element.getLibrary()); | 366 new Selector.setter(element.name, element.getLibrary()); |
| 371 registerInvokedSetter(element.name, selector); | 367 registerInvokedSetter(selector); |
| 372 } else if (element.isGetter()) { | 368 } else if (element.isGetter()) { |
| 373 Selector selector = | 369 Selector selector = |
| 374 new Selector.getter(element.name, element.getLibrary()); | 370 new Selector.getter(element.name, element.getLibrary()); |
| 375 registerInvokedGetter(element.name, selector); | 371 registerInvokedGetter(selector); |
| 376 } else if (element.isField()) { | 372 } else if (element.isField()) { |
| 377 Selector selector = | 373 Selector selector = |
| 378 new Selector.setter(element.name, element.getLibrary()); | 374 new Selector.setter(element.name, element.getLibrary()); |
| 379 registerInvokedSetter(element.name, selector); | 375 registerInvokedSetter(selector); |
| 380 selector = new Selector.getter(element.name, element.getLibrary()); | 376 selector = new Selector.getter(element.name, element.getLibrary()); |
| 381 registerInvokedGetter(element.name, selector); | 377 registerInvokedGetter(selector); |
| 382 } | 378 } |
| 383 } | 379 } |
| 384 } | 380 } |
| 385 | 381 |
| 386 /// Called when [:new Symbol(...):] is seen. | 382 /// Called when [:new Symbol(...):] is seen. |
| 387 void registerNewSymbol(TreeElements elements) { | 383 void registerNewSymbol(TreeElements elements) { |
| 388 } | 384 } |
| 389 | 385 |
| 390 void enqueueEverything() { | 386 void enqueueEverything() { |
| 391 if (hasEnqueuedEverything) return; | 387 if (hasEnqueuedEverything) return; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 compiler.backend.registerStaticUse(element, this); | 473 compiler.backend.registerStaticUse(element, this); |
| 478 } | 474 } |
| 479 | 475 |
| 480 void registerGetOfStaticFunction(FunctionElement element) { | 476 void registerGetOfStaticFunction(FunctionElement element) { |
| 481 registerStaticUse(element); | 477 registerStaticUse(element); |
| 482 registerInstantiatedClass(compiler.closureClass, | 478 registerInstantiatedClass(compiler.closureClass, |
| 483 compiler.globalDependencies); | 479 compiler.globalDependencies); |
| 484 universe.staticFunctionsNeedingGetter.add(element); | 480 universe.staticFunctionsNeedingGetter.add(element); |
| 485 } | 481 } |
| 486 | 482 |
| 487 void registerDynamicInvocation(SourceString methodName, Selector selector) { | 483 void registerDynamicInvocation(Selector selector) { |
| 488 assert(selector != null); | 484 assert(selector != null); |
| 489 registerInvocation(methodName, selector); | 485 registerInvocation(selector); |
| 490 } | 486 } |
| 491 | 487 |
| 492 void registerSelectorUse(Selector selector) { | 488 void registerSelectorUse(Selector selector) { |
| 493 if (selector.isGetter()) { | 489 if (selector.isGetter()) { |
| 494 registerInvokedGetter(selector.name, selector); | 490 registerInvokedGetter(selector); |
| 495 } else if (selector.isSetter()) { | 491 } else if (selector.isSetter()) { |
| 496 registerInvokedSetter(selector.name, selector); | 492 registerInvokedSetter(selector); |
| 497 } else { | 493 } else { |
| 498 registerInvocation(selector.name, selector); | 494 registerInvocation(selector); |
| 499 } | 495 } |
| 500 } | 496 } |
| 501 | 497 |
| 502 void registerDynamicGetter(SourceString methodName, Selector selector) { | 498 void registerDynamicGetter(Selector selector) { |
| 503 registerInvokedGetter(methodName, selector); | 499 registerInvokedGetter(selector); |
| 504 } | 500 } |
| 505 | 501 |
| 506 void registerDynamicSetter(SourceString methodName, Selector selector) { | 502 void registerDynamicSetter(Selector selector) { |
| 507 registerInvokedSetter(methodName, selector); | 503 registerInvokedSetter(selector); |
| 508 } | 504 } |
| 509 | 505 |
| 510 void registerFieldGetter(Element element) { | 506 void registerFieldGetter(Element element) { |
| 511 universe.fieldGetters.add(element); | 507 universe.fieldGetters.add(element); |
| 512 } | 508 } |
| 513 | 509 |
| 514 void registerFieldSetter(Element element) { | 510 void registerFieldSetter(Element element) { |
| 515 universe.fieldSetters.add(element); | 511 universe.fieldSetters.add(element); |
| 516 } | 512 } |
| 517 | 513 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 addToWorkList(compiler.isolateHelperLibrary.find( | 676 addToWorkList(compiler.isolateHelperLibrary.find( |
| 681 const SourceString('_callInIsolate'))); | 677 const SourceString('_callInIsolate'))); |
| 682 } | 678 } |
| 683 | 679 |
| 684 void enableNoSuchMethod(Element element) { | 680 void enableNoSuchMethod(Element element) { |
| 685 if (compiler.enabledNoSuchMethod) return; | 681 if (compiler.enabledNoSuchMethod) return; |
| 686 if (compiler.backend.isDefaultNoSuchMethodImplementation(element)) return; | 682 if (compiler.backend.isDefaultNoSuchMethodImplementation(element)) return; |
| 687 | 683 |
| 688 Selector selector = compiler.noSuchMethodSelector; | 684 Selector selector = compiler.noSuchMethodSelector; |
| 689 compiler.enabledNoSuchMethod = true; | 685 compiler.enabledNoSuchMethod = true; |
| 690 registerInvocation(Compiler.NO_SUCH_METHOD, selector); | 686 registerInvocation(selector); |
| 691 | 687 |
| 692 compiler.createInvocationMirrorElement = | 688 compiler.createInvocationMirrorElement = |
| 693 compiler.findHelper(Compiler.CREATE_INVOCATION_MIRROR); | 689 compiler.findHelper(Compiler.CREATE_INVOCATION_MIRROR); |
| 694 addToWorkList(compiler.createInvocationMirrorElement); | 690 addToWorkList(compiler.createInvocationMirrorElement); |
| 695 } | 691 } |
| 696 | 692 |
| 697 void forEach(f(WorkItem work)) { | 693 void forEach(f(WorkItem work)) { |
| 698 while (!queue.isEmpty) { | 694 while (!queue.isEmpty) { |
| 699 // TODO(johnniwinther): Find an optimal process order for resolution. | 695 // TODO(johnniwinther): Find an optimal process order for resolution. |
| 700 f(queue.removeLast()); | 696 f(queue.removeLast()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 while(!queue.isEmpty) { | 759 while(!queue.isEmpty) { |
| 764 // TODO(johnniwinther): Find an optimal process order for codegen. | 760 // TODO(johnniwinther): Find an optimal process order for codegen. |
| 765 f(queue.removeLast()); | 761 f(queue.removeLast()); |
| 766 } | 762 } |
| 767 } | 763 } |
| 768 | 764 |
| 769 void _logSpecificSummary(log(message)) { | 765 void _logSpecificSummary(log(message)) { |
| 770 log('Compiled ${generatedCode.length} methods.'); | 766 log('Compiled ${generatedCode.length} methods.'); |
| 771 } | 767 } |
| 772 } | 768 } |
| OLD | NEW |