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

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

Issue 3000763002: Implement .getCallType (Closed)
Patch Set: The fix 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' show ResolutionDartType;
29 show ResolutionDartType, ResolutionFunctionType, ResolutionTypedefType; 28 import '../../elements/types.dart';
30 import '../../elements/types.dart' show DartType, DartTypes, FunctionType;
31 import '../../js/js.dart' as js; 29 import '../../js/js.dart' as js;
32 import '../../js_backend/backend.dart' show SuperMemberData; 30 import '../../js_backend/backend.dart' show SuperMemberData;
33 import '../../js_backend/backend_usage.dart'; 31 import '../../js_backend/backend_usage.dart';
34 import '../../js_backend/constant_handler_javascript.dart' 32 import '../../js_backend/constant_handler_javascript.dart'
35 show JavaScriptConstantCompiler; 33 show JavaScriptConstantCompiler;
36 import '../../js_backend/custom_elements_analysis.dart'; 34 import '../../js_backend/custom_elements_analysis.dart';
37 import '../../js_backend/namer.dart' show Namer, StringBackedName; 35 import '../../js_backend/namer.dart' show Namer, StringBackedName;
38 import '../../js_backend/native_data.dart'; 36 import '../../js_backend/native_data.dart';
39 import '../../js_backend/interceptor_data.dart'; 37 import '../../js_backend/interceptor_data.dart';
40 import '../../js_backend/mirrors_data.dart'; 38 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 515 // tearing off JavaScript methods as we cannot distinguish between calling
518 // a regular getter that returns a JavaScript function and tearing off 516 // a regular getter that returns a JavaScript function and tearing off
519 // a method in the case where there exist multiple JavaScript classes 517 // a method in the case where there exist multiple JavaScript classes
520 // that conflict on whether the member is a getter or a method. 518 // that conflict on whether the member is a getter or a method.
521 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass]; 519 var interceptorClass = _classes[_commonElements.jsJavaScriptObjectClass];
522 var stubNames = new Set<String>(); 520 var stubNames = new Set<String>();
523 librariesMap 521 librariesMap
524 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) { 522 .forEach((LibraryEntity library, List<ClassEntity> classElements, _) {
525 for (ClassEntity cls in classElements) { 523 for (ClassEntity cls in classElements) {
526 if (_nativeData.isJsInteropClass(cls)) { 524 if (_nativeData.isJsInteropClass(cls)) {
527 // TODO(redemption): Handle class entities. 525 _elementEnvironment.forEachClassMember(cls,
528 ClassElement e = cls; 526 (ClassEntity declarer, MemberEntity member) {
529 e.declaration.forEachMember((_, _member) { 527 if (declarer != cls) return;
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
« no previous file with comments | « pkg/compiler/lib/src/js_backend/namer.dart ('k') | pkg/compiler/lib/src/kernel/element_map_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698