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

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: 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 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
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
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
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
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 }
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