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

Unified Diff: lib/compiler/implementation/ssa/builder.dart

Issue 10544026: Simplify generated code for string interpolation by delaying the constant folding. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Merge. Created 8 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 side-by-side diff with in-line comments
Download patch
Index: lib/compiler/implementation/ssa/builder.dart
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
index 1c48c664781ea70e1474379e2b0b4bbd81e62caf..c5b35184a51f412859fd4f97f39845f1df1c057e 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/lib/compiler/implementation/ssa/builder.dart
@@ -2562,11 +2562,9 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
stack.add(graph.addConstantString(node.dartString, node));
return;
}
- int offset = node.getBeginToken().charOffset;
- StringBuilderVisitor stringBuilder =
- new StringBuilderVisitor(this, offset);
+ StringBuilderVisitor stringBuilder = new StringBuilderVisitor(this);
stringBuilder.visit(node);
- stack.add(stringBuilder.result(node));
+ stack.add(stringBuilder.result);
}
void visitLiteralNull(LiteralNull node) {
@@ -2716,11 +2714,9 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
}
visitStringInterpolation(StringInterpolation node) {
- int offset = node.getBeginToken().charOffset;
- StringBuilderVisitor stringBuilder =
- new StringBuilderVisitor(this, offset);
+ StringBuilderVisitor stringBuilder = new StringBuilderVisitor(this);
stringBuilder.visit(node);
- stack.add(stringBuilder.result(node));
+ stack.add(stringBuilder.result);
}
visitStringInterpolationPart(StringInterpolationPart node) {
@@ -3395,33 +3391,13 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
*/
class StringBuilderVisitor extends AbstractVisitor {
final SsaBuilder builder;
- final Element stringConcat;
- final Element stringToString;
/**
- * Offset used for the synthetic operator token used by concat.
- * Can probably be removed when we stop using String.operator+.
+ * The string value generated so far.
*/
- final int offset;
+ HInstruction result = null;
- /**
- * Used to collect concatenated string literals into a single literal
- * instead of introducing unnecessary concatenations.
- */
- DartString literalAccumulator = const LiteralDartString("");
-
- /**
- * The string value generated so far (not including that which is still
- * in [literalAccumulator]).
- */
- HInstruction prefix = null;
-
- StringBuilderVisitor(builder, this.offset)
- : this.builder = builder,
- stringConcat = builder.compiler.findHelper(
- const SourceString("stringConcat")),
- stringToString = builder.compiler.findHelper(
- const SourceString("stringToString"));
+ StringBuilderVisitor(this.builder);
void visit(Node node) {
node.accept(this);
@@ -3432,27 +3408,9 @@ class StringBuilderVisitor extends AbstractVisitor {
}
void visitExpression(Node node) {
- flushLiterals(node);
node.accept(builder);
- HInstruction asString = buildToString(node, builder.pop());
- prefix = buildConcat(prefix, asString);
- }
-
- void visitLiteralNull(LiteralNull node) {
- addLiteral(const LiteralDartString("null"));
- }
-
- void visitLiteralInt(LiteralInt node) {
- addLiteral(new DartString.literal(node.value.toString()));
- }
-
- void visitLiteralDouble(LiteralDouble node) {
- addLiteral(new DartString.literal(node.value.toString()));
- }
-
- void visitLiteralBool(LiteralBool node) {
- addLiteral(node.value ? const LiteralDartString("true")
- : const LiteralDartString("false"));
+ HInstruction expression = builder.pop();
+ result = (result === null) ? expression : concat(result, expression);
}
void visitStringInterpolation(StringInterpolation node) {
@@ -3464,10 +3422,6 @@ class StringBuilderVisitor extends AbstractVisitor {
visit(node.string);
}
- void visitLiteralString(LiteralString node) {
- addLiteral(node.dartString);
- }
-
void visitStringJuxtaposition(StringJuxtaposition node) {
node.visitChildren(this);
}
@@ -3476,52 +3430,9 @@ class StringBuilderVisitor extends AbstractVisitor {
node.visitChildren(this);
}
- /**
- * Add another literal string to the literalAccumulator.
- */
- void addLiteral(DartString dartString) {
- literalAccumulator = new DartString.concat(literalAccumulator, dartString);
- }
-
- /**
- * Combine the strings in [literalAccumulator] into the prefix instruction.
- * After this, the [literalAccumulator] is empty and [prefix] is non-null.
- */
- void flushLiterals(Node node) {
- if (literalAccumulator.isEmpty()) {
- if (prefix === null) {
- prefix = builder.graph.addConstantString(literalAccumulator, node);
- }
- return;
- }
- HInstruction string =
- builder.graph.addConstantString(literalAccumulator, node);
- literalAccumulator = new DartString.empty();
- if (prefix !== null) {
- prefix = buildConcat(prefix, string);
- } else {
- prefix = string;
- }
- }
-
- HInstruction buildConcat(HInstruction left, HInstruction right) {
- HStatic target = new HStatic(stringConcat);
- builder.add(target);
- builder.push(new HAdd(target, left, right));
- return builder.pop();
- }
-
- HInstruction buildToString(Node node, HInstruction input) {
- HStatic target = new HStatic(stringToString);
- builder.add(target);
- builder.push(new HInvokeStatic(Selector.INVOCATION_1,
- <HInstruction>[target, input],
- HType.STRING));
- return builder.pop();
- }
-
- HInstruction result(Node node) {
- flushLiterals(node);
- return prefix;
+ HInstruction concat(HInstruction left, HInstruction right) {
+ HInstruction instruction = new HStringConcat(left, right);
+ builder.add(instruction);
+ return instruction;
}
}

Powered by Google App Engine
This is Rietveld 408576698