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

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

Issue 1570603006: dart2js: Simplification of the IrBuilderVisitor. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Remove unused variable. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698