| OLD | NEW |
| 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 library dart2js.ir_builder_task; | 5 library dart2js.ir_builder_task; |
| 6 | 6 |
| 7 import '../closure.dart' as closure; | 7 import '../closure.dart' as closure; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
| 10 Identifiers, | 10 Identifiers, |
| (...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 new Selector.callConstructor(constructor.memberName, 1), | 1147 new Selector.callConstructor(constructor.memberName, 1), |
| 1148 <ir.Primitive>[stream, dummyTypeArgument], | 1148 <ir.Primitive>[stream, dummyTypeArgument], |
| 1149 sourceInformationBuilder.buildGeneric(node))); | 1149 sourceInformationBuilder.buildGeneric(node))); |
| 1150 | 1150 |
| 1151 ir.Node buildTryBody(IrBuilder builder) { | 1151 ir.Node buildTryBody(IrBuilder builder) { |
| 1152 ir.Node buildLoopCondition(IrBuilder builder) { | 1152 ir.Node buildLoopCondition(IrBuilder builder) { |
| 1153 ir.Primitive moveNext = builder.buildDynamicInvocation( | 1153 ir.Primitive moveNext = builder.buildDynamicInvocation( |
| 1154 iterator, | 1154 iterator, |
| 1155 Selectors.moveNext, | 1155 Selectors.moveNext, |
| 1156 elements.getMoveNextTypeMask(node), | 1156 elements.getMoveNextTypeMask(node), |
| 1157 <ir.Primitive>[]); | 1157 <ir.Primitive>[], |
| 1158 sourceInformationBuilder.buildForInMoveNext(node)); |
| 1158 return builder.addPrimitive(new ir.Await(moveNext)); | 1159 return builder.addPrimitive(new ir.Await(moveNext)); |
| 1159 } | 1160 } |
| 1160 | 1161 |
| 1161 ir.Node buildLoopBody(IrBuilder builder) { | 1162 ir.Node buildLoopBody(IrBuilder builder) { |
| 1162 return withBuilder(builder, () { | 1163 return withBuilder(builder, () { |
| 1163 ir.Primitive current = irBuilder.buildDynamicInvocation( | 1164 ir.Primitive current = irBuilder.buildDynamicInvocation( |
| 1164 iterator, | 1165 iterator, |
| 1165 Selectors.current, | 1166 Selectors.current, |
| 1166 elements.getCurrentTypeMask(node), | 1167 elements.getCurrentTypeMask(node), |
| 1167 <ir.Primitive>[]); | 1168 <ir.Primitive>[], |
| 1169 sourceInformationBuilder.buildForInCurrent(node)); |
| 1168 Element variable = elements.getForInVariable(node); | 1170 Element variable = elements.getForInVariable(node); |
| 1171 SourceInformation sourceInformation = |
| 1172 sourceInformationBuilder.buildForInSet(node); |
| 1169 if (Elements.isLocal(variable)) { | 1173 if (Elements.isLocal(variable)) { |
| 1170 if (node.declaredIdentifier.asVariableDefinitions() != null) { | 1174 if (node.declaredIdentifier.asVariableDefinitions() != null) { |
| 1171 irBuilder.declareLocalVariable(variable); | 1175 irBuilder.declareLocalVariable(variable); |
| 1172 } | 1176 } |
| 1173 irBuilder.buildLocalVariableSet(variable, current); | 1177 irBuilder.buildLocalVariableSet( |
| 1178 variable, current, sourceInformation); |
| 1174 } else if (Elements.isError(variable) || | 1179 } else if (Elements.isError(variable) || |
| 1175 Elements.isMalformed(variable)) { | 1180 Elements.isMalformed(variable)) { |
| 1176 Selector selector = | 1181 Selector selector = |
| 1177 new Selector.setter(new Name(variable.name, variable.library)); | 1182 new Selector.setter(new Name(variable.name, variable.library)); |
| 1178 List<ir.Primitive> args = <ir.Primitive>[current]; | 1183 List<ir.Primitive> args = <ir.Primitive>[current]; |
| 1179 // Note the comparison below. It can be the case that an element | 1184 // Note the comparison below. It can be the case that an element |
| 1180 // isError and isMalformed. | 1185 // isError and isMalformed. |
| 1181 if (Elements.isError(variable)) { | 1186 if (Elements.isError(variable)) { |
| 1182 irBuilder.buildStaticNoSuchMethod(selector, args); | 1187 irBuilder.buildStaticNoSuchMethod( |
| 1188 selector, args, sourceInformation); |
| 1183 } else { | 1189 } else { |
| 1184 irBuilder.buildErroneousInvocation(variable, selector, args); | 1190 irBuilder.buildErroneousInvocation( |
| 1191 variable, selector, args, sourceInformation); |
| 1185 } | 1192 } |
| 1186 } else if (Elements.isStaticOrTopLevel(variable)) { | 1193 } else if (Elements.isStaticOrTopLevel(variable)) { |
| 1187 if (variable.isField) { | 1194 if (variable.isField) { |
| 1188 irBuilder.addPrimitive(new ir.SetStatic(variable, current)); | 1195 irBuilder.addPrimitive(new ir.SetStatic(variable, current)); |
| 1189 } else { | 1196 } else { |
| 1190 irBuilder.buildStaticSetterSet(variable, current); | 1197 irBuilder.buildStaticSetterSet( |
| 1198 variable, current, sourceInformation); |
| 1191 } | 1199 } |
| 1192 } else { | 1200 } else { |
| 1193 ir.Primitive receiver = irBuilder.buildThis(); | 1201 ir.Primitive receiver = irBuilder.buildThis(); |
| 1194 ast.Node identifier = node.declaredIdentifier; | 1202 ast.Node identifier = node.declaredIdentifier; |
| 1195 irBuilder.buildDynamicSet( | 1203 irBuilder.buildDynamicSet( |
| 1196 receiver, | 1204 receiver, |
| 1197 elements.getSelector(identifier), | 1205 elements.getSelector(identifier), |
| 1198 elements.getTypeMask(identifier), | 1206 elements.getTypeMask(identifier), |
| 1199 current); | 1207 current, |
| 1208 sourceInformation); |
| 1200 } | 1209 } |
| 1201 visit(node.body); | 1210 visit(node.body); |
| 1202 }); | 1211 }); |
| 1203 } | 1212 } |
| 1204 | 1213 |
| 1205 builder.buildWhile( | 1214 builder.buildWhile( |
| 1206 buildCondition: buildLoopCondition, | 1215 buildCondition: buildLoopCondition, |
| 1207 buildBody: buildLoopBody, | 1216 buildBody: buildLoopBody, |
| 1208 target: elements.getTargetDefinition(node), | 1217 target: elements.getTargetDefinition(node), |
| 1209 closureScope: getClosureScopeForNode(node)); | 1218 closureScope: getClosureScopeForNode(node)); |
| 1210 } | 1219 } |
| 1211 | 1220 |
| 1212 ir.Node buildFinallyBody(IrBuilder builder) { | 1221 ir.Node buildFinallyBody(IrBuilder builder) { |
| 1213 ir.Primitive cancellation = builder.buildDynamicInvocation( | 1222 ir.Primitive cancellation = builder.buildDynamicInvocation( |
| 1214 iterator, | 1223 iterator, |
| 1215 Selectors.cancel, | 1224 Selectors.cancel, |
| 1216 backend.dynamicType, | 1225 backend.dynamicType, |
| 1217 <ir.Primitive>[], | 1226 <ir.Primitive>[], |
| 1218 sourceInformation: sourceInformationBuilder.buildGeneric(node)); | 1227 sourceInformationBuilder.buildGeneric(node)); |
| 1219 return builder.addPrimitive(new ir.Await(cancellation)); | 1228 return builder.addPrimitive(new ir.Await(cancellation)); |
| 1220 } | 1229 } |
| 1221 | 1230 |
| 1222 irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody, | 1231 irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody, |
| 1223 buildFinallyBody); | 1232 buildFinallyBody); |
| 1224 } | 1233 } |
| 1225 | 1234 |
| 1226 visitAwait(ast.Await node) { | 1235 visitAwait(ast.Await node) { |
| 1227 assert(irBuilder.isOpen); | 1236 assert(irBuilder.isOpen); |
| 1228 ir.Primitive value = visit(node.expression); | 1237 ir.Primitive value = visit(node.expression); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1244 identifier.asVariableDefinitions(); | 1253 identifier.asVariableDefinitions(); |
| 1245 Element variableElement = elements.getForInVariable(node); | 1254 Element variableElement = elements.getForInVariable(node); |
| 1246 Selector selector = elements.getSelector(identifier); | 1255 Selector selector = elements.getSelector(identifier); |
| 1247 | 1256 |
| 1248 irBuilder.buildForIn( | 1257 irBuilder.buildForIn( |
| 1249 buildExpression: subbuild(node.expression), | 1258 buildExpression: subbuild(node.expression), |
| 1250 buildVariableDeclaration: subbuild(variableDeclaration), | 1259 buildVariableDeclaration: subbuild(variableDeclaration), |
| 1251 variableElement: variableElement, | 1260 variableElement: variableElement, |
| 1252 variableSelector: selector, | 1261 variableSelector: selector, |
| 1253 variableMask: elements.getTypeMask(identifier), | 1262 variableMask: elements.getTypeMask(identifier), |
| 1263 variableSetSourceInformation: |
| 1264 sourceInformationBuilder.buildForInSet(node), |
| 1254 currentMask: elements.getCurrentTypeMask(node), | 1265 currentMask: elements.getCurrentTypeMask(node), |
| 1266 currentSourceInformation: |
| 1267 sourceInformationBuilder.buildForInCurrent(node), |
| 1255 moveNextMask: elements.getMoveNextTypeMask(node), | 1268 moveNextMask: elements.getMoveNextTypeMask(node), |
| 1269 moveNextSourceInformation: |
| 1270 sourceInformationBuilder.buildForInMoveNext(node), |
| 1256 iteratorMask: elements.getIteratorTypeMask(node), | 1271 iteratorMask: elements.getIteratorTypeMask(node), |
| 1272 iteratorSourceInformation: |
| 1273 sourceInformationBuilder.buildForInIterator(node), |
| 1257 buildBody: subbuild(node.body), | 1274 buildBody: subbuild(node.body), |
| 1258 target: elements.getTargetDefinition(node), | 1275 target: elements.getTargetDefinition(node), |
| 1259 closureScope: getClosureScopeForNode(node)); | 1276 closureScope: getClosureScopeForNode(node)); |
| 1260 } | 1277 } |
| 1261 | 1278 |
| 1262 /// If compiling with trusted type annotations, assumes that [value] is | 1279 /// If compiling with trusted type annotations, assumes that [value] is |
| 1263 /// now known to be `null` or an instance of [type]. | 1280 /// now known to be `null` or an instance of [type]. |
| 1264 /// | 1281 /// |
| 1265 /// This is also where we should add type checks in checked mode, but this | 1282 /// This is also where we should add type checks in checked mode, but this |
| 1266 /// is not supported yet. | 1283 /// is not supported yet. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1311 if (nativeBody != null) { | 1328 if (nativeBody != null) { |
| 1312 ast.LiteralString jsCode = nativeBody.asLiteralString(); | 1329 ast.LiteralString jsCode = nativeBody.asLiteralString(); |
| 1313 String javaScriptCode = jsCode.dartString.slowToString(); | 1330 String javaScriptCode = jsCode.dartString.slowToString(); |
| 1314 assert(invariant(nativeBody, | 1331 assert(invariant(nativeBody, |
| 1315 !nativeRedirectionRegExp.hasMatch(javaScriptCode), | 1332 !nativeRedirectionRegExp.hasMatch(javaScriptCode), |
| 1316 message: "Deprecated syntax, use @JSName('name') instead.")); | 1333 message: "Deprecated syntax, use @JSName('name') instead.")); |
| 1317 assert(invariant(nativeBody, | 1334 assert(invariant(nativeBody, |
| 1318 function.functionSignature.parameterCount == 0, | 1335 function.functionSignature.parameterCount == 0, |
| 1319 message: 'native "..." syntax is restricted to ' | 1336 message: 'native "..." syntax is restricted to ' |
| 1320 'functions with zero parameters.')); | 1337 'functions with zero parameters.')); |
| 1321 irBuilder.buildNativeFunctionBody(function, javaScriptCode); | 1338 irBuilder.buildNativeFunctionBody(function, javaScriptCode, |
| 1339 sourceInformationBuilder.buildForeignCode(node)); |
| 1322 } else { | 1340 } else { |
| 1323 String name = backend.getFixedBackendName(function); | 1341 String name = backend.getFixedBackendName(function); |
| 1324 irBuilder.buildRedirectingNativeFunctionBody(function, name, source); | 1342 irBuilder.buildRedirectingNativeFunctionBody(function, name, source); |
| 1325 } | 1343 } |
| 1326 } else { | 1344 } else { |
| 1327 irBuilder.buildReturn( | 1345 irBuilder.buildReturn( |
| 1328 value: build(node.expression), | 1346 value: build(node.expression), |
| 1329 sourceInformation: source); | 1347 sourceInformation: source); |
| 1330 } | 1348 } |
| 1331 } | 1349 } |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1609 stackTraceVariable = elements[catchClause.trace]; | 1627 stackTraceVariable = elements[catchClause.trace]; |
| 1610 } | 1628 } |
| 1611 DartType type; | 1629 DartType type; |
| 1612 if (catchClause.onKeyword != null) { | 1630 if (catchClause.onKeyword != null) { |
| 1613 type = elements.getType(catchClause.type); | 1631 type = elements.getType(catchClause.type); |
| 1614 } | 1632 } |
| 1615 catchClauseInfos.add(new CatchClauseInfo( | 1633 catchClauseInfos.add(new CatchClauseInfo( |
| 1616 type: type, | 1634 type: type, |
| 1617 exceptionVariable: exceptionVariable, | 1635 exceptionVariable: exceptionVariable, |
| 1618 stackTraceVariable: stackTraceVariable, | 1636 stackTraceVariable: stackTraceVariable, |
| 1619 buildCatchBlock: subbuild(catchClause.block))); | 1637 buildCatchBlock: subbuild(catchClause.block), |
| 1638 sourceInformation: sourceInformationBuilder.buildCatch(catchClause))); |
| 1620 } | 1639 } |
| 1621 | 1640 |
| 1622 assert(!node.catchBlocks.isEmpty || node.finallyBlock != null); | 1641 assert(!node.catchBlocks.isEmpty || node.finallyBlock != null); |
| 1623 if (!node.catchBlocks.isEmpty && node.finallyBlock != null) { | 1642 if (!node.catchBlocks.isEmpty && node.finallyBlock != null) { |
| 1624 // Try/catch/finally is encoded in terms of try/catch and try/finally: | 1643 // Try/catch/finally is encoded in terms of try/catch and try/finally: |
| 1625 // | 1644 // |
| 1626 // try tryBlock catch (ex, st) catchBlock finally finallyBlock | 1645 // try tryBlock catch (ex, st) catchBlock finally finallyBlock |
| 1627 // ==> | 1646 // ==> |
| 1628 // try { try tryBlock catch (ex, st) catchBlock } finally finallyBlock | 1647 // try { try tryBlock catch (ex, st) catchBlock } finally finallyBlock |
| 1629 irBuilder.buildTryFinally(tryStatements[node.finallyBlock], | 1648 irBuilder.buildTryFinally(tryStatements[node.finallyBlock], |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1737 return translateConstant(node); | 1756 return translateConstant(node); |
| 1738 } | 1757 } |
| 1739 | 1758 |
| 1740 InterfaceType type = elements.getType(node); | 1759 InterfaceType type = elements.getType(node); |
| 1741 | 1760 |
| 1742 if (node.entries.nodes.isEmpty) { | 1761 if (node.entries.nodes.isEmpty) { |
| 1743 if (type.treatAsRaw) { | 1762 if (type.treatAsRaw) { |
| 1744 return irBuilder.buildStaticFunctionInvocation( | 1763 return irBuilder.buildStaticFunctionInvocation( |
| 1745 helpers.mapLiteralUntypedEmptyMaker, | 1764 helpers.mapLiteralUntypedEmptyMaker, |
| 1746 <ir.Primitive>[], | 1765 <ir.Primitive>[], |
| 1747 sourceInformation: sourceInformationBuilder.buildNew(node)); | 1766 sourceInformationBuilder.buildNew(node)); |
| 1748 } else { | 1767 } else { |
| 1749 ConstructorElement constructor = helpers.mapLiteralConstructorEmpty; | 1768 ConstructorElement constructor = helpers.mapLiteralConstructorEmpty; |
| 1750 return irBuilder.buildConstructorInvocation( | 1769 return irBuilder.buildConstructorInvocation( |
| 1751 constructor.effectiveTarget, | 1770 constructor.effectiveTarget, |
| 1752 CallStructure.NO_ARGS, | 1771 CallStructure.NO_ARGS, |
| 1753 constructor.computeEffectiveTargetType(type), | 1772 constructor.computeEffectiveTargetType(type), |
| 1754 <ir.Primitive>[], | 1773 <ir.Primitive>[], |
| 1755 sourceInformationBuilder.buildNew(node)); | 1774 sourceInformationBuilder.buildNew(node)); |
| 1756 } | 1775 } |
| 1757 } | 1776 } |
| 1758 | 1777 |
| 1759 List<ir.Primitive> keysAndValues = <ir.Primitive>[]; | 1778 List<ir.Primitive> keysAndValues = <ir.Primitive>[]; |
| 1760 for (ast.LiteralMapEntry entry in node.entries.nodes.toList()) { | 1779 for (ast.LiteralMapEntry entry in node.entries.nodes.toList()) { |
| 1761 keysAndValues.add(visit(entry.key)); | 1780 keysAndValues.add(visit(entry.key)); |
| 1762 keysAndValues.add(visit(entry.value)); | 1781 keysAndValues.add(visit(entry.value)); |
| 1763 } | 1782 } |
| 1764 ir.Primitive keysAndValuesList = | 1783 ir.Primitive keysAndValuesList = |
| 1765 irBuilder.buildListLiteral(null, keysAndValues); | 1784 irBuilder.buildListLiteral(null, keysAndValues); |
| 1766 | 1785 |
| 1767 if (type.treatAsRaw) { | 1786 if (type.treatAsRaw) { |
| 1768 return irBuilder.buildStaticFunctionInvocation( | 1787 return irBuilder.buildStaticFunctionInvocation( |
| 1769 helpers.mapLiteralUntypedMaker, | 1788 helpers.mapLiteralUntypedMaker, |
| 1770 <ir.Primitive>[keysAndValuesList], | 1789 <ir.Primitive>[keysAndValuesList], |
| 1771 sourceInformation: sourceInformationBuilder.buildNew(node)); | 1790 sourceInformationBuilder.buildNew(node)); |
| 1772 } else { | 1791 } else { |
| 1773 ConstructorElement constructor = helpers.mapLiteralConstructor; | 1792 ConstructorElement constructor = helpers.mapLiteralConstructor; |
| 1774 return irBuilder.buildConstructorInvocation( | 1793 return irBuilder.buildConstructorInvocation( |
| 1775 constructor.effectiveTarget, | 1794 constructor.effectiveTarget, |
| 1776 CallStructure.ONE_ARG, | 1795 CallStructure.ONE_ARG, |
| 1777 constructor.computeEffectiveTargetType(type), | 1796 constructor.computeEffectiveTargetType(type), |
| 1778 <ir.Primitive>[keysAndValuesList], | 1797 <ir.Primitive>[keysAndValuesList], |
| 1779 sourceInformationBuilder.buildNew(node)); | 1798 sourceInformationBuilder.buildNew(node)); |
| 1780 } | 1799 } |
| 1781 } | 1800 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1835 ir.Primitive buildCheckDeferredIsLoaded(PrefixElement prefix, ast.Send node) { | 1854 ir.Primitive buildCheckDeferredIsLoaded(PrefixElement prefix, ast.Send node) { |
| 1836 SourceInformation sourceInformation = | 1855 SourceInformation sourceInformation = |
| 1837 sourceInformationBuilder.buildCall(node, node.selector); | 1856 sourceInformationBuilder.buildCall(node, node.selector); |
| 1838 ir.Primitive name = irBuilder.buildStringConstant( | 1857 ir.Primitive name = irBuilder.buildStringConstant( |
| 1839 compiler.deferredLoadTask.getImportDeferName(node, prefix)); | 1858 compiler.deferredLoadTask.getImportDeferName(node, prefix)); |
| 1840 ir.Primitive uri = | 1859 ir.Primitive uri = |
| 1841 irBuilder.buildStringConstant('${prefix.deferredImport.uri}'); | 1860 irBuilder.buildStringConstant('${prefix.deferredImport.uri}'); |
| 1842 return irBuilder.buildStaticFunctionInvocation( | 1861 return irBuilder.buildStaticFunctionInvocation( |
| 1843 helpers.checkDeferredIsLoaded, | 1862 helpers.checkDeferredIsLoaded, |
| 1844 <ir.Primitive>[name, uri], | 1863 <ir.Primitive>[name, uri], |
| 1845 sourceInformation: sourceInformation); | 1864 sourceInformation); |
| 1846 } | 1865 } |
| 1847 | 1866 |
| 1848 ir.Primitive visitNamedArgument(ast.NamedArgument node) { | 1867 ir.Primitive visitNamedArgument(ast.NamedArgument node) { |
| 1849 assert(irBuilder.isOpen); | 1868 assert(irBuilder.isOpen); |
| 1850 return visit(node.expression); | 1869 return visit(node.expression); |
| 1851 } | 1870 } |
| 1852 | 1871 |
| 1853 @override | 1872 @override |
| 1854 ir.Primitive visitExpressionInvoke(ast.Send node, | 1873 ir.Primitive visitExpressionInvoke(ast.Send node, |
| 1855 ast.Node expression, | 1874 ast.Node expression, |
| 1856 ast.NodeList argumentsNode, | 1875 ast.NodeList argumentsNode, |
| 1857 CallStructure callStructure, _) { | 1876 CallStructure callStructure, _) { |
| 1858 ir.Primitive receiver = visit(expression); | 1877 ir.Primitive receiver = visit(expression); |
| 1859 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); | 1878 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); |
| 1860 callStructure = normalizeDynamicArguments(callStructure, arguments); | 1879 callStructure = normalizeDynamicArguments(callStructure, arguments); |
| 1861 return irBuilder.buildCallInvocation(receiver, callStructure, arguments, | 1880 return irBuilder.buildCallInvocation(receiver, callStructure, arguments, |
| 1862 sourceInformation: | 1881 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 1863 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 1864 } | 1882 } |
| 1865 | 1883 |
| 1866 /// Returns `true` if [node] is a super call. | 1884 /// Returns `true` if [node] is a super call. |
| 1867 // TODO(johnniwinther): Remove the need for this. | 1885 // TODO(johnniwinther): Remove the need for this. |
| 1868 bool isSuperCall(ast.Send node) { | 1886 bool isSuperCall(ast.Send node) { |
| 1869 return node != null && node.receiver != null && node.receiver.isSuper(); | 1887 return node != null && node.receiver != null && node.receiver.isSuper(); |
| 1870 } | 1888 } |
| 1871 | 1889 |
| 1872 @override | 1890 @override |
| 1873 ir.Primitive handleConstantGet( | 1891 ir.Primitive handleConstantGet( |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1945 MethodElement function, | 1963 MethodElement function, |
| 1946 _) { | 1964 _) { |
| 1947 return irBuilder.addPrimitive(new ir.GetStatic(function, isFinal: true)); | 1965 return irBuilder.addPrimitive(new ir.GetStatic(function, isFinal: true)); |
| 1948 } | 1966 } |
| 1949 | 1967 |
| 1950 @override | 1968 @override |
| 1951 ir.Primitive handleStaticGetterGet( | 1969 ir.Primitive handleStaticGetterGet( |
| 1952 ast.Send node, | 1970 ast.Send node, |
| 1953 FunctionElement getter, | 1971 FunctionElement getter, |
| 1954 _) { | 1972 _) { |
| 1955 return buildStaticGetterGet(getter, node); | 1973 return buildStaticGetterGet( |
| 1974 getter, node, sourceInformationBuilder.buildGet(node)); |
| 1956 } | 1975 } |
| 1957 | 1976 |
| 1958 /// Create a getter invocation of the static getter [getter]. This also | 1977 /// Create a getter invocation of the static getter [getter]. This also |
| 1959 /// handles the special case where [getter] is the `loadLibrary` | 1978 /// handles the special case where [getter] is the `loadLibrary` |
| 1960 /// pseudo-function on library prefixes of deferred imports. | 1979 /// pseudo-function on library prefixes of deferred imports. |
| 1961 ir.Primitive buildStaticGetterGet(MethodElement getter, ast.Send node) { | 1980 ir.Primitive buildStaticGetterGet( |
| 1962 SourceInformation sourceInformation = | 1981 MethodElement getter, |
| 1963 sourceInformationBuilder.buildGet(node); | 1982 ast.Send node, |
| 1983 SourceInformation sourceInformation) { |
| 1964 if (getter.isDeferredLoaderGetter) { | 1984 if (getter.isDeferredLoaderGetter) { |
| 1965 PrefixElement prefix = getter.enclosingElement; | 1985 PrefixElement prefix = getter.enclosingElement; |
| 1966 ir.Primitive loadId = irBuilder.buildStringConstant( | 1986 ir.Primitive loadId = irBuilder.buildStringConstant( |
| 1967 compiler.deferredLoadTask.getImportDeferName(node, prefix)); | 1987 compiler.deferredLoadTask.getImportDeferName(node, prefix)); |
| 1968 return irBuilder.buildStaticFunctionInvocation( | 1988 return irBuilder.buildStaticFunctionInvocation( |
| 1969 compiler.loadLibraryFunction, | 1989 compiler.loadLibraryFunction, |
| 1970 <ir.Primitive>[loadId], | 1990 <ir.Primitive>[loadId], |
| 1971 sourceInformation: sourceInformation); | 1991 sourceInformation); |
| 1972 } else { | 1992 } else { |
| 1973 return irBuilder.buildStaticGetterGet(getter, sourceInformation); | 1993 return irBuilder.buildStaticGetterGet(getter, sourceInformation); |
| 1974 } | 1994 } |
| 1975 } | 1995 } |
| 1976 | 1996 |
| 1977 @override | 1997 @override |
| 1978 ir.Primitive visitSuperFieldGet( | 1998 ir.Primitive visitSuperFieldGet( |
| 1979 ast.Send node, | 1999 ast.Send node, |
| 1980 FieldElement field, | 2000 FieldElement field, |
| 1981 _) { | 2001 _) { |
| 1982 return irBuilder.buildSuperFieldGet(field); | 2002 return irBuilder.buildSuperFieldGet( |
| 2003 field, sourceInformationBuilder.buildGet(node)); |
| 1983 } | 2004 } |
| 1984 | 2005 |
| 1985 @override | 2006 @override |
| 1986 ir.Primitive visitSuperGetterGet( | 2007 ir.Primitive visitSuperGetterGet( |
| 1987 ast.Send node, | 2008 ast.Send node, |
| 1988 FunctionElement getter, | 2009 FunctionElement getter, |
| 1989 _) { | 2010 _) { |
| 1990 return irBuilder.buildSuperGetterGet( | 2011 return irBuilder.buildSuperGetterGet( |
| 1991 getter, sourceInformationBuilder.buildGet(node)); | 2012 getter, sourceInformationBuilder.buildGet(node)); |
| 1992 } | 2013 } |
| 1993 | 2014 |
| 1994 @override | 2015 @override |
| 1995 ir.Primitive visitSuperMethodGet( | 2016 ir.Primitive visitSuperMethodGet( |
| 1996 ast.Send node, | 2017 ast.Send node, |
| 1997 MethodElement method, | 2018 MethodElement method, |
| 1998 _) { | 2019 _) { |
| 1999 return irBuilder.buildSuperMethodGet(method); | 2020 return irBuilder.buildSuperMethodGet( |
| 2021 method, sourceInformationBuilder.buildGet(node)); |
| 2000 } | 2022 } |
| 2001 | 2023 |
| 2002 @override | 2024 @override |
| 2003 ir.Primitive visitUnresolvedSuperGet( | 2025 ir.Primitive visitUnresolvedSuperGet( |
| 2004 ast.Send node, | 2026 ast.Send node, |
| 2005 Element element, _) { | 2027 Element element, _) { |
| 2006 return buildSuperNoSuchMethod( | 2028 return buildSuperNoSuchMethod( |
| 2007 elements.getSelector(node), elements.getTypeMask(node), []); | 2029 elements.getSelector(node), elements.getTypeMask(node), [], |
| 2030 sourceInformationBuilder.buildGet(node)); |
| 2008 } | 2031 } |
| 2009 | 2032 |
| 2010 @override | 2033 @override |
| 2011 ir.Primitive visitUnresolvedSuperSet( | 2034 ir.Primitive visitUnresolvedSuperSet( |
| 2012 ast.Send node, | 2035 ast.Send node, |
| 2013 Element element, | 2036 Element element, |
| 2014 ast.Node rhs, _) { | 2037 ast.Node rhs, _) { |
| 2015 return buildSuperNoSuchMethod( | 2038 return buildSuperNoSuchMethod( |
| 2016 elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)]); | 2039 elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)], |
| 2040 sourceInformationBuilder.buildAssignment(node)); |
| 2017 } | 2041 } |
| 2018 | 2042 |
| 2019 @override | 2043 @override |
| 2020 ir.Primitive visitThisGet(ast.Identifier node, _) { | 2044 ir.Primitive visitThisGet(ast.Identifier node, _) { |
| 2021 if (irBuilder.state.thisParameter == null) { | 2045 if (irBuilder.state.thisParameter == null) { |
| 2022 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. | 2046 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. |
| 2023 // 'this' in static context. Just translate to null. | 2047 // 'this' in static context. Just translate to null. |
| 2024 assert(compiler.compilationFailed); | 2048 assert(compiler.compilationFailed); |
| 2025 return irBuilder.buildNullConstant(); | 2049 return irBuilder.buildNullConstant(); |
| 2026 } | 2050 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2071 return translateLogicalOperator(left, right, isLazyOr: true); | 2095 return translateLogicalOperator(left, right, isLazyOr: true); |
| 2072 } | 2096 } |
| 2073 | 2097 |
| 2074 @override | 2098 @override |
| 2075 ir.Primitive visitAs( | 2099 ir.Primitive visitAs( |
| 2076 ast.Send node, | 2100 ast.Send node, |
| 2077 ast.Node expression, | 2101 ast.Node expression, |
| 2078 DartType type, | 2102 DartType type, |
| 2079 _) { | 2103 _) { |
| 2080 ir.Primitive receiver = visit(expression); | 2104 ir.Primitive receiver = visit(expression); |
| 2081 return irBuilder.buildTypeOperator(receiver, type, isTypeTest: false); | 2105 return irBuilder.buildTypeOperator( |
| 2106 receiver, |
| 2107 type, |
| 2108 sourceInformationBuilder.buildAs(node), |
| 2109 isTypeTest: false); |
| 2082 } | 2110 } |
| 2083 | 2111 |
| 2084 @override | 2112 @override |
| 2085 ir.Primitive visitIs( | 2113 ir.Primitive visitIs( |
| 2086 ast.Send node, | 2114 ast.Send node, |
| 2087 ast.Node expression, | 2115 ast.Node expression, |
| 2088 DartType type, | 2116 DartType type, |
| 2089 _) { | 2117 _) { |
| 2090 ir.Primitive value = visit(expression); | 2118 ir.Primitive value = visit(expression); |
| 2091 return irBuilder.buildTypeOperator(value, type, isTypeTest: true); | 2119 return irBuilder.buildTypeOperator( |
| 2120 value, |
| 2121 type, |
| 2122 sourceInformationBuilder.buildIs(node), |
| 2123 isTypeTest: true); |
| 2092 } | 2124 } |
| 2093 | 2125 |
| 2094 @override | 2126 @override |
| 2095 ir.Primitive visitIsNot(ast.Send node, | 2127 ir.Primitive visitIsNot(ast.Send node, |
| 2096 ast.Node expression, DartType type, _) { | 2128 ast.Node expression, DartType type, _) { |
| 2097 ir.Primitive value = visit(expression); | 2129 ir.Primitive value = visit(expression); |
| 2098 ir.Primitive check = irBuilder.buildTypeOperator( | 2130 ir.Primitive check = irBuilder.buildTypeOperator( |
| 2099 value, type, isTypeTest: true); | 2131 value, |
| 2132 type, |
| 2133 sourceInformationBuilder.buildIs(node), |
| 2134 isTypeTest: true); |
| 2100 return irBuilder.buildNegation(check); | 2135 return irBuilder.buildNegation(check); |
| 2101 } | 2136 } |
| 2102 | 2137 |
| 2103 ir.Primitive translateBinary(ast.Send node, | 2138 ir.Primitive translateBinary(ast.Send node, |
| 2104 ast.Node left, | 2139 ast.Node left, |
| 2105 op.BinaryOperator operator, | 2140 op.BinaryOperator operator, |
| 2106 ast.Node right) { | 2141 ast.Node right) { |
| 2107 ir.Primitive receiver = visit(left); | 2142 ir.Primitive receiver = visit(left); |
| 2108 Selector selector = new Selector.binaryOperator(operator.selectorName); | 2143 Selector selector = new Selector.binaryOperator(operator.selectorName); |
| 2109 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; | 2144 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; |
| 2110 CallStructure callStructure = | 2145 CallStructure callStructure = |
| 2111 normalizeDynamicArguments(selector.callStructure, arguments); | 2146 normalizeDynamicArguments(selector.callStructure, arguments); |
| 2112 return irBuilder.buildDynamicInvocation( | 2147 return irBuilder.buildDynamicInvocation( |
| 2113 receiver, | 2148 receiver, |
| 2114 new Selector(selector.kind, selector.memberName, callStructure), | 2149 new Selector(selector.kind, selector.memberName, callStructure), |
| 2115 elements.getTypeMask(node), | 2150 elements.getTypeMask(node), |
| 2116 arguments, | 2151 arguments, |
| 2117 sourceInformation: | 2152 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2118 sourceInformationBuilder.buildCall(node, node.selector)); | |
| 2119 } | 2153 } |
| 2120 | 2154 |
| 2121 @override | 2155 @override |
| 2122 ir.Primitive visitBinary(ast.Send node, | 2156 ir.Primitive visitBinary(ast.Send node, |
| 2123 ast.Node left, | 2157 ast.Node left, |
| 2124 op.BinaryOperator operator, | 2158 op.BinaryOperator operator, |
| 2125 ast.Node right, _) { | 2159 ast.Node right, _) { |
| 2126 return translateBinary(node, left, operator, right); | 2160 return translateBinary(node, left, operator, right); |
| 2127 } | 2161 } |
| 2128 | 2162 |
| 2129 @override | 2163 @override |
| 2130 ir.Primitive visitIndex(ast.Send node, | 2164 ir.Primitive visitIndex(ast.Send node, |
| 2131 ast.Node receiver, | 2165 ast.Node receiver, |
| 2132 ast.Node index, _) { | 2166 ast.Node index, _) { |
| 2133 ir.Primitive target = visit(receiver); | 2167 ir.Primitive target = visit(receiver); |
| 2134 Selector selector = new Selector.index(); | 2168 Selector selector = new Selector.index(); |
| 2135 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; | 2169 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; |
| 2136 CallStructure callStructure = | 2170 CallStructure callStructure = |
| 2137 normalizeDynamicArguments(selector.callStructure, arguments); | 2171 normalizeDynamicArguments(selector.callStructure, arguments); |
| 2138 return irBuilder.buildDynamicInvocation( | 2172 return irBuilder.buildDynamicInvocation( |
| 2139 target, | 2173 target, |
| 2140 new Selector(selector.kind, selector.memberName, callStructure), | 2174 new Selector(selector.kind, selector.memberName, callStructure), |
| 2141 elements.getTypeMask(node), | 2175 elements.getTypeMask(node), |
| 2142 arguments, | 2176 arguments, |
| 2143 sourceInformation: | 2177 sourceInformationBuilder.buildCall(receiver, node.selector)); |
| 2144 sourceInformationBuilder.buildCall(receiver, node.selector)); | |
| 2145 } | 2178 } |
| 2146 | 2179 |
| 2147 ir.Primitive translateSuperBinary(FunctionElement function, | 2180 ir.Primitive translateSuperBinary(FunctionElement function, |
| 2148 op.BinaryOperator operator, | 2181 op.BinaryOperator operator, |
| 2149 ast.Node argument) { | 2182 ast.Node argument, |
| 2183 SourceInformation sourceInformation) { |
| 2150 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; | 2184 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; |
| 2151 return irBuilder.buildSuperMethodInvocation(function, | 2185 return irBuilder.buildSuperMethodInvocation(function, |
| 2152 CallStructure.ONE_ARG, arguments); | 2186 CallStructure.ONE_ARG, arguments, sourceInformation); |
| 2153 } | 2187 } |
| 2154 | 2188 |
| 2155 @override | 2189 @override |
| 2156 ir.Primitive visitSuperBinary( | 2190 ir.Primitive visitSuperBinary( |
| 2157 ast.Send node, | 2191 ast.Send node, |
| 2158 FunctionElement function, | 2192 FunctionElement function, |
| 2159 op.BinaryOperator operator, | 2193 op.BinaryOperator operator, |
| 2160 ast.Node argument, | 2194 ast.Node argument, |
| 2161 _) { | 2195 _) { |
| 2162 return translateSuperBinary(function, operator, argument); | 2196 return translateSuperBinary(function, operator, argument, |
| 2197 sourceInformationBuilder.buildBinary(node)); |
| 2163 } | 2198 } |
| 2164 | 2199 |
| 2165 @override | 2200 @override |
| 2166 ir.Primitive visitSuperIndex( | 2201 ir.Primitive visitSuperIndex( |
| 2167 ast.Send node, | 2202 ast.Send node, |
| 2168 FunctionElement function, | 2203 FunctionElement function, |
| 2169 ast.Node index, | 2204 ast.Node index, |
| 2170 _) { | 2205 _) { |
| 2171 return irBuilder.buildSuperIndex(function, visit(index)); | 2206 return irBuilder.buildSuperIndex(function, visit(index), |
| 2207 sourceInformationBuilder.buildIndex(node)); |
| 2172 } | 2208 } |
| 2173 | 2209 |
| 2174 @override | 2210 @override |
| 2175 ir.Primitive visitEquals( | 2211 ir.Primitive visitEquals( |
| 2176 ast.Send node, | 2212 ast.Send node, |
| 2177 ast.Node left, | 2213 ast.Node left, |
| 2178 ast.Node right, | 2214 ast.Node right, |
| 2179 _) { | 2215 _) { |
| 2180 return translateBinary(node, left, op.BinaryOperator.EQ, right); | 2216 return translateBinary(node, left, op.BinaryOperator.EQ, right); |
| 2181 } | 2217 } |
| 2182 | 2218 |
| 2183 @override | 2219 @override |
| 2184 ir.Primitive visitSuperEquals( | 2220 ir.Primitive visitSuperEquals( |
| 2185 ast.Send node, | 2221 ast.Send node, |
| 2186 FunctionElement function, | 2222 FunctionElement function, |
| 2187 ast.Node argument, | 2223 ast.Node argument, |
| 2188 _) { | 2224 _) { |
| 2189 return translateSuperBinary(function, op.BinaryOperator.EQ, argument); | 2225 return translateSuperBinary(function, op.BinaryOperator.EQ, argument, |
| 2226 sourceInformationBuilder.buildBinary(node)); |
| 2190 } | 2227 } |
| 2191 | 2228 |
| 2192 @override | 2229 @override |
| 2193 ir.Primitive visitNot( | 2230 ir.Primitive visitNot( |
| 2194 ast.Send node, | 2231 ast.Send node, |
| 2195 ast.Node expression, | 2232 ast.Node expression, |
| 2196 _) { | 2233 _) { |
| 2197 return irBuilder.buildNegation(visit(expression)); | 2234 return irBuilder.buildNegation(visit(expression)); |
| 2198 } | 2235 } |
| 2199 | 2236 |
| 2200 @override | 2237 @override |
| 2201 ir.Primitive visitNotEquals( | 2238 ir.Primitive visitNotEquals( |
| 2202 ast.Send node, | 2239 ast.Send node, |
| 2203 ast.Node left, | 2240 ast.Node left, |
| 2204 ast.Node right, | 2241 ast.Node right, |
| 2205 _) { | 2242 _) { |
| 2206 return irBuilder.buildNegation( | 2243 return irBuilder.buildNegation( |
| 2207 translateBinary(node, left, op.BinaryOperator.NOT_EQ, right)); | 2244 translateBinary(node, left, op.BinaryOperator.NOT_EQ, right)); |
| 2208 } | 2245 } |
| 2209 | 2246 |
| 2210 @override | 2247 @override |
| 2211 ir.Primitive visitSuperNotEquals( | 2248 ir.Primitive visitSuperNotEquals( |
| 2212 ast.Send node, | 2249 ast.Send node, |
| 2213 FunctionElement function, | 2250 FunctionElement function, |
| 2214 ast.Node argument, | 2251 ast.Node argument, |
| 2215 _) { | 2252 _) { |
| 2216 return irBuilder.buildNegation( | 2253 return irBuilder.buildNegation( |
| 2217 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument)); | 2254 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument, |
| 2255 sourceInformationBuilder.buildBinary(node))); |
| 2218 } | 2256 } |
| 2219 | 2257 |
| 2220 @override | 2258 @override |
| 2221 ir.Primitive visitUnary(ast.Send node, | 2259 ir.Primitive visitUnary(ast.Send node, |
| 2222 op.UnaryOperator operator, ast.Node expression, _) { | 2260 op.UnaryOperator operator, ast.Node expression, _) { |
| 2223 // TODO(johnniwinther): Clean up the creation of selectors. | 2261 // TODO(johnniwinther): Clean up the creation of selectors. |
| 2224 Selector selector = operator.selector; | 2262 Selector selector = operator.selector; |
| 2225 ir.Primitive receiver = translateReceiver(expression); | 2263 ir.Primitive receiver = translateReceiver(expression); |
| 2226 return irBuilder.buildDynamicInvocation( | 2264 return irBuilder.buildDynamicInvocation( |
| 2227 receiver, selector, elements.getTypeMask(node), const [], | 2265 receiver, selector, elements.getTypeMask(node), const [], |
| 2228 sourceInformation: sourceInformationBuilder.buildCall( | 2266 sourceInformationBuilder.buildCall(expression, node)); |
| 2229 expression, node)); | |
| 2230 } | 2267 } |
| 2231 | 2268 |
| 2232 @override | 2269 @override |
| 2233 ir.Primitive visitSuperUnary( | 2270 ir.Primitive visitSuperUnary( |
| 2234 ast.Send node, | 2271 ast.Send node, |
| 2235 op.UnaryOperator operator, | 2272 op.UnaryOperator operator, |
| 2236 FunctionElement function, | 2273 FunctionElement function, |
| 2237 _) { | 2274 _) { |
| 2238 return irBuilder.buildSuperMethodInvocation( | 2275 return irBuilder.buildSuperMethodInvocation( |
| 2239 function, CallStructure.NO_ARGS, const []); | 2276 function, CallStructure.NO_ARGS, const [], |
| 2277 sourceInformationBuilder.buildCall(node, node)); |
| 2240 } | 2278 } |
| 2241 | 2279 |
| 2242 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct | 2280 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct |
| 2243 // semantic correlation between arguments and invocation. | 2281 // semantic correlation between arguments and invocation. |
| 2244 CallStructure translateDynamicArguments(ast.NodeList nodeList, | 2282 CallStructure translateDynamicArguments(ast.NodeList nodeList, |
| 2245 CallStructure callStructure, | 2283 CallStructure callStructure, |
| 2246 List<ir.Primitive> arguments) { | 2284 List<ir.Primitive> arguments) { |
| 2247 assert(arguments.isEmpty); | 2285 assert(arguments.isEmpty); |
| 2248 for (ast.Node node in nodeList) arguments.add(visit(node)); | 2286 for (ast.Node node in nodeList) arguments.add(visit(node)); |
| 2249 return normalizeDynamicArguments(callStructure, arguments); | 2287 return normalizeDynamicArguments(callStructure, arguments); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2260 return normalizeStaticArguments(callStructure, element, arguments); | 2298 return normalizeStaticArguments(callStructure, element, arguments); |
| 2261 } | 2299 } |
| 2262 | 2300 |
| 2263 ir.Primitive translateCallInvoke(ir.Primitive target, | 2301 ir.Primitive translateCallInvoke(ir.Primitive target, |
| 2264 ast.NodeList argumentsNode, | 2302 ast.NodeList argumentsNode, |
| 2265 CallStructure callStructure, | 2303 CallStructure callStructure, |
| 2266 SourceInformation sourceInformation) { | 2304 SourceInformation sourceInformation) { |
| 2267 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2305 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2268 callStructure = | 2306 callStructure = |
| 2269 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2307 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2270 return irBuilder.buildCallInvocation(target, callStructure, arguments, | 2308 return irBuilder.buildCallInvocation( |
| 2271 sourceInformation: sourceInformation); | 2309 target, callStructure, arguments, sourceInformation); |
| 2272 } | 2310 } |
| 2273 | 2311 |
| 2274 @override | 2312 @override |
| 2275 ir.Primitive handleConstantInvoke( | 2313 ir.Primitive handleConstantInvoke( |
| 2276 ast.Send node, | 2314 ast.Send node, |
| 2277 ConstantExpression constant, | 2315 ConstantExpression constant, |
| 2278 ast.NodeList arguments, | 2316 ast.NodeList arguments, |
| 2279 CallStructure callStructure, | 2317 CallStructure callStructure, |
| 2280 _) { | 2318 _) { |
| 2281 ir.Primitive target = buildConstantExpression(constant, | 2319 ir.Primitive target = buildConstantExpression(constant, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2359 _) { | 2397 _) { |
| 2360 ir.Primitive target = translateReceiver(receiver); | 2398 ir.Primitive target = translateReceiver(receiver); |
| 2361 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2399 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2362 CallStructure callStructure = translateDynamicArguments( | 2400 CallStructure callStructure = translateDynamicArguments( |
| 2363 argumentsNode, selector.callStructure, arguments); | 2401 argumentsNode, selector.callStructure, arguments); |
| 2364 return irBuilder.buildDynamicInvocation( | 2402 return irBuilder.buildDynamicInvocation( |
| 2365 target, | 2403 target, |
| 2366 new Selector(selector.kind, selector.memberName, callStructure), | 2404 new Selector(selector.kind, selector.memberName, callStructure), |
| 2367 elements.getTypeMask(node), | 2405 elements.getTypeMask(node), |
| 2368 arguments, | 2406 arguments, |
| 2369 sourceInformation: | 2407 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2370 sourceInformationBuilder.buildCall(node, node.selector)); | |
| 2371 } | 2408 } |
| 2372 | 2409 |
| 2373 @override | 2410 @override |
| 2374 ir.Primitive visitIfNotNullDynamicPropertyInvoke( | 2411 ir.Primitive visitIfNotNullDynamicPropertyInvoke( |
| 2375 ast.Send node, | 2412 ast.Send node, |
| 2376 ast.Node receiver, | 2413 ast.Node receiver, |
| 2377 ast.NodeList argumentsNode, | 2414 ast.NodeList argumentsNode, |
| 2378 Selector selector, | 2415 Selector selector, |
| 2379 _) { | 2416 _) { |
| 2380 ir.Primitive target = visit(receiver); | 2417 ir.Primitive target = visit(receiver); |
| 2381 return irBuilder.buildIfNotNullSend( | 2418 return irBuilder.buildIfNotNullSend( |
| 2382 target, | 2419 target, |
| 2383 nested(() { | 2420 nested(() { |
| 2384 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2421 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2385 CallStructure callStructure = translateDynamicArguments( | 2422 CallStructure callStructure = translateDynamicArguments( |
| 2386 argumentsNode, selector.callStructure, arguments); | 2423 argumentsNode, selector.callStructure, arguments); |
| 2387 return irBuilder.buildDynamicInvocation( | 2424 return irBuilder.buildDynamicInvocation( |
| 2388 target, | 2425 target, |
| 2389 new Selector(selector.kind, selector.memberName, callStructure), | 2426 new Selector(selector.kind, selector.memberName, callStructure), |
| 2390 elements.getTypeMask(node), | 2427 elements.getTypeMask(node), |
| 2391 arguments); | 2428 arguments, |
| 2429 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2392 })); | 2430 })); |
| 2393 } | 2431 } |
| 2394 | 2432 |
| 2395 ir.Primitive handleLocalInvoke( | 2433 ir.Primitive handleLocalInvoke( |
| 2396 ast.Send node, | 2434 ast.Send node, |
| 2397 LocalElement element, | 2435 LocalElement element, |
| 2398 ast.NodeList argumentsNode, | 2436 ast.NodeList argumentsNode, |
| 2399 CallStructure callStructure, | 2437 CallStructure callStructure, |
| 2400 _) { | 2438 _) { |
| 2401 ir.Primitive function = irBuilder.buildLocalGet(element); | 2439 ir.Primitive function = irBuilder.buildLocalGet(element); |
| 2402 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2440 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2403 callStructure = | 2441 callStructure = |
| 2404 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2442 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2405 return irBuilder.buildCallInvocation(function, callStructure, arguments, | 2443 return irBuilder.buildCallInvocation(function, callStructure, arguments, |
| 2406 sourceInformation: | 2444 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2407 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 2408 } | 2445 } |
| 2409 | 2446 |
| 2410 @override | 2447 @override |
| 2411 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { | 2448 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
| 2412 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); | 2449 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); |
| 2413 } | 2450 } |
| 2414 | 2451 |
| 2415 @override | 2452 @override |
| 2416 ir.Primitive handleStaticFieldInvoke( | 2453 ir.Primitive handleStaticFieldInvoke( |
| 2417 ast.Send node, | 2454 ast.Send node, |
| 2418 FieldElement field, | 2455 FieldElement field, |
| 2419 ast.NodeList argumentsNode, | 2456 ast.NodeList argumentsNode, |
| 2420 CallStructure callStructure, | 2457 CallStructure callStructure, |
| 2421 _) { | 2458 _) { |
| 2422 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2459 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2423 ir.Primitive target = buildStaticFieldGet(field, src); | 2460 ir.Primitive target = buildStaticFieldGet(field, src); |
| 2424 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2461 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2425 callStructure = | 2462 callStructure = |
| 2426 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2463 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2427 return irBuilder.buildCallInvocation( | 2464 return irBuilder.buildCallInvocation( |
| 2428 target, | 2465 target, |
| 2429 callStructure, | 2466 callStructure, |
| 2430 arguments, | 2467 arguments, |
| 2431 sourceInformation: | 2468 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2432 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 2433 } | 2469 } |
| 2434 | 2470 |
| 2435 @override | 2471 @override |
| 2436 ir.Primitive handleStaticFunctionInvoke(ast.Send node, | 2472 ir.Primitive handleStaticFunctionInvoke(ast.Send node, |
| 2437 MethodElement function, | 2473 MethodElement function, |
| 2438 ast.NodeList argumentsNode, | 2474 ast.NodeList argumentsNode, |
| 2439 CallStructure callStructure, | 2475 CallStructure callStructure, |
| 2440 _) { | 2476 _) { |
| 2441 if (compiler.backend.isForeign(function)) { | 2477 if (compiler.backend.isForeign(function)) { |
| 2442 return handleForeignCode(node, function, argumentsNode, callStructure); | 2478 return handleForeignCode( |
| 2479 node, |
| 2480 function, |
| 2481 argumentsNode, |
| 2482 callStructure); |
| 2443 } else { | 2483 } else { |
| 2444 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2484 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2445 callStructure = translateStaticArguments(argumentsNode, function, | 2485 callStructure = translateStaticArguments(argumentsNode, function, |
| 2446 callStructure, arguments); | 2486 callStructure, arguments); |
| 2447 Selector selector = new Selector.call(function.memberName, callStructure); | 2487 Selector selector = new Selector.call(function.memberName, callStructure); |
| 2448 return irBuilder.buildInvokeStatic(function, selector, arguments, | 2488 return irBuilder.buildInvokeStatic(function, selector, arguments, |
| 2449 sourceInformationBuilder.buildCall(node, node.selector)); | 2489 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2450 } | 2490 } |
| 2451 } | 2491 } |
| 2452 | 2492 |
| 2453 @override | 2493 @override |
| 2454 ir.Primitive handleStaticFunctionIncompatibleInvoke( | 2494 ir.Primitive handleStaticFunctionIncompatibleInvoke( |
| 2455 ast.Send node, | 2495 ast.Send node, |
| 2456 MethodElement function, | 2496 MethodElement function, |
| 2457 ast.NodeList arguments, | 2497 ast.NodeList arguments, |
| 2458 CallStructure callStructure, _) { | 2498 CallStructure callStructure, _) { |
| 2459 return irBuilder.buildStaticNoSuchMethod( | 2499 return irBuilder.buildStaticNoSuchMethod( |
| 2460 elements.getSelector(node), | 2500 elements.getSelector(node), |
| 2461 arguments.nodes.mapToList(visit)); | 2501 arguments.nodes.mapToList(visit), |
| 2502 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2462 } | 2503 } |
| 2463 | 2504 |
| 2464 @override | 2505 @override |
| 2465 ir.Primitive handleStaticGetterInvoke( | 2506 ir.Primitive handleStaticGetterInvoke( |
| 2466 ast.Send node, | 2507 ast.Send node, |
| 2467 FunctionElement getter, | 2508 FunctionElement getter, |
| 2468 ast.NodeList argumentsNode, | 2509 ast.NodeList argumentsNode, |
| 2469 CallStructure callStructure, | 2510 CallStructure callStructure, |
| 2470 _) { | 2511 _) { |
| 2471 ir.Primitive target = buildStaticGetterGet(getter, node); | 2512 ir.Primitive target = buildStaticGetterGet( |
| 2513 getter, node, sourceInformationBuilder.buildGet(node)); |
| 2472 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2514 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2473 callStructure = | 2515 callStructure = |
| 2474 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2516 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2475 return irBuilder.buildCallInvocation( | 2517 return irBuilder.buildCallInvocation( |
| 2476 target, | 2518 target, |
| 2477 callStructure, | 2519 callStructure, |
| 2478 arguments, | 2520 arguments, |
| 2479 sourceInformation: | 2521 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2480 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 2481 } | 2522 } |
| 2482 | 2523 |
| 2483 @override | 2524 @override |
| 2484 ir.Primitive visitSuperFieldInvoke( | 2525 ir.Primitive visitSuperFieldInvoke( |
| 2485 ast.Send node, | 2526 ast.Send node, |
| 2486 FieldElement field, | 2527 FieldElement field, |
| 2487 ast.NodeList argumentsNode, | 2528 ast.NodeList argumentsNode, |
| 2488 CallStructure callStructure, | 2529 CallStructure callStructure, |
| 2489 _) { | 2530 _) { |
| 2490 ir.Primitive target = irBuilder.buildSuperFieldGet(field); | 2531 ir.Primitive target = irBuilder.buildSuperFieldGet( |
| 2532 field, sourceInformationBuilder.buildGet(node)); |
| 2491 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2533 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2492 callStructure = | 2534 callStructure = |
| 2493 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2535 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2494 return irBuilder.buildCallInvocation( | 2536 return irBuilder.buildCallInvocation( |
| 2495 target, | 2537 target, |
| 2496 callStructure, | 2538 callStructure, |
| 2497 arguments, | 2539 arguments, |
| 2498 sourceInformation: | 2540 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2499 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 2500 } | 2541 } |
| 2501 | 2542 |
| 2502 @override | 2543 @override |
| 2503 ir.Primitive visitSuperGetterInvoke( | 2544 ir.Primitive visitSuperGetterInvoke( |
| 2504 ast.Send node, | 2545 ast.Send node, |
| 2505 FunctionElement getter, | 2546 FunctionElement getter, |
| 2506 ast.NodeList argumentsNode, | 2547 ast.NodeList argumentsNode, |
| 2507 CallStructure callStructure, | 2548 CallStructure callStructure, |
| 2508 _) { | 2549 _) { |
| 2509 ir.Primitive target = irBuilder.buildSuperGetterGet(getter, | 2550 ir.Primitive target = irBuilder.buildSuperGetterGet(getter, |
| 2510 sourceInformationBuilder.buildGet(node)); | 2551 sourceInformationBuilder.buildGet(node)); |
| 2511 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2552 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2512 callStructure = | 2553 callStructure = |
| 2513 translateDynamicArguments(argumentsNode, callStructure, arguments); | 2554 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 2514 return irBuilder.buildCallInvocation( | 2555 return irBuilder.buildCallInvocation( |
| 2515 target, | 2556 target, |
| 2516 callStructure, | 2557 callStructure, |
| 2517 arguments, | 2558 arguments, |
| 2518 sourceInformation: | 2559 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2519 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 2520 } | 2560 } |
| 2521 | 2561 |
| 2522 @override | 2562 @override |
| 2523 ir.Primitive visitSuperMethodInvoke( | 2563 ir.Primitive visitSuperMethodInvoke( |
| 2524 ast.Send node, | 2564 ast.Send node, |
| 2525 MethodElement method, | 2565 MethodElement method, |
| 2526 ast.NodeList argumentsNode, | 2566 ast.NodeList argumentsNode, |
| 2527 CallStructure callStructure, | 2567 CallStructure callStructure, |
| 2528 _) { | 2568 _) { |
| 2529 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2569 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2530 callStructure = translateStaticArguments(argumentsNode, method, | 2570 callStructure = translateStaticArguments(argumentsNode, method, |
| 2531 callStructure, arguments); | 2571 callStructure, arguments); |
| 2532 return irBuilder.buildSuperMethodInvocation( | 2572 return irBuilder.buildSuperMethodInvocation( |
| 2533 method, | 2573 method, |
| 2534 callStructure, | 2574 callStructure, |
| 2535 arguments, | 2575 arguments, |
| 2536 sourceInformation: | 2576 sourceInformationBuilder.buildCall(node, node.selector)); |
| 2537 sourceInformationBuilder.buildCall(node, node.selector)); | |
| 2538 } | 2577 } |
| 2539 | 2578 |
| 2540 @override | 2579 @override |
| 2541 ir.Primitive visitSuperMethodIncompatibleInvoke( | 2580 ir.Primitive visitSuperMethodIncompatibleInvoke( |
| 2542 ast.Send node, | 2581 ast.Send node, |
| 2543 MethodElement method, | 2582 MethodElement method, |
| 2544 ast.NodeList arguments, | 2583 ast.NodeList arguments, |
| 2545 CallStructure callStructure, _) { | 2584 CallStructure callStructure, _) { |
| 2546 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | 2585 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
| 2547 CallStructure normalizedCallStructure = | 2586 CallStructure normalizedCallStructure = |
| 2548 translateDynamicArguments(arguments, callStructure, normalizedArguments); | 2587 translateDynamicArguments(arguments, callStructure, normalizedArguments); |
| 2549 return buildSuperNoSuchMethod( | 2588 return buildSuperNoSuchMethod( |
| 2550 new Selector.call(method.memberName, normalizedCallStructure), | 2589 new Selector.call(method.memberName, normalizedCallStructure), |
| 2551 elements.getTypeMask(node), | 2590 elements.getTypeMask(node), |
| 2552 normalizedArguments); | 2591 normalizedArguments, |
| 2592 sourceInformationBuilder.buildCall(node, arguments)); |
| 2553 } | 2593 } |
| 2554 | 2594 |
| 2555 @override | 2595 @override |
| 2556 ir.Primitive visitUnresolvedSuperInvoke( | 2596 ir.Primitive visitUnresolvedSuperInvoke( |
| 2557 ast.Send node, | 2597 ast.Send node, |
| 2558 Element element, | 2598 Element element, |
| 2559 ast.NodeList argumentsNode, | 2599 ast.NodeList argumentsNode, |
| 2560 Selector selector, _) { | 2600 Selector selector, _) { |
| 2561 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2601 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 2562 CallStructure callStructure = translateDynamicArguments( | 2602 CallStructure callStructure = translateDynamicArguments( |
| 2563 argumentsNode, selector.callStructure, arguments); | 2603 argumentsNode, selector.callStructure, arguments); |
| 2564 // TODO(johnniwinther): Supply a member name to the visit function instead | 2604 // TODO(johnniwinther): Supply a member name to the visit function instead |
| 2565 // of looking it up in elements. | 2605 // of looking it up in elements. |
| 2566 return buildSuperNoSuchMethod( | 2606 return buildSuperNoSuchMethod( |
| 2567 new Selector.call(elements.getSelector(node).memberName, callStructure), | 2607 new Selector.call(elements.getSelector(node).memberName, callStructure), |
| 2568 elements.getTypeMask(node), | 2608 elements.getTypeMask(node), |
| 2569 arguments); | 2609 arguments, |
| 2610 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 2570 } | 2611 } |
| 2571 | 2612 |
| 2572 @override | 2613 @override |
| 2573 ir.Primitive visitThisInvoke( | 2614 ir.Primitive visitThisInvoke( |
| 2574 ast.Send node, | 2615 ast.Send node, |
| 2575 ast.NodeList arguments, | 2616 ast.NodeList arguments, |
| 2576 CallStructure callStructure, | 2617 CallStructure callStructure, |
| 2577 _) { | 2618 _) { |
| 2578 return translateCallInvoke( | 2619 return translateCallInvoke( |
| 2579 irBuilder.buildThis(), | 2620 irBuilder.buildThis(), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2598 } | 2639 } |
| 2599 | 2640 |
| 2600 @override | 2641 @override |
| 2601 ir.Primitive visitIndexSet( | 2642 ir.Primitive visitIndexSet( |
| 2602 ast.SendSet node, | 2643 ast.SendSet node, |
| 2603 ast.Node receiver, | 2644 ast.Node receiver, |
| 2604 ast.Node index, | 2645 ast.Node index, |
| 2605 ast.Node rhs, | 2646 ast.Node rhs, |
| 2606 _) { | 2647 _) { |
| 2607 return irBuilder.buildDynamicIndexSet( | 2648 return irBuilder.buildDynamicIndexSet( |
| 2608 visit(receiver), elements.getTypeMask(node), visit(index), visit(rhs)); | 2649 visit(receiver), |
| 2650 elements.getTypeMask(node), |
| 2651 visit(index), |
| 2652 visit(rhs), |
| 2653 sourceInformationBuilder.buildIndexSet(node)); |
| 2609 } | 2654 } |
| 2610 | 2655 |
| 2611 @override | 2656 @override |
| 2612 ir.Primitive visitSuperIndexSet( | 2657 ir.Primitive visitSuperIndexSet( |
| 2613 ast.SendSet node, | 2658 ast.SendSet node, |
| 2614 FunctionElement function, | 2659 FunctionElement function, |
| 2615 ast.Node index, | 2660 ast.Node index, |
| 2616 ast.Node rhs, | 2661 ast.Node rhs, |
| 2617 _) { | 2662 _) { |
| 2618 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 2663 return irBuilder.buildSuperIndexSet( |
| 2664 function, |
| 2665 visit(index), |
| 2666 visit(rhs), |
| 2667 sourceInformationBuilder.buildIndexSet(node)); |
| 2619 } | 2668 } |
| 2620 | 2669 |
| 2621 ir.Primitive translateCompounds( | 2670 ir.Primitive translateCompounds( |
| 2622 ast.SendSet node, | 2671 ast.SendSet node, |
| 2623 ir.Primitive getValue(), | 2672 ir.Primitive getValue(), |
| 2624 CompoundRhs rhs, | 2673 CompoundRhs rhs, |
| 2625 void setValue(ir.Primitive value)) { | 2674 void setValue(ir.Primitive value)) { |
| 2626 ir.Primitive value = getValue(); | 2675 ir.Primitive value = getValue(); |
| 2627 op.BinaryOperator operator = rhs.operator; | 2676 op.BinaryOperator operator = rhs.operator; |
| 2628 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { | 2677 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2649 TypeMask operatorTypeMask = | 2698 TypeMask operatorTypeMask = |
| 2650 elements.getOperatorTypeMaskInComplexSendSet(node); | 2699 elements.getOperatorTypeMaskInComplexSendSet(node); |
| 2651 SourceInformation operatorSourceInformation = | 2700 SourceInformation operatorSourceInformation = |
| 2652 sourceInformationBuilder.buildCall(node, node.assignmentOperator); | 2701 sourceInformationBuilder.buildCall(node, node.assignmentOperator); |
| 2653 ir.Primitive result = irBuilder.buildDynamicInvocation( | 2702 ir.Primitive result = irBuilder.buildDynamicInvocation( |
| 2654 value, | 2703 value, |
| 2655 new Selector(operatorSelector.kind, operatorSelector.memberName, | 2704 new Selector(operatorSelector.kind, operatorSelector.memberName, |
| 2656 callStructure), | 2705 callStructure), |
| 2657 operatorTypeMask, | 2706 operatorTypeMask, |
| 2658 arguments, | 2707 arguments, |
| 2659 sourceInformation: operatorSourceInformation); | 2708 operatorSourceInformation); |
| 2660 setValue(result); | 2709 setValue(result); |
| 2661 return rhs.kind == CompoundKind.POSTFIX ? value : result; | 2710 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 2662 } | 2711 } |
| 2663 | 2712 |
| 2664 ir.Primitive translateSetIfNull( | 2713 ir.Primitive translateSetIfNull( |
| 2665 ast.SendSet node, | 2714 ast.SendSet node, |
| 2666 ir.Primitive getValue(), | 2715 ir.Primitive getValue(), |
| 2667 ast.Node rhs, | 2716 ast.Node rhs, |
| 2668 void setValue(ir.Primitive value)) { | 2717 void setValue(ir.Primitive value)) { |
| 2669 ir.Primitive value = getValue(); | 2718 ir.Primitive value = getValue(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2680 ir.Primitive handleDynamicSet( | 2729 ir.Primitive handleDynamicSet( |
| 2681 ast.SendSet node, | 2730 ast.SendSet node, |
| 2682 ast.Node receiver, | 2731 ast.Node receiver, |
| 2683 Name name, | 2732 Name name, |
| 2684 ast.Node rhs, | 2733 ast.Node rhs, |
| 2685 _) { | 2734 _) { |
| 2686 return irBuilder.buildDynamicSet( | 2735 return irBuilder.buildDynamicSet( |
| 2687 translateReceiver(receiver), | 2736 translateReceiver(receiver), |
| 2688 new Selector.setter(name), | 2737 new Selector.setter(name), |
| 2689 elements.getTypeMask(node), | 2738 elements.getTypeMask(node), |
| 2690 visit(rhs)); | 2739 visit(rhs), |
| 2740 sourceInformationBuilder.buildAssignment(node)); |
| 2691 } | 2741 } |
| 2692 | 2742 |
| 2693 @override | 2743 @override |
| 2694 ir.Primitive visitIfNotNullDynamicPropertySet( | 2744 ir.Primitive visitIfNotNullDynamicPropertySet( |
| 2695 ast.SendSet node, | 2745 ast.SendSet node, |
| 2696 ast.Node receiver, | 2746 ast.Node receiver, |
| 2697 Name name, | 2747 Name name, |
| 2698 ast.Node rhs, | 2748 ast.Node rhs, |
| 2699 _) { | 2749 _) { |
| 2700 ir.Primitive target = visit(receiver); | 2750 ir.Primitive target = visit(receiver); |
| 2701 return irBuilder.buildIfNotNullSend( | 2751 return irBuilder.buildIfNotNullSend( |
| 2702 target, | 2752 target, |
| 2703 nested(() => irBuilder.buildDynamicSet( | 2753 nested(() => irBuilder.buildDynamicSet( |
| 2704 target, | 2754 target, |
| 2705 new Selector.setter(name), | 2755 new Selector.setter(name), |
| 2706 elements.getTypeMask(node), | 2756 elements.getTypeMask(node), |
| 2707 visit(rhs)))); | 2757 visit(rhs), |
| 2758 sourceInformationBuilder.buildAssignment(node)))); |
| 2708 } | 2759 } |
| 2709 | 2760 |
| 2710 @override | 2761 @override |
| 2711 ir.Primitive handleLocalSet( | 2762 ir.Primitive handleLocalSet( |
| 2712 ast.SendSet node, | 2763 ast.SendSet node, |
| 2713 LocalElement element, | 2764 LocalElement element, |
| 2714 ast.Node rhs, | 2765 ast.Node rhs, |
| 2715 _) { | 2766 _) { |
| 2716 ir.Primitive value = visit(rhs); | 2767 ir.Primitive value = visit(rhs); |
| 2717 value = checkTypeVsElement(value, element); | 2768 value = checkTypeVsElement(value, element); |
| 2718 return irBuilder.buildLocalVariableSet(element, value); | 2769 return irBuilder.buildLocalVariableSet(element, value, |
| 2770 sourceInformationBuilder.buildAssignment(node)); |
| 2719 } | 2771 } |
| 2720 | 2772 |
| 2721 @override | 2773 @override |
| 2722 ir.Primitive handleStaticFieldSet( | 2774 ir.Primitive handleStaticFieldSet( |
| 2723 ast.SendSet node, | 2775 ast.SendSet node, |
| 2724 FieldElement field, | 2776 FieldElement field, |
| 2725 ast.Node rhs, | 2777 ast.Node rhs, |
| 2726 _) { | 2778 _) { |
| 2727 ir.Primitive value = visit(rhs); | 2779 ir.Primitive value = visit(rhs); |
| 2728 irBuilder.addPrimitive(new ir.SetStatic(field, value)); | 2780 irBuilder.addPrimitive(new ir.SetStatic(field, value, |
| 2781 sourceInformationBuilder.buildAssignment(node))); |
| 2729 return value; | 2782 return value; |
| 2730 } | 2783 } |
| 2731 | 2784 |
| 2732 @override | 2785 @override |
| 2733 ir.Primitive visitSuperFieldSet( | 2786 ir.Primitive visitSuperFieldSet( |
| 2734 ast.SendSet node, | 2787 ast.SendSet node, |
| 2735 FieldElement field, | 2788 FieldElement field, |
| 2736 ast.Node rhs, | 2789 ast.Node rhs, |
| 2737 _) { | 2790 _) { |
| 2738 return irBuilder.buildSuperFieldSet(field, visit(rhs)); | 2791 return irBuilder.buildSuperFieldSet(field, visit(rhs), |
| 2792 sourceInformationBuilder.buildAssignment(node)); |
| 2739 } | 2793 } |
| 2740 | 2794 |
| 2741 @override | 2795 @override |
| 2742 ir.Primitive visitSuperSetterSet( | 2796 ir.Primitive visitSuperSetterSet( |
| 2743 ast.SendSet node, | 2797 ast.SendSet node, |
| 2744 FunctionElement setter, | 2798 FunctionElement setter, |
| 2745 ast.Node rhs, | 2799 ast.Node rhs, |
| 2746 _) { | 2800 _) { |
| 2747 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); | 2801 return irBuilder.buildSuperSetterSet(setter, visit(rhs), |
| 2802 sourceInformationBuilder.buildAssignment(node)); |
| 2748 } | 2803 } |
| 2749 | 2804 |
| 2750 @override | 2805 @override |
| 2751 ir.Primitive visitUnresolvedSuperIndexSet( | 2806 ir.Primitive visitUnresolvedSuperIndexSet( |
| 2752 ast.Send node, | 2807 ast.Send node, |
| 2753 Element element, | 2808 Element element, |
| 2754 ast.Node index, | 2809 ast.Node index, |
| 2755 ast.Node rhs, | 2810 ast.Node rhs, |
| 2756 arg) { | 2811 arg) { |
| 2757 return giveup(node, 'visitUnresolvedSuperIndexSet'); | 2812 return giveup(node, 'visitUnresolvedSuperIndexSet'); |
| 2758 } | 2813 } |
| 2759 | 2814 |
| 2760 @override | 2815 @override |
| 2761 ir.Primitive handleStaticSetterSet( | 2816 ir.Primitive handleStaticSetterSet( |
| 2762 ast.SendSet node, | 2817 ast.SendSet node, |
| 2763 FunctionElement setter, | 2818 FunctionElement setter, |
| 2764 ast.Node rhs, | 2819 ast.Node rhs, |
| 2765 _) { | 2820 _) { |
| 2766 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | 2821 return irBuilder.buildStaticSetterSet(setter, visit(rhs), |
| 2822 sourceInformationBuilder.buildAssignment(node)); |
| 2767 } | 2823 } |
| 2768 | 2824 |
| 2769 @override | 2825 @override |
| 2770 ir.Primitive handleTypeLiteralConstantCompounds( | 2826 ir.Primitive handleTypeLiteralConstantCompounds( |
| 2771 ast.SendSet node, | 2827 ast.SendSet node, |
| 2772 ConstantExpression constant, | 2828 ConstantExpression constant, |
| 2773 CompoundRhs rhs, | 2829 CompoundRhs rhs, |
| 2774 arg) { | 2830 arg) { |
| 2775 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2831 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2776 return translateCompounds(node, () { | 2832 return translateCompounds(node, () { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2804 return irBuilder.buildDynamicGet( | 2860 return irBuilder.buildDynamicGet( |
| 2805 target, | 2861 target, |
| 2806 new Selector.getter(name), | 2862 new Selector.getter(name), |
| 2807 elements.getGetterTypeMaskInComplexSendSet(node), | 2863 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2808 sourceInformationBuilder.buildGet(node)); | 2864 sourceInformationBuilder.buildGet(node)); |
| 2809 }, rhs, (ir.Primitive result) { | 2865 }, rhs, (ir.Primitive result) { |
| 2810 irBuilder.buildDynamicSet( | 2866 irBuilder.buildDynamicSet( |
| 2811 target, | 2867 target, |
| 2812 new Selector.setter(name), | 2868 new Selector.setter(name), |
| 2813 elements.getTypeMask(node), | 2869 elements.getTypeMask(node), |
| 2814 result); | 2870 result, |
| 2871 sourceInformationBuilder.buildAssignment(node)); |
| 2815 }); | 2872 }); |
| 2816 } | 2873 } |
| 2817 return node.isConditional | 2874 return node.isConditional |
| 2818 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2875 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2819 : helper(); | 2876 : helper(); |
| 2820 } | 2877 } |
| 2821 | 2878 |
| 2822 @override | 2879 @override |
| 2823 ir.Primitive handleDynamicSetIfNulls( | 2880 ir.Primitive handleDynamicSetIfNulls( |
| 2824 ast.Send node, | 2881 ast.Send node, |
| 2825 ast.Node receiver, | 2882 ast.Node receiver, |
| 2826 Name name, | 2883 Name name, |
| 2827 ast.Node rhs, | 2884 ast.Node rhs, |
| 2828 _) { | 2885 _) { |
| 2829 ir.Primitive target = translateReceiver(receiver); | 2886 ir.Primitive target = translateReceiver(receiver); |
| 2830 ir.Primitive helper() { | 2887 ir.Primitive helper() { |
| 2831 return translateSetIfNull(node, () { | 2888 return translateSetIfNull(node, () { |
| 2832 return irBuilder.buildDynamicGet( | 2889 return irBuilder.buildDynamicGet( |
| 2833 target, | 2890 target, |
| 2834 new Selector.getter(name), | 2891 new Selector.getter(name), |
| 2835 elements.getGetterTypeMaskInComplexSendSet(node), | 2892 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2836 sourceInformationBuilder.buildGet(node)); | 2893 sourceInformationBuilder.buildGet(node)); |
| 2837 }, rhs, (ir.Primitive result) { | 2894 }, rhs, (ir.Primitive result) { |
| 2838 irBuilder.buildDynamicSet( | 2895 irBuilder.buildDynamicSet( |
| 2839 target, | 2896 target, |
| 2840 new Selector.setter(name), | 2897 new Selector.setter(name), |
| 2841 elements.getTypeMask(node), | 2898 elements.getTypeMask(node), |
| 2842 result); | 2899 result, |
| 2900 sourceInformationBuilder.buildAssignment(node)); |
| 2843 }); | 2901 }); |
| 2844 } | 2902 } |
| 2845 return node.isConditional | 2903 return node.isConditional |
| 2846 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2904 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2847 : helper(); | 2905 : helper(); |
| 2848 } | 2906 } |
| 2849 | 2907 |
| 2850 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { | 2908 ir.Primitive buildLocalNoSuchSetter( |
| 2909 LocalElement local, |
| 2910 ir.Primitive value, |
| 2911 SourceInformation sourceInformation) { |
| 2851 Selector selector = new Selector.setter( | 2912 Selector selector = new Selector.setter( |
| 2852 new Name(local.name, local.library, isSetter: true)); | 2913 new Name(local.name, local.library, isSetter: true)); |
| 2853 return irBuilder.buildStaticNoSuchMethod(selector, [value]); | 2914 return irBuilder.buildStaticNoSuchMethod( |
| 2915 selector, [value], sourceInformation); |
| 2854 } | 2916 } |
| 2855 | 2917 |
| 2856 @override | 2918 @override |
| 2857 ir.Primitive handleLocalCompounds( | 2919 ir.Primitive handleLocalCompounds( |
| 2858 ast.SendSet node, | 2920 ast.SendSet node, |
| 2859 LocalElement local, | 2921 LocalElement local, |
| 2860 CompoundRhs rhs, | 2922 CompoundRhs rhs, |
| 2861 arg, | 2923 arg, |
| 2862 {bool isSetterValid}) { | 2924 {bool isSetterValid}) { |
| 2863 return translateCompounds(node, () { | 2925 return translateCompounds(node, () { |
| 2864 return irBuilder.buildLocalGet(local); | 2926 return irBuilder.buildLocalGet(local); |
| 2865 }, rhs, (ir.Primitive result) { | 2927 }, rhs, (ir.Primitive result) { |
| 2866 if (isSetterValid) { | 2928 if (isSetterValid) { |
| 2867 irBuilder.buildLocalVariableSet(local, result); | 2929 irBuilder.buildLocalVariableSet( |
| 2930 local, result, |
| 2931 sourceInformationBuilder.buildAssignment(node)); |
| 2868 } else { | 2932 } else { |
| 2869 Selector selector = new Selector.setter( | 2933 Selector selector = new Selector.setter( |
| 2870 new Name(local.name, local.library, isSetter: true)); | 2934 new Name(local.name, local.library, isSetter: true)); |
| 2871 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); | 2935 irBuilder.buildStaticNoSuchMethod( |
| 2936 selector, <ir.Primitive>[result], |
| 2937 sourceInformationBuilder.buildAssignment(node)); |
| 2872 } | 2938 } |
| 2873 }); | 2939 }); |
| 2874 } | 2940 } |
| 2875 | 2941 |
| 2876 @override | 2942 @override |
| 2877 ir.Primitive handleLocalSetIfNulls( | 2943 ir.Primitive handleLocalSetIfNulls( |
| 2878 ast.SendSet node, | 2944 ast.SendSet node, |
| 2879 LocalElement local, | 2945 LocalElement local, |
| 2880 ast.Node rhs, | 2946 ast.Node rhs, |
| 2881 _, | 2947 _, |
| 2882 {bool isSetterValid}) { | 2948 {bool isSetterValid}) { |
| 2883 return translateSetIfNull(node, () { | 2949 return translateSetIfNull(node, () { |
| 2884 return irBuilder.buildLocalGet(local); | 2950 return irBuilder.buildLocalGet( |
| 2951 local, sourceInformation: sourceInformationBuilder.buildGet(node)); |
| 2885 }, rhs, (ir.Primitive result) { | 2952 }, rhs, (ir.Primitive result) { |
| 2953 SourceInformation sourceInformation = |
| 2954 sourceInformationBuilder.buildAssignment(node); |
| 2886 if (isSetterValid) { | 2955 if (isSetterValid) { |
| 2887 irBuilder.buildLocalVariableSet(local, result); | 2956 irBuilder.buildLocalVariableSet( |
| 2957 local, result, sourceInformation); |
| 2888 } else { | 2958 } else { |
| 2889 Selector selector = new Selector.setter( | 2959 Selector selector = new Selector.setter( |
| 2890 new Name(local.name, local.library, isSetter: true)); | 2960 new Name(local.name, local.library, isSetter: true)); |
| 2891 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); | 2961 irBuilder.buildStaticNoSuchMethod( |
| 2962 selector, <ir.Primitive>[result], sourceInformation); |
| 2892 } | 2963 } |
| 2893 }); | 2964 }); |
| 2894 } | 2965 } |
| 2895 | 2966 |
| 2896 @override | 2967 @override |
| 2897 ir.Primitive handleStaticCompounds( | 2968 ir.Primitive handleStaticCompounds( |
| 2898 ast.SendSet node, | 2969 ast.SendSet node, |
| 2899 Element getter, | 2970 Element getter, |
| 2900 CompoundGetter getterKind, | 2971 CompoundGetter getterKind, |
| 2901 Element setter, | 2972 Element setter, |
| 2902 CompoundSetter setterKind, | 2973 CompoundSetter setterKind, |
| 2903 CompoundRhs rhs, | 2974 CompoundRhs rhs, |
| 2904 arg) { | 2975 arg) { |
| 2905 return translateCompounds(node, () { | 2976 return translateCompounds(node, () { |
| 2977 SourceInformation sourceInformation = |
| 2978 sourceInformationBuilder.buildGet(node); |
| 2906 switch (getterKind) { | 2979 switch (getterKind) { |
| 2907 case CompoundGetter.FIELD: | 2980 case CompoundGetter.FIELD: |
| 2908 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2981 return buildStaticFieldGet(getter, sourceInformation); |
| 2909 return buildStaticFieldGet(getter, src); | |
| 2910 case CompoundGetter.GETTER: | 2982 case CompoundGetter.GETTER: |
| 2911 return buildStaticGetterGet(getter, node); | 2983 return buildStaticGetterGet(getter, node, sourceInformation); |
| 2912 case CompoundGetter.METHOD: | 2984 case CompoundGetter.METHOD: |
| 2913 return irBuilder.addPrimitive(new ir.GetStatic(getter, | 2985 return irBuilder.addPrimitive(new ir.GetStatic(getter, |
| 2914 isFinal: true)); | 2986 sourceInformation: sourceInformation, isFinal: true)); |
| 2915 case CompoundGetter.UNRESOLVED: | 2987 case CompoundGetter.UNRESOLVED: |
| 2916 return irBuilder.buildStaticNoSuchMethod( | 2988 return irBuilder.buildStaticNoSuchMethod( |
| 2917 new Selector.getter(new Name(getter.name, getter.library)), | 2989 new Selector.getter(new Name(getter.name, getter.library)), |
| 2918 <ir.Primitive>[]); | 2990 <ir.Primitive>[], |
| 2991 sourceInformation); |
| 2919 } | 2992 } |
| 2920 }, rhs, (ir.Primitive result) { | 2993 }, rhs, (ir.Primitive result) { |
| 2994 SourceInformation sourceInformation = |
| 2995 sourceInformationBuilder.buildAssignment(node); |
| 2921 switch (setterKind) { | 2996 switch (setterKind) { |
| 2922 case CompoundSetter.FIELD: | 2997 case CompoundSetter.FIELD: |
| 2923 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); | 2998 irBuilder.addPrimitive( |
| 2999 new ir.SetStatic(setter, result, sourceInformation)); |
| 2924 return; | 3000 return; |
| 2925 case CompoundSetter.SETTER: | 3001 case CompoundSetter.SETTER: |
| 2926 irBuilder.buildStaticSetterSet(setter, result); | 3002 irBuilder.buildStaticSetterSet(setter, result, sourceInformation); |
| 2927 return; | 3003 return; |
| 2928 case CompoundSetter.INVALID: | 3004 case CompoundSetter.INVALID: |
| 2929 irBuilder.buildStaticNoSuchMethod( | 3005 irBuilder.buildStaticNoSuchMethod( |
| 2930 new Selector.setter(new Name(setter.name, setter.library)), | 3006 new Selector.setter(new Name(setter.name, setter.library)), |
| 2931 <ir.Primitive>[result]); | 3007 <ir.Primitive>[result], |
| 3008 sourceInformation); |
| 2932 return; | 3009 return; |
| 2933 } | 3010 } |
| 2934 }); | 3011 }); |
| 2935 } | 3012 } |
| 2936 | 3013 |
| 2937 @override | 3014 @override |
| 2938 ir.Primitive handleStaticSetIfNulls( | 3015 ir.Primitive handleStaticSetIfNulls( |
| 2939 ast.SendSet node, | 3016 ast.SendSet node, |
| 2940 Element getter, | 3017 Element getter, |
| 2941 CompoundGetter getterKind, | 3018 CompoundGetter getterKind, |
| 2942 Element setter, | 3019 Element setter, |
| 2943 CompoundSetter setterKind, | 3020 CompoundSetter setterKind, |
| 2944 ast.Node rhs, | 3021 ast.Node rhs, |
| 2945 _) { | 3022 _) { |
| 2946 return translateSetIfNull(node, () { | 3023 return translateSetIfNull(node, () { |
| 3024 SourceInformation sourceInformation = |
| 3025 sourceInformationBuilder.buildGet(node); |
| 2947 switch (getterKind) { | 3026 switch (getterKind) { |
| 2948 case CompoundGetter.FIELD: | 3027 case CompoundGetter.FIELD: |
| 2949 SourceInformation src = sourceInformationBuilder.buildGet(node); | 3028 return buildStaticFieldGet(getter, sourceInformation); |
| 2950 return buildStaticFieldGet(getter, src); | |
| 2951 case CompoundGetter.GETTER: | 3029 case CompoundGetter.GETTER: |
| 2952 return buildStaticGetterGet(getter, node); | 3030 return buildStaticGetterGet(getter, node, sourceInformation); |
| 2953 case CompoundGetter.METHOD: | 3031 case CompoundGetter.METHOD: |
| 2954 return irBuilder.addPrimitive(new ir.GetStatic(getter, | 3032 return irBuilder.addPrimitive(new ir.GetStatic(getter, |
| 3033 sourceInformation: sourceInformation, |
| 2955 isFinal: true)); | 3034 isFinal: true)); |
| 2956 case CompoundGetter.UNRESOLVED: | 3035 case CompoundGetter.UNRESOLVED: |
| 2957 return irBuilder.buildStaticNoSuchMethod( | 3036 return irBuilder.buildStaticNoSuchMethod( |
| 2958 new Selector.getter(new Name(getter.name, getter.library)), | 3037 new Selector.getter(new Name(getter.name, getter.library)), |
| 2959 <ir.Primitive>[]); | 3038 <ir.Primitive>[], |
| 3039 sourceInformation); |
| 2960 } | 3040 } |
| 2961 }, rhs, (ir.Primitive result) { | 3041 }, rhs, (ir.Primitive result) { |
| 3042 SourceInformation sourceInformation = |
| 3043 sourceInformationBuilder.buildAssignment(node); |
| 2962 switch (setterKind) { | 3044 switch (setterKind) { |
| 2963 case CompoundSetter.FIELD: | 3045 case CompoundSetter.FIELD: |
| 2964 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); | 3046 irBuilder.addPrimitive(new ir.SetStatic( |
| 3047 setter, result, sourceInformation)); |
| 2965 return; | 3048 return; |
| 2966 case CompoundSetter.SETTER: | 3049 case CompoundSetter.SETTER: |
| 2967 irBuilder.buildStaticSetterSet(setter, result); | 3050 irBuilder.buildStaticSetterSet(setter, result, sourceInformation); |
| 2968 return; | 3051 return; |
| 2969 case CompoundSetter.INVALID: | 3052 case CompoundSetter.INVALID: |
| 2970 irBuilder.buildStaticNoSuchMethod( | 3053 irBuilder.buildStaticNoSuchMethod( |
| 2971 new Selector.setter(new Name(setter.name, setter.library)), | 3054 new Selector.setter(new Name(setter.name, setter.library)), |
| 2972 <ir.Primitive>[result]); | 3055 <ir.Primitive>[result], |
| 3056 sourceInformation); |
| 2973 return; | 3057 return; |
| 2974 } | 3058 } |
| 2975 }); | 3059 }); |
| 2976 } | 3060 } |
| 2977 | 3061 |
| 2978 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 3062 ir.Primitive buildSuperNoSuchGetter( |
| 3063 Element element, |
| 3064 TypeMask mask, |
| 3065 SourceInformation sourceInformation) { |
| 2979 return buildSuperNoSuchMethod( | 3066 return buildSuperNoSuchMethod( |
| 2980 new Selector.getter(new Name(element.name, element.library)), | 3067 new Selector.getter(new Name(element.name, element.library)), |
| 2981 mask, | 3068 mask, |
| 2982 const <ir.Primitive>[]); | 3069 const <ir.Primitive>[], |
| 3070 sourceInformation); |
| 2983 } | 3071 } |
| 2984 | 3072 |
| 2985 ir.Primitive buildSuperNoSuchSetter(Element element, | 3073 ir.Primitive buildSuperNoSuchSetter( |
| 2986 TypeMask mask, | 3074 Element element, |
| 2987 ir.Primitive value) { | 3075 TypeMask mask, |
| 3076 ir.Primitive value, |
| 3077 SourceInformation sourceInformation) { |
| 2988 return buildSuperNoSuchMethod( | 3078 return buildSuperNoSuchMethod( |
| 2989 new Selector.setter(new Name(element.name, element.library)), | 3079 new Selector.setter(new Name(element.name, element.library)), |
| 2990 mask, | 3080 mask, |
| 2991 <ir.Primitive>[value]); | 3081 <ir.Primitive>[value], |
| 3082 sourceInformation); |
| 2992 } | 3083 } |
| 2993 | 3084 |
| 2994 @override | 3085 @override |
| 2995 ir.Primitive handleSuperCompounds( | 3086 ir.Primitive handleSuperCompounds( |
| 2996 ast.SendSet node, | 3087 ast.SendSet node, |
| 2997 Element getter, | 3088 Element getter, |
| 2998 CompoundGetter getterKind, | 3089 CompoundGetter getterKind, |
| 2999 Element setter, | 3090 Element setter, |
| 3000 CompoundSetter setterKind, | 3091 CompoundSetter setterKind, |
| 3001 CompoundRhs rhs, | 3092 CompoundRhs rhs, |
| 3002 arg) { | 3093 arg) { |
| 3003 return translateCompounds(node, () { | 3094 return translateCompounds(node, () { |
| 3004 switch (getterKind) { | 3095 switch (getterKind) { |
| 3005 case CompoundGetter.FIELD: | 3096 case CompoundGetter.FIELD: |
| 3006 return irBuilder.buildSuperFieldGet(getter); | 3097 return irBuilder.buildSuperFieldGet( |
| 3098 getter, sourceInformationBuilder.buildGet(node)); |
| 3007 case CompoundGetter.GETTER: | 3099 case CompoundGetter.GETTER: |
| 3008 return irBuilder.buildSuperGetterGet( | 3100 return irBuilder.buildSuperGetterGet( |
| 3009 getter, sourceInformationBuilder.buildGet(node)); | 3101 getter, sourceInformationBuilder.buildGet(node)); |
| 3010 case CompoundGetter.METHOD: | 3102 case CompoundGetter.METHOD: |
| 3011 return irBuilder.buildSuperMethodGet(getter); | 3103 return irBuilder.buildSuperMethodGet( |
| 3104 getter, sourceInformationBuilder.buildGet(node)); |
| 3012 case CompoundGetter.UNRESOLVED: | 3105 case CompoundGetter.UNRESOLVED: |
| 3013 return buildSuperNoSuchGetter( | 3106 return buildSuperNoSuchGetter( |
| 3014 getter, elements.getGetterTypeMaskInComplexSendSet(node)); | 3107 getter, elements.getGetterTypeMaskInComplexSendSet(node), |
| 3108 sourceInformationBuilder.buildGet(node)); |
| 3015 } | 3109 } |
| 3016 }, rhs, (ir.Primitive result) { | 3110 }, rhs, (ir.Primitive result) { |
| 3017 switch (setterKind) { | 3111 switch (setterKind) { |
| 3018 case CompoundSetter.FIELD: | 3112 case CompoundSetter.FIELD: |
| 3019 irBuilder.buildSuperFieldSet(setter, result); | 3113 irBuilder.buildSuperFieldSet(setter, result, |
| 3114 sourceInformationBuilder.buildAssignment(node)); |
| 3020 return; | 3115 return; |
| 3021 case CompoundSetter.SETTER: | 3116 case CompoundSetter.SETTER: |
| 3022 irBuilder.buildSuperSetterSet(setter, result); | 3117 irBuilder.buildSuperSetterSet(setter, result, |
| 3118 sourceInformationBuilder.buildAssignment(node)); |
| 3023 return; | 3119 return; |
| 3024 case CompoundSetter.INVALID: | 3120 case CompoundSetter.INVALID: |
| 3025 buildSuperNoSuchSetter( | 3121 buildSuperNoSuchSetter( |
| 3026 setter, elements.getTypeMask(node), result); | 3122 setter, elements.getTypeMask(node), result, |
| 3123 sourceInformationBuilder.buildAssignment(node)); |
| 3027 return; | 3124 return; |
| 3028 } | 3125 } |
| 3029 }); | 3126 }); |
| 3030 } | 3127 } |
| 3031 | 3128 |
| 3032 @override | 3129 @override |
| 3033 ir.Primitive handleSuperSetIfNulls( | 3130 ir.Primitive handleSuperSetIfNulls( |
| 3034 ast.SendSet node, | 3131 ast.SendSet node, |
| 3035 Element getter, | 3132 Element getter, |
| 3036 CompoundGetter getterKind, | 3133 CompoundGetter getterKind, |
| 3037 Element setter, | 3134 Element setter, |
| 3038 CompoundSetter setterKind, | 3135 CompoundSetter setterKind, |
| 3039 ast.Node rhs, | 3136 ast.Node rhs, |
| 3040 _) { | 3137 _) { |
| 3041 return translateSetIfNull(node, () { | 3138 return translateSetIfNull(node, () { |
| 3042 switch (getterKind) { | 3139 switch (getterKind) { |
| 3043 case CompoundGetter.FIELD: | 3140 case CompoundGetter.FIELD: |
| 3044 return irBuilder.buildSuperFieldGet(getter); | 3141 return irBuilder.buildSuperFieldGet( |
| 3142 getter, sourceInformationBuilder.buildGet(node)); |
| 3045 case CompoundGetter.GETTER: | 3143 case CompoundGetter.GETTER: |
| 3046 return irBuilder.buildSuperGetterGet( | 3144 return irBuilder.buildSuperGetterGet( |
| 3047 getter, sourceInformationBuilder.buildGet(node)); | 3145 getter, sourceInformationBuilder.buildGet(node)); |
| 3048 case CompoundGetter.METHOD: | 3146 case CompoundGetter.METHOD: |
| 3049 return irBuilder.buildSuperMethodGet(getter); | 3147 return irBuilder.buildSuperMethodGet( |
| 3148 getter, sourceInformationBuilder.buildGet(node)); |
| 3050 case CompoundGetter.UNRESOLVED: | 3149 case CompoundGetter.UNRESOLVED: |
| 3051 return buildSuperNoSuchGetter( | 3150 return buildSuperNoSuchGetter( |
| 3052 getter, | 3151 getter, |
| 3053 elements.getGetterTypeMaskInComplexSendSet(node)); | 3152 elements.getGetterTypeMaskInComplexSendSet(node), |
| 3153 sourceInformationBuilder.buildGet(node)); |
| 3054 } | 3154 } |
| 3055 }, rhs, (ir.Primitive result) { | 3155 }, rhs, (ir.Primitive result) { |
| 3056 switch (setterKind) { | 3156 switch (setterKind) { |
| 3057 case CompoundSetter.FIELD: | 3157 case CompoundSetter.FIELD: |
| 3058 irBuilder.buildSuperFieldSet(setter, result); | 3158 irBuilder.buildSuperFieldSet( |
| 3159 setter, result, |
| 3160 sourceInformationBuilder.buildAssignment(node)); |
| 3059 return; | 3161 return; |
| 3060 case CompoundSetter.SETTER: | 3162 case CompoundSetter.SETTER: |
| 3061 irBuilder.buildSuperSetterSet(setter, result); | 3163 irBuilder.buildSuperSetterSet( |
| 3164 setter, result, |
| 3165 sourceInformationBuilder.buildAssignment(node)); |
| 3062 return; | 3166 return; |
| 3063 case CompoundSetter.INVALID: | 3167 case CompoundSetter.INVALID: |
| 3064 buildSuperNoSuchSetter( | 3168 buildSuperNoSuchSetter( |
| 3065 setter, elements.getTypeMask(node), result); | 3169 setter, elements.getTypeMask(node), result, |
| 3170 sourceInformationBuilder.buildAssignment(node)); |
| 3066 return; | 3171 return; |
| 3067 } | 3172 } |
| 3068 }); | 3173 }); |
| 3069 } | 3174 } |
| 3070 | 3175 |
| 3071 @override | 3176 @override |
| 3072 ir.Primitive handleTypeVariableTypeLiteralCompounds( | 3177 ir.Primitive handleTypeVariableTypeLiteralCompounds( |
| 3073 ast.SendSet node, | 3178 ast.SendSet node, |
| 3074 TypeVariableElement typeVariable, | 3179 TypeVariableElement typeVariable, |
| 3075 CompoundRhs rhs, | 3180 CompoundRhs rhs, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3106 return translateCompounds(node, () { | 3211 return translateCompounds(node, () { |
| 3107 Selector selector = new Selector.index(); | 3212 Selector selector = new Selector.index(); |
| 3108 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 3213 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 3109 CallStructure callStructure = | 3214 CallStructure callStructure = |
| 3110 normalizeDynamicArguments(selector.callStructure, arguments); | 3215 normalizeDynamicArguments(selector.callStructure, arguments); |
| 3111 return irBuilder.buildDynamicInvocation( | 3216 return irBuilder.buildDynamicInvocation( |
| 3112 target, | 3217 target, |
| 3113 new Selector(selector.kind, selector.memberName, callStructure), | 3218 new Selector(selector.kind, selector.memberName, callStructure), |
| 3114 elements.getGetterTypeMaskInComplexSendSet(node), | 3219 elements.getGetterTypeMaskInComplexSendSet(node), |
| 3115 arguments, | 3220 arguments, |
| 3116 sourceInformation: | |
| 3117 sourceInformationBuilder.buildCall(receiver, node)); | 3221 sourceInformationBuilder.buildCall(receiver, node)); |
| 3118 }, rhs, (ir.Primitive result) { | 3222 }, rhs, (ir.Primitive result) { |
| 3119 irBuilder.buildDynamicIndexSet( | 3223 irBuilder.buildDynamicIndexSet( |
| 3120 target, | 3224 target, |
| 3121 elements.getTypeMask(node), | 3225 elements.getTypeMask(node), |
| 3122 indexValue, | 3226 indexValue, |
| 3123 result); | 3227 result, |
| 3228 sourceInformationBuilder.buildIndexSet(node)); |
| 3124 }); | 3229 }); |
| 3125 } | 3230 } |
| 3126 | 3231 |
| 3127 @override | 3232 @override |
| 3128 ir.Primitive handleSuperIndexCompounds( | 3233 ir.Primitive handleSuperIndexCompounds( |
| 3129 ast.SendSet node, | 3234 ast.SendSet node, |
| 3130 Element indexFunction, | 3235 Element indexFunction, |
| 3131 Element indexSetFunction, | 3236 Element indexSetFunction, |
| 3132 ast.Node index, | 3237 ast.Node index, |
| 3133 CompoundRhs rhs, | 3238 CompoundRhs rhs, |
| 3134 arg, | 3239 arg, |
| 3135 {bool isGetterValid, | 3240 {bool isGetterValid, |
| 3136 bool isSetterValid}) { | 3241 bool isSetterValid}) { |
| 3137 ir.Primitive indexValue = visit(index); | 3242 ir.Primitive indexValue = visit(index); |
| 3138 return translateCompounds(node, () { | 3243 return translateCompounds(node, () { |
| 3139 return isGetterValid | 3244 if (isGetterValid) { |
| 3140 ? irBuilder.buildSuperIndex(indexFunction, indexValue) | 3245 return irBuilder.buildSuperIndex( |
| 3141 : buildSuperNoSuchMethod( | 3246 indexFunction, |
| 3142 new Selector.index(), | 3247 indexValue, |
| 3143 elements.getGetterTypeMaskInComplexSendSet(node), | 3248 sourceInformationBuilder.buildIndex(node)); |
| 3144 <ir.Primitive>[indexValue]); | 3249 } else { |
| 3250 return buildSuperNoSuchMethod( |
| 3251 new Selector.index(), |
| 3252 elements.getGetterTypeMaskInComplexSendSet(node), |
| 3253 <ir.Primitive>[indexValue], |
| 3254 sourceInformationBuilder.buildIndex(node)); |
| 3255 } |
| 3145 }, rhs, (ir.Primitive result) { | 3256 }, rhs, (ir.Primitive result) { |
| 3146 if (isSetterValid) { | 3257 if (isSetterValid) { |
| 3147 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 3258 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result, |
| 3259 sourceInformationBuilder.buildIndexSet(node)); |
| 3148 } else { | 3260 } else { |
| 3149 buildSuperNoSuchMethod( | 3261 buildSuperNoSuchMethod( |
| 3150 new Selector.indexSet(), | 3262 new Selector.indexSet(), |
| 3151 elements.getTypeMask(node), | 3263 elements.getTypeMask(node), |
| 3152 <ir.Primitive>[indexValue, result]); | 3264 <ir.Primitive>[indexValue, result], |
| 3265 sourceInformationBuilder.buildIndexSet(node)); |
| 3153 } | 3266 } |
| 3154 }); | 3267 }); |
| 3155 } | 3268 } |
| 3156 | 3269 |
| 3157 /// Build code to handle foreign code, that is, native JavaScript code, or | 3270 /// Build code to handle foreign code, that is, native JavaScript code, or |
| 3158 /// builtin values and operations of the backend. | 3271 /// builtin values and operations of the backend. |
| 3159 ir.Primitive handleForeignCode(ast.Send node, | 3272 ir.Primitive handleForeignCode(ast.Send node, |
| 3160 MethodElement function, | 3273 MethodElement function, |
| 3161 ast.NodeList argumentList, | 3274 ast.NodeList argumentList, |
| 3162 CallStructure callStructure) { | 3275 CallStructure callStructure) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3238 ' and number of arguments.'}); | 3351 ' and number of arguments.'}); |
| 3239 return irBuilder.buildNullConstant(); | 3352 return irBuilder.buildNullConstant(); |
| 3240 } | 3353 } |
| 3241 | 3354 |
| 3242 if (HasCapturedPlaceholders.check(behavior.codeTemplate.ast)) { | 3355 if (HasCapturedPlaceholders.check(behavior.codeTemplate.ast)) { |
| 3243 reporter.reportErrorMessage(node, MessageKind.JS_PLACEHOLDER_CAPTURE); | 3356 reporter.reportErrorMessage(node, MessageKind.JS_PLACEHOLDER_CAPTURE); |
| 3244 return irBuilder.buildNullConstant(); | 3357 return irBuilder.buildNullConstant(); |
| 3245 } | 3358 } |
| 3246 | 3359 |
| 3247 return irBuilder.buildForeignCode(behavior.codeTemplate, arguments, | 3360 return irBuilder.buildForeignCode(behavior.codeTemplate, arguments, |
| 3248 behavior); | 3361 behavior, sourceInformationBuilder.buildForeignCode(node)); |
| 3249 | 3362 |
| 3250 case 'DART_CLOSURE_TO_JS': | 3363 case 'DART_CLOSURE_TO_JS': |
| 3251 // TODO(ahe): This should probably take care to wrap the closure in | 3364 // TODO(ahe): This should probably take care to wrap the closure in |
| 3252 // another closure that saves the current isolate. | 3365 // another closure that saves the current isolate. |
| 3253 case 'RAW_DART_FUNCTION_REF': | 3366 case 'RAW_DART_FUNCTION_REF': |
| 3254 validateArgumentCount(exactly: 1); | 3367 validateArgumentCount(exactly: 1); |
| 3255 | 3368 |
| 3256 ast.Node argument = node.arguments.single; | 3369 ast.Node argument = node.arguments.single; |
| 3257 FunctionElement closure = elements[argument].implementation; | 3370 FunctionElement closure = elements[argument].implementation; |
| 3258 if (!Elements.isStaticOrTopLevelFunction(closure)) { | 3371 if (!Elements.isStaticOrTopLevelFunction(closure)) { |
| 3259 internalError(argument, | 3372 internalError(argument, |
| 3260 'only static or toplevel function supported'); | 3373 'only static or toplevel function supported'); |
| 3261 } | 3374 } |
| 3262 if (closure.functionSignature.hasOptionalParameters) { | 3375 if (closure.functionSignature.hasOptionalParameters) { |
| 3263 internalError(argument, | 3376 internalError(argument, |
| 3264 'closures with optional parameters not supported'); | 3377 'closures with optional parameters not supported'); |
| 3265 } | 3378 } |
| 3266 return irBuilder.buildForeignCode( | 3379 return irBuilder.buildForeignCode( |
| 3267 js.js.expressionTemplateYielding( | 3380 js.js.expressionTemplateYielding( |
| 3268 backend.emitter.staticFunctionAccess(closure)), | 3381 backend.emitter.staticFunctionAccess(closure)), |
| 3269 <ir.Primitive>[], | 3382 <ir.Primitive>[], |
| 3270 NativeBehavior.PURE, | 3383 NativeBehavior.PURE, |
| 3384 sourceInformationBuilder.buildForeignCode(node), |
| 3271 dependency: closure); | 3385 dependency: closure); |
| 3272 | 3386 |
| 3273 case 'JS_BUILTIN': | 3387 case 'JS_BUILTIN': |
| 3274 // The first argument is a description of the type and effect of the | 3388 // The first argument is a description of the type and effect of the |
| 3275 // builtin, which has already been analyzed in the frontend. The second | 3389 // builtin, which has already been analyzed in the frontend. The second |
| 3276 // argument must be a [JsBuiltin] value. All other arguments are | 3390 // argument must be a [JsBuiltin] value. All other arguments are |
| 3277 // values used by the JavaScript template that is associated with the | 3391 // values used by the JavaScript template that is associated with the |
| 3278 // builtin. | 3392 // builtin. |
| 3279 validateArgumentCount(minimum: 2); | 3393 validateArgumentCount(minimum: 2); |
| 3280 | 3394 |
| 3281 ast.Node builtin = argumentNodes.tail.head; | 3395 ast.Node builtin = argumentNodes.tail.head; |
| 3282 JsBuiltin value = getEnumValue(builtin, helpers.jsBuiltinEnum, | 3396 JsBuiltin value = getEnumValue(builtin, helpers.jsBuiltinEnum, |
| 3283 JsBuiltin.values); | 3397 JsBuiltin.values); |
| 3284 js.Template template = backend.emitter.builtinTemplateFor(value); | 3398 js.Template template = backend.emitter.builtinTemplateFor(value); |
| 3285 List<ir.Primitive> arguments = | 3399 List<ir.Primitive> arguments = |
| 3286 argumentNodes.skip(2).mapToList(visit, growable: false); | 3400 argumentNodes.skip(2).mapToList(visit, growable: false); |
| 3287 return irBuilder.buildForeignCode(template, arguments, behavior); | 3401 return irBuilder.buildForeignCode(template, arguments, behavior, |
| 3402 sourceInformationBuilder.buildForeignCode(node)); |
| 3288 | 3403 |
| 3289 case 'JS_EMBEDDED_GLOBAL': | 3404 case 'JS_EMBEDDED_GLOBAL': |
| 3290 validateArgumentCount(exactly: 2); | 3405 validateArgumentCount(exactly: 2); |
| 3291 | 3406 |
| 3292 String name = expectStringConstant(argumentNodes.tail.head); | 3407 String name = expectStringConstant(argumentNodes.tail.head); |
| 3293 js.Expression access = | 3408 js.Expression access = |
| 3294 backend.emitter.generateEmbeddedGlobalAccess(name); | 3409 backend.emitter.generateEmbeddedGlobalAccess(name); |
| 3295 js.Template template = js.js.expressionTemplateYielding(access); | 3410 js.Template template = js.js.expressionTemplateYielding(access); |
| 3296 return irBuilder.buildForeignCode(template, <ir.Primitive>[], behavior); | 3411 return irBuilder.buildForeignCode(template, <ir.Primitive>[], behavior, |
| 3412 sourceInformationBuilder.buildForeignCode(node)); |
| 3297 | 3413 |
| 3298 case 'JS_INTERCEPTOR_CONSTANT': | 3414 case 'JS_INTERCEPTOR_CONSTANT': |
| 3299 validateArgumentCount(exactly: 1); | 3415 validateArgumentCount(exactly: 1); |
| 3300 | 3416 |
| 3301 ast.Node argument = argumentNodes.head; | 3417 ast.Node argument = argumentNodes.head; |
| 3302 ir.Primitive argumentValue = visit(argument); | 3418 ir.Primitive argumentValue = visit(argument); |
| 3303 if (argumentValue is ir.Constant && argumentValue.value.isType) { | 3419 if (argumentValue is ir.Constant && argumentValue.value.isType) { |
| 3304 TypeConstantValue constant = argumentValue.value; | 3420 TypeConstantValue constant = argumentValue.value; |
| 3305 ConstantValue interceptorValue = | 3421 ConstantValue interceptorValue = |
| 3306 new InterceptorConstantValue(constant.representedType); | 3422 new InterceptorConstantValue(constant.representedType); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3337 value = compiler.useContentSecurityPolicy; | 3453 value = compiler.useContentSecurityPolicy; |
| 3338 break; | 3454 break; |
| 3339 default: | 3455 default: |
| 3340 internalError(node, 'Unknown internal flag "$name".'); | 3456 internalError(node, 'Unknown internal flag "$name".'); |
| 3341 } | 3457 } |
| 3342 return irBuilder.buildBooleanConstant(value); | 3458 return irBuilder.buildBooleanConstant(value); |
| 3343 | 3459 |
| 3344 case 'JS_STRING_CONCAT': | 3460 case 'JS_STRING_CONCAT': |
| 3345 validateArgumentCount(exactly: 2); | 3461 validateArgumentCount(exactly: 2); |
| 3346 List<ir.Primitive> arguments = argumentNodes.mapToList(visit); | 3462 List<ir.Primitive> arguments = argumentNodes.mapToList(visit); |
| 3347 return irBuilder.buildStringConcatenation(arguments); | 3463 return irBuilder.buildStringConcatenation(arguments, |
| 3464 sourceInformationBuilder.buildForeignCode(node)); |
| 3348 | 3465 |
| 3349 case 'JS_CURRENT_ISOLATE_CONTEXT': | 3466 case 'JS_CURRENT_ISOLATE_CONTEXT': |
| 3350 validateArgumentCount(exactly: 0); | 3467 validateArgumentCount(exactly: 0); |
| 3351 | 3468 |
| 3352 if (!compiler.hasIsolateSupport) { | 3469 if (!compiler.hasIsolateSupport) { |
| 3353 // If the isolate library is not used, we just generate code | 3470 // If the isolate library is not used, we just generate code |
| 3354 // to fetch the current isolate. | 3471 // to fetch the current isolate. |
| 3355 continue getStaticState; | 3472 continue getStaticState; |
| 3356 } | 3473 } |
| 3357 return buildIsolateHelperInvocation(helpers.currentIsolate, | 3474 return buildIsolateHelperInvocation(helpers.currentIsolate, |
| 3358 CallStructure.NO_ARGS); | 3475 CallStructure.NO_ARGS); |
| 3359 | 3476 |
| 3360 getStaticState: case 'JS_GET_STATIC_STATE': | 3477 getStaticState: case 'JS_GET_STATIC_STATE': |
| 3361 validateArgumentCount(exactly: 0); | 3478 validateArgumentCount(exactly: 0); |
| 3362 | 3479 |
| 3363 return irBuilder.buildForeignCode( | 3480 return irBuilder.buildForeignCode( |
| 3364 js.js.parseForeignJS(backend.namer.staticStateHolder), | 3481 js.js.parseForeignJS(backend.namer.staticStateHolder), |
| 3365 const <ir.Primitive>[], | 3482 const <ir.Primitive>[], |
| 3366 NativeBehavior.DEPENDS_OTHER); | 3483 NativeBehavior.DEPENDS_OTHER, |
| 3484 sourceInformationBuilder.buildForeignCode(node)); |
| 3367 | 3485 |
| 3368 case 'JS_SET_STATIC_STATE': | 3486 case 'JS_SET_STATIC_STATE': |
| 3369 validateArgumentCount(exactly: 1); | 3487 validateArgumentCount(exactly: 1); |
| 3370 | 3488 |
| 3371 ir.Primitive value = visit(argumentNodes.single); | 3489 ir.Primitive value = visit(argumentNodes.single); |
| 3372 String isolateName = backend.namer.staticStateHolder; | 3490 String isolateName = backend.namer.staticStateHolder; |
| 3373 return irBuilder.buildForeignCode( | 3491 return irBuilder.buildForeignCode( |
| 3374 js.js.parseForeignJS("$isolateName = #"), | 3492 js.js.parseForeignJS("$isolateName = #"), |
| 3375 <ir.Primitive>[value], | 3493 <ir.Primitive>[value], |
| 3376 NativeBehavior.CHANGES_OTHER); | 3494 NativeBehavior.CHANGES_OTHER, |
| 3495 sourceInformationBuilder.buildForeignCode(node)); |
| 3377 | 3496 |
| 3378 case 'JS_CALL_IN_ISOLATE': | 3497 case 'JS_CALL_IN_ISOLATE': |
| 3379 validateArgumentCount(exactly: 2); | 3498 validateArgumentCount(exactly: 2); |
| 3380 | 3499 |
| 3381 if (!compiler.hasIsolateSupport) { | 3500 if (!compiler.hasIsolateSupport) { |
| 3382 ir.Primitive closure = visit(argumentNodes.tail.head); | 3501 ir.Primitive closure = visit(argumentNodes.tail.head); |
| 3383 return irBuilder.buildCallInvocation(closure, CallStructure.NO_ARGS, | 3502 return irBuilder.buildCallInvocation(closure, CallStructure.NO_ARGS, |
| 3384 const <ir.Primitive>[]); | 3503 const <ir.Primitive>[], |
| 3504 sourceInformationBuilder.buildForeignCode(node)); |
| 3385 } | 3505 } |
| 3386 return buildIsolateHelperInvocation(helpers.callInIsolate, | 3506 return buildIsolateHelperInvocation(helpers.callInIsolate, |
| 3387 CallStructure.TWO_ARGS); | 3507 CallStructure.TWO_ARGS); |
| 3388 | 3508 |
| 3389 default: | 3509 default: |
| 3390 return giveup(node, 'unplemented native construct: ${function.name}'); | 3510 return giveup(node, 'unplemented native construct: ${function.name}'); |
| 3391 } | 3511 } |
| 3392 } | 3512 } |
| 3393 | 3513 |
| 3394 /// Evaluates a string interpolation and appends each part to [accumulator] | 3514 /// Evaluates a string interpolation and appends each part to [accumulator] |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3408 // do not bother to include them. | 3528 // do not bother to include them. |
| 3409 if (!node.dartString.isEmpty) { | 3529 if (!node.dartString.isEmpty) { |
| 3410 accumulator.add(irBuilder.buildDartStringConstant(node.dartString)); | 3530 accumulator.add(irBuilder.buildDartStringConstant(node.dartString)); |
| 3411 } | 3531 } |
| 3412 } else if (node is ast.ParenthesizedExpression) { | 3532 } else if (node is ast.ParenthesizedExpression) { |
| 3413 buildStringParts(node.expression, accumulator); | 3533 buildStringParts(node.expression, accumulator); |
| 3414 } else { | 3534 } else { |
| 3415 ir.Primitive value = visit(node); | 3535 ir.Primitive value = visit(node); |
| 3416 accumulator.add(irBuilder.buildStaticFunctionInvocation( | 3536 accumulator.add(irBuilder.buildStaticFunctionInvocation( |
| 3417 helpers.stringInterpolationHelper, | 3537 helpers.stringInterpolationHelper, |
| 3418 <ir.Primitive>[value])); | 3538 <ir.Primitive>[value], |
| 3539 sourceInformationBuilder.buildStringInterpolation(node))); |
| 3419 } | 3540 } |
| 3420 } | 3541 } |
| 3421 | 3542 |
| 3422 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { | 3543 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { |
| 3423 assert(irBuilder.isOpen); | 3544 assert(irBuilder.isOpen); |
| 3424 List<ir.Primitive> parts = <ir.Primitive>[]; | 3545 List<ir.Primitive> parts = <ir.Primitive>[]; |
| 3425 buildStringParts(node, parts); | 3546 buildStringParts(node, parts); |
| 3426 return irBuilder.buildStringConcatenation(parts); | 3547 return irBuilder.buildStringConcatenation(parts, |
| 3548 sourceInformationBuilder.buildStringInterpolation(node)); |
| 3427 } | 3549 } |
| 3428 | 3550 |
| 3429 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { | 3551 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { |
| 3430 assert(irBuilder.isOpen); | 3552 assert(irBuilder.isOpen); |
| 3431 List<ir.Primitive> parts = <ir.Primitive>[]; | 3553 List<ir.Primitive> parts = <ir.Primitive>[]; |
| 3432 buildStringParts(node, parts); | 3554 buildStringParts(node, parts); |
| 3433 return irBuilder.buildStringConcatenation(parts); | 3555 return irBuilder.buildStringConcatenation(parts, |
| 3556 sourceInformationBuilder.buildStringInterpolation(node)); |
| 3434 } | 3557 } |
| 3435 | 3558 |
| 3436 ir.Primitive translateConstant(ast.Node node) { | 3559 ir.Primitive translateConstant(ast.Node node) { |
| 3437 assert(irBuilder.isOpen); | 3560 assert(irBuilder.isOpen); |
| 3438 return irBuilder.buildConstant( | 3561 return irBuilder.buildConstant( |
| 3439 getConstantForNode(node), | 3562 getConstantForNode(node), |
| 3440 sourceInformation: sourceInformationBuilder.buildGet(node)); | 3563 sourceInformation: sourceInformationBuilder.buildGet(node)); |
| 3441 } | 3564 } |
| 3442 | 3565 |
| 3443 ir.Primitive visitThrow(ast.Throw node) { | 3566 ir.Primitive visitThrow(ast.Throw node) { |
| 3444 assert(irBuilder.isOpen); | 3567 assert(irBuilder.isOpen); |
| 3445 // This function is not called for throw expressions occurring as | 3568 // This function is not called for throw expressions occurring as |
| 3446 // statements. | 3569 // statements. |
| 3447 return irBuilder.buildNonTailThrow(visit(node.expression)); | 3570 return irBuilder.buildNonTailThrow(visit(node.expression)); |
| 3448 } | 3571 } |
| 3449 | 3572 |
| 3450 ir.Primitive buildSuperNoSuchMethod(Selector selector, | 3573 ir.Primitive buildSuperNoSuchMethod( |
| 3574 Selector selector, |
| 3451 TypeMask mask, | 3575 TypeMask mask, |
| 3452 List<ir.Primitive> arguments) { | 3576 List<ir.Primitive> arguments, |
| 3577 SourceInformation sourceInformation) { |
| 3453 ClassElement cls = elements.analyzedElement.enclosingClass; | 3578 ClassElement cls = elements.analyzedElement.enclosingClass; |
| 3454 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); | 3579 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); |
| 3455 if (!Selectors.noSuchMethod_.signatureApplies(element)) { | 3580 if (!Selectors.noSuchMethod_.signatureApplies(element)) { |
| 3456 element = compiler.coreClasses.objectClass.lookupMember( | 3581 element = compiler.coreClasses.objectClass.lookupMember( |
| 3457 Identifiers.noSuchMethod_); | 3582 Identifiers.noSuchMethod_); |
| 3458 } | 3583 } |
| 3459 return irBuilder.buildSuperMethodInvocation( | 3584 return irBuilder.buildSuperMethodInvocation( |
| 3460 element, | 3585 element, |
| 3461 Selectors.noSuchMethod_.callStructure, | 3586 Selectors.noSuchMethod_.callStructure, |
| 3462 [irBuilder.buildInvocationMirror(selector, arguments)]); | 3587 [irBuilder.buildInvocationMirror(selector, arguments)], |
| 3588 sourceInformation); |
| 3463 } | 3589 } |
| 3464 | 3590 |
| 3465 @override | 3591 @override |
| 3466 ir.Primitive visitUnresolvedCompound( | 3592 ir.Primitive visitUnresolvedCompound( |
| 3467 ast.Send node, | 3593 ast.Send node, |
| 3468 Element element, | 3594 Element element, |
| 3469 op.AssignmentOperator operator, | 3595 op.AssignmentOperator operator, |
| 3470 ast.Node rhs, _) { | 3596 ast.Node rhs, _) { |
| 3471 // TODO(asgerf): What is unresolved? The getter and/or the setter? | 3597 return irBuilder.buildStaticNoSuchMethod( |
| 3472 // If it was the setter, we must evaluate the right-hand side. | 3598 new Selector.getter(new Name(element.name, element.library)), |
| 3473 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), []); | 3599 [], |
| 3600 sourceInformationBuilder.buildGet(node)); |
| 3474 } | 3601 } |
| 3475 | 3602 |
| 3476 @override | 3603 @override |
| 3477 ir.Primitive visitUnresolvedClassConstructorInvoke( | 3604 ir.Primitive visitUnresolvedClassConstructorInvoke( |
| 3478 ast.NewExpression node, | 3605 ast.NewExpression node, |
| 3479 Element element, | 3606 Element element, |
| 3480 DartType type, | 3607 DartType type, |
| 3481 ast.NodeList arguments, | 3608 ast.NodeList arguments, |
| 3482 Selector selector, _) { | 3609 Selector selector, _) { |
| 3483 // If the class is missing it's a runtime error. | 3610 // If the class is missing it's a runtime error. |
| 3484 ir.Primitive message = | 3611 ir.Primitive message = |
| 3485 irBuilder.buildStringConstant("Unresolved class: '${element.name}'"); | 3612 irBuilder.buildStringConstant("Unresolved class: '${element.name}'"); |
| 3486 return irBuilder.buildStaticFunctionInvocation( | 3613 return irBuilder.buildStaticFunctionInvocation( |
| 3487 helpers.throwRuntimeError, | 3614 helpers.throwRuntimeError, |
| 3488 <ir.Primitive>[message]); | 3615 <ir.Primitive>[message], |
| 3616 sourceInformationBuilder.buildNew(node)); |
| 3489 } | 3617 } |
| 3490 | 3618 |
| 3491 @override | 3619 @override |
| 3492 ir.Primitive visitUnresolvedConstructorInvoke( | 3620 ir.Primitive visitUnresolvedConstructorInvoke( |
| 3493 ast.NewExpression node, | 3621 ast.NewExpression node, |
| 3494 Element constructor, | 3622 Element constructor, |
| 3495 DartType type, | 3623 DartType type, |
| 3496 ast.NodeList argumentsNode, | 3624 ast.NodeList argumentsNode, |
| 3497 Selector selector, _) { | 3625 Selector selector, _) { |
| 3498 // If the class is there but the constructor is missing, it's an NSM error. | 3626 // If the class is there but the constructor is missing, it's an NSM error. |
| 3499 List<ir.Primitive> arguments = <ir.Primitive>[]; | 3627 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 3500 CallStructure callStructure = translateDynamicArguments( | 3628 CallStructure callStructure = translateDynamicArguments( |
| 3501 argumentsNode, selector.callStructure, arguments); | 3629 argumentsNode, selector.callStructure, arguments); |
| 3502 return irBuilder.buildStaticNoSuchMethod( | 3630 return irBuilder.buildStaticNoSuchMethod( |
| 3503 new Selector(selector.kind, selector.memberName, callStructure), | 3631 new Selector(selector.kind, selector.memberName, callStructure), |
| 3504 arguments); | 3632 arguments, |
| 3633 sourceInformationBuilder.buildNew(node)); |
| 3505 } | 3634 } |
| 3506 | 3635 |
| 3507 @override | 3636 @override |
| 3508 ir.Primitive visitConstructorIncompatibleInvoke( | 3637 ir.Primitive visitConstructorIncompatibleInvoke( |
| 3509 ast.NewExpression node, | 3638 ast.NewExpression node, |
| 3510 ConstructorElement constructor, | 3639 ConstructorElement constructor, |
| 3511 DartType type, | 3640 DartType type, |
| 3512 ast.NodeList argumentsNode, | 3641 ast.NodeList argumentsNode, |
| 3513 CallStructure callStructure, _) { | 3642 CallStructure callStructure, _) { |
| 3514 List<ir.Primitive> arguments = <ir.Primitive>[]; | 3643 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 3515 callStructure = | 3644 callStructure = |
| 3516 translateDynamicArguments(argumentsNode, callStructure, arguments); | 3645 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 3517 return irBuilder.buildStaticNoSuchMethod( | 3646 return irBuilder.buildStaticNoSuchMethod( |
| 3518 new Selector.call(constructor.memberName, callStructure), arguments); | 3647 new Selector.call(constructor.memberName, callStructure), arguments, |
| 3648 sourceInformationBuilder.buildNew(node)); |
| 3519 } | 3649 } |
| 3520 | 3650 |
| 3521 @override | 3651 @override |
| 3522 ir.Primitive visitUnresolvedGet( | 3652 ir.Primitive visitUnresolvedGet( |
| 3523 ast.Send node, | 3653 ast.Send node, |
| 3524 Element element, _) { | 3654 Element element, _) { |
| 3525 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), []); | 3655 return irBuilder.buildStaticNoSuchMethod( |
| 3656 elements.getSelector(node), [], |
| 3657 sourceInformationBuilder.buildGet(node)); |
| 3526 } | 3658 } |
| 3527 | 3659 |
| 3528 @override | 3660 @override |
| 3529 ir.Primitive visitUnresolvedInvoke( | 3661 ir.Primitive visitUnresolvedInvoke( |
| 3530 ast.Send node, | 3662 ast.Send node, |
| 3531 Element element, | 3663 Element element, |
| 3532 ast.NodeList arguments, | 3664 ast.NodeList arguments, |
| 3533 Selector selector, _) { | 3665 Selector selector, _) { |
| 3534 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), | 3666 return irBuilder.buildStaticNoSuchMethod( |
| 3535 arguments.nodes.mapToList(visit)); | 3667 elements.getSelector(node), |
| 3668 arguments.nodes.mapToList(visit), |
| 3669 sourceInformationBuilder.buildCall(node, node.selector)); |
| 3536 } | 3670 } |
| 3537 | 3671 |
| 3538 @override | 3672 @override |
| 3539 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( | 3673 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( |
| 3540 ast.NewExpression node, | 3674 ast.NewExpression node, |
| 3541 ConstructorElement constructor, | 3675 ConstructorElement constructor, |
| 3542 InterfaceType type, | 3676 InterfaceType type, |
| 3543 ast.NodeList argumentsNode, | 3677 ast.NodeList argumentsNode, |
| 3544 CallStructure callStructure, _) { | 3678 CallStructure callStructure, _) { |
| 3545 String nameString = Elements.reconstructConstructorName(constructor); | 3679 String nameString = Elements.reconstructConstructorName(constructor); |
| 3546 Name name = new Name(nameString, constructor.library); | 3680 Name name = new Name(nameString, constructor.library); |
| 3547 List<ir.Primitive> arguments = <ir.Primitive>[]; | 3681 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 3548 callStructure = | 3682 callStructure = |
| 3549 translateDynamicArguments(argumentsNode, callStructure, arguments); | 3683 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 3550 return irBuilder.buildStaticNoSuchMethod( | 3684 return irBuilder.buildStaticNoSuchMethod( |
| 3551 new Selector.call(name, callStructure), | 3685 new Selector.call(name, callStructure), |
| 3552 arguments); | 3686 arguments, |
| 3687 sourceInformationBuilder.buildNew(node)); |
| 3553 } | 3688 } |
| 3554 | 3689 |
| 3555 @override | 3690 @override |
| 3556 ir.Primitive visitUnresolvedSet( | 3691 ir.Primitive visitUnresolvedSet( |
| 3557 ast.Send node, | 3692 ast.Send node, |
| 3558 Element element, | 3693 Element element, |
| 3559 ast.Node rhs, _) { | 3694 ast.Node rhs, _) { |
| 3560 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), | 3695 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), |
| 3561 [visit(rhs)]); | 3696 [visit(rhs)], |
| 3697 sourceInformationBuilder.buildAssignment(node)); |
| 3562 } | 3698 } |
| 3563 | 3699 |
| 3564 @override | 3700 @override |
| 3565 ir.Primitive visitUnresolvedSuperIndex( | 3701 ir.Primitive visitUnresolvedSuperIndex( |
| 3566 ast.Send node, | 3702 ast.Send node, |
| 3567 Element function, | 3703 Element function, |
| 3568 ast.Node index, _) { | 3704 ast.Node index, _) { |
| 3569 // Assume the index getter is missing. | 3705 // Assume the index getter is missing. |
| 3570 return buildSuperNoSuchMethod( | 3706 return buildSuperNoSuchMethod( |
| 3571 new Selector.index(), elements.getTypeMask(node), [visit(index)]); | 3707 new Selector.index(), elements.getTypeMask(node), [visit(index)], |
| 3708 sourceInformationBuilder.buildIndex(node)); |
| 3572 } | 3709 } |
| 3573 | 3710 |
| 3574 @override | 3711 @override |
| 3575 ir.Primitive visitUnresolvedSuperBinary( | 3712 ir.Primitive visitUnresolvedSuperBinary( |
| 3576 ast.Send node, | 3713 ast.Send node, |
| 3577 Element element, | 3714 Element element, |
| 3578 op.BinaryOperator operator, | 3715 op.BinaryOperator operator, |
| 3579 ast.Node argument, _) { | 3716 ast.Node argument, _) { |
| 3580 return buildSuperNoSuchMethod( | 3717 return buildSuperNoSuchMethod( |
| 3581 elements.getSelector(node), | 3718 elements.getSelector(node), |
| 3582 elements.getTypeMask(node), | 3719 elements.getTypeMask(node), |
| 3583 [visit(argument)]); | 3720 [visit(argument)], |
| 3721 sourceInformationBuilder.buildCall(node, node.selector)); |
| 3584 } | 3722 } |
| 3585 | 3723 |
| 3586 @override | 3724 @override |
| 3587 ir.Primitive visitUnresolvedSuperUnary( | 3725 ir.Primitive visitUnresolvedSuperUnary( |
| 3588 ast.Send node, | 3726 ast.Send node, |
| 3589 op.UnaryOperator operator, | 3727 op.UnaryOperator operator, |
| 3590 Element element, _) { | 3728 Element element, _) { |
| 3591 return buildSuperNoSuchMethod( | 3729 return buildSuperNoSuchMethod( |
| 3592 elements.getSelector(node), elements.getTypeMask(node), []); | 3730 elements.getSelector(node), elements.getTypeMask(node), [], |
| 3731 sourceInformationBuilder.buildCall(node, node.selector)); |
| 3593 } | 3732 } |
| 3594 | 3733 |
| 3595 @override | 3734 @override |
| 3596 ir.Primitive bulkHandleNode(ast.Node node, String message, _) { | 3735 ir.Primitive bulkHandleNode(ast.Node node, String message, _) { |
| 3597 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}"); | 3736 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}"); |
| 3598 } | 3737 } |
| 3599 | 3738 |
| 3600 @override | 3739 @override |
| 3601 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) { | 3740 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) { |
| 3602 return irBuilder.buildNullConstant(); | 3741 return irBuilder.buildNullConstant(); |
| 3603 } | 3742 } |
| 3604 | 3743 |
| 3605 @override | 3744 @override |
| 3606 ir.Primitive visitClassTypeLiteralSet( | 3745 ir.Primitive visitClassTypeLiteralSet( |
| 3607 ast.SendSet node, | 3746 ast.SendSet node, |
| 3608 TypeConstantExpression constant, | 3747 TypeConstantExpression constant, |
| 3609 ast.Node rhs, _) { | 3748 ast.Node rhs, _) { |
| 3610 InterfaceType type = constant.type; | 3749 InterfaceType type = constant.type; |
| 3611 ClassElement element = type.element; | 3750 ClassElement element = type.element; |
| 3612 return irBuilder.buildStaticNoSuchMethod( | 3751 return irBuilder.buildStaticNoSuchMethod( |
| 3613 new Selector.setter(element.memberName), | 3752 new Selector.setter(element.memberName), |
| 3614 [visit(rhs)]); | 3753 [visit(rhs)], |
| 3754 sourceInformationBuilder.buildAssignment(node)); |
| 3615 } | 3755 } |
| 3616 | 3756 |
| 3617 @override | 3757 @override |
| 3618 ir.Primitive visitTypedefTypeLiteralSet( | 3758 ir.Primitive visitTypedefTypeLiteralSet( |
| 3619 ast.SendSet node, | 3759 ast.SendSet node, |
| 3620 TypeConstantExpression constant, | 3760 TypeConstantExpression constant, |
| 3621 ast.Node rhs, _) { | 3761 ast.Node rhs, _) { |
| 3622 TypedefType type = constant.type; | 3762 TypedefType type = constant.type; |
| 3623 TypedefElement element = type.element; | 3763 TypedefElement element = type.element; |
| 3624 return irBuilder.buildStaticNoSuchMethod( | 3764 return irBuilder.buildStaticNoSuchMethod( |
| 3625 new Selector.setter(element.memberName), | 3765 new Selector.setter(element.memberName), |
| 3626 [visit(rhs)]); | 3766 [visit(rhs)], |
| 3767 sourceInformationBuilder.buildAssignment(node)); |
| 3627 } | 3768 } |
| 3628 | 3769 |
| 3629 @override | 3770 @override |
| 3630 ir.Primitive visitTypeVariableTypeLiteralSet( | 3771 ir.Primitive visitTypeVariableTypeLiteralSet( |
| 3631 ast.SendSet node, | 3772 ast.SendSet node, |
| 3632 TypeVariableElement element, | 3773 TypeVariableElement element, |
| 3633 ast.Node rhs, _) { | 3774 ast.Node rhs, _) { |
| 3634 return irBuilder.buildStaticNoSuchMethod( | 3775 return irBuilder.buildStaticNoSuchMethod( |
| 3635 new Selector.setter(element.memberName), [visit(rhs)]); | 3776 new Selector.setter(element.memberName), [visit(rhs)], |
| 3777 sourceInformationBuilder.buildAssignment(node)); |
| 3636 } | 3778 } |
| 3637 | 3779 |
| 3638 @override | 3780 @override |
| 3639 ir.Primitive visitDynamicTypeLiteralSet( | 3781 ir.Primitive visitDynamicTypeLiteralSet( |
| 3640 ast.SendSet node, | 3782 ast.SendSet node, |
| 3641 ConstantExpression constant, | 3783 ConstantExpression constant, |
| 3642 ast.Node rhs, _) { | 3784 ast.Node rhs, _) { |
| 3643 return irBuilder.buildStaticNoSuchMethod( | 3785 return irBuilder.buildStaticNoSuchMethod( |
| 3644 new Selector.setter(Names.dynamic_), [visit(rhs)]); | 3786 new Selector.setter(Names.dynamic_), [visit(rhs)], |
| 3787 sourceInformationBuilder.buildAssignment(node)); |
| 3645 } | 3788 } |
| 3646 | 3789 |
| 3647 @override | 3790 @override |
| 3648 ir.Primitive visitAbstractClassConstructorInvoke( | 3791 ir.Primitive visitAbstractClassConstructorInvoke( |
| 3649 ast.NewExpression node, | 3792 ast.NewExpression node, |
| 3650 ConstructorElement element, | 3793 ConstructorElement element, |
| 3651 InterfaceType type, | 3794 InterfaceType type, |
| 3652 ast.NodeList arguments, | 3795 ast.NodeList arguments, |
| 3653 CallStructure callStructure, _) { | 3796 CallStructure callStructure, _) { |
| 3654 for (ast.Node argument in arguments) visit(argument); | 3797 for (ast.Node argument in arguments) visit(argument); |
| 3655 ir.Primitive name = | 3798 ir.Primitive name = |
| 3656 irBuilder.buildStringConstant(element.enclosingClass.name); | 3799 irBuilder.buildStringConstant(element.enclosingClass.name); |
| 3657 return irBuilder.buildStaticFunctionInvocation( | 3800 return irBuilder.buildStaticFunctionInvocation( |
| 3658 helpers.throwAbstractClassInstantiationError, | 3801 helpers.throwAbstractClassInstantiationError, |
| 3659 <ir.Primitive>[name]); | 3802 <ir.Primitive>[name], |
| 3803 sourceInformationBuilder.buildNew(node)); |
| 3660 } | 3804 } |
| 3661 | 3805 |
| 3662 @override | 3806 @override |
| 3663 ir.Primitive handleFinalStaticFieldSet( | 3807 ir.Primitive handleFinalStaticFieldSet( |
| 3664 ast.SendSet node, | 3808 ast.SendSet node, |
| 3665 FieldElement field, | 3809 FieldElement field, |
| 3666 ast.Node rhs, _) { | 3810 ast.Node rhs, _) { |
| 3667 // TODO(asgerf): Include class name somehow for static class members? | 3811 // TODO(asgerf): Include class name somehow for static class members? |
| 3668 return irBuilder.buildStaticNoSuchMethod( | 3812 return irBuilder.buildStaticNoSuchMethod( |
| 3669 new Selector.setter(field.memberName), | 3813 new Selector.setter(field.memberName), |
| 3670 [visit(rhs)]); | 3814 [visit(rhs)], |
| 3815 sourceInformationBuilder.buildAssignment(node)); |
| 3671 } | 3816 } |
| 3672 | 3817 |
| 3673 @override | 3818 @override |
| 3674 ir.Primitive visitFinalSuperFieldSet( | 3819 ir.Primitive visitFinalSuperFieldSet( |
| 3675 ast.SendSet node, | 3820 ast.SendSet node, |
| 3676 FieldElement field, | 3821 FieldElement field, |
| 3677 ast.Node rhs, _) { | 3822 ast.Node rhs, _) { |
| 3678 return buildSuperNoSuchMethod( | 3823 return buildSuperNoSuchMethod( |
| 3679 new Selector.setter(field.memberName), | 3824 new Selector.setter(field.memberName), |
| 3680 elements.getTypeMask(node), | 3825 elements.getTypeMask(node), |
| 3681 [visit(rhs)]); | 3826 [visit(rhs)], |
| 3827 sourceInformationBuilder.buildAssignment(node)); |
| 3682 } | 3828 } |
| 3683 | 3829 |
| 3684 @override | 3830 @override |
| 3685 ir.Primitive handleImmutableLocalSet( | 3831 ir.Primitive handleImmutableLocalSet( |
| 3686 ast.SendSet node, | 3832 ast.SendSet node, |
| 3687 LocalElement local, | 3833 LocalElement local, |
| 3688 ast.Node rhs, _) { | 3834 ast.Node rhs, _) { |
| 3689 return irBuilder.buildStaticNoSuchMethod( | 3835 return irBuilder.buildStaticNoSuchMethod( |
| 3690 new Selector.setter(new Name(local.name, local.library)), | 3836 new Selector.setter(new Name(local.name, local.library)), |
| 3691 [visit(rhs)]); | 3837 [visit(rhs)], |
| 3838 sourceInformationBuilder.buildAssignment(node)); |
| 3692 } | 3839 } |
| 3693 | 3840 |
| 3694 @override | 3841 @override |
| 3695 ir.Primitive handleStaticFunctionSet( | 3842 ir.Primitive handleStaticFunctionSet( |
| 3696 ast.Send node, | 3843 ast.Send node, |
| 3697 MethodElement function, | 3844 MethodElement function, |
| 3698 ast.Node rhs, | 3845 ast.Node rhs, |
| 3699 _) { | 3846 _) { |
| 3700 return irBuilder.buildStaticNoSuchMethod( | 3847 return irBuilder.buildStaticNoSuchMethod( |
| 3701 new Selector.setter(function.memberName), | 3848 new Selector.setter(function.memberName), |
| 3702 [visit(rhs)]); | 3849 [visit(rhs)], |
| 3850 sourceInformationBuilder.buildAssignment(node)); |
| 3703 } | 3851 } |
| 3704 | 3852 |
| 3705 @override | 3853 @override |
| 3706 ir.Primitive handleStaticGetterSet( | 3854 ir.Primitive handleStaticGetterSet( |
| 3707 ast.SendSet node, | 3855 ast.SendSet node, |
| 3708 GetterElement getter, | 3856 GetterElement getter, |
| 3709 ast.Node rhs, | 3857 ast.Node rhs, |
| 3710 _) { | 3858 _) { |
| 3711 return irBuilder.buildStaticNoSuchMethod( | 3859 return irBuilder.buildStaticNoSuchMethod( |
| 3712 new Selector.setter(getter.memberName), | 3860 new Selector.setter(getter.memberName), |
| 3713 [visit(rhs)]); | 3861 [visit(rhs)], |
| 3862 sourceInformationBuilder.buildAssignment(node)); |
| 3714 } | 3863 } |
| 3715 | 3864 |
| 3716 @override | 3865 @override |
| 3717 ir.Primitive handleStaticSetterGet( | 3866 ir.Primitive handleStaticSetterGet( |
| 3718 ast.Send node, | 3867 ast.Send node, |
| 3719 SetterElement setter, | 3868 SetterElement setter, |
| 3720 _) { | 3869 _) { |
| 3721 return irBuilder.buildStaticNoSuchMethod( | 3870 return irBuilder.buildStaticNoSuchMethod( |
| 3722 new Selector.getter(setter.memberName), | 3871 new Selector.getter(setter.memberName), |
| 3723 []); | 3872 [], |
| 3873 sourceInformationBuilder.buildGet(node)); |
| 3724 } | 3874 } |
| 3725 | 3875 |
| 3726 @override | 3876 @override |
| 3727 ir.Primitive handleStaticSetterInvoke( | 3877 ir.Primitive handleStaticSetterInvoke( |
| 3728 ast.Send node, | 3878 ast.Send node, |
| 3729 SetterElement setter, | 3879 SetterElement setter, |
| 3730 ast.NodeList argumentsNode, | 3880 ast.NodeList argumentsNode, |
| 3731 CallStructure callStructure, _) { | 3881 CallStructure callStructure, _) { |
| 3732 // Translate as a method call. | 3882 // Translate as a method call. |
| 3733 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); | 3883 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); |
| 3734 return irBuilder.buildStaticNoSuchMethod( | 3884 return irBuilder.buildStaticNoSuchMethod( |
| 3735 new Selector.call(setter.memberName, callStructure), | 3885 new Selector.call(setter.memberName, callStructure), |
| 3736 arguments); | 3886 arguments, |
| 3887 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 3737 } | 3888 } |
| 3738 | 3889 |
| 3739 @override | 3890 @override |
| 3740 ir.Primitive visitSuperGetterSet( | 3891 ir.Primitive visitSuperGetterSet( |
| 3741 ast.SendSet node, | 3892 ast.SendSet node, |
| 3742 GetterElement getter, | 3893 GetterElement getter, |
| 3743 ast.Node rhs, | 3894 ast.Node rhs, |
| 3744 _) { | 3895 _) { |
| 3745 return buildSuperNoSuchMethod( | 3896 return buildSuperNoSuchMethod( |
| 3746 new Selector.setter(getter.memberName), | 3897 new Selector.setter(getter.memberName), |
| 3747 elements.getTypeMask(node), | 3898 elements.getTypeMask(node), |
| 3748 [visit(rhs)]); | 3899 [visit(rhs)], |
| 3900 sourceInformationBuilder.buildAssignment(node)); |
| 3749 } | 3901 } |
| 3750 | 3902 |
| 3751 @override | 3903 @override |
| 3752 ir.Primitive visitSuperMethodSet( | 3904 ir.Primitive visitSuperMethodSet( |
| 3753 ast.Send node, | 3905 ast.Send node, |
| 3754 MethodElement method, | 3906 MethodElement method, |
| 3755 ast.Node rhs, | 3907 ast.Node rhs, |
| 3756 _) { | 3908 _) { |
| 3757 return buildSuperNoSuchMethod( | 3909 return buildSuperNoSuchMethod( |
| 3758 new Selector.setter(method.memberName), | 3910 new Selector.setter(method.memberName), |
| 3759 elements.getTypeMask(node), | 3911 elements.getTypeMask(node), |
| 3760 [visit(rhs)]); | 3912 [visit(rhs)], |
| 3913 sourceInformationBuilder.buildAssignment(node)); |
| 3761 } | 3914 } |
| 3762 | 3915 |
| 3763 @override | 3916 @override |
| 3764 ir.Primitive visitSuperSetterGet( | 3917 ir.Primitive visitSuperSetterGet( |
| 3765 ast.Send node, | 3918 ast.Send node, |
| 3766 SetterElement setter, _) { | 3919 SetterElement setter, _) { |
| 3767 return buildSuperNoSuchMethod( | 3920 return buildSuperNoSuchMethod( |
| 3768 new Selector.setter(setter.memberName), | 3921 new Selector.setter(setter.memberName), |
| 3769 elements.getTypeMask(node), | 3922 elements.getTypeMask(node), |
| 3770 []); | 3923 [], |
| 3924 sourceInformationBuilder.buildGet(node)); |
| 3771 } | 3925 } |
| 3772 | 3926 |
| 3773 @override | 3927 @override |
| 3774 ir.Primitive visitSuperSetterInvoke( | 3928 ir.Primitive visitSuperSetterInvoke( |
| 3775 ast.Send node, | 3929 ast.Send node, |
| 3776 SetterElement setter, | 3930 SetterElement setter, |
| 3777 ast.NodeList argumentsNode, | 3931 ast.NodeList argumentsNode, |
| 3778 CallStructure callStructure, _) { | 3932 CallStructure callStructure, _) { |
| 3779 List<ir.Primitive> arguments = <ir.Primitive>[]; | 3933 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 3780 callStructure = | 3934 callStructure = |
| 3781 translateDynamicArguments(argumentsNode, callStructure, arguments); | 3935 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 3782 return buildSuperNoSuchMethod( | 3936 return buildSuperNoSuchMethod( |
| 3783 new Selector.call(setter.memberName, callStructure), | 3937 new Selector.call(setter.memberName, callStructure), |
| 3784 elements.getTypeMask(node), | 3938 elements.getTypeMask(node), |
| 3785 arguments); | 3939 arguments, |
| 3940 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 3786 } | 3941 } |
| 3787 | 3942 |
| 3788 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { | 3943 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { |
| 3789 try { | 3944 try { |
| 3790 return action(); | 3945 return action(); |
| 3791 } catch(e) { | 3946 } catch(e) { |
| 3792 if (e == ABORT_IRNODE_BUILDER) { | 3947 if (e == ABORT_IRNODE_BUILDER) { |
| 3793 return null; | 3948 return null; |
| 3794 } | 3949 } |
| 3795 rethrow; | 3950 rethrow; |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4047 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass); | 4202 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass); |
| 4048 | 4203 |
| 4049 String getJsInteropTargetPath(FunctionElement element) { | 4204 String getJsInteropTargetPath(FunctionElement element) { |
| 4050 return '${_backend.namer.fixedBackendPath(element)}.' | 4205 return '${_backend.namer.fixedBackendPath(element)}.' |
| 4051 '${_backend.getFixedBackendName(element)}'; | 4206 '${_backend.getFixedBackendName(element)}'; |
| 4052 } | 4207 } |
| 4053 | 4208 |
| 4054 DartType get jsJavascriptObjectType => | 4209 DartType get jsJavascriptObjectType => |
| 4055 _backend.helpers.jsJavaScriptObjectClass.thisType; | 4210 _backend.helpers.jsJavaScriptObjectClass.thisType; |
| 4056 } | 4211 } |
| OLD | NEW |