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

Unified Diff: sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart

Issue 273723003: Assume a method can be torn off, if it's accessible through reflection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: More test and fixes. Created 6 years, 7 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
Index: sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 379d68721cdf0b6c0641634d8d4376c2ffecea6e..bef156cd817b696a396a00e9c8306692d0df89c9 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -345,6 +345,12 @@ class ContainerBuilder extends CodeEmitterHelper {
if (member.isInstanceMember) emitExtraAccessors(member, builder);
}
+ bool _isOperator(FunctionElement member) {
+ // TODO(18740): there must be a better way to know if an element is an
+ // operator.
+ return Elements.operatorNameToIdentifier(member.name) != member.name;
herhut 2014/05/09 07:23:18 Why do we use two different ways to determine whet
floitsch 2014/05/09 07:53:19 I didn't want to change unrelated code.
+ }
+
void addMemberMethod(FunctionElement member, ClassBuilder builder) {
if (member.isAbstract) return;
jsAst.Expression code = backend.generatedCode[member];
@@ -359,6 +365,9 @@ class ContainerBuilder extends CodeEmitterHelper {
member.isConstructor ||
member.isAccessor;
String tearOffName;
+
+ final bool canBeReflected = backend.isAccessibleByReflection(member);
+
if (isNotApplyTarget) {
canTearOff = false;
} else if (member.isInstanceMember) {
@@ -367,19 +376,21 @@ class ContainerBuilder extends CodeEmitterHelper {
isClosure = true;
} else {
// Careful with operators.
- canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler);
+ canTearOff =
+ compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
+ (canBeReflected && !_isOperator(member));
assert(!needsSuperGetter(member) || canTearOff);
tearOffName = namer.getterName(member);
}
} else {
canTearOff =
- compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member);
+ compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member) ||
+ canBeReflected;
tearOffName = namer.getStaticClosureName(member);
}
final bool canBeApplied = compiler.enabledFunctionApply &&
compiler.world.getMightBePassedToApply(member);
- final bool canBeReflected = backend.isAccessibleByReflection(member);
final bool needStructuredInfo =
canTearOff || canBeReflected || canBeApplied;
if (!needStructuredInfo) {

Powered by Google App Engine
This is Rietveld 408576698