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

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2748713002: Invoke native methods directly (Closed)
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index ce888fc1bb6ebea62bbc9b59415c627ad6f56699..b413c60fdb6bbf6b6b0e91113158bf3c35aa1037 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -5664,6 +5664,7 @@ class CodeGenerator extends GeneralizingAstVisitor
}
useExtension = baseType != null &&
_extensionTypes.hasNativeSubtype(baseType) &&
Jennifer Messerly 2017/03/13 17:20:10 you might want to fold this check into isForwarded
vsm 2017/03/13 20:55:26 Done.
+ !isForwardedNativeMember(baseType, name) &&
!isObjectMember(name);
}
@@ -5672,6 +5673,35 @@ class CodeGenerator extends GeneralizingAstVisitor
: result;
}
+ bool isForwardedNativeMember(DartType type, String name) {
+ // Don't call extension members that just forward to the underlying
Jennifer Messerly 2017/03/13 17:20:10 this might be nicer as a doc comment?
vsm 2017/03/13 20:55:26 Done - see below.
+ // native member. We limit this to non-renamed members as the receiver
+ // may be a mock type.
+
+ // Note, this is an underlying assumption here that, if another native type
+ // subtypes this one, it also forwards this member to its underlying native
+ // one without renaming.
+ if (type is InterfaceType) {
Jennifer Messerly 2017/03/13 17:20:11 this check could be moved to line 5665: `useExtens
vsm 2017/03/13 20:55:26 Done.
+ var element = type.element;
+ if (_extensionTypes.isNativeClass(element)) {
+ var member = element.lookUpMethod(name, currentLibrary) ??
Jennifer Messerly 2017/03/13 17:20:11 this is a pretty slow lookup. it'll linear scan th
vsm 2017/03/13 20:55:26 Done.
+ element.lookUpGetter(name, currentLibrary) ??
+ element.lookUpSetter(name, currentLibrary);
+
+ // Fields on a native class are implicitly native.
+ // Methods/getters/setters are marked external/native.
+ if (member != null) {
+ member = (member.isSynthetic && member is PropertyAccessorElement) ? member.variable : member;
Jennifer Messerly 2017/03/13 17:20:10 long line
vsm 2017/03/13 20:55:26 Done.
+ if (member is FieldElement || member.isExternal) {
+ var jsName = getAnnotationName(member, isJsName);
+ return jsName == null || jsName == name;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
JS.TemporaryId _emitPrivateNameSymbol(LibraryElement library, String name) {
return _privateNames
.putIfAbsent(library, () => new HashMap())
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698