| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 import 'dart:collection' show Queue; | 5 import 'dart:collection' show Queue; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/backend_api.dart' show ForeignResolver; | 8 import '../common/backend_api.dart' show ForeignResolver; |
| 9 import '../common/registry.dart' show Registry; | 9 import '../common/registry.dart' show Registry; |
| 10 import '../common/resolution.dart' show Resolution; | 10 import '../common/resolution.dart' show Resolution; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 | 41 |
| 42 /// Notification of native field. Adds information from metadata attributes. | 42 /// Notification of native field. Adds information from metadata attributes. |
| 43 void handleFieldAnnotations(Element field) {} | 43 void handleFieldAnnotations(Element field) {} |
| 44 | 44 |
| 45 /// Computes types instantiated due to getting a native field. | 45 /// Computes types instantiated due to getting a native field. |
| 46 void registerFieldLoad(Element field) {} | 46 void registerFieldLoad(Element field) {} |
| 47 | 47 |
| 48 /// Computes types instantiated due to setting a native field. | 48 /// Computes types instantiated due to setting a native field. |
| 49 void registerFieldStore(Element field) {} | 49 void registerFieldStore(Element field) {} |
| 50 | 50 |
| 51 NativeBehavior getNativeBehaviorOf(Send node) => new NativeBehavior(); | |
| 52 | |
| 53 /// Returns whether native classes are being used. | 51 /// Returns whether native classes are being used. |
| 54 bool hasInstantiatedNativeClasses() => false; | 52 bool hasInstantiatedNativeClasses() => false; |
| 55 | 53 |
| 56 /// Emits a summary information using the [log] function. | 54 /// Emits a summary information using the [log] function. |
| 57 void logSummary(log(message)) {} | 55 void logSummary(log(message)) {} |
| 58 | 56 |
| 59 // Do not use annotations in dart2dart. | 57 // Do not use annotations in dart2dart. |
| 60 ClassElement get annotationCreatesClass => null; | 58 ClassElement get annotationCreatesClass => null; |
| 61 ClassElement get annotationReturnsClass => null; | 59 ClassElement get annotationReturnsClass => null; |
| 62 ClassElement get annotationJsNameClass => null; | 60 ClassElement get annotationJsNameClass => null; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 88 * Records matched constraints ([SpecialType] or [DartType]). Once a type | 86 * Records matched constraints ([SpecialType] or [DartType]). Once a type |
| 89 * constraint has been matched, there is no need to match it again. | 87 * constraint has been matched, there is no need to match it again. |
| 90 */ | 88 */ |
| 91 final Set matchedTypeConstraints = new Set(); | 89 final Set matchedTypeConstraints = new Set(); |
| 92 | 90 |
| 93 /// Pending actions. Classes in [pendingClasses] have action thunks in | 91 /// Pending actions. Classes in [pendingClasses] have action thunks in |
| 94 /// [queue] to register the class. | 92 /// [queue] to register the class. |
| 95 final queue = new Queue(); | 93 final queue = new Queue(); |
| 96 bool flushing = false; | 94 bool flushing = false; |
| 97 | 95 |
| 98 /// Maps JS foreign calls to their computed native behavior. | |
| 99 final Map<Node, NativeBehavior> nativeBehaviors = | |
| 100 new Map<Node, NativeBehavior>(); | |
| 101 | |
| 102 final Enqueuer world; | 96 final Enqueuer world; |
| 103 final Compiler compiler; | 97 final Compiler compiler; |
| 104 final bool enableLiveTypeAnalysis; | 98 final bool enableLiveTypeAnalysis; |
| 105 | 99 |
| 106 ClassElement _annotationCreatesClass; | 100 ClassElement _annotationCreatesClass; |
| 107 ClassElement _annotationReturnsClass; | 101 ClassElement _annotationReturnsClass; |
| 108 ClassElement _annotationJsNameClass; | 102 ClassElement _annotationJsNameClass; |
| 109 | 103 |
| 110 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend. | 104 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend. |
| 111 NativeEnqueuerBase(this.world, Compiler compiler, this.enableLiveTypeAnalysis) | 105 NativeEnqueuerBase(this.world, Compiler compiler, this.enableLiveTypeAnalysis) |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 } | 480 } |
| 487 | 481 |
| 488 void registerFieldLoad(Element field) { | 482 void registerFieldLoad(Element field) { |
| 489 registerNativeBehavior(NativeBehavior.ofFieldLoad(field, compiler), field); | 483 registerNativeBehavior(NativeBehavior.ofFieldLoad(field, compiler), field); |
| 490 } | 484 } |
| 491 | 485 |
| 492 void registerFieldStore(Element field) { | 486 void registerFieldStore(Element field) { |
| 493 registerNativeBehavior(NativeBehavior.ofFieldStore(field, compiler), field); | 487 registerNativeBehavior(NativeBehavior.ofFieldStore(field, compiler), field); |
| 494 } | 488 } |
| 495 | 489 |
| 496 NativeBehavior getNativeBehaviorOf(Send node) => nativeBehaviors[node]; | |
| 497 | |
| 498 processNativeBehavior(NativeBehavior behavior, cause) { | 490 processNativeBehavior(NativeBehavior behavior, cause) { |
| 499 // TODO(ahe): Is this really a global dependency? | 491 // TODO(ahe): Is this really a global dependency? |
| 500 Registry registry = compiler.globalDependencies; | 492 Registry registry = compiler.globalDependencies; |
| 501 bool allUsedBefore = unusedClasses.isEmpty; | 493 bool allUsedBefore = unusedClasses.isEmpty; |
| 502 for (var type in behavior.typesInstantiated) { | 494 for (var type in behavior.typesInstantiated) { |
| 503 if (matchedTypeConstraints.contains(type)) continue; | 495 if (matchedTypeConstraints.contains(type)) continue; |
| 504 matchedTypeConstraints.add(type); | 496 matchedTypeConstraints.add(type); |
| 505 if (type is SpecialType) { | 497 if (type is SpecialType) { |
| 506 if (type == SpecialType.JsObject) { | 498 if (type == SpecialType.JsObject) { |
| 507 backend.registerInstantiatedType( | 499 backend.registerInstantiatedType( |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 | 598 |
| 607 /** | 599 /** |
| 608 * Handles JS-calls, which can be an instantiation point for types. | 600 * Handles JS-calls, which can be an instantiation point for types. |
| 609 * | 601 * |
| 610 * For example, the following code instantiates and returns native classes | 602 * For example, the following code instantiates and returns native classes |
| 611 * that are `_DOMWindowImpl` or a subtype. | 603 * that are `_DOMWindowImpl` or a subtype. |
| 612 * | 604 * |
| 613 * JS('_DOMWindowImpl', 'window') | 605 * JS('_DOMWindowImpl', 'window') |
| 614 * | 606 * |
| 615 */ | 607 */ |
| 616 void registerJsCall(Send node, ForeignResolver resolver) { | 608 NativeBehavior resolveJsCall(Send node, ForeignResolver resolver) { |
| 617 NativeBehavior behavior = NativeBehavior.ofJsCall( | 609 NativeBehavior behavior = NativeBehavior.ofJsCall( |
| 618 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); | 610 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
| 611 // TODO(johnniwinther): Move registration to the world impact application. |
| 619 registerNativeBehavior(behavior, node); | 612 registerNativeBehavior(behavior, node); |
| 620 nativeBehaviors[node] = behavior; | 613 return behavior; |
| 621 } | 614 } |
| 622 | 615 |
| 623 /** | 616 /** |
| 624 * Handles JS-embedded global calls, which can be an instantiation point for | 617 * Handles JS-embedded global calls, which can be an instantiation point for |
| 625 * types. | 618 * types. |
| 626 * | 619 * |
| 627 * For example, the following code instantiates and returns a String class | 620 * For example, the following code instantiates and returns a String class |
| 628 * | 621 * |
| 629 * JS_EMBEDDED_GLOBAL('String', 'foo') | 622 * JS_EMBEDDED_GLOBAL('String', 'foo') |
| 630 * | 623 * |
| 631 */ | 624 */ |
| 632 void registerJsEmbeddedGlobalCall(Send node, ForeignResolver resolver) { | 625 NativeBehavior resolveJsEmbeddedGlobalCall( |
| 626 Send node, ForeignResolver resolver) { |
| 633 NativeBehavior behavior = NativeBehavior.ofJsEmbeddedGlobalCall( | 627 NativeBehavior behavior = NativeBehavior.ofJsEmbeddedGlobalCall( |
| 634 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); | 628 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
| 629 // TODO(johnniwinther): Move registration to the world impact application. |
| 635 registerNativeBehavior(behavior, node); | 630 registerNativeBehavior(behavior, node); |
| 636 nativeBehaviors[node] = behavior; | 631 return behavior; |
| 637 } | 632 } |
| 638 | 633 |
| 639 /** | 634 /** |
| 640 * Handles JS-compiler builtin calls, which can be an instantiation point for | 635 * Handles JS-compiler builtin calls, which can be an instantiation point for |
| 641 * types. | 636 * types. |
| 642 * | 637 * |
| 643 * For example, the following code instantiates and returns a String class | 638 * For example, the following code instantiates and returns a String class |
| 644 * | 639 * |
| 645 * JS_BUILTIN('String', 'int2string', 0) | 640 * JS_BUILTIN('String', 'int2string', 0) |
| 646 * | 641 * |
| 647 */ | 642 */ |
| 648 void registerJsBuiltinCall(Send node, ForeignResolver resolver) { | 643 NativeBehavior resolveJsBuiltinCall(Send node, ForeignResolver resolver) { |
| 649 NativeBehavior behavior = NativeBehavior.ofJsBuiltinCall( | 644 NativeBehavior behavior = NativeBehavior.ofJsBuiltinCall( |
| 650 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); | 645 node, reporter, compiler.parsingContext, compiler.coreTypes, resolver); |
| 646 // TODO(johnniwinther): Move registration to the world impact application. |
| 651 registerNativeBehavior(behavior, node); | 647 registerNativeBehavior(behavior, node); |
| 652 nativeBehaviors[node] = behavior; | 648 return behavior; |
| 653 } | 649 } |
| 654 } | 650 } |
| 655 | 651 |
| 656 class NativeCodegenEnqueuer extends NativeEnqueuerBase { | 652 class NativeCodegenEnqueuer extends NativeEnqueuerBase { |
| 657 final CodeEmitterTask emitter; | 653 final CodeEmitterTask emitter; |
| 658 | 654 |
| 659 final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>(); | 655 final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>(); |
| 660 | 656 |
| 661 NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter) | 657 NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter) |
| 662 : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis); | 658 : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 List<Element> directSubtypes = | 704 List<Element> directSubtypes = |
| 709 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); | 705 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); |
| 710 directSubtypes.add(cls); | 706 directSubtypes.add(cls); |
| 711 } | 707 } |
| 712 | 708 |
| 713 void logSummary(log(message)) { | 709 void logSummary(log(message)) { |
| 714 log('Compiled ${registeredClasses.length} native classes, ' | 710 log('Compiled ${registeredClasses.length} native classes, ' |
| 715 '${unusedClasses.length} native classes omitted.'); | 711 '${unusedClasses.length} native classes omitted.'); |
| 716 } | 712 } |
| 717 } | 713 } |
| OLD | NEW |