Index: lib/compiler/implementation/ssa/builder.dart |
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart |
index 53aacdd1fe8c8884ba66ad2fce96aac676ae5162..a546b85e29384cdd298507fb2ac3a8fd7f77c582 100644 |
--- a/lib/compiler/implementation/ssa/builder.dart |
+++ b/lib/compiler/implementation/ssa/builder.dart |
@@ -2590,9 +2590,7 @@ class SsaBuilder 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)); |
} |
@@ -2744,9 +2742,7 @@ class SsaBuilder 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)); |
} |
@@ -3290,33 +3286,13 @@ class SsaBuilder 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+. |
- */ |
- final int offset; |
- |
- /** |
- * 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]). |
+ * The string value generated so far. |
*/ |
HInstruction prefix = null; |
floitsch
2012/06/06 12:13:34
Maybe rename to 'result' and remove result-method?
kasperl
2012/06/06 13:31:03
Done.
|
- 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); |
@@ -3327,27 +3303,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(); |
+ prefix = (prefix === null) ? expression : concat(prefix, expression); |
} |
void visitStringInterpolation(StringInterpolation node) { |
@@ -3359,10 +3317,6 @@ class StringBuilderVisitor extends AbstractVisitor { |
visit(node.string); |
} |
- void visitLiteralString(LiteralString node) { |
- addLiteral(node.dartString); |
- } |
- |
void visitStringJuxtaposition(StringJuxtaposition node) { |
node.visitChildren(this); |
} |
@@ -3371,52 +3325,13 @@ 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 concat(HInstruction left, HInstruction right) { |
+ HInstruction result = new HStringConcat([left, right]); |
+ builder.add(result); |
+ return result; |
} |
HInstruction result(Node node) { |
floitsch
2012/06/06 12:13:34
If you keep the result-method, remove the argument
|
- flushLiterals(node); |
return prefix; |
} |
} |