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

Side by Side Diff: pkg/compiler/lib/src/kernel/kernel_visitor.dart

Issue 2561843002: dart2js-kernel: associate more compound assignment inner nodes (Closed)
Patch Set: move voidContext deeper Created 4 years 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 import 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 import 'package:kernel/frontend/accessors.dart' 6 import 'package:kernel/frontend/accessors.dart'
7 show 7 show
8 Accessor, 8 Accessor,
9 IndexAccessor, 9 IndexAccessor,
10 NullAwarePropertyAccessor, 10 NullAwarePropertyAccessor,
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 ir.FunctionExpression function = 1223 ir.FunctionExpression function =
1224 new ir.FunctionExpression(buildFunctionNode(closure, body)); 1224 new ir.FunctionExpression(buildFunctionNode(closure, body));
1225 kernel.localFunctions[closure] = function; 1225 kernel.localFunctions[closure] = function;
1226 return function; 1226 return function;
1227 }); 1227 });
1228 } 1228 }
1229 1229
1230 @override 1230 @override
1231 ir.Expression visitCompoundIndexSet(SendSet node, Node receiver, Node index, 1231 ir.Expression visitCompoundIndexSet(SendSet node, Node receiver, Node index,
1232 AssignmentOperator operator, Node rhs, _) { 1232 AssignmentOperator operator, Node rhs, _) {
1233 // TODO(sra): Find binary operator. 1233 return buildCompoundAssignment(
1234 return buildIndexAccessor(receiver, index).buildCompoundAssignment( 1234 node,
1235 buildIndexAccessor(receiver, index),
1235 kernel.irName(operator.selectorName, currentElement), 1236 kernel.irName(operator.selectorName, currentElement),
1236 visitForValue(rhs), 1237 visitForValue(rhs));
1237 voidContext: isVoidContext);
1238 } 1238 }
1239 1239
1240 @override 1240 @override
1241 ir.InvocationExpression visitConstConstructorInvoke( 1241 ir.InvocationExpression visitConstConstructorInvoke(
1242 NewExpression node, ConstructedConstantExpression constant, _) { 1242 NewExpression node, ConstructedConstantExpression constant, _) {
1243 return buildConstructorInvoke(node, isConst: true); 1243 return buildConstructorInvoke(node, isConst: true);
1244 } 1244 }
1245 1245
1246 @override 1246 @override
1247 visitConstantGet(Send node, ConstantExpression constant, _) { 1247 visitConstantGet(Send node, ConstantExpression constant, _) {
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 return IndexAccessor.make( 1576 return IndexAccessor.make(
1577 visitForValue(receiver), visitForValue(index), null, null); 1577 visitForValue(receiver), visitForValue(index), null, null);
1578 } 1578 }
1579 1579
1580 @override 1580 @override
1581 ir.Expression visitIndex(Send node, Node receiver, Node index, _) { 1581 ir.Expression visitIndex(Send node, Node receiver, Node index, _) {
1582 return associateNode( 1582 return associateNode(
1583 buildIndexAccessor(receiver, index).buildSimpleRead(), node); 1583 buildIndexAccessor(receiver, index).buildSimpleRead(), node);
1584 } 1584 }
1585 1585
1586 ir.Expression buildIndexPostfix(Accessor accessor, IncDecOperator operator) { 1586 ir.Expression buildIndexPostfix(
1587 Send node, Accessor accessor, IncDecOperator operator) {
1587 ir.Name name = kernel.irName(operator.selectorName, currentElement); 1588 ir.Name name = kernel.irName(operator.selectorName, currentElement);
1588 return accessor.buildPostfixIncrement(name, voidContext: isVoidContext); 1589 return buildPostfixIncrement(node, accessor, name);
1589 } 1590 }
1590 1591
1591 @override 1592 @override
1592 ir.Expression visitIndexPostfix( 1593 ir.Expression visitIndexPostfix(
1593 Send node, Node receiver, Node index, IncDecOperator operator, _) { 1594 Send node, Node receiver, Node index, IncDecOperator operator, _) {
1594 return buildIndexPostfix(buildIndexAccessor(receiver, index), operator); 1595 return buildIndexPostfix(
1596 node, buildIndexAccessor(receiver, index), operator);
1595 } 1597 }
1596 1598
1597 ir.Expression buildIndexPrefix(Accessor accessor, IncDecOperator operator) { 1599 ir.Expression buildIndexPrefix(
1600 Send node, Accessor accessor, IncDecOperator operator) {
1598 ir.Name name = kernel.irName(operator.selectorName, currentElement); 1601 ir.Name name = kernel.irName(operator.selectorName, currentElement);
1599 return accessor.buildPrefixIncrement(name, voidContext: isVoidContext); 1602 return buildPrefixIncrement(node, accessor, name);
1600 } 1603 }
1601 1604
1602 @override 1605 @override
1603 ir.Expression visitIndexPrefix( 1606 ir.Expression visitIndexPrefix(
1604 Send node, Node receiver, Node index, IncDecOperator operator, _) { 1607 Send node, Node receiver, Node index, IncDecOperator operator, _) {
1605 return buildIndexPrefix(buildIndexAccessor(receiver, index), operator); 1608 return buildIndexPrefix(
1609 node, buildIndexAccessor(receiver, index), operator);
1606 } 1610 }
1607 1611
1608 @override 1612 @override
1609 ir.Expression visitIndexSet( 1613 ir.Expression visitIndexSet(
1610 SendSet node, Node receiver, Node index, Node rhs, _) { 1614 SendSet node, Node receiver, Node index, Node rhs, _) {
1611 return associateNode( 1615 return associateNode(
1612 buildIndexAccessor(receiver, index) 1616 buildIndexAccessor(receiver, index)
1613 .buildAssignment(visitForValue(rhs), voidContext: isVoidContext), 1617 .buildAssignment(visitForValue(rhs), voidContext: isVoidContext),
1614 node); 1618 node);
1615 } 1619 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1718 } 1722 }
1719 1723
1720 @override 1724 @override
1721 ir.VariableGet handleLocalGet(Send node, LocalElement element, _) { 1725 ir.VariableGet handleLocalGet(Send node, LocalElement element, _) {
1722 return buildLocalGet(element); 1726 return buildLocalGet(element);
1723 } 1727 }
1724 1728
1725 ir.Expression buildCompound( 1729 ir.Expression buildCompound(
1726 Accessor accessor, CompoundRhs rhs, SendSet node) { 1730 Accessor accessor, CompoundRhs rhs, SendSet node) {
1727 ir.Name name = kernel.irName(rhs.operator.selectorName, currentElement); 1731 ir.Name name = kernel.irName(rhs.operator.selectorName, currentElement);
1728 ir.Expression result;
1729 switch (rhs.kind) { 1732 switch (rhs.kind) {
1730 case CompoundKind.POSTFIX: 1733 case CompoundKind.POSTFIX:
1731 result = 1734 return buildPostfixIncrement(node, accessor, name);
1732 accessor.buildPostfixIncrement(name, voidContext: isVoidContext);
1733 break;
1734 1735
1735 case CompoundKind.PREFIX: 1736 case CompoundKind.PREFIX:
1736 result = 1737 return buildPrefixIncrement(node, accessor, name);
1737 accessor.buildPrefixIncrement(name, voidContext: isVoidContext);
1738 break;
1739 1738
1740 case CompoundKind.ASSIGNMENT: 1739 case CompoundKind.ASSIGNMENT:
1741 result = accessor.buildCompoundAssignment(name, visitForValue(rhs.rhs), 1740 return buildCompoundAssignment(
1742 voidContext: isVoidContext); 1741 node, accessor, name, visitForValue(rhs.rhs));
1743 break;
1744 } 1742 }
1743 }
1744
1745 ir.Expression buildCompoundAssignment(
1746 SendSet node, Accessor accessor, ir.Name name, ir.Expression rhs) {
1747 ir.Expression result =
1748 accessor.buildCompoundAssignment(name, rhs, voidContext: isVoidContext);
1749 associateCompoundComponents(accessor, node);
1750 return result;
1751 }
1752
1753 ir.Expression buildPrefixIncrement(
1754 SendSet node, Accessor accessor, ir.Name name) {
1755 ir.Expression result =
1756 accessor.buildPrefixIncrement(name, voidContext: isVoidContext);
1757 associateCompoundComponents(accessor, node);
1758 return result;
1759 }
1760
1761 ir.Expression buildPostfixIncrement(
1762 SendSet node, Accessor accessor, ir.Name name) {
1763 ir.Expression result =
1764 accessor.buildPostfixIncrement(name, voidContext: isVoidContext);
1765 associateCompoundComponents(accessor, node);
1766 return result;
1767 }
1768
1769 void associateCompoundComponents(Accessor accessor, Node node) {
1745 assert(accessor.builtBinary != null); 1770 assert(accessor.builtBinary != null);
1746 kernel.nodeToAstOperator[accessor.builtBinary] = node; 1771 kernel.nodeToAstOperator[accessor.builtBinary] = node;
1747 if (accessor.builtGetter != null) { 1772 if (accessor.builtGetter != null) {
1748 kernel.nodeToAst[accessor.builtGetter] = node; 1773 kernel.nodeToAst[accessor.builtGetter] = node;
1749 } 1774 }
1750 return result;
1751 } 1775 }
1752 1776
1753 @override 1777 @override
1754 ir.Expression handleLocalCompounds( 1778 ir.Expression handleLocalCompounds(
1755 SendSet node, LocalElement local, CompoundRhs rhs, _, 1779 SendSet node, LocalElement local, CompoundRhs rhs, _,
1756 {bool isSetterValid}) { 1780 {bool isSetterValid}) {
1757 ir.Expression compound = 1781 ir.Expression compound =
1758 buildCompound(new VariableAccessor(getLocal(local)), rhs, node); 1782 buildCompound(new VariableAccessor(getLocal(local)), rhs, node);
1759 if (compound is ir.VariableSet) { 1783 if (compound is ir.VariableSet) {
1760 associateNode(compound.value, node); 1784 associateNode(compound.value, node);
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
2245 2269
2246 @override 2270 @override
2247 ir.Expression visitSuperCompoundIndexSet( 2271 ir.Expression visitSuperCompoundIndexSet(
2248 SendSet node, 2272 SendSet node,
2249 MethodElement getter, 2273 MethodElement getter,
2250 MethodElement setter, 2274 MethodElement setter,
2251 Node index, 2275 Node index,
2252 AssignmentOperator operator, 2276 AssignmentOperator operator,
2253 Node rhs, 2277 Node rhs,
2254 _) { 2278 _) {
2255 // TODO(sra): Find binary operator. 2279 return buildCompoundAssignment(
2256 return buildSuperIndexAccessor(index, getter, setter) 2280 node,
2257 .buildCompoundAssignment( 2281 buildSuperIndexAccessor(index, getter, setter),
2258 kernel.irName(operator.selectorName, currentElement), 2282 kernel.irName(operator.selectorName, currentElement),
2259 visitForValue(rhs), 2283 visitForValue(rhs));
2260 voidContext: isVoidContext);
2261 } 2284 }
2262 2285
2263 @override 2286 @override
2264 ir.Initializer visitSuperConstructorInvoke( 2287 ir.Initializer visitSuperConstructorInvoke(
2265 Send node, 2288 Send node,
2266 ConstructorElement superConstructor, 2289 ConstructorElement superConstructor,
2267 InterfaceType type, 2290 InterfaceType type,
2268 NodeList arguments, 2291 NodeList arguments,
2269 CallStructure callStructure, 2292 CallStructure callStructure,
2270 _) { 2293 _) {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
2429 ir.SuperMethodInvocation visitSuperIndex( 2452 ir.SuperMethodInvocation visitSuperIndex(
2430 Send node, FunctionElement function, Node index, _) { 2453 Send node, FunctionElement function, Node index, _) {
2431 return buildSuperIndexAccessor(index, function).buildSimpleRead(); 2454 return buildSuperIndexAccessor(index, function).buildSimpleRead();
2432 } 2455 }
2433 2456
2434 @override 2457 @override
2435 ir.Expression visitSuperIndexPostfix(Send node, MethodElement indexFunction, 2458 ir.Expression visitSuperIndexPostfix(Send node, MethodElement indexFunction,
2436 MethodElement indexSetFunction, Node index, IncDecOperator operator, _) { 2459 MethodElement indexSetFunction, Node index, IncDecOperator operator, _) {
2437 Accessor accessor = 2460 Accessor accessor =
2438 buildSuperIndexAccessor(index, indexFunction, indexSetFunction); 2461 buildSuperIndexAccessor(index, indexFunction, indexSetFunction);
2439 return buildIndexPostfix(accessor, operator); 2462 return buildIndexPostfix(node, accessor, operator);
2440 } 2463 }
2441 2464
2442 @override 2465 @override
2443 ir.Expression visitSuperIndexPrefix(Send node, MethodElement indexFunction, 2466 ir.Expression visitSuperIndexPrefix(Send node, MethodElement indexFunction,
2444 MethodElement indexSetFunction, Node index, IncDecOperator operator, _) { 2467 MethodElement indexSetFunction, Node index, IncDecOperator operator, _) {
2445 Accessor accessor = 2468 Accessor accessor =
2446 buildSuperIndexAccessor(index, indexFunction, indexSetFunction); 2469 buildSuperIndexAccessor(index, indexFunction, indexSetFunction);
2447 return buildIndexPrefix(accessor, operator); 2470 return buildIndexPrefix(node, accessor, operator);
2448 } 2471 }
2449 2472
2450 @override 2473 @override
2451 ir.Expression visitSuperIndexSet( 2474 ir.Expression visitSuperIndexSet(
2452 SendSet node, FunctionElement function, Node index, Node rhs, _) { 2475 SendSet node, FunctionElement function, Node index, Node rhs, _) {
2453 return buildSuperIndexAccessor(index, null, function) 2476 return buildSuperIndexAccessor(index, null, function)
2454 .buildAssignment(visitForValue(rhs), voidContext: isVoidContext); 2477 .buildAssignment(visitForValue(rhs), voidContext: isVoidContext);
2455 } 2478 }
2456 2479
2457 @override 2480 @override
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 : this(null, true, node, initializers); 2840 : this(null, true, node, initializers);
2818 2841
2819 accept(ir.Visitor v) => throw "unsupported"; 2842 accept(ir.Visitor v) => throw "unsupported";
2820 2843
2821 visitChildren(ir.Visitor v) => throw "unsupported"; 2844 visitChildren(ir.Visitor v) => throw "unsupported";
2822 2845
2823 String toString() { 2846 String toString() {
2824 return "IrFunction($kind, $isConstructor, $node, $initializers)"; 2847 return "IrFunction($kind, $isConstructor, $node, $initializers)";
2825 } 2848 }
2826 } 2849 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698