Chromium Code Reviews| 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) { |