Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
index 37dc74b9d18c41776c02584a3b20fefbd0e0194d..88c8e364b157d7d685e09e081a1a5638332b4dec 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
@@ -7,6 +7,7 @@ library dart2js.ir_builder_task; |
import '../closure.dart' as closure; |
import '../common.dart'; |
import '../common/names.dart' show |
+ Identifiers, |
Names, |
Selectors; |
import '../common/tasks.dart' show |
@@ -1894,11 +1895,20 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
ir.Primitive visitUnresolvedSuperGet( |
ast.Send node, |
Element element, _) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
elements.getSelector(node), elements.getTypeMask(node), []); |
} |
@override |
+ ir.Primitive visitUnresolvedSuperSet( |
+ ast.Send node, |
+ Element element, |
+ ast.Node rhs, _) { |
+ return buildSuperNoSuchMethod( |
+ elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)]); |
+ } |
+ |
+ @override |
ir.Primitive visitThisGet(ast.Identifier node, _) { |
if (irBuilder.state.thisParameter == null) { |
// TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. |
@@ -2428,7 +2438,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
CallStructure normalizedCallStructure = |
translateDynamicArguments(arguments, callStructure, normalizedArguments); |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.call(method.memberName, normalizedCallStructure), |
elements.getTypeMask(node), |
normalizedArguments); |
@@ -2445,7 +2455,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
argumentsNode, selector.callStructure, arguments); |
// TODO(johnniwinther): Supply a member name to the visit function instead |
// of looking it up in elements. |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.call(elements.getSelector(node).memberName, callStructure), |
elements.getTypeMask(node), |
arguments); |
@@ -2856,7 +2866,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
} |
ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.getter(new Name(element.name, element.library)), |
mask, |
const <ir.Primitive>[]); |
@@ -2865,7 +2875,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
ir.Primitive buildSuperNoSuchSetter(Element element, |
TypeMask mask, |
ir.Primitive value) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.setter(new Name(element.name, element.library)), |
mask, |
<ir.Primitive>[value]); |
@@ -3018,7 +3028,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
return translateCompounds(node, () { |
return isGetterValid |
? irBuilder.buildSuperIndex(indexFunction, indexValue) |
- : buildInstanceNoSuchMethod( |
+ : buildSuperNoSuchMethod( |
new Selector.index(), |
elements.getGetterTypeMaskInComplexSendSet(node), |
<ir.Primitive>[indexValue]); |
@@ -3026,7 +3036,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
if (isSetterValid) { |
irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
} else { |
- buildInstanceNoSuchMethod( |
+ buildSuperNoSuchMethod( |
new Selector.indexSet(), |
elements.getTypeMask(node), |
<ir.Primitive>[indexValue, result]); |
@@ -3327,13 +3337,18 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
return irBuilder.buildNonTailThrow(visit(node.expression)); |
} |
- ir.Primitive buildInstanceNoSuchMethod(Selector selector, |
+ ir.Primitive buildSuperNoSuchMethod(Selector selector, |
TypeMask mask, |
List<ir.Primitive> arguments) { |
- return irBuilder.buildDynamicInvocation( |
- irBuilder.buildThis(), |
- Selectors.noSuchMethod_, |
- mask, |
+ ClassElement cls = elements.analyzedElement.enclosingClass; |
+ MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); |
+ if (!Selectors.noSuchMethod_.signatureApplies(element)) { |
+ element = compiler.coreClasses.objectClass.lookupMember( |
+ Identifiers.noSuchMethod_); |
+ } |
+ return irBuilder.buildSuperMethodInvocation( |
+ element, |
+ Selectors.noSuchMethod_.callStructure, |
[irBuilder.buildInvocationMirror(selector, arguments)]); |
} |
@@ -3442,7 +3457,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
Element function, |
ast.Node index, _) { |
// Assume the index getter is missing. |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.index(), elements.getTypeMask(node), [visit(index)]); |
} |
@@ -3452,7 +3467,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
Element element, |
op.BinaryOperator operator, |
ast.Node argument, _) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
elements.getSelector(node), |
elements.getTypeMask(node), |
[visit(argument)]); |
@@ -3463,7 +3478,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
ast.Send node, |
op.UnaryOperator operator, |
Element element, _) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
elements.getSelector(node), elements.getTypeMask(node), []); |
} |
@@ -3550,7 +3565,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
ast.SendSet node, |
FieldElement field, |
ast.Node rhs, _) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.setter(field.memberName), |
elements.getTypeMask(node), |
[visit(rhs)]); |
@@ -3617,7 +3632,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
GetterElement getter, |
ast.Node rhs, |
_) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.setter(getter.memberName), |
elements.getTypeMask(node), |
[visit(rhs)]); |
@@ -3629,7 +3644,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
MethodElement method, |
ast.Node rhs, |
_) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.setter(method.memberName), |
elements.getTypeMask(node), |
[visit(rhs)]); |
@@ -3639,7 +3654,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
ir.Primitive visitSuperSetterGet( |
ast.Send node, |
SetterElement setter, _) { |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.setter(setter.memberName), |
elements.getTypeMask(node), |
[]); |
@@ -3654,7 +3669,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
List<ir.Primitive> arguments = <ir.Primitive>[]; |
callStructure = |
translateDynamicArguments(argumentsNode, callStructure, arguments); |
- return buildInstanceNoSuchMethod( |
+ return buildSuperNoSuchMethod( |
new Selector.call(setter.memberName, callStructure), |
elements.getTypeMask(node), |
arguments); |