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

Unified Diff: sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart

Issue 349923004: Add support for superSend to the new IR and dart backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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/ir/ir_builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index e80aa26c07ceefceb645a8e015afceec421ea788..f2b285d72da7dcf0aa25760d6fb318562c305017 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -812,8 +812,16 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
ir.Primitive visitIdentifier(ast.Identifier node) {
assert(isOpen);
- assert(node.isThis());
- return lookupThis();
+ if (node.isThis()) {
+ return lookupThis();
+ } else if (node.isSuper()) {
+ return lookupSuper();
+ } else {
+ // super and this are the only identifiers that should be met by the
+ // visitor.
+ assert(false);
+ return null;
+ }
}
ir.Primitive visitParenthesizedExpression(
@@ -848,6 +856,12 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
return result;
}
+ ir.Primitive lookupSuper() {
+ ir.Primitive result = new ir.Super();
+ add(new ir.LetPrim(result));
+ return result;
+ }
+
ir.Primitive lookupLocal(Element element) {
int index = variableIndex[element];
ir.Primitive value = assignedVars[index];
@@ -896,8 +910,8 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
ir.Primitive visitDynamicSend(ast.Send node) {
assert(isOpen);
- if (node.receiver == null || node.receiver.isSuper()) {
- return giveup(node, 'DynamicSend without receiver, or super receiver');
+ if (node.receiver == null) {
+ return giveup(node, 'DynamicSend without receiver');
}
Selector selector = elements.getSelector(node);
ir.Primitive receiver = visit(node.receiver);
@@ -1122,7 +1136,11 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
ir.Primitive visitSuperSend(ast.Send node) {
assert(isOpen);
- return giveup(node, 'SuperSend');
+ if (node.isPropertyAccess) {
+ return visitGetterSend(node);
+ } else {
+ return visitDynamicSend(node);
+ }
}
ir.Primitive visitTypeReferenceSend(ast.Send node) {
@@ -1181,7 +1199,7 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
return giveup(node, 'SendSet: non-local, non-static, but no receiver');
} else {
if (element != null && Elements.isUnresolved(element)) {
- return giveup(node);
+ return giveup(node, 'SendSet: non-local, non-static, unresolved');
}
// Setter or index-setter invocation
@@ -1308,8 +1326,10 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
try {
return action();
- } catch(e) {
- if (e == ABORT_IRNODE_BUILDER) return null;
+ } catch(e, tr) {
+ if (e == ABORT_IRNODE_BUILDER) {
+ return null;
+ }
rethrow;
}
}

Powered by Google App Engine
This is Rietveld 408576698