| Index: lib/compiler/implementation/ssa/builder.dart
|
| diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
|
| index 8d6c163875223f6a40e72eb8db446ab1be043565..16f4b3f2c8bc5229a5492ef7606d70e05b2fa0d3 100644
|
| --- a/lib/compiler/implementation/ssa/builder.dart
|
| +++ b/lib/compiler/implementation/ssa/builder.dart
|
| @@ -157,7 +157,8 @@ class SsaBuilderTask extends CompilerTask {
|
| return measure(() {
|
| Element element = work.element;
|
| HInstruction.idCounter = 0;
|
| - SsaBuilder builder = new SsaBuilder(this, work);
|
| + ConstantSystem constantSystem = compiler.backend.constantSystem;
|
| + SsaBuilder builder = new SsaBuilder(constantSystem, this, work);
|
| HGraph graph;
|
| ElementKind kind = element.kind;
|
| if (kind === ElementKind.GENERATIVE_CONSTRUCTOR) {
|
| @@ -807,6 +808,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| final SsaBuilderTask builder;
|
| final Interceptors interceptors;
|
| final WorkItem work;
|
| + final ConstantSystem constantSystem;
|
| bool methodInterceptionEnabled;
|
| HGraph graph;
|
| LocalsHandler localsHandler;
|
| @@ -838,7 +840,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| Compiler get compiler => builder.compiler;
|
| CodeEmitterTask get emitter => builder.emitter;
|
|
|
| - SsaBuilder(SsaBuilderTask builder, WorkItem work)
|
| + SsaBuilder(this.constantSystem, SsaBuilderTask builder, WorkItem work)
|
| : this.builder = builder,
|
| this.work = work,
|
| interceptors = builder.interceptors,
|
| @@ -950,7 +952,8 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| returnElement = new Element(const SourceString("result"),
|
| ElementKind.VARIABLE,
|
| function);
|
| - localsHandler.updateLocal(returnElement, graph.addConstantNull());
|
| + localsHandler.updateLocal(returnElement,
|
| + graph.addConstantNull(constantSystem));
|
| elements = compiler.enqueuer.resolution.getCachedElements(function);
|
| FunctionSignature signature = function.computeSignature(compiler);
|
| int index = 0;
|
| @@ -1136,7 +1139,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| SendSet assignment = node.asSendSet();
|
| HInstruction value;
|
| if (assignment === null) {
|
| - value = graph.addConstantNull();
|
| + value = graph.addConstantNull(constantSystem);
|
| } else {
|
| Node right = assignment.arguments.head;
|
| TreeElements savedElements = elements;
|
| @@ -1269,7 +1272,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| ConstantHandler handler = compiler.constantHandler;
|
| Constant constant = handler.compileVariable(element);
|
| HConstant defaultValue = constant == null
|
| - ? graph.addConstantNull()
|
| + ? graph.addConstantNull(constantSystem)
|
| : graph.addConstant(constant);
|
|
|
| // Emit the equality check with the sentinel.
|
| @@ -1670,7 +1673,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| }
|
| HInstruction buildCondition() {
|
| if (node.condition === null) {
|
| - return graph.addConstantBool(true);
|
| + return graph.addConstantBool(true, constantSystem);
|
| }
|
| visit(node.condition);
|
| return popBoolified();
|
| @@ -1885,7 +1888,8 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| // See if we can constant-fold right away. This avoids rewrites later on.
|
| if (operand is HConstant) {
|
| HConstant constant = operand;
|
| - Constant folded = result.operation.fold(constant.constant);
|
| + Constant folded =
|
| + result.operation(constantSystem).fold(constant.constant);
|
| if (folded !== null) {
|
| stack.add(graph.addConstant(folded));
|
| return;
|
| @@ -2174,7 +2178,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| // compiler and answer true to any is check involving a type variable
|
| // -- both is T and is !T -- until we have a proper implementation of
|
| // reified generics.
|
| - stack.add(graph.addConstantBool(true));
|
| + stack.add(graph.addConstantBool(true, constantSystem));
|
| } else {
|
| HInstruction instruction;
|
| if (typeInfo !== null) {
|
| @@ -2510,10 +2514,12 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| String name = identifier.source.slowToString();
|
| // TODO(ahe): Add the arguments to this list.
|
| push(new HLiteralList([]));
|
| + Constant nameConstant =
|
| + constantSystem.createString(new DartString.literal(name), node);
|
| var inputs = <HInstruction>[
|
| target,
|
| self,
|
| - graph.addConstantString(new DartString.literal(name), node),
|
| + graph.addConstant(nameConstant),
|
| pop()];
|
| push(new HInvokeSuper(inputs));
|
| }
|
| @@ -2581,7 +2587,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| } else {
|
| // The type variable is a type (e.g. int).
|
| return graph.addConstantString(
|
| - new LiteralDartString('$argument'), currentNode);
|
| + new LiteralDartString('$argument'), currentNode, constantSystem);
|
| }
|
| }
|
|
|
| @@ -2639,7 +2645,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| Selector selector = elements.getSelector(node);
|
| Element element = elements[node];
|
| if (element === compiler.assertMethod && !compiler.enableUserAssertions) {
|
| - stack.add(graph.addConstantNull());
|
| + stack.add(graph.addConstantNull(constantSystem));
|
| return;
|
| }
|
| compiler.ensure(!element.isGenerativeConstructor());
|
| @@ -2683,7 +2689,9 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
|
|
| void generateRuntimeError(Node node, String message) {
|
| DartString messageObject = new DartString.literal(message);
|
| - HInstruction errorMessage = graph.addConstantString(messageObject, node);
|
| + Constant messageConstant =
|
| + constantSystem.createString(messageObject, node);
|
| + HInstruction errorMessage = graph.addConstant(messageConstant);
|
| Element helper = interceptors.getThrowRuntimeError();
|
| pushInvokeHelper1(helper, errorMessage);
|
| }
|
| @@ -2697,10 +2705,14 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| Element helper =
|
| compiler.findHelper(const SourceString('throwNoSuchMethod'));
|
| DartString receiverLiteral = new DartString.literal('');
|
| - HInstruction receiver = graph.addConstantString(receiverLiteral, node);
|
| + Constant receiverConstant =
|
| + constantSystem.createString(receiverLiteral, node);
|
| + HInstruction receiver = graph.addConstant(receiverConstant);
|
| String constructorName = 'constructor ${message.arguments[0]}';
|
| DartString nameLiteral = new DartString.literal(constructorName);
|
| - HInstruction name = graph.addConstantString(nameLiteral, node.send);
|
| + Constant nameConstant =
|
| + constantSystem.createString(nameLiteral, node.send);
|
| + HInstruction name = graph.addConstant(nameConstant);
|
| List<HInstruction> inputs = <HInstruction>[];
|
| node.send.arguments.forEach((argumentNode) {
|
| visit(argumentNode);
|
| @@ -2769,7 +2781,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| index = pop();
|
| } else {
|
| index = pop();
|
| - value = graph.addConstantInt(1);
|
| + value = graph.addConstantInt(1, constantSystem);
|
| }
|
| HStatic indexMethod = new HStatic(interceptors.getIndexInterceptor());
|
| add(indexMethod);
|
| @@ -2819,7 +2831,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| visit(node.argumentsNode);
|
| right = pop();
|
| } else {
|
| - right = graph.addConstantInt(1);
|
| + right = graph.addConstantInt(1, constantSystem);
|
| }
|
| visitBinary(left, op, right);
|
| HInstruction operation = pop();
|
| @@ -2839,25 +2851,25 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| }
|
|
|
| void visitLiteralInt(LiteralInt node) {
|
| - stack.add(graph.addConstantInt(node.value));
|
| + stack.add(graph.addConstantInt(node.value, constantSystem));
|
| }
|
|
|
| void visitLiteralDouble(LiteralDouble node) {
|
| - stack.add(graph.addConstantDouble(node.value));
|
| + stack.add(graph.addConstantDouble(node.value, constantSystem));
|
| }
|
|
|
| void visitLiteralBool(LiteralBool node) {
|
| - stack.add(graph.addConstantBool(node.value));
|
| + stack.add(graph.addConstantBool(node.value, constantSystem));
|
| }
|
|
|
| void visitLiteralString(LiteralString node) {
|
| - stack.add(graph.addConstantString(node.dartString, node));
|
| + stack.add(graph.addConstantString(node.dartString, node, constantSystem));
|
| }
|
|
|
| void visitStringJuxtaposition(StringJuxtaposition node) {
|
| if (!node.isInterpolation) {
|
| // This is a simple string with no interpolations.
|
| - stack.add(graph.addConstantString(node.dartString, node));
|
| + stack.add(graph.addConstantString(node.dartString, node, constantSystem));
|
| return;
|
| }
|
| StringBuilderVisitor stringBuilder = new StringBuilderVisitor(this, node);
|
| @@ -2866,7 +2878,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| }
|
|
|
| void visitLiteralNull(LiteralNull node) {
|
| - stack.add(graph.addConstantNull());
|
| + stack.add(graph.addConstantNull(constantSystem));
|
| }
|
|
|
| visitNodeList(NodeList node) {
|
| @@ -2906,7 +2918,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| }
|
| HInstruction value;
|
| if (node.expression === null) {
|
| - value = graph.addConstantNull();
|
| + value = graph.addConstantNull(constantSystem);
|
| } else {
|
| visit(node.expression);
|
| value = pop();
|
| @@ -2922,7 +2934,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| if (node.expression === null) {
|
| HInstruction exception = rethrowableException;
|
| if (exception === null) {
|
| - exception = graph.addConstantNull();
|
| + exception = graph.addConstantNull(constantSystem);
|
| compiler.reportError(node,
|
| 'throw without expression outside catch block');
|
| }
|
| @@ -2944,7 +2956,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| link = link.tail) {
|
| Node definition = link.head;
|
| if (definition is Identifier) {
|
| - HInstruction initialValue = graph.addConstantNull();
|
| + HInstruction initialValue = graph.addConstantNull(constantSystem);
|
| localsHandler.updateLocal(elements[definition], initialValue);
|
| } else {
|
| assert(definition is SendSet);
|
| @@ -3542,7 +3554,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| VariableDefinitions declaration = catchBlock.formals.nodes.head;
|
| HInstruction condition = null;
|
| if (declaration.type == null) {
|
| - condition = graph.addConstantBool(true);
|
| + condition = graph.addConstantBool(true, constantSystem);
|
| stack.add(condition);
|
| } else {
|
| // TODO(aprelev@gmail.com): Once old catch syntax is removed
|
| @@ -3653,7 +3665,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
|
| /** HACK HACK HACK */
|
| void hackAroundPossiblyAbortingBody(Node statement, void body()) {
|
| visitCondition() {
|
| - stack.add(graph.addConstantBool(true));
|
| + stack.add(graph.addConstantBool(true, constantSystem));
|
| }
|
| buildBody() {
|
| // TODO(lrn): Make sure to take continue into account.
|
| @@ -3945,8 +3957,10 @@ class SsaBranchBuilder {
|
| }
|
|
|
| handleIf(visitCondition, visitThen, null);
|
| + HConstant notIsAnd =
|
| + builder.graph.addConstantBool(!isAnd, builder.constantSystem);
|
| HPhi result = new HPhi.manyInputs(null,
|
| - <HInstruction>[boolifiedRight, builder.graph.addConstantBool(!isAnd)]);
|
| + <HInstruction>[boolifiedRight, notIsAnd]);
|
| builder.current.addPhi(result);
|
| builder.stack.add(result);
|
| }
|
|
|