OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 world_builder; | 5 part of world_builder; |
6 | 6 |
7 /// World builder specific to codegen. | 7 /// World builder specific to codegen. |
8 /// | 8 /// |
9 /// This adds additional access to liveness of selectors and elements. | 9 /// This adds additional access to liveness of selectors and elements. |
10 abstract class CodegenWorldBuilder implements WorldBuilder { | 10 abstract class CodegenWorldBuilder implements WorldBuilder { |
11 /// Calls [f] with every instance field, together with its declarer, in an | 11 /// Calls [f] with every instance field, together with its declarer, in an |
12 /// instance of [cls]. | 12 /// instance of [cls]. |
13 void forEachInstanceField( | 13 void forEachInstanceField( |
14 ClassEntity cls, void f(ClassEntity declarer, FieldEntity field)); | 14 ClassEntity cls, void f(ClassEntity declarer, FieldEntity field)); |
15 | 15 |
16 /// Calls [f] for each parameter of [function] providing the type and name of | 16 /// Calls [f] for each parameter of [function] providing the type and name of |
17 /// the parameter. | 17 /// the parameter and the [defaultValue] if the parameter is optional. |
18 void forEachParameter( | 18 void forEachParameter(FunctionEntity function, |
19 FunctionEntity function, void f(DartType type, String name)); | 19 void f(DartType type, String name, ConstantValue defaultValue)); |
20 | 20 |
21 void forEachInvokedName( | 21 void forEachInvokedName( |
22 f(String name, Map<Selector, SelectorConstraints> selectors)); | 22 f(String name, Map<Selector, SelectorConstraints> selectors)); |
23 | 23 |
24 void forEachInvokedGetter( | 24 void forEachInvokedGetter( |
25 f(String name, Map<Selector, SelectorConstraints> selectors)); | 25 f(String name, Map<Selector, SelectorConstraints> selectors)); |
26 | 26 |
27 void forEachInvokedSetter( | 27 void forEachInvokedSetter( |
28 f(String name, Map<Selector, SelectorConstraints> selectors)); | 28 f(String name, Map<Selector, SelectorConstraints> selectors)); |
29 | 29 |
| 30 /// Returns `true` if [field] constant or final with a constant initializer. |
| 31 bool hasConstantFieldInitializer(FieldEntity field); |
| 32 |
30 /// Returns `true` if [member] is invoked as a setter. | 33 /// Returns `true` if [member] is invoked as a setter. |
31 bool hasInvokedSetter(MemberEntity member, ClosedWorld world); | 34 bool hasInvokedSetter(MemberEntity member, ClosedWorld world); |
32 | 35 |
33 bool hasInvokedGetter(MemberEntity member, ClosedWorld world); | 36 bool hasInvokedGetter(MemberEntity member, ClosedWorld world); |
34 | 37 |
35 Map<Selector, SelectorConstraints> invocationsByName(String name); | 38 Map<Selector, SelectorConstraints> invocationsByName(String name); |
36 | 39 |
37 Map<Selector, SelectorConstraints> getterInvocationsByName(String name); | 40 Map<Selector, SelectorConstraints> getterInvocationsByName(String name); |
38 | 41 |
39 Map<Selector, SelectorConstraints> setterInvocationsByName(String name); | 42 Map<Selector, SelectorConstraints> setterInvocationsByName(String name); |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 /// the constant use was new to the world. | 538 /// the constant use was new to the world. |
536 bool registerConstantUse(ConstantUse use) { | 539 bool registerConstantUse(ConstantUse use) { |
537 if (use.kind == ConstantUseKind.DIRECT) { | 540 if (use.kind == ConstantUseKind.DIRECT) { |
538 addCompileTimeConstantForEmission(use.value); | 541 addCompileTimeConstantForEmission(use.value); |
539 } | 542 } |
540 return _constantValues.add(use.value); | 543 return _constantValues.add(use.value); |
541 } | 544 } |
542 } | 545 } |
543 | 546 |
544 class ElementCodegenWorldBuilderImpl extends CodegenWorldBuilderImpl { | 547 class ElementCodegenWorldBuilderImpl extends CodegenWorldBuilderImpl { |
| 548 final JavaScriptConstantCompiler _constants; |
| 549 |
545 ElementCodegenWorldBuilderImpl( | 550 ElementCodegenWorldBuilderImpl( |
| 551 this._constants, |
546 ElementEnvironment elementEnvironment, | 552 ElementEnvironment elementEnvironment, |
547 NativeBasicData nativeBasicData, | 553 NativeBasicData nativeBasicData, |
548 ClosedWorld world, | 554 ClosedWorld world, |
549 SelectorConstraintsStrategy selectorConstraintsStrategy) | 555 SelectorConstraintsStrategy selectorConstraintsStrategy) |
550 : super(elementEnvironment, nativeBasicData, world, | 556 : super(elementEnvironment, nativeBasicData, world, |
551 selectorConstraintsStrategy); | 557 selectorConstraintsStrategy); |
552 | 558 |
| 559 @override |
| 560 bool hasConstantFieldInitializer(FieldElement field) { |
| 561 return field.constant != null; |
| 562 } |
| 563 |
553 /// Calls [f] with every instance field, together with its declarer, in an | 564 /// Calls [f] with every instance field, together with its declarer, in an |
554 /// instance of [cls]. | 565 /// instance of [cls]. |
555 void forEachInstanceField( | 566 void forEachInstanceField( |
556 ClassElement cls, void f(ClassEntity declarer, FieldEntity field)) { | 567 ClassElement cls, void f(ClassEntity declarer, FieldEntity field)) { |
557 cls.implementation | 568 cls.implementation |
558 .forEachInstanceField(f, includeSuperAndInjectedMembers: true); | 569 .forEachInstanceField(f, includeSuperAndInjectedMembers: true); |
559 } | 570 } |
560 | 571 |
561 @override | 572 @override |
562 void forEachParameter( | 573 void forEachParameter(MethodElement function, |
563 MethodElement function, void f(DartType type, String name)) { | 574 void f(DartType type, String name, ConstantValue defaultValue)) { |
564 FunctionSignature parameters = function.functionSignature; | 575 FunctionSignature parameters = function.functionSignature; |
565 parameters.forEachParameter((_parameter) { | 576 parameters.orderedForEachParameter((_parameter) { |
566 ParameterElement parameter = _parameter; | 577 ParameterElement parameter = _parameter; |
567 f(parameter.type, parameter.name); | 578 ConstantValue value; |
| 579 if (parameter.constant != null) { |
| 580 value = _constants.getConstantValue(parameter.constant); |
| 581 } else { |
| 582 value = new NullConstantValue(); |
| 583 } |
| 584 f(parameter.type, parameter.name, value); |
568 }); | 585 }); |
569 } | 586 } |
570 | 587 |
571 @override | 588 @override |
572 void _processInstantiatedClassMember( | 589 void _processInstantiatedClassMember( |
573 ClassEntity cls, MemberElement member, MemberUsedCallback memberUsed) { | 590 ClassEntity cls, MemberElement member, MemberUsedCallback memberUsed) { |
574 assert(member.isDeclaration, failedAt(member)); | 591 assert(member.isDeclaration, failedAt(member)); |
575 if (member.isMalformed) return; | 592 if (member.isMalformed) return; |
576 super._processInstantiatedClassMember(cls, member, memberUsed); | 593 super._processInstantiatedClassMember(cls, member, memberUsed); |
577 } | 594 } |
(...skipping 15 matching lines...) Expand all Loading... |
593 void registerIsCheck(ResolutionDartType type) { | 610 void registerIsCheck(ResolutionDartType type) { |
594 // Even in checked mode, type annotations for return type and argument | 611 // Even in checked mode, type annotations for return type and argument |
595 // types do not imply type checks, so there should never be a check | 612 // types do not imply type checks, so there should never be a check |
596 // against the type variable of a typedef. | 613 // against the type variable of a typedef. |
597 assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef); | 614 assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef); |
598 super.registerIsCheck(type); | 615 super.registerIsCheck(type); |
599 } | 616 } |
600 } | 617 } |
601 | 618 |
602 class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl { | 619 class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl { |
| 620 KernelToElementMapImpl _elementMap; |
| 621 |
603 KernelCodegenWorldBuilder( | 622 KernelCodegenWorldBuilder( |
| 623 this._elementMap, |
604 ElementEnvironment elementEnvironment, | 624 ElementEnvironment elementEnvironment, |
605 NativeBasicData nativeBasicData, | 625 NativeBasicData nativeBasicData, |
606 ClosedWorld world, | 626 ClosedWorld world, |
607 SelectorConstraintsStrategy selectorConstraintsStrategy) | 627 SelectorConstraintsStrategy selectorConstraintsStrategy) |
608 : super(elementEnvironment, nativeBasicData, world, | 628 : super(elementEnvironment, nativeBasicData, world, |
609 selectorConstraintsStrategy); | 629 selectorConstraintsStrategy); |
610 | 630 |
611 @override | 631 @override |
612 void forEachParameter( | 632 bool hasConstantFieldInitializer(FieldEntity field) { |
613 FunctionEntity function, void f(DartType type, String name)) { | 633 return _elementMap.hasConstantFieldInitializer(field); |
614 throw new UnimplementedError('KernelCodegenWorldBuilder.forEachParameter'); | |
615 } | 634 } |
616 | 635 |
617 @override | 636 @override |
| 637 void forEachParameter(FunctionEntity function, |
| 638 void f(DartType type, String name, ConstantValue defaultValue)) { |
| 639 _elementMap.forEachParameter(function, f); |
| 640 } |
| 641 |
| 642 @override |
618 void forEachInstanceField( | 643 void forEachInstanceField( |
619 ClassEntity cls, void f(ClassEntity declarer, FieldEntity field)) { | 644 ClassEntity cls, void f(ClassEntity declarer, FieldEntity field)) { |
620 _elementEnvironment.forEachClassMember(cls, | 645 _elementEnvironment.forEachClassMember(cls, |
621 (ClassEntity declarer, MemberEntity member) { | 646 (ClassEntity declarer, MemberEntity member) { |
622 if (member.isField && member.isInstanceMember) f(declarer, member); | 647 if (member.isField && member.isInstanceMember) f(declarer, member); |
623 }); | 648 }); |
624 } | 649 } |
625 } | 650 } |
OLD | NEW |