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

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

Issue 1195573003: dart2js cps: Refactor and optimize string concatenations. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Revert doc comment change Created 5 years, 6 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
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 closurelib; 7 import '../closure.dart' as closurelib;
8 import '../closure.dart' hide ClosureScope; 8 import '../closure.dart' hide ClosureScope;
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
11 import '../dart2jslib.dart'; 11 import '../dart2jslib.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../elements/modelx.dart' show SynthesizedConstructorElementX, 13 import '../elements/modelx.dart' show SynthesizedConstructorElementX,
14 ConstructorBodyElementX, FunctionSignatureX; 14 ConstructorBodyElementX, FunctionSignatureX;
15 import '../io/source_information.dart'; 15 import '../io/source_information.dart';
16 import '../js_backend/js_backend.dart' show JavaScriptBackend; 16 import '../js_backend/js_backend.dart' show JavaScriptBackend;
17 import '../resolution/semantic_visitor.dart'; 17 import '../resolution/semantic_visitor.dart';
18 import '../resolution/operators.dart' as op; 18 import '../resolution/operators.dart' as op;
19 import '../tree/tree.dart' as ast; 19 import '../tree/tree.dart' as ast;
20 import '../universe/universe.dart' show SelectorKind, CallStructure; 20 import '../universe/universe.dart' show SelectorKind, CallStructure;
21 import '../constants/values.dart' show ConstantValue;
21 import 'cps_ir_nodes.dart' as ir; 22 import 'cps_ir_nodes.dart' as ir;
22 import 'cps_ir_builder.dart'; 23 import 'cps_ir_builder.dart';
23 import '../native/native.dart' show NativeBehavior; 24 import '../native/native.dart' show NativeBehavior;
24 25
25 // TODO(karlklose): remove. 26 // TODO(karlklose): remove.
26 import '../js/js.dart' as js show js, Template, Expression; 27 import '../js/js.dart' as js show js, Template, Expression;
27 import '../ssa/ssa.dart' show TypeMaskFactory; 28 import '../ssa/ssa.dart' show TypeMaskFactory;
28 import '../types/types.dart' show TypeMask; 29 import '../types/types.dart' show TypeMask;
29 import '../util/util.dart'; 30 import '../util/util.dart';
30 31
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 variableElement: variableElement, 347 variableElement: variableElement,
347 variableSelector: selector, 348 variableSelector: selector,
348 buildBody: subbuild(node.body), 349 buildBody: subbuild(node.body),
349 target: elements.getTargetDefinition(node), 350 target: elements.getTargetDefinition(node),
350 closureScope: getClosureScopeForNode(node)); 351 closureScope: getClosureScopeForNode(node));
351 } 352 }
352 353
353 ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) { 354 ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
354 assert(irBuilder.isOpen); 355 assert(irBuilder.isOpen);
355 if (node.modifiers.isConst) { 356 if (node.modifiers.isConst) {
356 for (ast.SendSet definition in node.definitions.nodes) { 357 // Do nothing.
357 assert(!definition.arguments.isEmpty); 358 // handleLocalConstantGet inlines the constant at use-site.
358 assert(definition.arguments.tail.isEmpty);
359 VariableElement element = elements[definition];
360 ConstantExpression value = getConstantForVariable(element);
361 irBuilder.declareLocalConstant(element, value);
362 }
363 } else { 359 } else {
364 for (ast.Node definition in node.definitions.nodes) { 360 for (ast.Node definition in node.definitions.nodes) {
365 Element element = elements[definition]; 361 Element element = elements[definition];
366 ir.Primitive initialValue; 362 ir.Primitive initialValue;
367 // Definitions are either SendSets if there is an initializer, or 363 // Definitions are either SendSets if there is an initializer, or
368 // Identifiers if there is no initializer. 364 // Identifiers if there is no initializer.
369 if (definition is ast.SendSet) { 365 if (definition is ast.SendSet) {
370 assert(!definition.arguments.isEmpty); 366 assert(!definition.arguments.isEmpty);
371 assert(definition.arguments.tail.isEmpty); 367 assert(definition.arguments.tail.isEmpty);
372 initialValue = visit(definition.arguments.head); 368 initialValue = visit(definition.arguments.head);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 ir.Primitive visitLiteralNull(ast.LiteralNull node) { 488 ir.Primitive visitLiteralNull(ast.LiteralNull node) {
493 assert(irBuilder.isOpen); 489 assert(irBuilder.isOpen);
494 return irBuilder.buildNullConstant(); 490 return irBuilder.buildNullConstant();
495 } 491 }
496 492
497 ir.Primitive visitLiteralString(ast.LiteralString node) { 493 ir.Primitive visitLiteralString(ast.LiteralString node) {
498 assert(irBuilder.isOpen); 494 assert(irBuilder.isOpen);
499 return irBuilder.buildDartStringConstant(node.dartString); 495 return irBuilder.buildDartStringConstant(node.dartString);
500 } 496 }
501 497
502 ConstantExpression getConstantForNode(ast.Node node) { 498 ConstantValue getConstantForNode(ast.Node node) {
503 ConstantExpression constant = 499 return irBuilder.state.constants.getConstantValueForNode(node, elements);
504 irBuilder.state.constants.getConstantForNode(node, elements);
505 assert(invariant(node, constant != null,
506 message: 'No constant computed for $node'));
507 return constant;
508 } 500 }
509 501
510 ConstantExpression getConstantForVariable(VariableElement element) { 502 ConstantValue getConstantForVariable(VariableElement element) {
511 ConstantExpression constant = 503 return irBuilder.state.constants.getConstantValueForVariable(element);
512 irBuilder.state.constants.getConstantForVariable(element);
513 assert(invariant(element, constant != null,
514 message: 'No constant computed for $element'));
515 return constant;
516 } 504 }
517 505
518 /// Builds a constant pulling the value from the constant environment. 506 ir.Primitive buildConstantExpression(ConstantExpression expression) {
519 // TODO(johnniwinther): Remove this when [IrBuilder.buildConstant] only takes 507 return irBuilder.buildConstant(
520 // a [ConstantExpression].
521 ir.Primitive buildConstant(ConstantExpression expression) {
522 return irBuilder.buildConstant(expression,
523 irBuilder.state.constants.getConstantValue(expression)); 508 irBuilder.state.constants.getConstantValue(expression));
524 } 509 }
525 510
526 ir.Primitive visitLiteralList(ast.LiteralList node) { 511 ir.Primitive visitLiteralList(ast.LiteralList node) {
527 if (node.isConst) { 512 if (node.isConst) {
528 return translateConstant(node); 513 return translateConstant(node);
529 } 514 }
530 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); 515 List<ir.Primitive> values = node.elements.nodes.mapToList(visit);
531 InterfaceType type = elements.getType(node); 516 InterfaceType type = elements.getType(node);
532 return irBuilder.buildListLiteral(type, values); 517 return irBuilder.buildListLiteral(type, values);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 /// Returns `true` if [node] is a super call. 595 /// Returns `true` if [node] is a super call.
611 // TODO(johnniwinther): Remove the need for this. 596 // TODO(johnniwinther): Remove the need for this.
612 bool isSuperCall(ast.Send node) { 597 bool isSuperCall(ast.Send node) {
613 return node != null && node.receiver != null && node.receiver.isSuper(); 598 return node != null && node.receiver != null && node.receiver.isSuper();
614 } 599 }
615 600
616 @override 601 @override
617 ir.Primitive handleConstantGet( 602 ir.Primitive handleConstantGet(
618 ast.Node node, 603 ast.Node node,
619 ConstantExpression constant, _) { 604 ConstantExpression constant, _) {
620 return buildConstant(constant); 605 return buildConstantExpression(constant);
621 } 606 }
622 607
623 /// If [node] is null, returns this. 608 /// If [node] is null, returns this.
624 /// Otherwise visits [node] and returns the result. 609 /// Otherwise visits [node] and returns the result.
625 ir.Primitive translateReceiver(ast.Expression node) { 610 ir.Primitive translateReceiver(ast.Expression node) {
626 return node != null ? visit(node) : irBuilder.buildThis(); 611 return node != null ? visit(node) : irBuilder.buildThis();
627 } 612 }
628 613
629 @override 614 @override
630 ir.Primitive handleDynamicGet( 615 ir.Primitive handleDynamicGet(
(...skipping 16 matching lines...) Expand all
647 return irBuilder.buildIfNotNullSend( 632 return irBuilder.buildIfNotNullSend(
648 target, 633 target,
649 nested(() => irBuilder.buildDynamicGet(target, selector))); 634 nested(() => irBuilder.buildDynamicGet(target, selector)));
650 } 635 }
651 636
652 @override 637 @override
653 ir.Primitive visitDynamicTypeLiteralGet( 638 ir.Primitive visitDynamicTypeLiteralGet(
654 ast.Send node, 639 ast.Send node,
655 ConstantExpression constant, 640 ConstantExpression constant,
656 _) { 641 _) {
657 return buildConstant(constant); 642 return buildConstantExpression(constant);
658 } 643 }
659 644
660 @override 645 @override
661 ir.Primitive visitLocalVariableGet( 646 ir.Primitive visitLocalVariableGet(
662 ast.Send node, 647 ast.Send node,
663 LocalVariableElement element, 648 LocalVariableElement element,
664 _) { 649 _) {
665 return element.isConst 650 return element.isConst
666 ? buildConstant(getConstantForVariable(element)) 651 ? irBuilder.buildConstant(getConstantForVariable(element))
667 : irBuilder.buildLocalVariableGet(element); 652 : irBuilder.buildLocalVariableGet(element);
668 } 653 }
669 654
670 @override 655 @override
671 ir.Primitive handleLocalGet( 656 ir.Primitive handleLocalGet(
672 ast.Send node, 657 ast.Send node,
673 LocalElement element, 658 LocalElement element,
674 _) { 659 _) {
675 return irBuilder.buildLocalVariableGet(element); 660 return irBuilder.buildLocalVariableGet(element);
676 } 661 }
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 translateDynamicArguments(arguments, callStructure)); 951 translateDynamicArguments(arguments, callStructure));
967 } 952 }
968 953
969 @override 954 @override
970 ir.Primitive handleConstantInvoke( 955 ir.Primitive handleConstantInvoke(
971 ast.Send node, 956 ast.Send node,
972 ConstantExpression constant, 957 ConstantExpression constant,
973 ast.NodeList arguments, 958 ast.NodeList arguments,
974 CallStructure callStructure, 959 CallStructure callStructure,
975 _) { 960 _) {
976 ir.Primitive target = buildConstant(constant); 961 ir.Primitive target = buildConstantExpression(constant);
977 return translateCallInvoke(target, arguments, callStructure); 962 return translateCallInvoke(target, arguments, callStructure);
978 } 963 }
979 964
980 @override 965 @override
981 ir.Primitive handleDynamicInvoke( 966 ir.Primitive handleDynamicInvoke(
982 ast.Send node, 967 ast.Send node,
983 ast.Node receiver, 968 ast.Node receiver,
984 ast.NodeList arguments, 969 ast.NodeList arguments,
985 Selector selector, 970 Selector selector,
986 _) { 971 _) {
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); 1280 return irBuilder.buildStaticSetterSet(setter, visit(rhs));
1296 } 1281 }
1297 1282
1298 @override 1283 @override
1299 ir.Primitive handleTypeLiteralConstantCompounds( 1284 ir.Primitive handleTypeLiteralConstantCompounds(
1300 ast.SendSet node, 1285 ast.SendSet node,
1301 ConstantExpression constant, 1286 ConstantExpression constant,
1302 CompoundRhs rhs, 1287 CompoundRhs rhs,
1303 arg) { 1288 arg) {
1304 return translateCompounds( 1289 return translateCompounds(
1305 getValue: () => buildConstant(constant), 1290 getValue: () => buildConstantExpression(constant),
1306 rhs: rhs, 1291 rhs: rhs,
1307 setValue: (value) {}); // The binary operator will throw before this. 1292 setValue: (value) {}); // The binary operator will throw before this.
1308 } 1293 }
1309 1294
1310 @override 1295 @override
1311 ir.Primitive handleDynamicCompounds( 1296 ir.Primitive handleDynamicCompounds(
1312 ast.Send node, 1297 ast.Send node,
1313 ast.Node receiver, 1298 ast.Node receiver,
1314 CompoundRhs rhs, 1299 CompoundRhs rhs,
1315 Selector getterSelector, 1300 Selector getterSelector,
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 setValue: (ir.Primitive result) { 1501 setValue: (ir.Primitive result) {
1517 if (isSetterValid) { 1502 if (isSetterValid) {
1518 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); 1503 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
1519 } else { 1504 } else {
1520 buildInstanceNoSuchMethod( 1505 buildInstanceNoSuchMethod(
1521 new Selector.indexSet(), <ir.Primitive>[indexValue, result]); 1506 new Selector.indexSet(), <ir.Primitive>[indexValue, result]);
1522 } 1507 }
1523 }); 1508 });
1524 } 1509 }
1525 1510
1511 /// Evaluates a string interpolation and appends each part to [accumulator]
1512 /// (after stringify conversion).
1513 void buildStringParts(ast.Node node, List<ir.Primitive> accumulator) {
1514 if (node is ast.StringJuxtaposition) {
1515 buildStringParts(node.first, accumulator);
1516 buildStringParts(node.second, accumulator);
1517 } else if (node is ast.StringInterpolation) {
1518 buildStringParts(node.string, accumulator);
1519 for (ast.StringInterpolationPart part in node.parts) {
1520 buildStringParts(part.expression, accumulator);
1521 buildStringParts(part.string, accumulator);
1522 }
1523 } else if (node is ast.LiteralString) {
1524 // Empty strings often occur at the end of a string interpolation,
1525 // do not bother to include them.
1526 if (!node.dartString.isEmpty) {
1527 accumulator.add(irBuilder.buildDartStringConstant(node.dartString));
1528 }
1529 } else if (node is ast.ParenthesizedExpression) {
1530 buildStringParts(node.expression, accumulator);
1531 } else {
1532 ir.Primitive value = visit(node);
1533 accumulator.add(irBuilder.buildStringify(value));
1534 }
1535 }
1536
1526 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { 1537 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
1527 assert(irBuilder.isOpen); 1538 assert(irBuilder.isOpen);
1528 ir.Primitive first = visit(node.first); 1539 List<ir.Primitive> parts = <ir.Primitive>[];
1529 ir.Primitive second = visit(node.second); 1540 buildStringParts(node, parts);
1530 return irBuilder.buildStringConcatenation([first, second]); 1541 return irBuilder.buildStringConcatenation(parts);
1531 } 1542 }
1532 1543
1533 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { 1544 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
1534 assert(irBuilder.isOpen); 1545 assert(irBuilder.isOpen);
1535 List<ir.Primitive> arguments = []; 1546 List<ir.Primitive> parts = <ir.Primitive>[];
1536 arguments.add(visitLiteralString(node.string)); 1547 buildStringParts(node, parts);
1537 var it = node.parts.iterator; 1548 return irBuilder.buildStringConcatenation(parts);
1538 while (it.moveNext()) {
1539 ast.StringInterpolationPart part = it.current;
1540 arguments.add(visit(part.expression));
1541 arguments.add(visitLiteralString(part.string));
1542 }
1543 return irBuilder.buildStringConcatenation(arguments);
1544 } 1549 }
1545 1550
1546 ir.Primitive translateConstant(ast.Node node) { 1551 ir.Primitive translateConstant(ast.Node node) {
1547 assert(irBuilder.isOpen); 1552 assert(irBuilder.isOpen);
1548 return buildConstant(getConstantForNode(node)); 1553 return irBuilder.buildConstant(getConstantForNode(node));
1549 } 1554 }
1550 1555
1551 ir.Primitive visitThrow(ast.Throw node) { 1556 ir.Primitive visitThrow(ast.Throw node) {
1552 assert(irBuilder.isOpen); 1557 assert(irBuilder.isOpen);
1553 // This function is not called for throw expressions occurring as 1558 // This function is not called for throw expressions occurring as
1554 // statements. 1559 // statements.
1555 return irBuilder.buildNonTailThrow(visit(node.expression)); 1560 return irBuilder.buildNonTailThrow(visit(node.expression));
1556 } 1561 }
1557 1562
1558 ir.Primitive buildStaticNoSuchMethod( 1563 ir.Primitive buildStaticNoSuchMethod(
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 JavaScriptBackend get _backend => _compiler.backend; 2097 JavaScriptBackend get _backend => _compiler.backend;
2093 2098
2094 GlobalProgramInformation(this._compiler); 2099 GlobalProgramInformation(this._compiler);
2095 2100
2096 /// Returns [true], if the analysis could not determine that the type 2101 /// Returns [true], if the analysis could not determine that the type
2097 /// arguments for the class [cls] are never used in the program. 2102 /// arguments for the class [cls] are never used in the program.
2098 bool requiresRuntimeTypesFor(ClassElement cls) { 2103 bool requiresRuntimeTypesFor(ClassElement cls) {
2099 return cls.typeVariables.isNotEmpty && _backend.classNeedsRti(cls); 2104 return cls.typeVariables.isNotEmpty && _backend.classNeedsRti(cls);
2100 } 2105 }
2101 2106
2107 FunctionElement get stringifyFunction {
2108 return _backend.getStringInterpolationHelper();
2109 }
2110
2102 FunctionElement get throwTypeErrorHelper => _backend.getThrowTypeError(); 2111 FunctionElement get throwTypeErrorHelper => _backend.getThrowTypeError();
2103 2112
2104 ClassElement get nullClass => _compiler.nullClass; 2113 ClassElement get nullClass => _compiler.nullClass;
2105 2114
2106 DartType unaliasType(DartType type) => type.unalias(_compiler); 2115 DartType unaliasType(DartType type) => type.unalias(_compiler);
2107 2116
2108 TypeMask getTypeMaskForForeign(NativeBehavior behavior) { 2117 TypeMask getTypeMaskForForeign(NativeBehavior behavior) {
2109 return TypeMaskFactory.fromNativeBehavior(behavior, _compiler); 2118 return TypeMaskFactory.fromNativeBehavior(behavior, _compiler);
2110 } 2119 }
2111 } 2120 }
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 [irBuilder.buildStringConstant(element.name)]); 2883 [irBuilder.buildStringConstant(element.name)]);
2875 } 2884 }
2876 2885
2877 @override 2886 @override
2878 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { 2887 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) {
2879 SourceInformation src = sourceInformationBuilder.buildGet(node); 2888 SourceInformation src = sourceInformationBuilder.buildGet(node);
2880 return buildStaticFieldGet(field, src); 2889 return buildStaticFieldGet(field, src);
2881 } 2890 }
2882 2891
2883 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { 2892 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) {
2884 ConstantExpression constant = 2893 ConstantValue constant = getConstantForVariable(field);
2885 backend.constants.getConstantForVariable(field);
2886 if (constant != null && !field.isAssignable) { 2894 if (constant != null && !field.isAssignable) {
2887 return buildConstant(constant); 2895 return irBuilder.buildConstant(constant);
2888 } else if (backend.constants.lazyStatics.contains(field)) { 2896 } else if (backend.constants.lazyStatics.contains(field)) {
2889 return irBuilder.buildStaticFieldLazyGet(field, src); 2897 return irBuilder.buildStaticFieldLazyGet(field, src);
2890 } else { 2898 } else {
2891 return irBuilder.buildStaticFieldGet(field, src); 2899 return irBuilder.buildStaticFieldGet(field, src);
2892 } 2900 }
2893 } 2901 }
2894 2902
2895 /// Build code to handle foreign code, that is, native JavaScript code, or 2903 /// Build code to handle foreign code, that is, native JavaScript code, or
2896 /// builtin values and operations of the backend. 2904 /// builtin values and operations of the backend.
2897 ir.Primitive handleForeignCode(ast.Send node, 2905 ir.Primitive handleForeignCode(ast.Send node,
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
3021 3029
3022 case 'JS_INTERCEPTOR_CONSTANT': 3030 case 'JS_INTERCEPTOR_CONSTANT':
3023 validateArgumentCount(exactly: 1); 3031 validateArgumentCount(exactly: 1);
3024 3032
3025 ast.Node argument = argumentNodes.head; 3033 ast.Node argument = argumentNodes.head;
3026 ir.Primitive argumentValue = visit(argument); 3034 ir.Primitive argumentValue = visit(argument);
3027 if (argumentValue is ir.Constant && argumentValue.value.isType) { 3035 if (argumentValue is ir.Constant && argumentValue.value.isType) {
3028 TypeConstantValue constant = argumentValue.value; 3036 TypeConstantValue constant = argumentValue.value;
3029 ConstantValue interceptorValue = 3037 ConstantValue interceptorValue =
3030 new InterceptorConstantValue(constant.representedType); 3038 new InterceptorConstantValue(constant.representedType);
3031 return irBuilder.buildConstant(argumentValue.expression, 3039 return irBuilder.buildConstant(interceptorValue);
3032 interceptorValue);
3033 } else { 3040 } else {
3034 internalError(argument, 'expected Type as argument'); 3041 internalError(argument, 'expected Type as argument');
3035 } 3042 }
3036 break; 3043 break;
3037 3044
3038 case 'JS_EFFECT': 3045 case 'JS_EFFECT':
3039 return irBuilder.buildNullConstant(); 3046 return irBuilder.buildNullConstant();
3040 3047
3041 case 'JS_GET_NAME': 3048 case 'JS_GET_NAME':
3042 validateArgumentCount(exactly: 1); 3049 validateArgumentCount(exactly: 1);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 } 3176 }
3170 3177
3171 processSetStatic(ir.SetStatic node) { 3178 processSetStatic(ir.SetStatic node) {
3172 node.body = replacementFor(node.body); 3179 node.body = replacementFor(node.body);
3173 } 3180 }
3174 3181
3175 processContinuation(ir.Continuation node) { 3182 processContinuation(ir.Continuation node) {
3176 node.body = replacementFor(node.body); 3183 node.body = replacementFor(node.body);
3177 } 3184 }
3178 } 3185 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698