Chromium Code Reviews| 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 value, |
|
asgerf
2016/01/11 21:16:36
I think this was better before, but I don't feel s
Kevin Millikin (Google)
2016/01/12 15:58:47
I guess I can see that. I've changed it back (but
| |
| 2190 CompoundRhs rhs, | 2163 CompoundRhs rhs, |
| 2191 void setValue(ir.Primitive value)}) { | 2164 void setValue(ir.Primitive value)) { |
| 2192 ir.Primitive value = getValue(); | |
| 2193 op.BinaryOperator operator = rhs.operator; | 2165 op.BinaryOperator operator = rhs.operator; |
| 2194 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { | 2166 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
| 2195 // Unlike other compound operators if-null conditionally will not do the | 2167 // Unlike other compound operators if-null conditionally will not do the |
| 2196 // assignment operation. | 2168 // assignment operation. |
| 2197 return irBuilder.buildIfNull(value, nested(() { | 2169 return irBuilder.buildIfNull(value, nested(() { |
| 2198 ir.Primitive newValue = build(rhs.rhs); | 2170 ir.Primitive newValue = build(rhs.rhs); |
| 2199 setValue(newValue); | 2171 setValue(newValue); |
| 2200 return newValue; | 2172 return newValue; |
| 2201 })); | 2173 })); |
| 2202 } | 2174 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 2222 callStructure), | 2194 callStructure), |
| 2223 operatorTypeMask, | 2195 operatorTypeMask, |
| 2224 arguments, | 2196 arguments, |
| 2225 sourceInformation: operatorSourceInformation); | 2197 sourceInformation: operatorSourceInformation); |
| 2226 setValue(result); | 2198 setValue(result); |
| 2227 return rhs.kind == CompoundKind.POSTFIX ? value : result; | 2199 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 2228 } | 2200 } |
| 2229 | 2201 |
| 2230 ir.Primitive translateSetIfNull( | 2202 ir.Primitive translateSetIfNull( |
| 2231 ast.SendSet node, | 2203 ast.SendSet node, |
| 2232 {ir.Primitive getValue(), | 2204 ir.Primitive value, |
| 2233 ast.Node rhs, | 2205 ast.Node rhs, |
| 2234 void setValue(ir.Primitive value)}) { | 2206 void setValue(ir.Primitive value)) { |
| 2235 ir.Primitive value = getValue(); | |
| 2236 // Unlike other compound operators if-null conditionally will not do the | 2207 // Unlike other compound operators if-null conditionally will not do the |
| 2237 // assignment operation. | 2208 // assignment operation. |
| 2238 return irBuilder.buildIfNull(value, nested(() { | 2209 return irBuilder.buildIfNull(value, nested(() { |
| 2239 ir.Primitive newValue = build(rhs); | 2210 ir.Primitive newValue = build(rhs); |
| 2240 setValue(newValue); | 2211 setValue(newValue); |
| 2241 return newValue; | 2212 return newValue; |
| 2242 })); | 2213 })); |
| 2243 } | 2214 } |
| 2244 | 2215 |
| 2245 @override | 2216 @override |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2283 value = checkTypeVsElement(value, element); | 2254 value = checkTypeVsElement(value, element); |
| 2284 return irBuilder.buildLocalVariableSet(element, value); | 2255 return irBuilder.buildLocalVariableSet(element, value); |
| 2285 } | 2256 } |
| 2286 | 2257 |
| 2287 @override | 2258 @override |
| 2288 ir.Primitive handleStaticFieldSet( | 2259 ir.Primitive handleStaticFieldSet( |
| 2289 ast.SendSet node, | 2260 ast.SendSet node, |
| 2290 FieldElement field, | 2261 FieldElement field, |
| 2291 ast.Node rhs, | 2262 ast.Node rhs, |
| 2292 _) { | 2263 _) { |
| 2293 return irBuilder.buildStaticFieldSet(field, visit(rhs)); | 2264 ir.Primitive value = visit(rhs); |
| 2265 irBuilder.addPrimitive(new ir.SetStatic(field, value)); | |
| 2266 return value; | |
| 2294 } | 2267 } |
| 2295 | 2268 |
| 2296 @override | 2269 @override |
| 2297 ir.Primitive visitSuperFieldSet( | 2270 ir.Primitive visitSuperFieldSet( |
| 2298 ast.SendSet node, | 2271 ast.SendSet node, |
| 2299 FieldElement field, | 2272 FieldElement field, |
| 2300 ast.Node rhs, | 2273 ast.Node rhs, |
| 2301 _) { | 2274 _) { |
| 2302 return irBuilder.buildSuperFieldSet(field, visit(rhs)); | 2275 return irBuilder.buildSuperFieldSet(field, visit(rhs)); |
| 2303 } | 2276 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2329 _) { | 2302 _) { |
| 2330 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | 2303 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
| 2331 } | 2304 } |
| 2332 | 2305 |
| 2333 @override | 2306 @override |
| 2334 ir.Primitive handleTypeLiteralConstantCompounds( | 2307 ir.Primitive handleTypeLiteralConstantCompounds( |
| 2335 ast.SendSet node, | 2308 ast.SendSet node, |
| 2336 ConstantExpression constant, | 2309 ConstantExpression constant, |
| 2337 CompoundRhs rhs, | 2310 CompoundRhs rhs, |
| 2338 arg) { | 2311 arg) { |
| 2339 return translateCompounds( | 2312 ir.Primitive value = buildConstantExpression(constant, |
| 2340 node, | 2313 sourceInformationBuilder.buildGet(node)); |
| 2341 getValue: () { | 2314 return translateCompounds(node, value, rhs, (ir.Primitive value) { |
| 2342 return buildConstantExpression(constant, | 2315 // The binary operator will throw before this. |
| 2343 sourceInformationBuilder.buildGet(node)); | 2316 }); |
| 2344 }, | |
| 2345 rhs: rhs, | |
| 2346 setValue: (value) {}); // The binary operator will throw before this. | |
| 2347 } | 2317 } |
| 2348 | 2318 |
| 2349 @override | 2319 @override |
| 2350 ir.Primitive handleTypeLiteralConstantSetIfNulls( | 2320 ir.Primitive handleTypeLiteralConstantSetIfNulls( |
| 2351 ast.SendSet node, | 2321 ast.SendSet node, |
| 2352 ConstantExpression constant, | 2322 ConstantExpression constant, |
| 2353 ast.Node rhs, | 2323 ast.Node rhs, |
| 2354 _) { | 2324 _) { |
| 2355 // The type literal is never `null`. | 2325 // The type literal is never `null`. |
| 2356 return buildConstantExpression(constant, | 2326 return buildConstantExpression(constant, |
| 2357 sourceInformationBuilder.buildGet(node)); | 2327 sourceInformationBuilder.buildGet(node)); |
| 2358 } | 2328 } |
| 2359 | 2329 |
| 2360 @override | 2330 @override |
| 2361 ir.Primitive handleDynamicCompounds( | 2331 ir.Primitive handleDynamicCompounds( |
| 2362 ast.SendSet node, | 2332 ast.SendSet node, |
| 2363 ast.Node receiver, | 2333 ast.Node receiver, |
| 2364 Name name, | 2334 Name name, |
| 2365 CompoundRhs rhs, | 2335 CompoundRhs rhs, |
| 2366 arg) { | 2336 arg) { |
| 2367 ir.Primitive target = translateReceiver(receiver); | 2337 ir.Primitive target = translateReceiver(receiver); |
| 2368 ir.Primitive helper() { | 2338 ir.Primitive helper() { |
| 2369 return translateCompounds( | 2339 ir.Primitive value = irBuilder.buildDynamicGet( |
| 2370 node, | 2340 target, |
| 2371 getValue: () => irBuilder.buildDynamicGet( | 2341 new Selector.getter(name), |
| 2372 target, | 2342 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2373 new Selector.getter(name), | 2343 sourceInformationBuilder.buildGet(node)); |
| 2374 elements.getGetterTypeMaskInComplexSendSet(node), | 2344 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2375 sourceInformationBuilder.buildGet(node)), | 2345 irBuilder.buildDynamicSet( |
| 2376 rhs: rhs, | 2346 target, |
| 2377 setValue: (ir.Primitive result) { | 2347 new Selector.setter(name), |
| 2378 irBuilder.buildDynamicSet( | 2348 elements.getTypeMask(node), |
| 2379 target, | 2349 result); |
| 2380 new Selector.setter(name), | 2350 }); |
| 2381 elements.getTypeMask(node), | |
| 2382 result); | |
| 2383 }); | |
| 2384 } | 2351 } |
| 2385 return node.isConditional | 2352 return node.isConditional |
| 2386 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2353 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2387 : helper(); | 2354 : helper(); |
| 2388 } | 2355 } |
| 2389 | 2356 |
| 2390 @override | 2357 @override |
| 2391 ir.Primitive handleDynamicSetIfNulls( | 2358 ir.Primitive handleDynamicSetIfNulls( |
| 2392 ast.Send node, | 2359 ast.Send node, |
| 2393 ast.Node receiver, | 2360 ast.Node receiver, |
| 2394 Name name, | 2361 Name name, |
| 2395 ast.Node rhs, | 2362 ast.Node rhs, |
| 2396 _) { | 2363 _) { |
| 2397 ir.Primitive target = translateReceiver(receiver); | 2364 ir.Primitive target = translateReceiver(receiver); |
| 2398 ir.Primitive helper() { | 2365 ir.Primitive helper() { |
| 2399 return translateSetIfNull( | 2366 ir.Primitive value = irBuilder.buildDynamicGet( |
| 2400 node, | 2367 target, |
| 2401 getValue: () => irBuilder.buildDynamicGet( | 2368 new Selector.getter(name), |
| 2402 target, | 2369 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2403 new Selector.getter(name), | 2370 sourceInformationBuilder.buildGet(node)); |
| 2404 elements.getGetterTypeMaskInComplexSendSet(node), | 2371 return translateSetIfNull(node, value, rhs, (ir.Primitive result) { |
| 2405 sourceInformationBuilder.buildGet(node)), | 2372 irBuilder.buildDynamicSet( |
| 2406 rhs: rhs, | 2373 target, |
| 2407 setValue: (ir.Primitive result) { | 2374 new Selector.setter(name), |
| 2408 irBuilder.buildDynamicSet( | 2375 elements.getTypeMask(node), |
| 2409 target, | 2376 result); |
| 2410 new Selector.setter(name), | 2377 }); |
| 2411 elements.getTypeMask(node), | |
| 2412 result); | |
| 2413 }); | |
| 2414 } | 2378 } |
| 2415 return node.isConditional | 2379 return node.isConditional |
| 2416 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 2380 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 2417 : helper(); | 2381 : helper(); |
| 2418 } | 2382 } |
| 2419 | 2383 |
| 2420 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { | 2384 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { |
| 2421 Selector selector = new Selector.setter( | 2385 Selector selector = new Selector.setter( |
| 2422 new Name(local.name, local.library, isSetter: true)); | 2386 new Name(local.name, local.library, isSetter: true)); |
| 2423 return irBuilder.buildStaticNoSuchMethod(selector, [value]); | 2387 return irBuilder.buildStaticNoSuchMethod(selector, [value]); |
| 2424 } | 2388 } |
| 2425 | 2389 |
| 2426 @override | 2390 @override |
| 2427 ir.Primitive handleLocalCompounds( | 2391 ir.Primitive handleLocalCompounds( |
| 2428 ast.SendSet node, | 2392 ast.SendSet node, |
| 2429 LocalElement local, | 2393 LocalElement local, |
| 2430 CompoundRhs rhs, | 2394 CompoundRhs rhs, |
| 2431 arg, | 2395 arg, |
| 2432 {bool isSetterValid}) { | 2396 {bool isSetterValid}) { |
| 2433 return translateCompounds( | 2397 ir.Primitive value = irBuilder.buildLocalGet(local); |
| 2434 node, | 2398 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2435 getValue: () { | 2399 if (isSetterValid) { |
| 2436 if (local.isFunction) { | 2400 irBuilder.buildLocalVariableSet(local, result); |
| 2437 return irBuilder.buildLocalFunctionGet(local); | 2401 } else { |
| 2438 } else { | 2402 Selector selector = new Selector.setter( |
| 2439 return irBuilder.buildLocalVariableGet(local); | 2403 new Name(local.name, local.library, isSetter: true)); |
| 2440 } | 2404 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); |
| 2441 }, | 2405 } |
| 2442 rhs: rhs, | 2406 }); |
| 2443 setValue: (ir.Primitive result) { | |
| 2444 if (isSetterValid) { | |
| 2445 irBuilder.buildLocalVariableSet(local, result); | |
| 2446 } else { | |
| 2447 return buildLocalNoSuchSetter(local, result); | |
| 2448 } | |
| 2449 }); | |
| 2450 } | 2407 } |
| 2451 | 2408 |
| 2452 @override | 2409 @override |
| 2453 ir.Primitive handleLocalSetIfNulls( | 2410 ir.Primitive handleLocalSetIfNulls( |
| 2454 ast.SendSet node, | 2411 ast.SendSet node, |
| 2455 LocalElement local, | 2412 LocalElement local, |
| 2456 ast.Node rhs, | 2413 ast.Node rhs, |
| 2457 _, | 2414 _, |
| 2458 {bool isSetterValid}) { | 2415 {bool isSetterValid}) { |
| 2459 return translateSetIfNull( | 2416 ir.Primitive value = irBuilder.buildLocalGet(local); |
| 2460 node, | 2417 return translateSetIfNull(node, value, rhs, (ir.Primitive result) { |
| 2461 getValue: () { | 2418 if (isSetterValid) { |
| 2462 if (local.isFunction) { | 2419 irBuilder.buildLocalVariableSet(local, result); |
| 2463 return irBuilder.buildLocalFunctionGet(local); | 2420 } else { |
| 2464 } else { | 2421 Selector selector = new Selector.setter( |
| 2465 return irBuilder.buildLocalVariableGet(local); | 2422 new Name(local.name, local.library, isSetter: true)); |
| 2466 } | 2423 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); |
| 2467 }, | 2424 } |
| 2468 rhs: rhs, | 2425 }); |
| 2469 setValue: (ir.Primitive result) { | |
| 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 } | 2426 } |
| 2489 | 2427 |
| 2490 @override | 2428 @override |
| 2491 ir.Primitive handleStaticCompounds( | 2429 ir.Primitive handleStaticCompounds( |
| 2492 ast.SendSet node, | 2430 ast.SendSet node, |
| 2493 Element getter, | 2431 Element getter, |
| 2494 CompoundGetter getterKind, | 2432 CompoundGetter getterKind, |
| 2495 Element setter, | 2433 Element setter, |
| 2496 CompoundSetter setterKind, | 2434 CompoundSetter setterKind, |
| 2497 CompoundRhs rhs, | 2435 CompoundRhs rhs, |
| 2498 arg) { | 2436 arg) { |
| 2499 return translateCompounds( | 2437 ir.Primitive value; |
| 2500 node, | 2438 switch (getterKind) { |
| 2501 getValue: () { | 2439 case CompoundGetter.FIELD: |
| 2502 switch (getterKind) { | 2440 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2503 case CompoundGetter.FIELD: | 2441 value = buildStaticFieldGet(getter, src); |
| 2504 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2442 break; |
| 2505 return buildStaticFieldGet(getter, src); | 2443 case CompoundGetter.GETTER: |
| 2506 case CompoundGetter.GETTER: | 2444 value = buildStaticGetterGet(getter, node); |
| 2507 return buildStaticGetterGet(getter, node); | 2445 break; |
| 2508 case CompoundGetter.METHOD: | 2446 case CompoundGetter.METHOD: |
| 2509 return irBuilder.buildStaticFunctionGet(getter); | 2447 value = irBuilder.addPrimitive(new ir.GetStatic(getter)); |
| 2510 case CompoundGetter.UNRESOLVED: | 2448 break; |
| 2511 return buildStaticNoSuchGetter(getter); | 2449 case CompoundGetter.UNRESOLVED: |
|
asgerf
2016/01/11 21:16:36
The buildStaticNoSuchGetter seemed kind of conveni
| |
| 2512 } | 2450 value = irBuilder.buildStaticNoSuchMethod( |
| 2513 }, | 2451 new Selector.getter(new Name(getter.name, getter.library)), |
| 2514 rhs: rhs, | 2452 <ir.Primitive>[]); |
| 2515 setValue: (ir.Primitive result) { | 2453 break; |
| 2516 switch (setterKind) { | 2454 } |
| 2517 case CompoundSetter.FIELD: | 2455 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2518 return irBuilder.buildStaticFieldSet(setter, result); | 2456 switch (setterKind) { |
| 2519 case CompoundSetter.SETTER: | 2457 case CompoundSetter.FIELD: |
| 2520 return irBuilder.buildStaticSetterSet(setter, result); | 2458 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); |
| 2521 case CompoundSetter.INVALID: | 2459 break; |
| 2522 return buildStaticNoSuchSetter(setter, result); | 2460 case CompoundSetter.SETTER: |
| 2523 } | 2461 irBuilder.buildStaticSetterSet(setter, result); |
| 2524 }); | 2462 break; |
| 2463 case CompoundSetter.INVALID: | |
| 2464 irBuilder.buildStaticNoSuchMethod( | |
| 2465 new Selector.setter(new Name(setter.name, setter.library)), | |
| 2466 <ir.Primitive>[result]); | |
| 2467 break; | |
| 2468 } | |
| 2469 }); | |
| 2525 } | 2470 } |
| 2526 | 2471 |
| 2527 @override | 2472 @override |
| 2528 ir.Primitive handleStaticSetIfNulls( | 2473 ir.Primitive handleStaticSetIfNulls( |
| 2529 ast.SendSet node, | 2474 ast.SendSet node, |
| 2530 Element getter, | 2475 Element getter, |
| 2531 CompoundGetter getterKind, | 2476 CompoundGetter getterKind, |
| 2532 Element setter, | 2477 Element setter, |
| 2533 CompoundSetter setterKind, | 2478 CompoundSetter setterKind, |
| 2534 ast.Node rhs, | 2479 ast.Node rhs, |
| 2535 _) { | 2480 _) { |
| 2536 return translateSetIfNull( | 2481 ir.Primitive value; |
| 2537 node, | 2482 switch (getterKind) { |
| 2538 getValue: () { | 2483 case CompoundGetter.FIELD: |
| 2539 switch (getterKind) { | 2484 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 2540 case CompoundGetter.FIELD: | 2485 value = buildStaticFieldGet(getter, src); |
| 2541 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2486 break; |
| 2542 return buildStaticFieldGet(getter, src); | 2487 case CompoundGetter.GETTER: |
| 2543 case CompoundGetter.GETTER: | 2488 value = buildStaticGetterGet(getter, node); |
| 2544 return buildStaticGetterGet(getter, node); | 2489 break; |
| 2545 case CompoundGetter.METHOD: | 2490 case CompoundGetter.METHOD: |
| 2546 return irBuilder.buildStaticFunctionGet(getter); | 2491 value = irBuilder.addPrimitive(new ir.GetStatic(getter)); |
| 2547 case CompoundGetter.UNRESOLVED: | 2492 break; |
| 2548 return buildStaticNoSuchGetter(getter); | 2493 case CompoundGetter.UNRESOLVED: |
| 2549 } | 2494 value = irBuilder.buildStaticNoSuchMethod( |
| 2550 }, | 2495 new Selector.getter(new Name(getter.name, getter.library)), |
| 2551 rhs: rhs, | 2496 <ir.Primitive>[]); |
| 2552 setValue: (ir.Primitive result) { | 2497 break; |
| 2553 switch (setterKind) { | 2498 } |
| 2554 case CompoundSetter.FIELD: | 2499 return translateSetIfNull(node, value, rhs, (ir.Primitive result) { |
| 2555 return irBuilder.buildStaticFieldSet(setter, result); | 2500 switch (setterKind) { |
| 2556 case CompoundSetter.SETTER: | 2501 case CompoundSetter.FIELD: |
| 2557 return irBuilder.buildStaticSetterSet(setter, result); | 2502 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); |
| 2558 case CompoundSetter.INVALID: | 2503 break; |
| 2559 return buildStaticNoSuchSetter(setter, result); | 2504 case CompoundSetter.SETTER: |
| 2560 } | 2505 irBuilder.buildStaticSetterSet(setter, result); |
| 2561 }); | 2506 break; |
| 2507 case CompoundSetter.INVALID: | |
| 2508 irBuilder.buildStaticNoSuchMethod( | |
| 2509 new Selector.setter(new Name(setter.name, setter.library)), | |
| 2510 <ir.Primitive>[result]); | |
| 2511 break; | |
| 2512 } | |
| 2513 }); | |
| 2562 } | 2514 } |
| 2563 | 2515 |
| 2564 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 2516 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
| 2565 return buildInstanceNoSuchMethod( | 2517 return buildInstanceNoSuchMethod( |
| 2566 new Selector.getter(new Name(element.name, element.library)), | 2518 new Selector.getter(new Name(element.name, element.library)), |
| 2567 mask, | 2519 mask, |
| 2568 const <ir.Primitive>[]); | 2520 const <ir.Primitive>[]); |
| 2569 } | 2521 } |
| 2570 | 2522 |
| 2571 ir.Primitive buildSuperNoSuchSetter(Element element, | 2523 ir.Primitive buildSuperNoSuchSetter(Element element, |
| 2572 TypeMask mask, | 2524 TypeMask mask, |
| 2573 ir.Primitive value) { | 2525 ir.Primitive value) { |
| 2574 return buildInstanceNoSuchMethod( | 2526 return buildInstanceNoSuchMethod( |
| 2575 new Selector.setter(new Name(element.name, element.library)), | 2527 new Selector.setter(new Name(element.name, element.library)), |
| 2576 mask, | 2528 mask, |
| 2577 <ir.Primitive>[value]); | 2529 <ir.Primitive>[value]); |
| 2578 } | 2530 } |
| 2579 | 2531 |
| 2580 @override | 2532 @override |
| 2581 ir.Primitive handleSuperCompounds( | 2533 ir.Primitive handleSuperCompounds( |
| 2582 ast.SendSet node, | 2534 ast.SendSet node, |
| 2583 Element getter, | 2535 Element getter, |
| 2584 CompoundGetter getterKind, | 2536 CompoundGetter getterKind, |
| 2585 Element setter, | 2537 Element setter, |
| 2586 CompoundSetter setterKind, | 2538 CompoundSetter setterKind, |
| 2587 CompoundRhs rhs, | 2539 CompoundRhs rhs, |
| 2588 arg) { | 2540 arg) { |
| 2589 return translateCompounds( | 2541 ir.Primitive value; |
| 2590 node, | 2542 switch (getterKind) { |
| 2591 getValue: () { | 2543 case CompoundGetter.FIELD: |
| 2592 switch (getterKind) { | 2544 value = irBuilder.buildSuperFieldGet(getter); |
| 2593 case CompoundGetter.FIELD: | 2545 break; |
| 2594 return irBuilder.buildSuperFieldGet(getter); | 2546 case CompoundGetter.GETTER: |
| 2595 case CompoundGetter.GETTER: | 2547 value = irBuilder.buildSuperGetterGet( |
| 2596 return irBuilder.buildSuperGetterGet( | 2548 getter, sourceInformationBuilder.buildGet(node)); |
| 2597 getter, sourceInformationBuilder.buildGet(node)); | 2549 break; |
| 2598 case CompoundGetter.METHOD: | 2550 case CompoundGetter.METHOD: |
| 2599 return irBuilder.buildSuperMethodGet(getter); | 2551 value = irBuilder.buildSuperMethodGet(getter); |
| 2600 case CompoundGetter.UNRESOLVED: | 2552 break; |
| 2601 return buildSuperNoSuchGetter( | 2553 case CompoundGetter.UNRESOLVED: |
| 2602 getter, | 2554 value = buildSuperNoSuchGetter( |
| 2603 elements.getGetterTypeMaskInComplexSendSet(node)); | 2555 getter, elements.getGetterTypeMaskInComplexSendSet(node)); |
| 2604 } | 2556 break; |
| 2605 }, | 2557 } |
| 2606 rhs: rhs, | 2558 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2607 setValue: (ir.Primitive result) { | 2559 switch (setterKind) { |
| 2608 switch (setterKind) { | 2560 case CompoundSetter.FIELD: |
| 2609 case CompoundSetter.FIELD: | 2561 irBuilder.buildSuperFieldSet(setter, result); |
| 2610 return irBuilder.buildSuperFieldSet(setter, result); | 2562 break; |
| 2611 case CompoundSetter.SETTER: | 2563 case CompoundSetter.SETTER: |
| 2612 return irBuilder.buildSuperSetterSet(setter, result); | 2564 irBuilder.buildSuperSetterSet(setter, result); |
| 2613 case CompoundSetter.INVALID: | 2565 break; |
| 2614 return buildSuperNoSuchSetter( | 2566 case CompoundSetter.INVALID: |
| 2615 setter, elements.getTypeMask(node), result); | 2567 buildSuperNoSuchSetter( |
| 2616 } | 2568 setter, elements.getTypeMask(node), result); |
| 2617 }); | 2569 break; |
| 2570 } | |
| 2571 }); | |
| 2618 } | 2572 } |
| 2619 | 2573 |
| 2620 @override | 2574 @override |
| 2621 ir.Primitive handleSuperSetIfNulls( | 2575 ir.Primitive handleSuperSetIfNulls( |
| 2622 ast.SendSet node, | 2576 ast.SendSet node, |
| 2623 Element getter, | 2577 Element getter, |
| 2624 CompoundGetter getterKind, | 2578 CompoundGetter getterKind, |
| 2625 Element setter, | 2579 Element setter, |
| 2626 CompoundSetter setterKind, | 2580 CompoundSetter setterKind, |
| 2627 ast.Node rhs, | 2581 ast.Node rhs, |
| 2628 _) { | 2582 _) { |
| 2629 return translateSetIfNull( | 2583 ir.Primitive value; |
| 2630 node, | 2584 switch (getterKind) { |
| 2631 getValue: () { | 2585 case CompoundGetter.FIELD: |
| 2632 switch (getterKind) { | 2586 value = irBuilder.buildSuperFieldGet(getter); |
| 2633 case CompoundGetter.FIELD: | 2587 break; |
| 2634 return irBuilder.buildSuperFieldGet(getter); | 2588 case CompoundGetter.GETTER: |
| 2635 case CompoundGetter.GETTER: | 2589 value = irBuilder.buildSuperGetterGet( |
| 2636 return irBuilder.buildSuperGetterGet( | 2590 getter, sourceInformationBuilder.buildGet(node)); |
| 2637 getter, sourceInformationBuilder.buildGet(node)); | 2591 break; |
| 2638 case CompoundGetter.METHOD: | 2592 case CompoundGetter.METHOD: |
| 2639 return irBuilder.buildSuperMethodGet(getter); | 2593 value = irBuilder.buildSuperMethodGet(getter); |
| 2640 case CompoundGetter.UNRESOLVED: | 2594 break; |
| 2641 return buildSuperNoSuchGetter( | 2595 case CompoundGetter.UNRESOLVED: |
| 2642 getter, | 2596 value = buildSuperNoSuchGetter( |
| 2643 elements.getGetterTypeMaskInComplexSendSet(node)); | 2597 getter, |
| 2644 } | 2598 elements.getGetterTypeMaskInComplexSendSet(node)); |
| 2645 }, | 2599 break; |
| 2646 rhs: rhs, | 2600 } |
| 2647 setValue: (ir.Primitive result) { | 2601 return translateSetIfNull(node, value, rhs, (ir.Primitive result) { |
| 2648 switch (setterKind) { | 2602 switch (setterKind) { |
| 2649 case CompoundSetter.FIELD: | 2603 case CompoundSetter.FIELD: |
| 2650 return irBuilder.buildSuperFieldSet(setter, result); | 2604 irBuilder.buildSuperFieldSet(setter, result); |
| 2651 case CompoundSetter.SETTER: | 2605 break; |
| 2652 return irBuilder.buildSuperSetterSet(setter, result); | 2606 case CompoundSetter.SETTER: |
| 2653 case CompoundSetter.INVALID: | 2607 irBuilder.buildSuperSetterSet(setter, result); |
| 2654 return buildSuperNoSuchSetter( | 2608 break; |
| 2655 setter, elements.getTypeMask(node), result); | 2609 case CompoundSetter.INVALID: |
| 2656 } | 2610 buildSuperNoSuchSetter( |
| 2657 }); | 2611 setter, elements.getTypeMask(node), result); |
| 2612 break; | |
| 2613 } | |
| 2614 }); | |
| 2658 } | 2615 } |
| 2659 | 2616 |
| 2660 @override | 2617 @override |
| 2661 ir.Primitive handleTypeVariableTypeLiteralCompounds( | 2618 ir.Primitive handleTypeVariableTypeLiteralCompounds( |
| 2662 ast.SendSet node, | 2619 ast.SendSet node, |
| 2663 TypeVariableElement typeVariable, | 2620 TypeVariableElement typeVariable, |
| 2664 CompoundRhs rhs, | 2621 CompoundRhs rhs, |
| 2665 arg) { | 2622 arg) { |
| 2666 return translateCompounds( | 2623 ir.Primitive value = irBuilder.buildReifyTypeVariable( |
| 2667 node, | 2624 typeVariable.type, |
| 2668 getValue: () { | 2625 sourceInformationBuilder.buildGet(node)); |
| 2669 return irBuilder.buildReifyTypeVariable( | 2626 return translateCompounds(node, value, rhs, (ir.Primitive value) { |
| 2670 typeVariable.type, | 2627 // The binary operator will throw before this. |
| 2671 sourceInformationBuilder.buildGet(node)); | 2628 }); |
| 2672 }, | |
| 2673 rhs: rhs, | |
| 2674 setValue: (value) {}); // The binary operator will throw before this. | |
| 2675 } | 2629 } |
| 2676 | 2630 |
| 2677 @override | 2631 @override |
| 2678 ir.Primitive visitTypeVariableTypeLiteralSetIfNull( | 2632 ir.Primitive visitTypeVariableTypeLiteralSetIfNull( |
| 2679 ast.Send node, | 2633 ast.Send node, |
| 2680 TypeVariableElement element, | 2634 TypeVariableElement element, |
| 2681 ast.Node rhs, | 2635 ast.Node rhs, |
| 2682 _) { | 2636 _) { |
| 2683 // The type variable is never `null`. | 2637 // The type variable is never `null`. |
| 2684 return translateTypeVariableTypeLiteral(element, | 2638 return translateTypeVariableTypeLiteral(element, |
| 2685 sourceInformationBuilder.buildGet(node)); | 2639 sourceInformationBuilder.buildGet(node)); |
| 2686 } | 2640 } |
| 2687 | 2641 |
| 2688 @override | 2642 @override |
| 2689 ir.Primitive handleIndexCompounds( | 2643 ir.Primitive handleIndexCompounds( |
| 2690 ast.SendSet node, | 2644 ast.SendSet node, |
| 2691 ast.Node receiver, | 2645 ast.Node receiver, |
| 2692 ast.Node index, | 2646 ast.Node index, |
| 2693 CompoundRhs rhs, | 2647 CompoundRhs rhs, |
| 2694 arg) { | 2648 arg) { |
| 2695 ir.Primitive target = visit(receiver); | 2649 ir.Primitive target = visit(receiver); |
| 2696 ir.Primitive indexValue = visit(index); | 2650 ir.Primitive indexValue = visit(index); |
| 2697 return translateCompounds( | 2651 Selector selector = new Selector.index(); |
| 2698 node, | 2652 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 2699 getValue: () { | 2653 CallStructure callStructure = |
| 2700 Selector selector = new Selector.index(); | 2654 normalizeDynamicArguments(selector.callStructure, arguments); |
| 2701 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 2655 ir.Primitive value = irBuilder.buildDynamicInvocation( |
| 2702 CallStructure callStructure = | 2656 target, |
| 2703 normalizeDynamicArguments(selector.callStructure, arguments); | 2657 new Selector(selector.kind, selector.memberName, callStructure), |
| 2704 return irBuilder.buildDynamicInvocation( | 2658 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2705 target, | 2659 arguments, |
| 2706 new Selector(selector.kind, selector.memberName, callStructure), | 2660 sourceInformation: |
| 2707 elements.getGetterTypeMaskInComplexSendSet(node), | 2661 sourceInformationBuilder.buildCall(receiver, node)); |
| 2708 arguments, | 2662 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2709 sourceInformation: | 2663 irBuilder.buildDynamicIndexSet( |
| 2710 sourceInformationBuilder.buildCall(receiver, node)); | 2664 target, |
| 2711 }, | 2665 elements.getTypeMask(node), |
| 2712 rhs: rhs, | 2666 indexValue, |
| 2713 setValue: (ir.Primitive result) { | 2667 result); |
| 2714 irBuilder.buildDynamicIndexSet( | 2668 }); |
| 2715 target, | |
| 2716 elements.getTypeMask(node), | |
| 2717 indexValue, | |
| 2718 result); | |
| 2719 }); | |
| 2720 } | 2669 } |
| 2721 | 2670 |
| 2722 @override | 2671 @override |
| 2723 ir.Primitive handleSuperIndexCompounds( | 2672 ir.Primitive handleSuperIndexCompounds( |
| 2724 ast.SendSet node, | 2673 ast.SendSet node, |
| 2725 Element indexFunction, | 2674 Element indexFunction, |
| 2726 Element indexSetFunction, | 2675 Element indexSetFunction, |
| 2727 ast.Node index, | 2676 ast.Node index, |
| 2728 CompoundRhs rhs, | 2677 CompoundRhs rhs, |
| 2729 arg, | 2678 arg, |
| 2730 {bool isGetterValid, | 2679 {bool isGetterValid, |
| 2731 bool isSetterValid}) { | 2680 bool isSetterValid}) { |
| 2732 ir.Primitive indexValue = visit(index); | 2681 ir.Primitive indexValue = visit(index); |
| 2733 return translateCompounds( | 2682 ir.Primitive value = isGetterValid |
| 2734 node, | 2683 ? irBuilder.buildSuperIndex(indexFunction, indexValue) |
| 2735 getValue: () { | 2684 : buildInstanceNoSuchMethod( |
| 2736 if (isGetterValid) { | 2685 new Selector.index(), |
| 2737 return irBuilder.buildSuperIndex(indexFunction, indexValue); | 2686 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2738 } else { | 2687 <ir.Primitive>[indexValue]); |
| 2739 return buildInstanceNoSuchMethod( | 2688 return translateCompounds(node, value, rhs, (ir.Primitive result) { |
| 2740 new Selector.index(), | 2689 if (isSetterValid) { |
| 2741 elements.getGetterTypeMaskInComplexSendSet(node), | 2690 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
| 2742 <ir.Primitive>[indexValue]); | 2691 } else { |
| 2743 } | 2692 buildInstanceNoSuchMethod( |
| 2744 }, | 2693 new Selector.indexSet(), |
| 2745 rhs: rhs, | 2694 elements.getTypeMask(node), |
| 2746 setValue: (ir.Primitive result) { | 2695 <ir.Primitive>[indexValue, result]); |
| 2747 if (isSetterValid) { | 2696 } |
| 2748 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 2697 }); |
| 2749 } else { | |
| 2750 buildInstanceNoSuchMethod( | |
| 2751 new Selector.indexSet(), | |
| 2752 elements.getTypeMask(node), | |
| 2753 <ir.Primitive>[indexValue, result]); | |
| 2754 } | |
| 2755 }); | |
| 2756 } | 2698 } |
| 2757 | 2699 |
| 2758 /// Build code to handle foreign code, that is, native JavaScript code, or | 2700 /// Build code to handle foreign code, that is, native JavaScript code, or |
| 2759 /// builtin values and operations of the backend. | 2701 /// builtin values and operations of the backend. |
| 2760 ir.Primitive handleForeignCode(ast.Send node, | 2702 ir.Primitive handleForeignCode(ast.Send node, |
| 2761 MethodElement function, | 2703 MethodElement function, |
| 2762 ast.NodeList argumentList, | 2704 ast.NodeList argumentList, |
| 2763 CallStructure callStructure) { | 2705 CallStructure callStructure) { |
| 2764 | 2706 |
| 2765 void validateArgumentCount({int minimum, int exactly}) { | 2707 void validateArgumentCount({int minimum, int exactly}) { |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3613 } | 3555 } |
| 3614 | 3556 |
| 3615 Element get closureConverter { | 3557 Element get closureConverter { |
| 3616 return _backend.helpers.closureConverter; | 3558 return _backend.helpers.closureConverter; |
| 3617 } | 3559 } |
| 3618 | 3560 |
| 3619 void addNativeMethod(FunctionElement function) { | 3561 void addNativeMethod(FunctionElement function) { |
| 3620 _backend.emitter.nativeEmitter.nativeMethods.add(function); | 3562 _backend.emitter.nativeEmitter.nativeMethods.add(function); |
| 3621 } | 3563 } |
| 3622 } | 3564 } |
| OLD | NEW |