Chromium Code Reviews| 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 FieldElement, | 20 FieldElement, |
| 21 FunctionSignature, | 21 FunctionSignature, |
| 22 GetterElement, | |
| 23 LibraryElement, | 22 LibraryElement, |
| 24 MemberElement, | 23 MemberElement, |
| 25 MethodElement, | 24 MethodElement, |
| 26 ParameterElement; | 25 ParameterElement; |
| 27 import '../../elements/entities.dart'; | 26 import '../../elements/entities.dart'; |
| 28 import '../../elements/resolution_types.dart' | 27 import '../../elements/resolution_types.dart' |
| 29 show ResolutionDartType, ResolutionFunctionType, ResolutionTypedefType; | 28 show ResolutionDartType, ResolutionFunctionType; |
| 30 import '../../elements/types.dart' show DartType, DartTypes; | 29 import '../../elements/types.dart'; |
| 31 import '../../js/js.dart' as js; | 30 import '../../js/js.dart' as js; |
| 32 import '../../js_backend/backend.dart' show SuperMemberData; | 31 import '../../js_backend/backend.dart' show SuperMemberData; |
| 33 import '../../js_backend/backend_usage.dart'; | 32 import '../../js_backend/backend_usage.dart'; |
| 34 import '../../js_backend/constant_handler_javascript.dart' | 33 import '../../js_backend/constant_handler_javascript.dart' |
| 35 show JavaScriptConstantCompiler; | 34 show JavaScriptConstantCompiler; |
| 36 import '../../js_backend/custom_elements_analysis.dart'; | 35 import '../../js_backend/custom_elements_analysis.dart'; |
| 37 import '../../js_backend/namer.dart' show Namer, StringBackedName; | 36 import '../../js_backend/namer.dart' show Namer, StringBackedName; |
| 38 import '../../js_backend/native_data.dart'; | 37 import '../../js_backend/native_data.dart'; |
| 39 import '../../js_backend/interceptor_data.dart'; | 38 import '../../js_backend/interceptor_data.dart'; |
| 40 import '../../js_backend/mirrors_data.dart'; | 39 import '../../js_backend/mirrors_data.dart'; |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 517 // tearing off JavaScript methods as we cannot distinguish between calling | 516 // tearing off JavaScript methods as we cannot distinguish between calling |
| 518 // a regular getter that returns a JavaScript function and tearing off | 517 // a regular getter that returns a JavaScript function and tearing off |
| 519 // a method in the case where there exist multiple JavaScript classes | 518 // a method in the case where there exist multiple JavaScript classes |
| 520 // that conflict on whether the member is a getter or a method. | 519 // that conflict on whether the member is a getter or a method. |
| 521 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass]; | 520 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass]; |
| 522 var stubNames = new Set<String>(); | 521 var stubNames = new Set<String>(); |
| 523 librariesMap | 522 librariesMap |
| 524 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) { | 523 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) { |
| 525 for (ClassEntity cls in classElements) { | 524 for (ClassEntity cls in classElements) { |
| 526 if (_nativeData.isJsInteropClass(cls)) { | 525 if (_nativeData.isJsInteropClass(cls)) { |
| 527 // TODO(redemption): Handle class entities. | 526 // TODO(redemption): Handle class entities. |
|
Siggi Cherem (dart-lang)
2017/08/11 16:14:59
delete todo?
Johnni Winther
2017/08/15 14:17:37
Done.
| |
| 528 ClassElement e = cls; | 527 _elementEnvironment.forEachClassMember(cls, (_, MemberEntity member) { |
| 529 e.declaration.forEachMember((_, _member) { | |
| 530 MemberElement member = _member; | |
| 531 var jsName = _nativeData.computeUnescapedJSInteropName(member.name); | 528 var jsName = _nativeData.computeUnescapedJSInteropName(member.name); |
| 532 if (!member.isInstanceMember) return; | 529 if (!member.isInstanceMember) return; |
| 533 if (member.isGetter || member.isField || member.isFunction) { | 530 if (member.isGetter || member.isField || member.isFunction) { |
| 534 var selectors = | 531 var selectors = |
| 535 _worldBuilder.getterInvocationsByName(member.name); | 532 _worldBuilder.getterInvocationsByName(member.name); |
| 536 if (selectors != null && !selectors.isEmpty) { | 533 if (selectors != null && !selectors.isEmpty) { |
| 537 for (var selector in selectors.keys) { | 534 for (var selector in selectors.keys) { |
| 538 var stubName = _namer.invocationName(selector); | 535 var stubName = _namer.invocationName(selector); |
| 539 if (stubNames.add(stubName.key)) { | 536 if (stubNames.add(stubName.key)) { |
| 540 interceptorClass.callStubs.add(_buildStubMethod(stubName, | 537 interceptorClass.callStubs.add(_buildStubMethod(stubName, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 554 interceptorClass.callStubs.add(_buildStubMethod(stubName, | 551 interceptorClass.callStubs.add(_buildStubMethod(stubName, |
| 555 js.js('function(obj, v) { return obj.# = v }', [jsName]), | 552 js.js('function(obj, v) { return obj.# = v }', [jsName]), |
| 556 element: member)); | 553 element: member)); |
| 557 } | 554 } |
| 558 } | 555 } |
| 559 } | 556 } |
| 560 | 557 |
| 561 // Generating stubs for direct calls and stubs for call-through | 558 // Generating stubs for direct calls and stubs for call-through |
| 562 // of getters that happen to be functions. | 559 // of getters that happen to be functions. |
| 563 bool isFunctionLike = false; | 560 bool isFunctionLike = false; |
| 564 ResolutionFunctionType functionType = null; | 561 FunctionType functionType = null; |
| 565 | 562 |
| 566 if (member.isFunction) { | 563 if (member.isFunction) { |
| 567 MethodElement fn = member; | 564 MethodElement fn = member; |
| 568 functionType = fn.type; | 565 functionType = fn.type; |
| 569 } else if (member.isGetter) { | 566 } else if (member.isGetter) { |
| 570 if (_options.trustTypeAnnotations) { | 567 if (_options.trustTypeAnnotations) { |
| 571 GetterElement getter = member; | 568 DartType returnType = |
| 572 ResolutionDartType returnType = getter.type.returnType; | 569 _elementEnvironment.getFunctionType(member).returnType; |
| 573 if (returnType.isFunctionType) { | 570 if (returnType.isFunctionType) { |
| 574 functionType = returnType; | 571 functionType = returnType; |
| 575 } else if (returnType.treatAsDynamic || | 572 } else if (returnType.treatAsDynamic || |
| 576 _types.isSubtype( | 573 _types.isSubtype( |
| 577 returnType, | 574 returnType, |
| 578 // ignore: UNNECESSARY_CAST | 575 // ignore: UNNECESSARY_CAST |
| 579 _commonElements.functionType as DartType)) { | 576 _commonElements.functionType as DartType)) { |
| 580 if (returnType.isTypedef) { | 577 if (returnType.isTypedef) { |
| 581 ResolutionTypedefType typedef = returnType; | 578 TypedefType typedef = returnType; |
| 582 // TODO(jacobr): can we just use typdef.unaliased instead? | 579 functionType = typedef.unaliased; |
| 583 functionType = typedef.element.functionSignature.type; | |
| 584 } else { | 580 } else { |
| 585 // Other misc function type such as commonElements.Function. | 581 // Other misc function type such as commonElements.Function. |
| 586 // Allow any number of arguments. | 582 // Allow any number of arguments. |
| 587 isFunctionLike = true; | 583 isFunctionLike = true; |
| 588 } | 584 } |
| 589 } | 585 } |
| 590 } else { | 586 } else { |
| 591 isFunctionLike = true; | 587 isFunctionLike = true; |
| 592 } | 588 } |
| 593 } // TODO(jacobr): handle field elements. | 589 } // TODO(jacobr): handle field elements. |
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1190 Constant constant = new Constant(name, holder, constantValue); | 1186 Constant constant = new Constant(name, holder, constantValue); |
| 1191 _constants[constantValue] = constant; | 1187 _constants[constantValue] = constant; |
| 1192 } | 1188 } |
| 1193 } | 1189 } |
| 1194 | 1190 |
| 1195 Holder _registerStaticStateHolder() { | 1191 Holder _registerStaticStateHolder() { |
| 1196 return _registry.registerHolder(_namer.staticStateHolder, | 1192 return _registry.registerHolder(_namer.staticStateHolder, |
| 1197 isStaticStateHolder: true); | 1193 isStaticStateHolder: true); |
| 1198 } | 1194 } |
| 1199 } | 1195 } |
| OLD | NEW |