Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart

Issue 3000763002: Implement .getCallType (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698