Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
index 647f48fcafcb6dc8a64a1220a79d81984927ffab..d411ee447d6c30eb897f48d287c059f2754ca35b 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
@@ -399,6 +399,8 @@ class IrBuilderSharedState { |
/// A stack of collectors for continues. |
final List<JumpCollector> continueCollectors = <JumpCollector>[]; |
+ final List<ConstDeclaration> localConstants = <ConstDeclaration>[]; |
+ |
final ExecutableElement currentElement; |
final ir.Continuation returnContinuation = new ir.Continuation.retrn(); |
@@ -596,6 +598,13 @@ abstract class IrBuilder { |
return parameter; |
} |
+ /// Adds the constant [variableElement] to the environment with [value] as its |
+ /// constant value. |
+ void declareLocalConstant(LocalVariableElement variableElement, |
+ ConstantExpression value) { |
+ state.localConstants.add(new ConstDeclaration(variableElement, value)); |
+ } |
+ |
/// Plug an expression into the 'hole' in the context being accumulated. The |
/// empty context (just a hole) is represented by root (and current) being |
/// null. Since the hole in the current context is filled by this function, |
@@ -666,41 +675,54 @@ abstract class IrBuilder { |
} |
- /// Create a [ir.Constant] from [value] and add it to the CPS term. |
- ir.Constant buildConstant(ConstantValue value) { |
+ /// Create a [ir.Constant] from [constant] and add it to the CPS term. |
+ // TODO(johnniwinther): Remove [value] when [ConstantValue] can be computed |
+ // directly from [constant]. |
+ ir.Constant buildConstant(ConstantExpression constant, ConstantValue value) { |
assert(isOpen); |
- return addPrimitive(new ir.Constant(value)); |
+ return addPrimitive(new ir.Constant(constant, value)); |
} |
/// Create an integer constant and add it to the CPS term. |
ir.Constant buildIntegerConstant(int value) { |
- return buildConstant(state.constantSystem.createInt(value)); |
+ return buildConstant( |
+ new IntConstantExpression(value), |
+ state.constantSystem.createInt(value)); |
} |
/// Create a double constant and add it to the CPS term. |
ir.Constant buildDoubleConstant(double value) { |
- return buildConstant(state.constantSystem.createDouble(value)); |
+ return buildConstant( |
+ new DoubleConstantExpression(value), |
+ state.constantSystem.createDouble(value)); |
} |
/// Create a Boolean constant and add it to the CPS term. |
ir.Constant buildBooleanConstant(bool value) { |
- return buildConstant(state.constantSystem.createBool(value)); |
+ return buildConstant( |
+ new BoolConstantExpression(value), |
+ state.constantSystem.createBool(value)); |
} |
/// Create a null constant and add it to the CPS term. |
ir.Constant buildNullConstant() { |
- return buildConstant(state.constantSystem.createNull()); |
+ return buildConstant( |
+ new NullConstantExpression(), |
+ state.constantSystem.createNull()); |
} |
/// Create a string constant and add it to the CPS term. |
ir.Constant buildStringConstant(String value) { |
return buildConstant( |
+ new StringConstantExpression(value), |
state.constantSystem.createString(new ast.DartString.literal(value))); |
} |
/// Create a string constant and add it to the CPS term. |
ir.Constant buildDartStringConstant(ast.DartString value) { |
- return buildConstant(state.constantSystem.createString(value)); |
+ return buildConstant( |
+ new StringConstantExpression(value.slowToString()), |
+ state.constantSystem.createString(value)); |
} |
/// Creates a non-constant list literal of the provided [type] and with the |
@@ -1068,17 +1090,11 @@ abstract class IrBuilder { |
DartType type, |
List<ir.Primitive> arguments); |
- ir.Primitive buildStringify(ir.Primitive argument); |
- |
- /// Concatenate string values. |
- /// |
- /// The arguments must be strings; usually a call to [buildStringify] is |
- /// needed to ensure the proper conversion takes places. |
+ /// Create a string concatenation of the [arguments]. |
ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments) { |
assert(isOpen); |
- return addPrimitive(new ir.ApplyBuiltinOperator( |
- ir.BuiltinOperator.StringConcatenate, |
- arguments)); |
+ return _continueWithExpression( |
+ (k) => new ir.ConcatenateStrings(arguments, k)); |
} |
/// Create an invocation of the `call` method of [functionExpression], where |
@@ -1985,7 +2001,9 @@ abstract class IrBuilder { |
ir.Continuation elseContinuation = new ir.Continuation([]); |
ir.Constant makeBoolConstant(bool value) { |
- return new ir.Constant(state.constantSystem.createBool(value)); |
+ return new ir.Constant( |
+ new BoolConstantExpression(value), |
+ state.constantSystem.createBool(value)); |
} |
ir.Constant trueConstant = makeBoolConstant(true); |
@@ -2538,14 +2556,6 @@ class JsIrBuilder extends IrBuilder { |
ir.Primitive right = buildNullConstant(); |
return addPrimitive(new ir.Identical(value, right)); |
} |
- |
- /// Convert the given value to a string. |
- ir.Primitive buildStringify(ir.Primitive value) { |
- return buildStaticFunctionInvocation( |
- program.stringifyFunction, |
- new CallStructure.unnamed(1), |
- <ir.Primitive>[value]); |
- } |
} |