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

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

Issue 329983002: Implement references to "this" in the new IR. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: rebase 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 a6693ca1ca0fee0e0e707beb42a6471e58e9a49c..137703ef53c795305f2edc6b7069efc88e48b56b 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -810,6 +810,12 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
return constant;
}
+ ir.Primitive visitIdentifier(ast.Identifier node) {
+ assert(isOpen);
+ assert(node.isThis());
+ return lookupThis();
+ }
+
ir.Primitive visitParenthesizedExpression(
ast.ParenthesizedExpression node) {
assert(isOpen);
@@ -836,6 +842,12 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
return receiver;
}
+ ir.Primitive lookupThis() {
+ ir.Primitive result = new ir.This();
+ add(new ir.LetPrim(result));
+ return result;
+ }
+
ir.Primitive lookupLocal(Element element) {
int index = variableIndex[element];
ir.Primitive value = assignedVars[index];
@@ -907,10 +919,9 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
if (Elements.isLocal(element)) {
return lookupLocal(element);
} else if (element == null || Elements.isInstanceField(element)) {
- // TODO: Support implicit this.
- if (node.receiver == null) return giveup(node);
-
- ir.Primitive receiver = visit(node.receiver);
+ ir.Primitive receiver = node.receiver == null
+ ? lookupThis()
+ : visit(node.receiver);
ir.Parameter v = new ir.Parameter(null);
ir.Continuation k = new ir.Continuation([v]);
Selector selector = elements.getSelector(node);
@@ -1169,11 +1180,16 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
// - Assignment to final variable (will not be resolved)
return giveup(node, 'SendSet: non-local, non-static, but no receiver');
} else {
+ if (element != null && Elements.isUnresolved(element)) return giveup();
+
// Setter or index-setter invocation
assert(node.receiver != null);
+
if (node.receiver.isSuper()) return giveup(node, 'Super SendSet');
- ir.Primitive receiver = visit(node.receiver);
+ ir.Primitive receiver = node.receiver == null
+ ? lookupThis()
+ : visit(node.receiver);
ir.Parameter v = new ir.Parameter(null);
ir.Continuation k = new ir.Continuation([v]);
Selector selector = elements.getSelector(node);

Powered by Google App Engine
This is Rietveld 408576698