| 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 Names, | 10 Names, |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 if (enclosingClass.isMixinApplication) { | 638 if (enclosingClass.isMixinApplication) { |
| 639 forwardSynthesizedMixinConstructor(constructor, supers, fieldValues); | 639 forwardSynthesizedMixinConstructor(constructor, supers, fieldValues); |
| 640 return; | 640 return; |
| 641 } | 641 } |
| 642 // Evaluate initializing parameters, e.g. `Foo(this.x)`. | 642 // Evaluate initializing parameters, e.g. `Foo(this.x)`. |
| 643 constructor.functionSignature.orderedForEachParameter( | 643 constructor.functionSignature.orderedForEachParameter( |
| 644 (ParameterElement parameter) { | 644 (ParameterElement parameter) { |
| 645 if (parameter.isInitializingFormal) { | 645 if (parameter.isInitializingFormal) { |
| 646 InitializingFormalElement fieldParameter = parameter; | 646 InitializingFormalElement fieldParameter = parameter; |
| 647 fieldValues[fieldParameter.fieldElement] = | 647 fieldValues[fieldParameter.fieldElement] = |
| 648 irBuilder.buildLocalVariableGet(parameter); | 648 irBuilder.buildLocalGet(parameter); |
| 649 } | 649 } |
| 650 }); | 650 }); |
| 651 // Evaluate constructor initializers, e.g. `Foo() : x = 50`. | 651 // Evaluate constructor initializers, e.g. `Foo() : x = 50`. |
| 652 ast.FunctionExpression node = constructor.node; | 652 ast.FunctionExpression node = constructor.node; |
| 653 bool hasConstructorCall = false; // Has this() or super() initializer? | 653 bool hasConstructorCall = false; // Has this() or super() initializer? |
| 654 if (node != null && node.initializers != null) { | 654 if (node != null && node.initializers != null) { |
| 655 for(ast.Node initializer in node.initializers) { | 655 for(ast.Node initializer in node.initializers) { |
| 656 if (initializer is ast.SendSet) { | 656 if (initializer is ast.SendSet) { |
| 657 // Field initializer. | 657 // Field initializer. |
| 658 FieldElement field = elements[initializer]; | 658 FieldElement field = elements[initializer]; |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 callStructure.getOrderedNamedArguments()); | 862 callStructure.getOrderedNamedArguments()); |
| 863 } | 863 } |
| 864 | 864 |
| 865 /// Read the value of [field]. | 865 /// Read the value of [field]. |
| 866 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { | 866 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { |
| 867 ConstantValue constant = getConstantForVariable(field); | 867 ConstantValue constant = getConstantForVariable(field); |
| 868 if (constant != null && !field.isAssignable) { | 868 if (constant != null && !field.isAssignable) { |
| 869 typeMaskSystem.associateConstantValueWithElement(constant, field); | 869 typeMaskSystem.associateConstantValueWithElement(constant, field); |
| 870 return irBuilder.buildConstant(constant, sourceInformation: src); | 870 return irBuilder.buildConstant(constant, sourceInformation: src); |
| 871 } else if (backend.constants.lazyStatics.contains(field)) { | 871 } else if (backend.constants.lazyStatics.contains(field)) { |
| 872 return irBuilder.buildStaticFieldLazyGet(field, src); | 872 return irBuilder.addPrimitive(new ir.GetLazyStatic(field, src)); |
| 873 } else { | 873 } else { |
| 874 return irBuilder.buildStaticFieldGet(field, src); | 874 return irBuilder.addPrimitive(new ir.GetStatic(field, src)); |
| 875 } | 875 } |
| 876 } | 876 } |
| 877 | 877 |
| 878 ir.FunctionDefinition _makeFunctionBody(FunctionElement element, | 878 ir.FunctionDefinition _makeFunctionBody(FunctionElement element, |
| 879 ast.FunctionExpression node) { | 879 ast.FunctionExpression node) { |
| 880 FunctionSignature signature = element.functionSignature; | 880 FunctionSignature signature = element.functionSignature; |
| 881 List<Local> parameters = <Local>[]; | 881 List<Local> parameters = <Local>[]; |
| 882 signature.orderedForEachParameter( | 882 signature.orderedForEachParameter( |
| 883 (LocalParameterElement e) => parameters.add(e)); | 883 (LocalParameterElement e) => parameters.add(e)); |
| 884 | 884 |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 if (node.isConst) { | 1323 if (node.isConst) { |
| 1324 return translateConstant(node); | 1324 return translateConstant(node); |
| 1325 } | 1325 } |
| 1326 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); | 1326 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); |
| 1327 InterfaceType type = elements.getType(node); | 1327 InterfaceType type = elements.getType(node); |
| 1328 return irBuilder.buildListLiteral(type, values, | 1328 return irBuilder.buildListLiteral(type, values, |
| 1329 allocationSiteType: getAllocationSiteType(node)); | 1329 allocationSiteType: getAllocationSiteType(node)); |
| 1330 } | 1330 } |
| 1331 | 1331 |
| 1332 ir.Primitive visitLiteralMap(ast.LiteralMap node) { | 1332 ir.Primitive visitLiteralMap(ast.LiteralMap node) { |
| 1333 assert(irBuilder.isOpen); |
| 1333 if (node.isConst) { | 1334 if (node.isConst) { |
| 1334 return translateConstant(node); | 1335 return translateConstant(node); |
| 1335 } | 1336 } |
| 1336 InterfaceType type = elements.getType(node); | 1337 InterfaceType type = elements.getType(node); |
| 1337 return irBuilder.buildMapLiteral( | 1338 List<ir.LiteralMapEntry> entries = |
| 1338 type, | 1339 node.entries.nodes.mapToList((ast.LiteralMapEntry e) { |
| 1339 node.entries.nodes.map((e) => e.key), | 1340 return new ir.LiteralMapEntry(visit(e.key), visit(e.value)); |
| 1340 node.entries.nodes.map((e) => e.value), | 1341 }); |
| 1341 build); | 1342 return irBuilder.addPrimitive(new ir.LiteralMap(type, entries)); |
| 1342 } | 1343 } |
| 1343 | 1344 |
| 1344 ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) { | 1345 ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) { |
| 1345 assert(irBuilder.isOpen); | 1346 assert(irBuilder.isOpen); |
| 1346 return translateConstant(node); | 1347 return translateConstant(node); |
| 1347 } | 1348 } |
| 1348 | 1349 |
| 1349 ir.Primitive visitParenthesizedExpression( | 1350 ir.Primitive visitParenthesizedExpression( |
| 1350 ast.ParenthesizedExpression node) { | 1351 ast.ParenthesizedExpression node) { |
| 1351 assert(irBuilder.isOpen); | 1352 assert(irBuilder.isOpen); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1483 } | 1484 } |
| 1484 | 1485 |
| 1485 @override | 1486 @override |
| 1486 ir.Primitive visitLocalVariableGet( | 1487 ir.Primitive visitLocalVariableGet( |
| 1487 ast.Send node, | 1488 ast.Send node, |
| 1488 LocalVariableElement element, | 1489 LocalVariableElement element, |
| 1489 _) { | 1490 _) { |
| 1490 return element.isConst | 1491 return element.isConst |
| 1491 ? irBuilder.buildConstant(getConstantForVariable(element), | 1492 ? irBuilder.buildConstant(getConstantForVariable(element), |
| 1492 sourceInformation: sourceInformationBuilder.buildGet(node)) | 1493 sourceInformation: sourceInformationBuilder.buildGet(node)) |
| 1493 : irBuilder.buildLocalVariableGet(element); | 1494 : irBuilder.buildLocalGet(element); |
| 1494 } | 1495 } |
| 1495 | 1496 |
| 1496 @override | |
| 1497 ir.Primitive handleLocalGet( | 1497 ir.Primitive handleLocalGet( |
| 1498 ast.Send node, | 1498 ast.Send node, |
| 1499 LocalElement element, | 1499 LocalElement element, |
| 1500 _) { | 1500 _) { |
| 1501 return irBuilder.buildLocalVariableGet(element); | 1501 return irBuilder.buildLocalGet(element); |
| 1502 } | 1502 } |
| 1503 | 1503 |
| 1504 @override | 1504 @override |
| 1505 ir.Primitive visitLocalFunctionGet( | |
| 1506 ast.Send node, | |
| 1507 LocalFunctionElement function, | |
| 1508 _) { | |
| 1509 return irBuilder.buildLocalFunctionGet(function); | |
| 1510 } | |
| 1511 | |
| 1512 @override | |
| 1513 ir.Primitive handleStaticFunctionGet( | 1505 ir.Primitive handleStaticFunctionGet( |
| 1514 ast.Send node, | 1506 ast.Send node, |
| 1515 MethodElement function, | 1507 MethodElement function, |
| 1516 _) { | 1508 _) { |
| 1517 return irBuilder.buildStaticFunctionGet(function); | 1509 return irBuilder.addPrimitive(new ir.GetStatic(function)); |
| 1518 } | 1510 } |
| 1519 | 1511 |
| 1520 @override | 1512 @override |
| 1521 ir.Primitive handleStaticGetterGet( | 1513 ir.Primitive handleStaticGetterGet( |
| 1522 ast.Send node, | 1514 ast.Send node, |
| 1523 FunctionElement getter, | 1515 FunctionElement getter, |
| 1524 _) { | 1516 _) { |
| 1525 return buildStaticGetterGet(getter, node); | 1517 return buildStaticGetterGet(getter, node); |
| 1526 } | 1518 } |
| 1527 | 1519 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1938 arguments); | 1930 arguments); |
| 1939 })); | 1931 })); |
| 1940 } | 1932 } |
| 1941 | 1933 |
| 1942 ir.Primitive handleLocalInvoke( | 1934 ir.Primitive handleLocalInvoke( |
| 1943 ast.Send node, | 1935 ast.Send node, |
| 1944 LocalElement element, | 1936 LocalElement element, |
| 1945 ast.NodeList argumentsNode, | 1937 ast.NodeList argumentsNode, |
| 1946 CallStructure callStructure, | 1938 CallStructure callStructure, |
| 1947 _) { | 1939 _) { |
| 1940 ir.Primitive function = irBuilder.buildLocalGet(element); |
| 1948 List<ir.Primitive> arguments = <ir.Primitive>[]; | 1941 List<ir.Primitive> arguments = <ir.Primitive>[]; |
| 1949 callStructure = | 1942 callStructure = |
| 1950 translateDynamicArguments(argumentsNode, callStructure, arguments); | 1943 translateDynamicArguments(argumentsNode, callStructure, arguments); |
| 1951 return irBuilder.buildLocalVariableInvocation( | 1944 return irBuilder.buildCallInvocation(function, callStructure, arguments, |
| 1952 element, | 1945 sourceInformation: |
| 1953 callStructure, | |
| 1954 arguments, | |
| 1955 callSourceInformation: | |
| 1956 sourceInformationBuilder.buildCall(node, argumentsNode)); | 1946 sourceInformationBuilder.buildCall(node, argumentsNode)); |
| 1957 } | 1947 } |
| 1958 | 1948 |
| 1959 @override | 1949 @override |
| 1960 ir.Primitive visitLocalFunctionInvoke( | |
| 1961 ast.Send node, | |
| 1962 LocalFunctionElement function, | |
| 1963 ast.NodeList argumentsNode, | |
| 1964 CallStructure callStructure, | |
| 1965 _) { | |
| 1966 List<ir.Primitive> arguments = <ir.Primitive>[]; | |
| 1967 callStructure = | |
| 1968 translateDynamicArguments(argumentsNode, callStructure, arguments); | |
| 1969 return irBuilder.buildLocalFunctionInvocation( | |
| 1970 function, | |
| 1971 callStructure, | |
| 1972 arguments, | |
| 1973 sourceInformationBuilder.buildCall(node, argumentsNode)); | |
| 1974 } | |
| 1975 | |
| 1976 @override | |
| 1977 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { | 1950 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
| 1978 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); | 1951 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); |
| 1979 } | 1952 } |
| 1980 | 1953 |
| 1981 @override | 1954 @override |
| 1982 ir.Primitive handleStaticFieldInvoke( | 1955 ir.Primitive handleStaticFieldInvoke( |
| 1983 ast.Send node, | 1956 ast.Send node, |
| 1984 FieldElement field, | 1957 FieldElement field, |
| 1985 ast.NodeList argumentsNode, | 1958 ast.NodeList argumentsNode, |
| 1986 CallStructure callStructure, | 1959 CallStructure callStructure, |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2179 ast.SendSet node, | 2152 ast.SendSet node, |
| 2180 FunctionElement function, | 2153 FunctionElement function, |
| 2181 ast.Node index, | 2154 ast.Node index, |
| 2182 ast.Node rhs, | 2155 ast.Node rhs, |
| 2183 _) { | 2156 _) { |
| 2184 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 2157 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); |
| 2185 } | 2158 } |
| 2186 | 2159 |
| 2187 ir.Primitive translateCompounds( | 2160 ir.Primitive translateCompounds( |
| 2188 ast.SendSet node, | 2161 ast.SendSet node, |
| 2189 {ir.Primitive getValue(), | 2162 ir.Primitive getValue(), |
| 2190 CompoundRhs rhs, | 2163 CompoundRhs rhs, |
| 2191 void setValue(ir.Primitive value)}) { | 2164 void setValue(ir.Primitive value)) { |
| 2192 ir.Primitive value = getValue(); | 2165 ir.Primitive value = getValue(); |
| 2193 op.BinaryOperator operator = rhs.operator; | 2166 op.BinaryOperator operator = rhs.operator; |
| 2194 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { | 2167 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
| 2195 // Unlike other compound operators if-null conditionally will not do the | 2168 // Unlike other compound operators if-null conditionally will not do the |
| 2196 // assignment operation. | 2169 // assignment operation. |
| 2197 return irBuilder.buildIfNull(value, nested(() { | 2170 return irBuilder.buildIfNull(value, nested(() { |
| 2198 ir.Primitive newValue = build(rhs.rhs); | 2171 ir.Primitive newValue = build(rhs.rhs); |
| 2199 setValue(newValue); | 2172 setValue(newValue); |
| 2200 return newValue; | 2173 return newValue; |
| 2201 })); | 2174 })); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2222 callStructure), | 2195 callStructure), |
| 2223 operatorTypeMask, | 2196 operatorTypeMask, |
| 2224 arguments, | 2197 arguments, |
| 2225 sourceInformation: operatorSourceInformation); | 2198 sourceInformation: operatorSourceInformation); |
| 2226 setValue(result); | 2199 setValue(result); |
| 2227 return rhs.kind == CompoundKind.POSTFIX ? value : result; | 2200 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 2228 } | 2201 } |
| 2229 | 2202 |
| 2230 ir.Primitive translateSetIfNull( | 2203 ir.Primitive translateSetIfNull( |
| 2231 ast.SendSet node, | 2204 ast.SendSet node, |
| 2232 {ir.Primitive getValue(), | 2205 ir.Primitive getValue(), |
| 2233 ast.Node rhs, | 2206 ast.Node rhs, |
| 2234 void setValue(ir.Primitive value)}) { | 2207 void setValue(ir.Primitive value)) { |
| 2235 ir.Primitive value = getValue(); | 2208 ir.Primitive value = getValue(); |
| 2236 // Unlike other compound operators if-null conditionally will not do the | 2209 // Unlike other compound operators if-null conditionally will not do the |
| 2237 // assignment operation. | 2210 // assignment operation. |
| 2238 return irBuilder.buildIfNull(value, nested(() { | 2211 return irBuilder.buildIfNull(value, nested(() { |
| 2239 ir.Primitive newValue = build(rhs); | 2212 ir.Primitive newValue = build(rhs); |
| 2240 setValue(newValue); | 2213 setValue(newValue); |
| 2241 return newValue; | 2214 return newValue; |
| 2242 })); | 2215 })); |
| 2243 } | 2216 } |
| 2244 | 2217 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2283 value = checkTypeVsElement(value, element); | 2256 value = checkTypeVsElement(value, element); |
| 2284 return irBuilder.buildLocalVariableSet(element, value); | 2257 return irBuilder.buildLocalVariableSet(element, value); |
| 2285 } | 2258 } |
| 2286 | 2259 |
| 2287 @override | 2260 @override |
| 2288 ir.Primitive handleStaticFieldSet( | 2261 ir.Primitive handleStaticFieldSet( |
| 2289 ast.SendSet node, | 2262 ast.SendSet node, |
| 2290 FieldElement field, | 2263 FieldElement field, |
| 2291 ast.Node rhs, | 2264 ast.Node rhs, |
| 2292 _) { | 2265 _) { |
| 2293 return irBuilder.buildStaticFieldSet(field, visit(rhs)); | 2266 ir.Primitive value = visit(rhs); |
| 2267 irBuilder.addPrimitive(new ir.SetStatic(field, value)); |
| 2268 return value; |
| 2294 } | 2269 } |
| 2295 | 2270 |
| 2296 @override | 2271 @override |
| 2297 ir.Primitive visitSuperFieldSet( | 2272 ir.Primitive visitSuperFieldSet( |
| 2298 ast.SendSet node, | 2273 ast.SendSet node, |
| 2299 FieldElement field, | 2274 FieldElement field, |
| 2300 ast.Node rhs, | 2275 ast.Node rhs, |
| 2301 _) { | 2276 _) { |
| 2302 return irBuilder.buildSuperFieldSet(field, visit(rhs)); | 2277 return irBuilder.buildSuperFieldSet(field, visit(rhs)); |
| 2303 } | 2278 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2329 _) { | 2304 _) { |
| 2330 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | 2305 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
| 2331 } | 2306 } |
| 2332 | 2307 |
| 2333 @override | 2308 @override |
| 2334 ir.Primitive handleTypeLiteralConstantCompounds( | 2309 ir.Primitive handleTypeLiteralConstantCompounds( |
| 2335 ast.SendSet node, | 2310 ast.SendSet node, |
| 2336 ConstantExpression constant, | 2311 ConstantExpression constant, |
| 2337 CompoundRhs rhs, | 2312 CompoundRhs rhs, |
| 2338 arg) { | 2313 arg) { |
| 2339 return translateCompounds( | 2314 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2340 node, | 2315 return translateCompounds(node, () { |
| 2341 getValue: () { | 2316 return buildConstantExpression(constant, src); |
| 2342 return buildConstantExpression(constant, | 2317 }, rhs, (ir.Primitive value) { |
| 2343 sourceInformationBuilder.buildGet(node)); | 2318 // The binary operator will throw before this. |
| 2344 }, | 2319 }); |
| 2345 rhs: rhs, | |
| 2346 setValue: (value) {}); // The binary operator will throw before this. | |
| 2347 } | 2320 } |
| 2348 | 2321 |
| 2349 @override | 2322 @override |
| 2350 ir.Primitive handleTypeLiteralConstantSetIfNulls( | 2323 ir.Primitive handleTypeLiteralConstantSetIfNulls( |
| 2351 ast.SendSet node, | 2324 ast.SendSet node, |
| 2352 ConstantExpression constant, | 2325 ConstantExpression constant, |
| 2353 ast.Node rhs, | 2326 ast.Node rhs, |
| 2354 _) { | 2327 _) { |
| 2355 // The type literal is never `null`. | 2328 // The type literal is never `null`. |
| 2356 return buildConstantExpression(constant, | 2329 return buildConstantExpression(constant, |
| 2357 sourceInformationBuilder.buildGet(node)); | 2330 sourceInformationBuilder.buildGet(node)); |
| 2358 } | 2331 } |
| 2359 | 2332 |
| 2360 @override | 2333 @override |
| 2361 ir.Primitive handleDynamicCompounds( | 2334 ir.Primitive handleDynamicCompounds( |
| 2362 ast.SendSet node, | 2335 ast.SendSet node, |
| 2363 ast.Node receiver, | 2336 ast.Node receiver, |
| 2364 Name name, | 2337 Name name, |
| 2365 CompoundRhs rhs, | 2338 CompoundRhs rhs, |
| 2366 arg) { | 2339 arg) { |
| 2367 ir.Primitive target = translateReceiver(receiver); | 2340 ir.Primitive target = translateReceiver(receiver); |
| 2368 ir.Primitive helper() { | 2341 ir.Primitive helper() { |
| 2369 return translateCompounds( | 2342 return translateCompounds(node, () { |
| 2370 node, | 2343 return irBuilder.buildDynamicGet( |
| 2371 getValue: () => irBuilder.buildDynamicGet( | 2344 target, |
| 2372 target, | 2345 new Selector.getter(name), |
| 2373 new Selector.getter(name), | 2346 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2374 elements.getGetterTypeMaskInComplexSendSet(node), | 2347 sourceInformationBuilder.buildGet(node)); |
| 2375 sourceInformationBuilder.buildGet(node)), | 2348 }, rhs, (ir.Primitive result) { |
| 2376 rhs: rhs, | 2349 irBuilder.buildDynamicSet( |
| 2377 setValue: (ir.Primitive result) { | 2350 target, |
| 2378 irBuilder.buildDynamicSet( | 2351 new Selector.setter(name), |
| 2379 target, | 2352 elements.getTypeMask(node), |
| 2380 new Selector.setter(name), | 2353 result); |
| 2381 elements.getTypeMask(node), | 2354 }); |
| 2382 result); | |
| 2383 }); | |
| 2384 } | 2355 } |
| 2385 return node.isConditional | 2356 return node.isConditional |
| 2386 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2357 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2387 : helper(); | 2358 : helper(); |
| 2388 } | 2359 } |
| 2389 | 2360 |
| 2390 @override | 2361 @override |
| 2391 ir.Primitive handleDynamicSetIfNulls( | 2362 ir.Primitive handleDynamicSetIfNulls( |
| 2392 ast.Send node, | 2363 ast.Send node, |
| 2393 ast.Node receiver, | 2364 ast.Node receiver, |
| 2394 Name name, | 2365 Name name, |
| 2395 ast.Node rhs, | 2366 ast.Node rhs, |
| 2396 _) { | 2367 _) { |
| 2397 ir.Primitive target = translateReceiver(receiver); | 2368 ir.Primitive target = translateReceiver(receiver); |
| 2398 ir.Primitive helper() { | 2369 ir.Primitive helper() { |
| 2399 return translateSetIfNull( | 2370 return translateSetIfNull(node, () { |
| 2400 node, | 2371 return irBuilder.buildDynamicGet( |
| 2401 getValue: () => irBuilder.buildDynamicGet( | 2372 target, |
| 2402 target, | 2373 new Selector.getter(name), |
| 2403 new Selector.getter(name), | 2374 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2404 elements.getGetterTypeMaskInComplexSendSet(node), | 2375 sourceInformationBuilder.buildGet(node)); |
| 2405 sourceInformationBuilder.buildGet(node)), | 2376 }, rhs, (ir.Primitive result) { |
| 2406 rhs: rhs, | 2377 irBuilder.buildDynamicSet( |
| 2407 setValue: (ir.Primitive result) { | 2378 target, |
| 2408 irBuilder.buildDynamicSet( | 2379 new Selector.setter(name), |
| 2409 target, | 2380 elements.getTypeMask(node), |
| 2410 new Selector.setter(name), | 2381 result); |
| 2411 elements.getTypeMask(node), | 2382 }); |
| 2412 result); | |
| 2413 }); | |
| 2414 } | 2383 } |
| 2415 return node.isConditional | 2384 return node.isConditional |
| 2416 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2385 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2417 : helper(); | 2386 : helper(); |
| 2418 } | 2387 } |
| 2419 | 2388 |
| 2420 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { | 2389 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { |
| 2421 Selector selector = new Selector.setter( | 2390 Selector selector = new Selector.setter( |
| 2422 new Name(local.name, local.library, isSetter: true)); | 2391 new Name(local.name, local.library, isSetter: true)); |
| 2423 return irBuilder.buildStaticNoSuchMethod(selector, [value]); | 2392 return irBuilder.buildStaticNoSuchMethod(selector, [value]); |
| 2424 } | 2393 } |
| 2425 | 2394 |
| 2426 @override | 2395 @override |
| 2427 ir.Primitive handleLocalCompounds( | 2396 ir.Primitive handleLocalCompounds( |
| 2428 ast.SendSet node, | 2397 ast.SendSet node, |
| 2429 LocalElement local, | 2398 LocalElement local, |
| 2430 CompoundRhs rhs, | 2399 CompoundRhs rhs, |
| 2431 arg, | 2400 arg, |
| 2432 {bool isSetterValid}) { | 2401 {bool isSetterValid}) { |
| 2433 return translateCompounds( | 2402 return translateCompounds(node, () { |
| 2434 node, | 2403 return irBuilder.buildLocalGet(local); |
| 2435 getValue: () { | 2404 }, rhs, (ir.Primitive result) { |
| 2436 if (local.isFunction) { | 2405 if (isSetterValid) { |
| 2437 return irBuilder.buildLocalFunctionGet(local); | 2406 irBuilder.buildLocalVariableSet(local, result); |
| 2438 } else { | 2407 } else { |
| 2439 return irBuilder.buildLocalVariableGet(local); | 2408 Selector selector = new Selector.setter( |
| 2440 } | 2409 new Name(local.name, local.library, isSetter: true)); |
| 2441 }, | 2410 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); |
| 2442 rhs: rhs, | 2411 } |
| 2443 setValue: (ir.Primitive result) { | 2412 }); |
| 2444 if (isSetterValid) { | |
| 2445 irBuilder.buildLocalVariableSet(local, result); | |
| 2446 } else { | |
| 2447 return buildLocalNoSuchSetter(local, result); | |
| 2448 } | |
| 2449 }); | |
| 2450 } | 2413 } |
| 2451 | 2414 |
| 2452 @override | 2415 @override |
| 2453 ir.Primitive handleLocalSetIfNulls( | 2416 ir.Primitive handleLocalSetIfNulls( |
| 2454 ast.SendSet node, | 2417 ast.SendSet node, |
| 2455 LocalElement local, | 2418 LocalElement local, |
| 2456 ast.Node rhs, | 2419 ast.Node rhs, |
| 2457 _, | 2420 _, |
| 2458 {bool isSetterValid}) { | 2421 {bool isSetterValid}) { |
| 2459 return translateSetIfNull( | 2422 return translateSetIfNull(node, () { |
| 2460 node, | 2423 return irBuilder.buildLocalGet(local); |
| 2461 getValue: () { | 2424 }, rhs, (ir.Primitive result) { |
| 2462 if (local.isFunction) { | 2425 if (isSetterValid) { |
| 2463 return irBuilder.buildLocalFunctionGet(local); | 2426 irBuilder.buildLocalVariableSet(local, result); |
| 2464 } else { | 2427 } else { |
| 2465 return irBuilder.buildLocalVariableGet(local); | 2428 Selector selector = new Selector.setter( |
| 2466 } | 2429 new Name(local.name, local.library, isSetter: true)); |
| 2467 }, | 2430 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); |
| 2468 rhs: rhs, | 2431 } |
| 2469 setValue: (ir.Primitive result) { | 2432 }); |
| 2470 if (isSetterValid) { | |
| 2471 irBuilder.buildLocalVariableSet(local, result); | |
| 2472 } else { | |
| 2473 return buildLocalNoSuchSetter(local, result); | |
| 2474 } | |
| 2475 }); | |
| 2476 } | |
| 2477 | |
| 2478 ir.Primitive buildStaticNoSuchGetter(Element element) { | |
| 2479 return irBuilder.buildStaticNoSuchMethod( | |
| 2480 new Selector.getter(new Name(element.name, element.library)), | |
| 2481 const <ir.Primitive>[]); | |
| 2482 } | |
| 2483 | |
| 2484 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { | |
| 2485 return irBuilder.buildStaticNoSuchMethod( | |
| 2486 new Selector.setter(new Name(element.name, element.library)), | |
| 2487 <ir.Primitive>[value]); | |
| 2488 } | 2433 } |
| 2489 | 2434 |
| 2490 @override | 2435 @override |
| 2491 ir.Primitive handleStaticCompounds( | 2436 ir.Primitive handleStaticCompounds( |
| 2492 ast.SendSet node, | 2437 ast.SendSet node, |
| 2493 Element getter, | 2438 Element getter, |
| 2494 CompoundGetter getterKind, | 2439 CompoundGetter getterKind, |
| 2495 Element setter, | 2440 Element setter, |
| 2496 CompoundSetter setterKind, | 2441 CompoundSetter setterKind, |
| 2497 CompoundRhs rhs, | 2442 CompoundRhs rhs, |
| 2498 arg) { | 2443 arg) { |
| 2499 return translateCompounds( | 2444 return translateCompounds(node, () { |
| 2500 node, | 2445 switch (getterKind) { |
| 2501 getValue: () { | 2446 case CompoundGetter.FIELD: |
| 2502 switch (getterKind) { | 2447 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2503 case CompoundGetter.FIELD: | 2448 return buildStaticFieldGet(getter, src); |
| 2504 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2449 case CompoundGetter.GETTER: |
| 2505 return buildStaticFieldGet(getter, src); | 2450 return buildStaticGetterGet(getter, node); |
| 2506 case CompoundGetter.GETTER: | 2451 case CompoundGetter.METHOD: |
| 2507 return buildStaticGetterGet(getter, node); | 2452 return irBuilder.addPrimitive(new ir.GetStatic(getter)); |
| 2508 case CompoundGetter.METHOD: | 2453 case CompoundGetter.UNRESOLVED: |
| 2509 return irBuilder.buildStaticFunctionGet(getter); | 2454 return irBuilder.buildStaticNoSuchMethod( |
| 2510 case CompoundGetter.UNRESOLVED: | 2455 new Selector.getter(new Name(getter.name, getter.library)), |
| 2511 return buildStaticNoSuchGetter(getter); | 2456 <ir.Primitive>[]); |
| 2512 } | 2457 } |
| 2513 }, | 2458 }, rhs, (ir.Primitive result) { |
| 2514 rhs: rhs, | 2459 switch (setterKind) { |
| 2515 setValue: (ir.Primitive result) { | 2460 case CompoundSetter.FIELD: |
| 2516 switch (setterKind) { | 2461 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); |
| 2517 case CompoundSetter.FIELD: | 2462 return; |
| 2518 return irBuilder.buildStaticFieldSet(setter, result); | 2463 case CompoundSetter.SETTER: |
| 2519 case CompoundSetter.SETTER: | 2464 irBuilder.buildStaticSetterSet(setter, result); |
| 2520 return irBuilder.buildStaticSetterSet(setter, result); | 2465 return; |
| 2521 case CompoundSetter.INVALID: | 2466 case CompoundSetter.INVALID: |
| 2522 return buildStaticNoSuchSetter(setter, result); | 2467 irBuilder.buildStaticNoSuchMethod( |
| 2523 } | 2468 new Selector.setter(new Name(setter.name, setter.library)), |
| 2524 }); | 2469 <ir.Primitive>[result]); |
| 2470 return; |
| 2471 } |
| 2472 }); |
| 2525 } | 2473 } |
| 2526 | 2474 |
| 2527 @override | 2475 @override |
| 2528 ir.Primitive handleStaticSetIfNulls( | 2476 ir.Primitive handleStaticSetIfNulls( |
| 2529 ast.SendSet node, | 2477 ast.SendSet node, |
| 2530 Element getter, | 2478 Element getter, |
| 2531 CompoundGetter getterKind, | 2479 CompoundGetter getterKind, |
| 2532 Element setter, | 2480 Element setter, |
| 2533 CompoundSetter setterKind, | 2481 CompoundSetter setterKind, |
| 2534 ast.Node rhs, | 2482 ast.Node rhs, |
| 2535 _) { | 2483 _) { |
| 2536 return translateSetIfNull( | 2484 return translateSetIfNull(node, () { |
| 2537 node, | 2485 switch (getterKind) { |
| 2538 getValue: () { | 2486 case CompoundGetter.FIELD: |
| 2539 switch (getterKind) { | 2487 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2540 case CompoundGetter.FIELD: | 2488 return buildStaticFieldGet(getter, src); |
| 2541 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2489 case CompoundGetter.GETTER: |
| 2542 return buildStaticFieldGet(getter, src); | 2490 return buildStaticGetterGet(getter, node); |
| 2543 case CompoundGetter.GETTER: | 2491 case CompoundGetter.METHOD: |
| 2544 return buildStaticGetterGet(getter, node); | 2492 return irBuilder.addPrimitive(new ir.GetStatic(getter)); |
| 2545 case CompoundGetter.METHOD: | 2493 case CompoundGetter.UNRESOLVED: |
| 2546 return irBuilder.buildStaticFunctionGet(getter); | 2494 return irBuilder.buildStaticNoSuchMethod( |
| 2547 case CompoundGetter.UNRESOLVED: | 2495 new Selector.getter(new Name(getter.name, getter.library)), |
| 2548 return buildStaticNoSuchGetter(getter); | 2496 <ir.Primitive>[]); |
| 2549 } | 2497 } |
| 2550 }, | 2498 }, rhs, (ir.Primitive result) { |
| 2551 rhs: rhs, | 2499 switch (setterKind) { |
| 2552 setValue: (ir.Primitive result) { | 2500 case CompoundSetter.FIELD: |
| 2553 switch (setterKind) { | 2501 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); |
| 2554 case CompoundSetter.FIELD: | 2502 return; |
| 2555 return irBuilder.buildStaticFieldSet(setter, result); | 2503 case CompoundSetter.SETTER: |
| 2556 case CompoundSetter.SETTER: | 2504 irBuilder.buildStaticSetterSet(setter, result); |
| 2557 return irBuilder.buildStaticSetterSet(setter, result); | 2505 return; |
| 2558 case CompoundSetter.INVALID: | 2506 case CompoundSetter.INVALID: |
| 2559 return buildStaticNoSuchSetter(setter, result); | 2507 irBuilder.buildStaticNoSuchMethod( |
| 2560 } | 2508 new Selector.setter(new Name(setter.name, setter.library)), |
| 2561 }); | 2509 <ir.Primitive>[result]); |
| 2510 return; |
| 2511 } |
| 2512 }); |
| 2562 } | 2513 } |
| 2563 | 2514 |
| 2564 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 2515 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
| 2565 return buildInstanceNoSuchMethod( | 2516 return buildInstanceNoSuchMethod( |
| 2566 new Selector.getter(new Name(element.name, element.library)), | 2517 new Selector.getter(new Name(element.name, element.library)), |
| 2567 mask, | 2518 mask, |
| 2568 const <ir.Primitive>[]); | 2519 const <ir.Primitive>[]); |
| 2569 } | 2520 } |
| 2570 | 2521 |
| 2571 ir.Primitive buildSuperNoSuchSetter(Element element, | 2522 ir.Primitive buildSuperNoSuchSetter(Element element, |
| 2572 TypeMask mask, | 2523 TypeMask mask, |
| 2573 ir.Primitive value) { | 2524 ir.Primitive value) { |
| 2574 return buildInstanceNoSuchMethod( | 2525 return buildInstanceNoSuchMethod( |
| 2575 new Selector.setter(new Name(element.name, element.library)), | 2526 new Selector.setter(new Name(element.name, element.library)), |
| 2576 mask, | 2527 mask, |
| 2577 <ir.Primitive>[value]); | 2528 <ir.Primitive>[value]); |
| 2578 } | 2529 } |
| 2579 | 2530 |
| 2580 @override | 2531 @override |
| 2581 ir.Primitive handleSuperCompounds( | 2532 ir.Primitive handleSuperCompounds( |
| 2582 ast.SendSet node, | 2533 ast.SendSet node, |
| 2583 Element getter, | 2534 Element getter, |
| 2584 CompoundGetter getterKind, | 2535 CompoundGetter getterKind, |
| 2585 Element setter, | 2536 Element setter, |
| 2586 CompoundSetter setterKind, | 2537 CompoundSetter setterKind, |
| 2587 CompoundRhs rhs, | 2538 CompoundRhs rhs, |
| 2588 arg) { | 2539 arg) { |
| 2589 return translateCompounds( | 2540 return translateCompounds(node, () { |
| 2590 node, | 2541 switch (getterKind) { |
| 2591 getValue: () { | 2542 case CompoundGetter.FIELD: |
| 2592 switch (getterKind) { | 2543 return irBuilder.buildSuperFieldGet(getter); |
| 2593 case CompoundGetter.FIELD: | 2544 case CompoundGetter.GETTER: |
| 2594 return irBuilder.buildSuperFieldGet(getter); | 2545 return irBuilder.buildSuperGetterGet( |
| 2595 case CompoundGetter.GETTER: | 2546 getter, sourceInformationBuilder.buildGet(node)); |
| 2596 return irBuilder.buildSuperGetterGet( | 2547 case CompoundGetter.METHOD: |
| 2597 getter, sourceInformationBuilder.buildGet(node)); | 2548 return irBuilder.buildSuperMethodGet(getter); |
| 2598 case CompoundGetter.METHOD: | 2549 case CompoundGetter.UNRESOLVED: |
| 2599 return irBuilder.buildSuperMethodGet(getter); | 2550 return buildSuperNoSuchGetter( |
| 2600 case CompoundGetter.UNRESOLVED: | 2551 getter, elements.getGetterTypeMaskInComplexSendSet(node)); |
| 2601 return buildSuperNoSuchGetter( | 2552 } |
| 2602 getter, | 2553 }, rhs, (ir.Primitive result) { |
| 2603 elements.getGetterTypeMaskInComplexSendSet(node)); | 2554 switch (setterKind) { |
| 2604 } | 2555 case CompoundSetter.FIELD: |
| 2605 }, | 2556 irBuilder.buildSuperFieldSet(setter, result); |
| 2606 rhs: rhs, | 2557 return; |
| 2607 setValue: (ir.Primitive result) { | 2558 case CompoundSetter.SETTER: |
| 2608 switch (setterKind) { | 2559 irBuilder.buildSuperSetterSet(setter, result); |
| 2609 case CompoundSetter.FIELD: | 2560 return; |
| 2610 return irBuilder.buildSuperFieldSet(setter, result); | 2561 case CompoundSetter.INVALID: |
| 2611 case CompoundSetter.SETTER: | 2562 buildSuperNoSuchSetter( |
| 2612 return irBuilder.buildSuperSetterSet(setter, result); | 2563 setter, elements.getTypeMask(node), result); |
| 2613 case CompoundSetter.INVALID: | 2564 return; |
| 2614 return buildSuperNoSuchSetter( | 2565 } |
| 2615 setter, elements.getTypeMask(node), result); | 2566 }); |
| 2616 } | |
| 2617 }); | |
| 2618 } | 2567 } |
| 2619 | 2568 |
| 2620 @override | 2569 @override |
| 2621 ir.Primitive handleSuperSetIfNulls( | 2570 ir.Primitive handleSuperSetIfNulls( |
| 2622 ast.SendSet node, | 2571 ast.SendSet node, |
| 2623 Element getter, | 2572 Element getter, |
| 2624 CompoundGetter getterKind, | 2573 CompoundGetter getterKind, |
| 2625 Element setter, | 2574 Element setter, |
| 2626 CompoundSetter setterKind, | 2575 CompoundSetter setterKind, |
| 2627 ast.Node rhs, | 2576 ast.Node rhs, |
| 2628 _) { | 2577 _) { |
| 2629 return translateSetIfNull( | 2578 return translateSetIfNull(node, () { |
| 2630 node, | 2579 switch (getterKind) { |
| 2631 getValue: () { | 2580 case CompoundGetter.FIELD: |
| 2632 switch (getterKind) { | 2581 return irBuilder.buildSuperFieldGet(getter); |
| 2633 case CompoundGetter.FIELD: | 2582 case CompoundGetter.GETTER: |
| 2634 return irBuilder.buildSuperFieldGet(getter); | 2583 return irBuilder.buildSuperGetterGet( |
| 2635 case CompoundGetter.GETTER: | 2584 getter, sourceInformationBuilder.buildGet(node)); |
| 2636 return irBuilder.buildSuperGetterGet( | 2585 case CompoundGetter.METHOD: |
| 2637 getter, sourceInformationBuilder.buildGet(node)); | 2586 return irBuilder.buildSuperMethodGet(getter); |
| 2638 case CompoundGetter.METHOD: | 2587 case CompoundGetter.UNRESOLVED: |
| 2639 return irBuilder.buildSuperMethodGet(getter); | 2588 return buildSuperNoSuchGetter( |
| 2640 case CompoundGetter.UNRESOLVED: | 2589 getter, |
| 2641 return buildSuperNoSuchGetter( | 2590 elements.getGetterTypeMaskInComplexSendSet(node)); |
| 2642 getter, | 2591 } |
| 2643 elements.getGetterTypeMaskInComplexSendSet(node)); | 2592 }, rhs, (ir.Primitive result) { |
| 2644 } | 2593 switch (setterKind) { |
| 2645 }, | 2594 case CompoundSetter.FIELD: |
| 2646 rhs: rhs, | 2595 irBuilder.buildSuperFieldSet(setter, result); |
| 2647 setValue: (ir.Primitive result) { | 2596 return; |
| 2648 switch (setterKind) { | 2597 case CompoundSetter.SETTER: |
| 2649 case CompoundSetter.FIELD: | 2598 irBuilder.buildSuperSetterSet(setter, result); |
| 2650 return irBuilder.buildSuperFieldSet(setter, result); | 2599 return; |
| 2651 case CompoundSetter.SETTER: | 2600 case CompoundSetter.INVALID: |
| 2652 return irBuilder.buildSuperSetterSet(setter, result); | 2601 buildSuperNoSuchSetter( |
| 2653 case CompoundSetter.INVALID: | 2602 setter, elements.getTypeMask(node), result); |
| 2654 return buildSuperNoSuchSetter( | 2603 return; |
| 2655 setter, elements.getTypeMask(node), result); | 2604 } |
| 2656 } | 2605 }); |
| 2657 }); | |
| 2658 } | 2606 } |
| 2659 | 2607 |
| 2660 @override | 2608 @override |
| 2661 ir.Primitive handleTypeVariableTypeLiteralCompounds( | 2609 ir.Primitive handleTypeVariableTypeLiteralCompounds( |
| 2662 ast.SendSet node, | 2610 ast.SendSet node, |
| 2663 TypeVariableElement typeVariable, | 2611 TypeVariableElement typeVariable, |
| 2664 CompoundRhs rhs, | 2612 CompoundRhs rhs, |
| 2665 arg) { | 2613 arg) { |
| 2666 return translateCompounds( | 2614 return translateCompounds(node, () { |
| 2667 node, | 2615 return irBuilder.buildReifyTypeVariable( |
| 2668 getValue: () { | 2616 typeVariable.type, |
| 2669 return irBuilder.buildReifyTypeVariable( | 2617 sourceInformationBuilder.buildGet(node)); |
| 2670 typeVariable.type, | 2618 }, rhs, (ir.Primitive value) { |
| 2671 sourceInformationBuilder.buildGet(node)); | 2619 // The binary operator will throw before this. |
| 2672 }, | 2620 }); |
| 2673 rhs: rhs, | |
| 2674 setValue: (value) {}); // The binary operator will throw before this. | |
| 2675 } | 2621 } |
| 2676 | 2622 |
| 2677 @override | 2623 @override |
| 2678 ir.Primitive visitTypeVariableTypeLiteralSetIfNull( | 2624 ir.Primitive visitTypeVariableTypeLiteralSetIfNull( |
| 2679 ast.Send node, | 2625 ast.Send node, |
| 2680 TypeVariableElement element, | 2626 TypeVariableElement element, |
| 2681 ast.Node rhs, | 2627 ast.Node rhs, |
| 2682 _) { | 2628 _) { |
| 2683 // The type variable is never `null`. | 2629 // The type variable is never `null`. |
| 2684 return translateTypeVariableTypeLiteral(element, | 2630 return translateTypeVariableTypeLiteral(element, |
| 2685 sourceInformationBuilder.buildGet(node)); | 2631 sourceInformationBuilder.buildGet(node)); |
| 2686 } | 2632 } |
| 2687 | 2633 |
| 2688 @override | 2634 @override |
| 2689 ir.Primitive handleIndexCompounds( | 2635 ir.Primitive handleIndexCompounds( |
| 2690 ast.SendSet node, | 2636 ast.SendSet node, |
| 2691 ast.Node receiver, | 2637 ast.Node receiver, |
| 2692 ast.Node index, | 2638 ast.Node index, |
| 2693 CompoundRhs rhs, | 2639 CompoundRhs rhs, |
| 2694 arg) { | 2640 arg) { |
| 2695 ir.Primitive target = visit(receiver); | 2641 ir.Primitive target = visit(receiver); |
| 2696 ir.Primitive indexValue = visit(index); | 2642 ir.Primitive indexValue = visit(index); |
| 2697 return translateCompounds( | 2643 return translateCompounds(node, () { |
| 2698 node, | 2644 Selector selector = new Selector.index(); |
| 2699 getValue: () { | 2645 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 2700 Selector selector = new Selector.index(); | 2646 CallStructure callStructure = |
| 2701 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 2647 normalizeDynamicArguments(selector.callStructure, arguments); |
| 2702 CallStructure callStructure = | 2648 return irBuilder.buildDynamicInvocation( |
| 2703 normalizeDynamicArguments(selector.callStructure, arguments); | 2649 target, |
| 2704 return irBuilder.buildDynamicInvocation( | 2650 new Selector(selector.kind, selector.memberName, callStructure), |
| 2705 target, | 2651 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2706 new Selector(selector.kind, selector.memberName, callStructure), | 2652 arguments, |
| 2707 elements.getGetterTypeMaskInComplexSendSet(node), | 2653 sourceInformation: |
| 2708 arguments, | 2654 sourceInformationBuilder.buildCall(receiver, node)); |
| 2709 sourceInformation: | 2655 }, rhs, (ir.Primitive result) { |
| 2710 sourceInformationBuilder.buildCall(receiver, node)); | 2656 irBuilder.buildDynamicIndexSet( |
| 2711 }, | 2657 target, |
| 2712 rhs: rhs, | 2658 elements.getTypeMask(node), |
| 2713 setValue: (ir.Primitive result) { | 2659 indexValue, |
| 2714 irBuilder.buildDynamicIndexSet( | 2660 result); |
| 2715 target, | 2661 }); |
| 2716 elements.getTypeMask(node), | |
| 2717 indexValue, | |
| 2718 result); | |
| 2719 }); | |
| 2720 } | 2662 } |
| 2721 | 2663 |
| 2722 @override | 2664 @override |
| 2723 ir.Primitive handleSuperIndexCompounds( | 2665 ir.Primitive handleSuperIndexCompounds( |
| 2724 ast.SendSet node, | 2666 ast.SendSet node, |
| 2725 Element indexFunction, | 2667 Element indexFunction, |
| 2726 Element indexSetFunction, | 2668 Element indexSetFunction, |
| 2727 ast.Node index, | 2669 ast.Node index, |
| 2728 CompoundRhs rhs, | 2670 CompoundRhs rhs, |
| 2729 arg, | 2671 arg, |
| 2730 {bool isGetterValid, | 2672 {bool isGetterValid, |
| 2731 bool isSetterValid}) { | 2673 bool isSetterValid}) { |
| 2732 ir.Primitive indexValue = visit(index); | 2674 ir.Primitive indexValue = visit(index); |
| 2733 return translateCompounds( | 2675 return translateCompounds(node, () { |
| 2734 node, | 2676 return isGetterValid |
| 2735 getValue: () { | 2677 ? irBuilder.buildSuperIndex(indexFunction, indexValue) |
| 2736 if (isGetterValid) { | 2678 : buildInstanceNoSuchMethod( |
| 2737 return irBuilder.buildSuperIndex(indexFunction, indexValue); | 2679 new Selector.index(), |
| 2738 } else { | 2680 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2739 return buildInstanceNoSuchMethod( | 2681 <ir.Primitive>[indexValue]); |
| 2740 new Selector.index(), | 2682 }, rhs, (ir.Primitive result) { |
| 2741 elements.getGetterTypeMaskInComplexSendSet(node), | 2683 if (isSetterValid) { |
| 2742 <ir.Primitive>[indexValue]); | 2684 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
| 2743 } | 2685 } else { |
| 2744 }, | 2686 buildInstanceNoSuchMethod( |
| 2745 rhs: rhs, | 2687 new Selector.indexSet(), |
| 2746 setValue: (ir.Primitive result) { | 2688 elements.getTypeMask(node), |
| 2747 if (isSetterValid) { | 2689 <ir.Primitive>[indexValue, result]); |
| 2748 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 2690 } |
| 2749 } else { | 2691 }); |
| 2750 buildInstanceNoSuchMethod( | |
| 2751 new Selector.indexSet(), | |
| 2752 elements.getTypeMask(node), | |
| 2753 <ir.Primitive>[indexValue, result]); | |
| 2754 } | |
| 2755 }); | |
| 2756 } | 2692 } |
| 2757 | 2693 |
| 2758 /// Build code to handle foreign code, that is, native JavaScript code, or | 2694 /// Build code to handle foreign code, that is, native JavaScript code, or |
| 2759 /// builtin values and operations of the backend. | 2695 /// builtin values and operations of the backend. |
| 2760 ir.Primitive handleForeignCode(ast.Send node, | 2696 ir.Primitive handleForeignCode(ast.Send node, |
| 2761 MethodElement function, | 2697 MethodElement function, |
| 2762 ast.NodeList argumentList, | 2698 ast.NodeList argumentList, |
| 2763 CallStructure callStructure) { | 2699 CallStructure callStructure) { |
| 2764 | 2700 |
| 2765 void validateArgumentCount({int minimum, int exactly}) { | 2701 void validateArgumentCount({int minimum, int exactly}) { |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3613 } | 3549 } |
| 3614 | 3550 |
| 3615 Element get closureConverter { | 3551 Element get closureConverter { |
| 3616 return _backend.helpers.closureConverter; | 3552 return _backend.helpers.closureConverter; |
| 3617 } | 3553 } |
| 3618 | 3554 |
| 3619 void addNativeMethod(FunctionElement function) { | 3555 void addNativeMethod(FunctionElement function) { |
| 3620 _backend.emitter.nativeEmitter.nativeMethods.add(function); | 3556 _backend.emitter.nativeEmitter.nativeMethods.add(function); |
| 3621 } | 3557 } |
| 3622 } | 3558 } |
| OLD | NEW |