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; |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 // tearing off JavaScript methods as we cannot distinguish between calling | 518 // tearing off JavaScript methods as we cannot distinguish between calling |
519 // a regular getter that returns a JavaScript function and tearing off | 519 // a regular getter that returns a JavaScript function and tearing off |
520 // a method in the case where there exist multiple JavaScript classes | 520 // a method in the case where there exist multiple JavaScript classes |
521 // that conflict on whether the member is a getter or a method. | 521 // that conflict on whether the member is a getter or a method. |
522 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass]; | 522 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass]; |
523 var stubNames = new Set<String>(); | 523 var stubNames = new Set<String>(); |
524 librariesMap | 524 librariesMap |
525 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) { | 525 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) { |
526 for (ClassEntity cls in classElements) { | 526 for (ClassEntity cls in classElements) { |
527 if (_nativeData.isJsInteropClass(cls)) { | 527 if (_nativeData.isJsInteropClass(cls)) { |
528 // TODO(johnniwinther): Handle class entities. | 528 // TODO(redemption): Handle class entities. |
529 ClassElement e = cls; | 529 ClassElement e = cls; |
530 e.declaration.forEachMember((_, _member) { | 530 e.declaration.forEachMember((_, _member) { |
531 MemberElement member = _member; | 531 MemberElement member = _member; |
532 var jsName = _nativeData.computeUnescapedJSInteropName(member.name); | 532 var jsName = _nativeData.computeUnescapedJSInteropName(member.name); |
533 if (!member.isInstanceMember) return; | 533 if (!member.isInstanceMember) return; |
534 if (member.isGetter || member.isField || member.isFunction) { | 534 if (member.isGetter || member.isField || member.isFunction) { |
535 var selectors = | 535 var selectors = |
536 _worldBuilder.getterInvocationsByName(member.name); | 536 _worldBuilder.getterInvocationsByName(member.name); |
537 if (selectors != null && !selectors.isEmpty) { | 537 if (selectors != null && !selectors.isEmpty) { |
538 for (var selector in selectors.keys) { | 538 for (var selector in selectors.keys) { |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 js.Name name = _namer.getterForMember(Names.call); | 748 js.Name name = _namer.getterForMember(Names.call); |
749 js.Fun function = js.js('function() { return this; }'); | 749 js.Fun function = js.js('function() { return this; }'); |
750 callStubs.add(_buildStubMethod(name, function)); | 750 callStubs.add(_buildStubMethod(name, function)); |
751 } | 751 } |
752 | 752 |
753 // MixinApplications run through the members of their mixin. Here, we are | 753 // MixinApplications run through the members of their mixin. Here, we are |
754 // only interested in direct members. | 754 // only interested in direct members. |
755 if (!onlyForRti && !_elementEnvironment.isMixinApplication(cls)) { | 755 if (!onlyForRti && !_elementEnvironment.isMixinApplication(cls)) { |
756 _elementEnvironment.forEachClassMember(cls, visitMember); | 756 _elementEnvironment.forEachClassMember(cls, visitMember); |
757 if (cls is ClassElement) { | 757 if (cls is ClassElement) { |
758 // TODO(johnniwinther): Support constructor bodies for entities. | 758 // TODO(redemption): Support constructor bodies for entities. |
759 cls.forEachConstructorBody((ConstructorBodyElement constructorBody) => | 759 cls.forEachConstructorBody((ConstructorBodyElement constructorBody) => |
760 visitMember(cls, constructorBody)); | 760 visitMember(cls, constructorBody)); |
761 } | 761 } |
762 } | 762 } |
763 bool isInterceptedClass = _interceptorData.isInterceptedClass(cls); | 763 bool isInterceptedClass = _interceptorData.isInterceptedClass(cls); |
764 List<Field> instanceFields = onlyForRti | 764 List<Field> instanceFields = onlyForRti |
765 ? const <Field>[] | 765 ? const <Field>[] |
766 : _buildFields( | 766 : _buildFields( |
767 cls: cls, | 767 cls: cls, |
768 visitStatics: false, | 768 visitStatics: false, |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 DartType memberType = _elementEnvironment.getFunctionType(element); | 940 DartType memberType = _elementEnvironment.getFunctionType(element); |
941 js.Expression functionType; | 941 js.Expression functionType; |
942 if (canTearOff || canBeReflected) { | 942 if (canTearOff || canBeReflected) { |
943 OutputUnit outputUnit = _deferredLoadTask.outputUnitForMember(element); | 943 OutputUnit outputUnit = _deferredLoadTask.outputUnitForMember(element); |
944 functionType = _generateFunctionType(memberType, outputUnit); | 944 functionType = _generateFunctionType(memberType, outputUnit); |
945 } | 945 } |
946 | 946 |
947 int requiredParameterCount; | 947 int requiredParameterCount; |
948 var /* List | Map */ optionalParameterDefaultValues; | 948 var /* List | Map */ optionalParameterDefaultValues; |
949 if (canBeApplied || canBeReflected) { | 949 if (canBeApplied || canBeReflected) { |
950 // TODO(johnniwinther): Handle function entities. | 950 // TODO(redemption): Handle function entities. |
951 MethodElement method = element; | 951 MethodElement method = element; |
952 FunctionSignature signature = method.functionSignature; | 952 FunctionSignature signature = method.functionSignature; |
953 requiredParameterCount = signature.requiredParameterCount; | 953 requiredParameterCount = signature.requiredParameterCount; |
954 optionalParameterDefaultValues = | 954 optionalParameterDefaultValues = |
955 _computeParameterDefaultValues(signature); | 955 _computeParameterDefaultValues(signature); |
956 } | 956 } |
957 | 957 |
958 return new InstanceMethod(element, name, code, | 958 return new InstanceMethod(element, name, code, |
959 _generateParameterStubs(element, canTearOff), callName, | 959 _generateParameterStubs(element, canTearOff), callName, |
960 needsTearOff: canTearOff, | 960 needsTearOff: canTearOff, |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 js.Expression functionType; | 1148 js.Expression functionType; |
1149 DartType type = _elementEnvironment.getFunctionType(element); | 1149 DartType type = _elementEnvironment.getFunctionType(element); |
1150 if (needsTearOff || canBeReflected) { | 1150 if (needsTearOff || canBeReflected) { |
1151 OutputUnit outputUnit = _deferredLoadTask.outputUnitForMember(element); | 1151 OutputUnit outputUnit = _deferredLoadTask.outputUnitForMember(element); |
1152 functionType = _generateFunctionType(type, outputUnit); | 1152 functionType = _generateFunctionType(type, outputUnit); |
1153 } | 1153 } |
1154 | 1154 |
1155 int requiredParameterCount; | 1155 int requiredParameterCount; |
1156 var /* List | Map */ optionalParameterDefaultValues; | 1156 var /* List | Map */ optionalParameterDefaultValues; |
1157 if (canBeApplied || canBeReflected) { | 1157 if (canBeApplied || canBeReflected) { |
1158 // TODO(johnniwinther): Support entities; | 1158 // TODO(redemption): Support entities; |
1159 MethodElement method = element; | 1159 MethodElement method = element; |
1160 FunctionSignature signature = method.functionSignature; | 1160 FunctionSignature signature = method.functionSignature; |
1161 requiredParameterCount = signature.requiredParameterCount; | 1161 requiredParameterCount = signature.requiredParameterCount; |
1162 optionalParameterDefaultValues = | 1162 optionalParameterDefaultValues = |
1163 _computeParameterDefaultValues(signature); | 1163 _computeParameterDefaultValues(signature); |
1164 } | 1164 } |
1165 | 1165 |
1166 // TODO(floitsch): we shouldn't update the registry in the middle of | 1166 // TODO(floitsch): we shouldn't update the registry in the middle of |
1167 // building a static method. | 1167 // building a static method. |
1168 return new StaticDartMethod(element, name, _registry.registerHolder(holder), | 1168 return new StaticDartMethod(element, name, _registry.registerHolder(holder), |
(...skipping 21 matching lines...) Expand all Loading... |
1190 Constant constant = new Constant(name, holder, constantValue); | 1190 Constant constant = new Constant(name, holder, constantValue); |
1191 _constants[constantValue] = constant; | 1191 _constants[constantValue] = constant; |
1192 } | 1192 } |
1193 } | 1193 } |
1194 | 1194 |
1195 Holder _registerStaticStateHolder() { | 1195 Holder _registerStaticStateHolder() { |
1196 return _registry.registerHolder(_namer.staticStateHolder, | 1196 return _registry.registerHolder(_namer.staticStateHolder, |
1197 isStaticStateHolder: true); | 1197 isStaticStateHolder: true); |
1198 } | 1198 } |
1199 } | 1199 } |
OLD | NEW |