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 library dart2js.js_emitter.program_builder; | 5 library dart2js.js_emitter.program_builder; |
6 | 6 |
7 import 'dart:io'; | 7 import 'dart:io'; |
8 import 'dart:convert' show JSON; | 8 import 'dart:convert' show JSON; |
9 | 9 |
10 import '../../closure.dart' show ClosureConversionTask, ClosureFieldElement; | 10 import '../../closure.dart' show ClosureConversionTask, ClosureFieldElement; |
11 import '../../common.dart'; | 11 import '../../common.dart'; |
12 import '../../common/names.dart' show Names, Selectors; | 12 import '../../common/names.dart' show Names, Selectors; |
13 import '../../constants/values.dart' | 13 import '../../constants/values.dart' |
14 show ConstantValue, InterceptorConstantValue; | 14 show ConstantValue, InterceptorConstantValue; |
15 import '../../common_elements.dart' show CommonElements, ElementEnvironment; | 15 import '../../common_elements.dart' show CommonElements, ElementEnvironment; |
16 import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit; | 16 import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit; |
17 import '../../elements/elements.dart' | 17 import '../../elements/elements.dart' |
18 show | 18 show |
19 ClassElement, | 19 ClassElement, |
20 ConstructorBodyElement, | |
21 Elements, | 20 Elements, |
22 FieldElement, | 21 FieldElement, |
23 FunctionSignature, | 22 FunctionSignature, |
24 GetterElement, | 23 GetterElement, |
25 LibraryElement, | 24 LibraryElement, |
26 MemberElement, | 25 MemberElement, |
27 MethodElement, | 26 MethodElement, |
28 ParameterElement, | 27 ParameterElement, |
29 TypedefElement; | 28 TypedefElement; |
30 import '../../elements/entities.dart'; | 29 import '../../elements/entities.dart'; |
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 // We add a special getter to allow for tearing off a closure from itself. | 751 // We add a special getter to allow for tearing off a closure from itself. |
753 js.Name name = _namer.getterForMember(Names.call); | 752 js.Name name = _namer.getterForMember(Names.call); |
754 js.Fun function = js.js('function() { return this; }'); | 753 js.Fun function = js.js('function() { return this; }'); |
755 callStubs.add(_buildStubMethod(name, function)); | 754 callStubs.add(_buildStubMethod(name, function)); |
756 } | 755 } |
757 | 756 |
758 // MixinApplications run through the members of their mixin. Here, we are | 757 // MixinApplications run through the members of their mixin. Here, we are |
759 // only interested in direct members. | 758 // only interested in direct members. |
760 if (!onlyForRti && !_elementEnvironment.isMixinApplication(cls)) { | 759 if (!onlyForRti && !_elementEnvironment.isMixinApplication(cls)) { |
761 _elementEnvironment.forEachClassMember(cls, visitMember); | 760 _elementEnvironment.forEachClassMember(cls, visitMember); |
762 if (cls is ClassElement) { | 761 _elementEnvironment.forEachConstructorBody( |
763 // TODO(redemption): Support constructor bodies for entities. | 762 cls, |
764 cls.forEachConstructorBody((ConstructorBodyElement constructorBody) => | 763 (ConstructorBodyEntity constructorBody) => |
765 visitMember(cls, constructorBody)); | 764 visitMember(cls, constructorBody)); |
766 } | |
767 } | 765 } |
768 bool isInterceptedClass = _interceptorData.isInterceptedClass(cls); | 766 bool isInterceptedClass = _interceptorData.isInterceptedClass(cls); |
769 List<Field> instanceFields = onlyForRti | 767 List<Field> instanceFields = onlyForRti |
770 ? const <Field>[] | 768 ? const <Field>[] |
771 : _buildFields( | 769 : _buildFields( |
772 cls: cls, | 770 cls: cls, |
773 visitStatics: false, | 771 visitStatics: false, |
774 isHolderInterceptedClass: isInterceptedClass); | 772 isHolderInterceptedClass: isInterceptedClass); |
775 List<Field> staticFieldsForReflection = onlyForRti | 773 List<Field> staticFieldsForReflection = onlyForRti |
776 ? const <Field>[] | 774 ? const <Field>[] |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 canTearOff = _worldBuilder.hasInvokedGetter(element, _closedWorld) || | 923 canTearOff = _worldBuilder.hasInvokedGetter(element, _closedWorld) || |
926 (canBeReflected && !Selector.isOperatorName(element.name)); | 924 (canBeReflected && !Selector.isOperatorName(element.name)); |
927 assert(canTearOff || | 925 assert(canTearOff || |
928 !_worldBuilder.methodsNeedingSuperGetter.contains(element)); | 926 !_worldBuilder.methodsNeedingSuperGetter.contains(element)); |
929 tearOffName = _namer.getterForElement(element); | 927 tearOffName = _namer.getterForElement(element); |
930 } | 928 } |
931 } | 929 } |
932 | 930 |
933 if (canTearOff) { | 931 if (canTearOff) { |
934 assert(element is! ConstructorEntity, failedAt(element)); | 932 assert(element is! ConstructorEntity, failedAt(element)); |
935 assert(element is! ConstructorBodyElement, failedAt(element)); | 933 assert(element is! ConstructorBodyEntity, failedAt(element)); |
936 } | 934 } |
937 | 935 |
938 js.Name callName = null; | 936 js.Name callName = null; |
939 if (canTearOff) { | 937 if (canTearOff) { |
940 Selector callSelector = | 938 Selector callSelector = |
941 new Selector.fromElement(element).toCallSelector(); | 939 new Selector.fromElement(element).toCallSelector(); |
942 callName = _namer.invocationName(callSelector); | 940 callName = _namer.invocationName(callSelector); |
943 } | 941 } |
944 | 942 |
945 DartType memberType = _elementEnvironment.getFunctionType(element); | 943 DartType memberType = _elementEnvironment.getFunctionType(element); |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 Constant constant = new Constant(name, holder, constantValue); | 1193 Constant constant = new Constant(name, holder, constantValue); |
1196 _constants[constantValue] = constant; | 1194 _constants[constantValue] = constant; |
1197 } | 1195 } |
1198 } | 1196 } |
1199 | 1197 |
1200 Holder _registerStaticStateHolder() { | 1198 Holder _registerStaticStateHolder() { |
1201 return _registry.registerHolder(_namer.staticStateHolder, | 1199 return _registry.registerHolder(_namer.staticStateHolder, |
1202 isStaticStateHolder: true); | 1200 isStaticStateHolder: true); |
1203 } | 1201 } |
1204 } | 1202 } |
OLD | NEW |