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

Side by Side Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2748713002: Invoke native methods directly (Closed)
Patch Set: Address comments / cleanup Created 3 years, 9 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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 2
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 5
6 import 'dart:collection' show HashMap, HashSet; 6 import 'dart:collection' show HashMap, HashSet;
7 import 'dart:math' show min, max; 7 import 'dart:math' show min, max;
8 8
9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 5644 matching lines...) Expand 10 before | Expand all | Expand 10 after
5655 } 5655 }
5656 5656
5657 var result = _propertyName(name); 5657 var result = _propertyName(name);
5658 5658
5659 if (useExtension == null) { 5659 if (useExtension == null) {
5660 // Dart "extension" methods. Used for JS Array, Boolean, Number, String. 5660 // Dart "extension" methods. Used for JS Array, Boolean, Number, String.
5661 var baseType = type; 5661 var baseType = type;
5662 while (baseType is TypeParameterType) { 5662 while (baseType is TypeParameterType) {
5663 baseType = (baseType.element as TypeParameterElement).bound; 5663 baseType = (baseType.element as TypeParameterElement).bound;
5664 } 5664 }
5665 useExtension = baseType != null && 5665 useExtension =
5666 _extensionTypes.hasNativeSubtype(baseType) && 5666 baseType is InterfaceType && _isSymbolizedMember(baseType, name);
5667 !isObjectMember(name);
5668 } 5667 }
5669 5668
5670 return useExtension 5669 return useExtension
5671 ? js.call('#.#', [_extensionSymbolsModule, result]) 5670 ? js.call('#.#', [_extensionSymbolsModule, result])
5672 : result; 5671 : result;
5673 } 5672 }
5674 5673
5674 var _forwardingCache = <Element, Map<String, ExecutableElement>>{};
Jennifer Messerly 2017/03/13 21:21:32 micro-opt: var _forwardingCache = new HashMap
5675 Element _lookupForwardedMember(ClassElement element, String name) {
5676 // We only care about public methods.
5677 if (name.startsWith('_')) return null;
5678
5679 var map = _forwardingCache.putIfAbsent(element, () => {});
5680 if (map.containsKey(name)) return map[name];
5681
5682 // Note, for a public member, the library should not matter.
5683 var library = element.library;
5684 var member = element.lookUpMethod(name, library) ??
5685 element.lookUpGetter(name, library) ??
5686 element.lookUpSetter(name, library);
5687 member = (member != null &&
5688 member.isSynthetic &&
5689 member is PropertyAccessorElement)
5690 ? member.variable
5691 : member;
5692 map[name] = member;
5693 return member;
5694 }
5695
5696 /// Don't symbolize native members that just forward to the underlying
5697 /// native member. We limit this to non-renamed members as the receiver
5698 /// may be a mock type.
5699 ///
5700 /// Note, this is an underlying assumption here that, if another native type
5701 /// subtypes this one, it also forwards this member to its underlying native
5702 /// one without renaming.
5703 bool _isSymbolizedMember(InterfaceType type, String name) {
5704 // Object members are handled separately.
5705 if (isObjectMember(name)) {
5706 return false;
5707 }
5708
5709 var element = type.element;
5710 if (_extensionTypes.isNativeClass(element)) {
5711 var member = _lookupForwardedMember(element, name);
5712
5713 // Fields on a native class are implicitly native.
5714 // Methods/getters/setters are marked external/native.
5715 if (member is FieldElement ||
5716 member is ExecutableElement && member.isExternal) {
5717 var jsName = getAnnotationName(member, isJsName);
5718 return jsName != null && jsName != name;
5719 } else {
5720 // Non-external members must be symbolized.
5721 return true;
5722 }
5723 }
5724 // If the receiver *may* be a native type (i.e., an interface allowed to
5725 // be implemented by a native class), conservatively symbolize - we don't
5726 // whether it'll be implemented via forwarding.
5727 // TODO(vsm): Consider CHA here to be less conservative.
5728 return _extensionTypes.isNativeInterface(element);
5729 }
5730
5675 JS.TemporaryId _emitPrivateNameSymbol(LibraryElement library, String name) { 5731 JS.TemporaryId _emitPrivateNameSymbol(LibraryElement library, String name) {
5676 return _privateNames 5732 return _privateNames
5677 .putIfAbsent(library, () => new HashMap()) 5733 .putIfAbsent(library, () => new HashMap())
5678 .putIfAbsent(name, () { 5734 .putIfAbsent(name, () {
5679 var id = new JS.TemporaryId(name); 5735 var id = new JS.TemporaryId(name);
5680 _moduleItems.add( 5736 _moduleItems.add(
5681 js.statement('const # = Symbol(#);', [id, js.string(id.name, "'")])); 5737 js.statement('const # = Symbol(#);', [id, js.string(id.name, "'")]));
5682 return id; 5738 return id;
5683 }); 5739 });
5684 } 5740 }
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
5960 if (targetIdentifier.staticElement is! PrefixElement) return false; 6016 if (targetIdentifier.staticElement is! PrefixElement) return false;
5961 var prefix = targetIdentifier.staticElement as PrefixElement; 6017 var prefix = targetIdentifier.staticElement as PrefixElement;
5962 6018
5963 // The library the prefix is referring to must come from a deferred import. 6019 // The library the prefix is referring to must come from a deferred import.
5964 var containingLibrary = resolutionMap 6020 var containingLibrary = resolutionMap
5965 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) 6021 .elementDeclaredByCompilationUnit(target.root as CompilationUnit)
5966 .library; 6022 .library;
5967 var imports = containingLibrary.getImportsWithPrefix(prefix); 6023 var imports = containingLibrary.getImportsWithPrefix(prefix);
5968 return imports.length == 1 && imports[0].isDeferred; 6024 return imports.length == 1 && imports[0].isDeferred;
5969 } 6025 }
OLDNEW
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/lib/src/compiler/extension_types.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698