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

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart

Issue 861713002: Handle super-method invocations in CPS->JS backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart2js.ir_builder; 5 part of dart2js.ir_builder;
6 6
7 /** 7 /**
8 * This task iterates through all resolved elements and builds [ir.Node]s. The 8 * This task iterates through all resolved elements and builds [ir.Node]s. The
9 * nodes are stored in the [nodes] map and accessible through [hasIr] and 9 * nodes are stored in the [nodes] map and accessible through [hasIr] and
10 * [getIr]. 10 * [getIr].
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 receiver = visitReceiver(node.receiver); 739 receiver = visitReceiver(node.receiver);
740 List<ir.Primitive> arguments = new List<ir.Primitive>(); 740 List<ir.Primitive> arguments = new List<ir.Primitive>();
741 if (selector.isIndex) { 741 if (selector.isIndex) {
742 index = visit(node.arguments.head); 742 index = visit(node.arguments.head);
743 arguments.add(index); 743 arguments.add(index);
744 } 744 }
745 745
746 assert(selector.kind == SelectorKind.GETTER || 746 assert(selector.kind == SelectorKind.GETTER ||
747 selector.kind == SelectorKind.INDEX); 747 selector.kind == SelectorKind.INDEX);
748 if (isSuperCall(node)) { 748 if (isSuperCall(node)) {
749 result = irBuilder.buildSuperInvocation(selector, arguments); 749 result = irBuilder.buildSuperInvocation(element, selector, arguments);
750 } else { 750 } else {
751 result = 751 result =
752 irBuilder.buildDynamicInvocation(receiver, selector, arguments); 752 irBuilder.buildDynamicInvocation(receiver, selector, arguments);
753 } 753 }
754 } else if (element.isField || element.isGetter || element.isErroneous || 754 } else if (element.isField || element.isGetter || element.isErroneous ||
755 element.isSetter) { 755 element.isSetter) {
756 // TODO(johnniwinther): Change handling of setter selectors. 756 // TODO(johnniwinther): Change handling of setter selectors.
757 // Access to a static field or getter (non-static case handled above). 757 // Access to a static field or getter (non-static case handled above).
758 // Even if there is only a setter, we compile as if it was a getter, 758 // Even if there is only a setter, we compile as if it was a getter,
759 // so the vm can fail at runtime. 759 // so the vm can fail at runtime.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 node.arguments.mapToList(visit, growable:false); 840 node.arguments.mapToList(visit, growable:false);
841 return irBuilder.buildStaticInvocation(element, selector, arguments); 841 return irBuilder.buildStaticInvocation(element, selector, arguments);
842 } 842 }
843 843
844 ir.Primitive visitSuperSend(ast.Send node) { 844 ir.Primitive visitSuperSend(ast.Send node) {
845 assert(irBuilder.isOpen); 845 assert(irBuilder.isOpen);
846 if (node.isPropertyAccess) { 846 if (node.isPropertyAccess) {
847 return visitGetterSend(node); 847 return visitGetterSend(node);
848 } else { 848 } else {
849 Selector selector = elements.getSelector(node); 849 Selector selector = elements.getSelector(node);
850 Element target = elements[node];
850 List<ir.Primitive> arguments = new List<ir.Primitive>(); 851 List<ir.Primitive> arguments = new List<ir.Primitive>();
851 for (ast.Node n in node.arguments) { 852 for (ast.Node n in node.arguments) {
852 arguments.add(visit(n)); 853 arguments.add(visit(n));
853 } 854 }
854 return irBuilder.buildSuperInvocation(selector, arguments); 855 return irBuilder.buildSuperInvocation(target, selector, arguments);
855 } 856 }
856 } 857 }
857 858
858 visitTypePrefixSend(ast.Send node) { 859 visitTypePrefixSend(ast.Send node) {
859 compiler.internalError(node, "visitTypePrefixSend should not be called."); 860 compiler.internalError(node, "visitTypePrefixSend should not be called.");
860 } 861 }
861 862
862 ir.Primitive visitTypeLiteralSend(ast.Send node) { 863 ir.Primitive visitTypeLiteralSend(ast.Send node) {
863 assert(irBuilder.isOpen); 864 assert(irBuilder.isOpen);
864 // If the user is trying to invoke the type literal or variable, 865 // If the user is trying to invoke the type literal or variable,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 Elements.isStaticOrTopLevel(element)) { 948 Elements.isStaticOrTopLevel(element)) {
948 irBuilder.buildStaticSet( 949 irBuilder.buildStaticSet(
949 element, elements.getSelector(node), valueToStore); 950 element, elements.getSelector(node), valueToStore);
950 } else { 951 } else {
951 // Setter or index-setter invocation 952 // Setter or index-setter invocation
952 Selector selector = elements.getSelector(node); 953 Selector selector = elements.getSelector(node);
953 assert(selector.kind == SelectorKind.SETTER || 954 assert(selector.kind == SelectorKind.SETTER ||
954 selector.kind == SelectorKind.INDEX); 955 selector.kind == SelectorKind.INDEX);
955 if (selector.isIndexSet) { 956 if (selector.isIndexSet) {
956 if (isSuperCall(node)) { 957 if (isSuperCall(node)) {
957 irBuilder.buildSuperIndexSet(index, valueToStore); 958 irBuilder.buildSuperIndexSet(element, index, valueToStore);
958 } else { 959 } else {
959 irBuilder.buildDynamicIndexSet(receiver, index, valueToStore); 960 irBuilder.buildDynamicIndexSet(receiver, index, valueToStore);
960 } 961 }
961 } else { 962 } else {
962 if (isSuperCall(node)) { 963 if (isSuperCall(node)) {
963 irBuilder.buildSuperSet(selector, valueToStore); 964 irBuilder.buildSuperSet(element, selector, valueToStore);
964 } else { 965 } else {
965 irBuilder.buildDynamicSet(receiver, selector, valueToStore); 966 irBuilder.buildDynamicSet(receiver, selector, valueToStore);
966 } 967 }
967 } 968 }
968 } 969 }
969 970
970 if (node.isPostfix) { 971 if (node.isPostfix) {
971 assert(originalValue != null); 972 assert(originalValue != null);
972 return originalValue; 973 return originalValue;
973 } else { 974 } else {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 currentFunction = elements[node]; 1151 currentFunction = elements[node];
1151 if (node.initializers != null) { 1152 if (node.initializers != null) {
1152 insideInitializer = true; 1153 insideInitializer = true;
1153 visit(node.initializers); 1154 visit(node.initializers);
1154 insideInitializer = false; 1155 insideInitializer = false;
1155 } 1156 }
1156 visit(node.body); 1157 visit(node.body);
1157 currentFunction = oldFunction; 1158 currentFunction = oldFunction;
1158 } 1159 }
1159 } 1160 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698