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

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1678053002: Fix super noSuchMethod handling. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix. Created 4 years, 10 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 | « no previous file | pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698