| 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;
|
| }
|
| }
|
|
|