Reland "Eliminate singleton/static access to the constant system and expose its functionality at the top level."

This is a reland of 027b76ecbf92c2323b5c3f3236c2dd5f7513c173

Original change's description:
> Eliminate singleton/static access to the constant system and expose its
> functionality at the top level.
>
> Use sites have been updated to import the library with a prefix.
>
> Change-Id: I0f5e4e47bec089d2d0dc2fcd50caccfd98947cf5
> Reviewed-on: https://dart-review.googlesource.com/c/93842
> Reviewed-by: Sigmund Cherem <sigmund@google.com>
> Reviewed-by: Johnni Winther <johnniwinther@google.com>

Change-Id: Ib04a9d48c8dca51020258313256e0fb0df330d9b
Reviewed-on: https://dart-review.googlesource.com/c/94107
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 744318e..ba4f731f 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -7,7 +7,7 @@
 
 import 'common.dart';
 import 'common/names.dart' show Identifiers, Uris;
-import 'constants/constant_system.dart';
+import 'constants/constant_system.dart' as constant_system;
 import 'constants/expressions.dart' show ConstantExpression;
 import 'constants/values.dart';
 import 'elements/entities.dart';
@@ -1438,13 +1438,13 @@
   ClassEntity get stackTraceHelperClass => _findHelperClass('_StackTrace');
 
   ClassEntity get constantMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_CLASS);
   ClassEntity get constantStringMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_STRING_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_STRING_CLASS);
   ClassEntity get constantProtoMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_PROTO_CLASS);
-  ClassEntity get generalConstantMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_GENERAL_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_PROTO_CLASS);
+  ClassEntity get generalConstantMapClass => _findHelperClass(
+      constant_system.JavaScriptMapConstant.DART_GENERAL_CLASS);
 
   ClassEntity get annotationCreatesClass => _findHelperClass('Creates');
 
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 9055af7..20e7219 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -5,15 +5,11 @@
 library dart2js.compile_time_constant_evaluator;
 
 import 'common/tasks.dart' show CompilerTask, Measurer;
-import 'constants/constant_system.dart';
 import 'elements/entities.dart';
 
 /// A [ConstantEnvironment] provides access for constants compiled for variable
 /// initializers.
-abstract class ConstantEnvironment {
-  /// The [ConstantSystem] used by this environment.
-  ConstantSystem get constantSystem;
-}
+abstract class ConstantEnvironment {}
 
 /// A [BackendConstantEnvironment] provides access to constants needed for
 /// backend implementation.
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 6c37cb8..5e2f563 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Constant system following the semantics for Dart code that has been
+/// compiled to JavaScript.
 library dart2js.constant_system;
 
 import '../common_elements.dart' show CommonElements;
@@ -10,6 +12,243 @@
 import '../elements/types.dart';
 import 'values.dart';
 
+final _BITS32 = new BigInt.from(0xFFFFFFFF);
+
+const add = const JavaScriptAddOperation();
+const bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
+const bitNot = const BitNotOperation();
+const bitOr = const JavaScriptBinaryBitOperation(const BitOrOperation());
+const bitXor = const JavaScriptBinaryBitOperation(const BitXorOperation());
+const booleanAnd = const BooleanAndOperation();
+const booleanOr = const BooleanOrOperation();
+const divide =
+    const JavaScriptBinaryArithmeticOperation(const DivideOperation());
+const equal = const EqualsOperation();
+const greaterEqual = const GreaterEqualOperation();
+const greater = const GreaterOperation();
+const identity = const JavaScriptIdentityOperation();
+const ifNull = const IfNullOperation();
+const lessEqual = const LessEqualOperation();
+const less = const LessOperation();
+const modulo =
+    const JavaScriptBinaryArithmeticOperation(const ModuloOperation());
+const multiply =
+    const JavaScriptBinaryArithmeticOperation(const MultiplyOperation());
+const negate = const JavaScriptNegateOperation();
+const not = const NotOperation();
+const remainder = const JavaScriptRemainderOperation();
+const shiftLeft =
+    const JavaScriptBinaryBitOperation(const ShiftLeftOperation());
+const shiftRight = const JavaScriptShiftRightOperation();
+const subtract =
+    const JavaScriptBinaryArithmeticOperation(const SubtractOperation());
+const truncatingDivide = const JavaScriptBinaryArithmeticOperation(
+    const TruncatingDivideOperation());
+const codeUnitAt = const CodeUnitAtRuntimeOperation();
+const round = const JavaScriptRoundOperation();
+const abs = const UnfoldedUnaryOperation('abs');
+
+/// Returns true if [value] will turn into NaN or infinity
+/// at runtime.
+bool _integerBecomesNanOrInfinity(BigInt value) {
+  double doubleValue = value.toDouble();
+  return doubleValue.isNaN || doubleValue.isInfinite;
+}
+
+NumConstantValue _convertToJavaScriptConstant(NumConstantValue constant) {
+  if (constant.isInt) {
+    IntConstantValue intConstant = constant;
+    BigInt intValue = intConstant.intValue;
+    if (_integerBecomesNanOrInfinity(intValue)) {
+      return new DoubleConstantValue(intValue.toDouble());
+    }
+    // If the integer loses precision with JavaScript numbers, use
+    // the floored version JavaScript will use.
+    BigInt floorValue = new BigInt.from(intValue.toDouble());
+    if (floorValue != intValue) {
+      return new IntConstantValue(floorValue);
+    }
+  } else if (constant.isDouble) {
+    DoubleConstantValue doubleResult = constant;
+    double doubleValue = doubleResult.doubleValue;
+    if (!doubleValue.isInfinite &&
+        !doubleValue.isNaN &&
+        !constant.isMinusZero) {
+      double truncated = doubleValue.truncateToDouble();
+      if (truncated == doubleValue) {
+        return new IntConstantValue(new BigInt.from(truncated));
+      }
+    }
+  }
+  return constant;
+}
+
+NumConstantValue createInt(BigInt i) =>
+    _convertToJavaScriptConstant(new IntConstantValue(i));
+NumConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
+NumConstantValue _createInt32(BigInt i) => new IntConstantValue(i & _BITS32);
+NumConstantValue createDouble(double d) =>
+    _convertToJavaScriptConstant(new DoubleConstantValue(d));
+StringConstantValue createString(String string) =>
+    new StringConstantValue(string);
+BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
+NullConstantValue createNull() => new NullConstantValue();
+ListConstantValue createList(InterfaceType type, List<ConstantValue> values) =>
+    new ListConstantValue(type, values);
+
+ConstantValue createType(CommonElements commonElements, DartType type) {
+  InterfaceType instanceType = commonElements.typeLiteralType;
+  return new TypeConstantValue(type, instanceType);
+}
+
+/// Returns true if the [constant] is an integer at runtime.
+///
+/// Integer checks report true for -0.0, INFINITY, and -INFINITY.  At
+/// runtime an 'X is int' check is implemented as:
+///
+/// typeof(X) === "number" && Math.floor(X) === X
+///
+/// We consistently match that runtime semantics at compile time as well.
+bool isInt(ConstantValue constant) =>
+    constant.isInt ||
+    constant.isMinusZero ||
+    constant.isPositiveInfinity ||
+    constant.isNegativeInfinity;
+
+/// Returns true if the [constant] is a double at runtime.
+bool isDouble(ConstantValue constant) =>
+    constant.isDouble && !constant.isMinusZero;
+
+/// Returns true if the [constant] is a string at runtime.
+bool isString(ConstantValue constant) => constant.isString;
+
+/// Returns true if the [constant] is a boolean at runtime.
+bool isBool(ConstantValue constant) => constant.isBool;
+
+/// Returns true if the [constant] is null at runtime.
+bool isNull(ConstantValue constant) => constant.isNull;
+
+bool isSubtype(DartTypes types, DartType s, DartType t) {
+  // At runtime, an integer is both an integer and a double: the
+  // integer type check is Math.floor, which will return true only
+  // for real integers, and our double type check is 'typeof number'
+  // which will return true for both integers and doubles.
+  if (s == types.commonElements.intType &&
+      t == types.commonElements.doubleType) {
+    return true;
+  }
+  return types.isSubtype(s, t);
+}
+
+SetConstantValue createSet(CommonElements commonElements,
+    InterfaceType sourceType, List<ConstantValue> values) {
+  InterfaceType type = commonElements.getConstantSetTypeFor(sourceType);
+  return new JavaScriptSetConstant(commonElements, type, values);
+}
+
+MapConstantValue createMap(
+    CommonElements commonElements,
+    InterfaceType sourceType,
+    List<ConstantValue> keys,
+    List<ConstantValue> values) {
+  bool onlyStringKeys = true;
+  ConstantValue protoValue = null;
+  for (int i = 0; i < keys.length; i++) {
+    dynamic key = keys[i];
+    if (key.isString) {
+      if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
+        protoValue = values[i];
+      }
+    } else {
+      onlyStringKeys = false;
+      // Don't handle __proto__ values specially in the general map case.
+      protoValue = null;
+      break;
+    }
+  }
+
+  bool hasProtoKey = (protoValue != null);
+  InterfaceType keysType;
+  if (sourceType.treatAsRaw) {
+    keysType = commonElements.listType();
+  } else {
+    keysType = commonElements.listType(sourceType.typeArguments.first);
+  }
+  ListConstantValue keysList = new ListConstantValue(keysType, keys);
+  InterfaceType type = commonElements.getConstantMapTypeFor(sourceType,
+      hasProtoKey: hasProtoKey, onlyStringKeys: onlyStringKeys);
+  return new JavaScriptMapConstant(
+      type, keysList, values, protoValue, onlyStringKeys);
+}
+
+ConstantValue createSymbol(CommonElements commonElements, String text) {
+  InterfaceType type = commonElements.symbolImplementationType;
+  FieldEntity field = commonElements.symbolField;
+  ConstantValue argument = createString(text);
+  // TODO(johnniwinther): Use type arguments when all uses no longer expect
+  // a [FieldElement].
+  var fields = <FieldEntity, ConstantValue>{field: argument};
+  return new ConstructedConstantValue(type, fields);
+}
+
+UnaryOperation lookupUnary(UnaryOperator operator) {
+  switch (operator.kind) {
+    case UnaryOperatorKind.COMPLEMENT:
+      return bitNot;
+    case UnaryOperatorKind.NEGATE:
+      return negate;
+    case UnaryOperatorKind.NOT:
+      return not;
+    default:
+      return null;
+  }
+}
+
+BinaryOperation lookupBinary(BinaryOperator operator) {
+  switch (operator.kind) {
+    case BinaryOperatorKind.ADD:
+      return add;
+    case BinaryOperatorKind.SUB:
+      return subtract;
+    case BinaryOperatorKind.MUL:
+      return multiply;
+    case BinaryOperatorKind.DIV:
+      return divide;
+    case BinaryOperatorKind.MOD:
+      return modulo;
+    case BinaryOperatorKind.IDIV:
+      return truncatingDivide;
+    case BinaryOperatorKind.OR:
+      return bitOr;
+    case BinaryOperatorKind.AND:
+      return bitAnd;
+    case BinaryOperatorKind.XOR:
+      return bitXor;
+    case BinaryOperatorKind.LOGICAL_OR:
+      return booleanOr;
+    case BinaryOperatorKind.LOGICAL_AND:
+      return booleanAnd;
+    case BinaryOperatorKind.SHL:
+      return shiftLeft;
+    case BinaryOperatorKind.SHR:
+      return shiftRight;
+    case BinaryOperatorKind.LT:
+      return less;
+    case BinaryOperatorKind.LTEQ:
+      return lessEqual;
+    case BinaryOperatorKind.GT:
+      return greater;
+    case BinaryOperatorKind.GTEQ:
+      return greaterEqual;
+    case BinaryOperatorKind.EQ:
+      return equal;
+    case BinaryOperatorKind.IF_NULL:
+      return ifNull;
+    default:
+      return null;
+  }
+}
+
 abstract class Operation {
   String get name;
 }
@@ -30,14 +269,14 @@
   const BitNotOperation();
 
   ConstantValue fold(ConstantValue constant) {
-    if (ConstantSystem.only.isInt(constant)) {
+    if (isInt(constant)) {
       // In JavaScript we don't check for -0 and treat it as if it was zero.
       if (constant.isMinusZero) {
-        constant = ConstantSystem.only.createInt(BigInt.zero);
+        constant = createInt(BigInt.zero);
       }
       IntConstantValue intConstant = constant;
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return ConstantSystem.only.createInt32(~intConstant.intValue);
+      return _createInt32(~intConstant.intValue);
     }
     return null;
   }
@@ -49,11 +288,11 @@
   ConstantValue fold(ConstantValue constant) {
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      return ConstantSystem.only.createInt(-intConstant.intValue);
+      return createInt(-intConstant.intValue);
     }
     if (constant.isDouble) {
       DoubleConstantValue doubleConstant = constant;
-      return ConstantSystem.only.createDouble(-doubleConstant.doubleValue);
+      return createDouble(-doubleConstant.doubleValue);
     }
     return null;
   }
@@ -70,7 +309,7 @@
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
       if (intConstant.intValue == BigInt.zero) {
-        return ConstantSystem.only.createDouble(-0.0);
+        return createDouble(-0.0);
       }
     }
     return dartNegateOperation.fold(constant);
@@ -83,7 +322,7 @@
   ConstantValue fold(ConstantValue constant) {
     if (constant.isBool) {
       BoolConstantValue boolConstant = constant;
-      return ConstantSystem.only.createBool(!boolConstant.boolValue);
+      return createBool(!boolConstant.boolValue);
     }
     return null;
   }
@@ -98,7 +337,7 @@
       IntConstantValue rightInt = right;
       BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
       if (resultValue == null) return null;
-      return ConstantSystem.only.createInt(resultValue);
+      return createInt(resultValue);
     }
     return null;
   }
@@ -118,15 +357,15 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     // In JavaScript we don't check for -0 and treat it as if it was zero.
     if (left.isMinusZero) {
-      left = ConstantSystem.only.createInt(BigInt.zero);
+      left = createInt(BigInt.zero);
     }
     if (right.isMinusZero) {
-      right = ConstantSystem.only.createInt(BigInt.zero);
+      right = createInt(BigInt.zero);
     }
     IntConstantValue result = dartBitOperation.fold(left, right);
     if (result != null) {
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return ConstantSystem.only.createInt32(result.intValue);
+      return _createInt32(result.intValue);
     }
     return result;
   }
@@ -187,7 +426,7 @@
     if (left.isInt) {
       IntConstantValue intConstant = left;
       BigInt value = intConstant.intValue;
-      BigInt truncatedValue = value & ConstantSystem.only.BITS32;
+      BigInt truncatedValue = value & _BITS32;
       if (value < BigInt.zero) {
         // Sign-extend if the input was negative. The current semantics don't
         // make much sense, since we only look at bit 31.
@@ -203,7 +442,7 @@
         truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
       }
       if (value != truncatedValue) {
-        left = ConstantSystem.only.createInt(truncatedValue);
+        left = createInt(truncatedValue);
       }
     }
     return super.fold(left, right);
@@ -217,7 +456,7 @@
       BoolConstantValue leftBool = left;
       BoolConstantValue rightBool = right;
       bool resultValue = foldBools(leftBool.boolValue, rightBool.boolValue);
-      return ConstantSystem.only.createBool(resultValue);
+      return createBool(resultValue);
     }
     return null;
   }
@@ -257,9 +496,9 @@
       if (foldedValue == null) return null;
       if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
         assert(foldedValue is BigInt);
-        return ConstantSystem.only.createInt(foldedValue);
+        return createInt(foldedValue);
       } else {
-        return ConstantSystem.only.createDouble(foldedValue);
+        return createDouble(foldedValue);
       }
     }
     return null;
@@ -281,7 +520,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = dartArithmeticOperation.fold(left, right);
     if (result == null) return result;
-    return ConstantSystem.only.convertToJavaScriptConstant(result);
+    return _convertToJavaScriptConstant(result);
   }
 
   apply(left, right) => dartArithmeticOperation.apply(left, right);
@@ -364,17 +603,17 @@
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
       BigInt result = leftInt.intValue + rightInt.intValue;
-      return ConstantSystem.only.createInt(result);
+      return createInt(result);
     } else if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
       NumConstantValue rightNum = right;
       double result = leftNum.doubleValue + rightNum.doubleValue;
-      return ConstantSystem.only.createDouble(result);
+      return createDouble(result);
     } else if (left.isString && right.isString) {
       StringConstantValue leftString = left;
       StringConstantValue rightString = right;
       String result = leftString.stringValue + rightString.stringValue;
-      return ConstantSystem.only.createString(result);
+      return createString(result);
     } else {
       return null;
     }
@@ -392,7 +631,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = _addOperation.fold(left, right);
     if (result != null && result.isNum) {
-      return ConstantSystem.only.convertToJavaScriptConstant(result);
+      return _convertToJavaScriptConstant(result);
     }
     return result;
   }
@@ -415,7 +654,7 @@
       foldedValue = foldNums(leftNum.doubleValue, rightNum.doubleValue);
     }
     assert(foldedValue != null);
-    return ConstantSystem.only.createBool(foldedValue);
+    return createBool(foldedValue);
   }
 
   bool foldInts(BigInt left, BigInt right);
@@ -464,26 +703,26 @@
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
       bool result = leftInt.intValue == rightInt.intValue;
-      return ConstantSystem.only.createBool(result);
+      return createBool(result);
     }
 
     if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
       NumConstantValue rightNum = right;
       bool result = leftNum.doubleValue == rightNum.doubleValue;
-      return ConstantSystem.only.createBool(result);
+      return createBool(result);
     }
 
     if (left.isConstructedObject) {
       if (right.isNull) {
-        return ConstantSystem.only.createBool(false);
+        return createBool(false);
       }
       // Unless we know that the user-defined object does not implement the
       // equality operator we cannot fold here.
       return null;
     }
 
-    return ConstantSystem.only.createBool(left == right);
+    return createBool(left == right);
   }
 
   apply(left, right) => left == right;
@@ -497,7 +736,7 @@
     // constant fold NaN === NaN. Otherwise the output depends on inlined
     // variables and other optimizations.
     if (left.isNaN && right.isNaN) return null;
-    return ConstantSystem.only.createBool(left == right);
+    return createBool(left == right);
   }
 
   apply(left, right) => identical(left, right);
@@ -561,7 +800,7 @@
       int index = indexConstant.intValue.toInt();
       if (index < 0 || index >= string.length) return null;
       int value = string.codeUnitAt(index);
-      return ConstantSystem.only.createIntFromInt(value);
+      return createIntFromInt(value);
     }
     return null;
   }
@@ -569,7 +808,7 @@
 
 class JavaScriptRoundOperation implements UnaryOperation {
   const JavaScriptRoundOperation();
-  String get name => ConstantSystem.only.round.name;
+  String get name => round.name;
   ConstantValue fold(ConstantValue constant) {
     // Be careful to round() only values that do not throw on either the host or
     // target platform.
@@ -583,7 +822,7 @@
       double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
       double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
       if (rounded != rounded1 || rounded != rounded2) return null;
-      return ConstantSystem.only.convertToJavaScriptConstant(
+      return _convertToJavaScriptConstant(
           new IntConstantValue(new BigInt.from(value.round())));
     }
 
@@ -614,258 +853,12 @@
   }
 }
 
-/// Constant system following the semantics for Dart code that has been
-/// compiled to JavaScript.
-class ConstantSystem {
-  final BITS32 = new BigInt.from(0xFFFFFFFF);
-
-  final add = const JavaScriptAddOperation();
-  final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
-  final bitNot = const BitNotOperation();
-  final bitOr = const JavaScriptBinaryBitOperation(const BitOrOperation());
-  final bitXor = const JavaScriptBinaryBitOperation(const BitXorOperation());
-  final booleanAnd = const BooleanAndOperation();
-  final booleanOr = const BooleanOrOperation();
-  final divide =
-      const JavaScriptBinaryArithmeticOperation(const DivideOperation());
-  final equal = const EqualsOperation();
-  final greaterEqual = const GreaterEqualOperation();
-  final greater = const GreaterOperation();
-  final identity = const JavaScriptIdentityOperation();
-  final ifNull = const IfNullOperation();
-  final lessEqual = const LessEqualOperation();
-  final less = const LessOperation();
-  final modulo =
-      const JavaScriptBinaryArithmeticOperation(const ModuloOperation());
-  final multiply =
-      const JavaScriptBinaryArithmeticOperation(const MultiplyOperation());
-  final negate = const JavaScriptNegateOperation();
-  final not = const NotOperation();
-  final remainder = const JavaScriptRemainderOperation();
-  final shiftLeft =
-      const JavaScriptBinaryBitOperation(const ShiftLeftOperation());
-  final shiftRight = const JavaScriptShiftRightOperation();
-  final subtract =
-      const JavaScriptBinaryArithmeticOperation(const SubtractOperation());
-  final truncatingDivide = const JavaScriptBinaryArithmeticOperation(
-      const TruncatingDivideOperation());
-  final codeUnitAt = const CodeUnitAtRuntimeOperation();
-  final round = const JavaScriptRoundOperation();
-  final abs = const UnfoldedUnaryOperation('abs');
-
-  static final ConstantSystem only = new ConstantSystem._internal();
-
-  ConstantSystem._internal();
-
-  /// Returns true if [value] will turn into NaN or infinity
-  /// at runtime.
-  bool integerBecomesNanOrInfinity(BigInt value) {
-    double doubleValue = value.toDouble();
-    return doubleValue.isNaN || doubleValue.isInfinite;
-  }
-
-  NumConstantValue convertToJavaScriptConstant(NumConstantValue constant) {
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      BigInt intValue = intConstant.intValue;
-      if (integerBecomesNanOrInfinity(intValue)) {
-        return new DoubleConstantValue(intValue.toDouble());
-      }
-      // If the integer loses precision with JavaScript numbers, use
-      // the floored version JavaScript will use.
-      BigInt floorValue = new BigInt.from(intValue.toDouble());
-      if (floorValue != intValue) {
-        return new IntConstantValue(floorValue);
-      }
-    } else if (constant.isDouble) {
-      DoubleConstantValue doubleResult = constant;
-      double doubleValue = doubleResult.doubleValue;
-      if (!doubleValue.isInfinite &&
-          !doubleValue.isNaN &&
-          !constant.isMinusZero) {
-        double truncated = doubleValue.truncateToDouble();
-        if (truncated == doubleValue) {
-          return new IntConstantValue(new BigInt.from(truncated));
-        }
-      }
-    }
-    return constant;
-  }
-
-  NumConstantValue createInt(BigInt i) =>
-      convertToJavaScriptConstant(new IntConstantValue(i));
-  NumConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
-  NumConstantValue createInt32(BigInt i) => new IntConstantValue(i & BITS32);
-  NumConstantValue createDouble(double d) =>
-      convertToJavaScriptConstant(new DoubleConstantValue(d));
-  StringConstantValue createString(String string) =>
-      new StringConstantValue(string);
-  BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
-  NullConstantValue createNull() => new NullConstantValue();
-  ListConstantValue createList(
-          InterfaceType type, List<ConstantValue> values) =>
-      new ListConstantValue(type, values);
-
-  ConstantValue createType(CommonElements commonElements, DartType type) {
-    InterfaceType instanceType = commonElements.typeLiteralType;
-    return new TypeConstantValue(type, instanceType);
-  }
-
-  /// Returns true if the [constant] is an integer at runtime.
-  ///
-  /// Integer checks report true for -0.0, INFINITY, and -INFINITY.  At
-  /// runtime an 'X is int' check is implemented as:
-  ///
-  /// typeof(X) === "number" && Math.floor(X) === X
-  ///
-  /// We consistently match that runtime semantics at compile time as well.
-  bool isInt(ConstantValue constant) =>
-      constant.isInt ||
-      constant.isMinusZero ||
-      constant.isPositiveInfinity ||
-      constant.isNegativeInfinity;
-
-  /// Returns true if the [constant] is a double at runtime.
-  bool isDouble(ConstantValue constant) =>
-      constant.isDouble && !constant.isMinusZero;
-
-  /// Returns true if the [constant] is a string at runtime.
-  bool isString(ConstantValue constant) => constant.isString;
-
-  /// Returns true if the [constant] is a boolean at runtime.
-  bool isBool(ConstantValue constant) => constant.isBool;
-
-  /// Returns true if the [constant] is null at runtime.
-  bool isNull(ConstantValue constant) => constant.isNull;
-
-  bool isSubtype(DartTypes types, DartType s, DartType t) {
-    // At runtime, an integer is both an integer and a double: the
-    // integer type check is Math.floor, which will return true only
-    // for real integers, and our double type check is 'typeof number'
-    // which will return true for both integers and doubles.
-    if (s == types.commonElements.intType &&
-        t == types.commonElements.doubleType) {
-      return true;
-    }
-    return types.isSubtype(s, t);
-  }
-
-  SetConstantValue createSet(CommonElements commonElements,
-      InterfaceType sourceType, List<ConstantValue> values) {
-    InterfaceType type = commonElements.getConstantSetTypeFor(sourceType);
-    return new JavaScriptSetConstant(commonElements, type, values);
-  }
-
-  MapConstantValue createMap(
-      CommonElements commonElements,
-      InterfaceType sourceType,
-      List<ConstantValue> keys,
-      List<ConstantValue> values) {
-    bool onlyStringKeys = true;
-    ConstantValue protoValue = null;
-    for (int i = 0; i < keys.length; i++) {
-      dynamic key = keys[i];
-      if (key.isString) {
-        if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
-          protoValue = values[i];
-        }
-      } else {
-        onlyStringKeys = false;
-        // Don't handle __proto__ values specially in the general map case.
-        protoValue = null;
-        break;
-      }
-    }
-
-    bool hasProtoKey = (protoValue != null);
-    InterfaceType keysType;
-    if (sourceType.treatAsRaw) {
-      keysType = commonElements.listType();
-    } else {
-      keysType = commonElements.listType(sourceType.typeArguments.first);
-    }
-    ListConstantValue keysList = new ListConstantValue(keysType, keys);
-    InterfaceType type = commonElements.getConstantMapTypeFor(sourceType,
-        hasProtoKey: hasProtoKey, onlyStringKeys: onlyStringKeys);
-    return new JavaScriptMapConstant(
-        type, keysList, values, protoValue, onlyStringKeys);
-  }
-
-  ConstantValue createSymbol(CommonElements commonElements, String text) {
-    InterfaceType type = commonElements.symbolImplementationType;
-    FieldEntity field = commonElements.symbolField;
-    ConstantValue argument = createString(text);
-    // TODO(johnniwinther): Use type arguments when all uses no longer expect
-    // a [FieldElement].
-    var fields = <FieldEntity, ConstantValue>{field: argument};
-    return new ConstructedConstantValue(type, fields);
-  }
-
-  UnaryOperation lookupUnary(UnaryOperator operator) {
-    switch (operator.kind) {
-      case UnaryOperatorKind.COMPLEMENT:
-        return bitNot;
-      case UnaryOperatorKind.NEGATE:
-        return negate;
-      case UnaryOperatorKind.NOT:
-        return not;
-      default:
-        return null;
-    }
-  }
-
-  BinaryOperation lookupBinary(BinaryOperator operator) {
-    switch (operator.kind) {
-      case BinaryOperatorKind.ADD:
-        return add;
-      case BinaryOperatorKind.SUB:
-        return subtract;
-      case BinaryOperatorKind.MUL:
-        return multiply;
-      case BinaryOperatorKind.DIV:
-        return divide;
-      case BinaryOperatorKind.MOD:
-        return modulo;
-      case BinaryOperatorKind.IDIV:
-        return truncatingDivide;
-      case BinaryOperatorKind.OR:
-        return bitOr;
-      case BinaryOperatorKind.AND:
-        return bitAnd;
-      case BinaryOperatorKind.XOR:
-        return bitXor;
-      case BinaryOperatorKind.LOGICAL_OR:
-        return booleanOr;
-      case BinaryOperatorKind.LOGICAL_AND:
-        return booleanAnd;
-      case BinaryOperatorKind.SHL:
-        return shiftLeft;
-      case BinaryOperatorKind.SHR:
-        return shiftRight;
-      case BinaryOperatorKind.LT:
-        return less;
-      case BinaryOperatorKind.LTEQ:
-        return lessEqual;
-      case BinaryOperatorKind.GT:
-        return greater;
-      case BinaryOperatorKind.GTEQ:
-        return greaterEqual;
-      case BinaryOperatorKind.EQ:
-        return equal;
-      case BinaryOperatorKind.IF_NULL:
-        return ifNull;
-      default:
-        return null;
-    }
-  }
-}
-
 class JavaScriptSetConstant extends SetConstantValue {
   final MapConstantValue entries;
 
   JavaScriptSetConstant(CommonElements commonElements, InterfaceType type,
       List<ConstantValue> values)
-      : entries = ConstantSystem.only.createMap(
+      : entries = createMap(
             commonElements,
             commonElements.mapType(
                 type.typeArguments.first, commonElements.nullType),
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 2e40a0c..d67fa7a 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -7,8 +7,8 @@
 import 'dart:collection';
 
 import '../common.dart';
-import '../constants/constant_system.dart';
 import '../common_elements.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../elements/entities.dart';
 import '../elements/operators.dart';
 import '../elements/types.dart';
@@ -73,10 +73,8 @@
   /// Substitute free variables using arguments.
   ConstantExpression apply(NormalizedArguments arguments) => this;
 
-  /// Compute the [ConstantValue] for this expression using the [environment]
-  /// and the [constantSystem].
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem);
+  /// Compute the [ConstantValue] for this expression using the [environment].
+  ConstantValue evaluate(EvaluationEnvironment environment);
 
   /// Returns the type of this constant expression, if it is independent of the
   /// environment values.
@@ -145,8 +143,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // TODO(johnniwinther): Use non-constant values for errors.
     return new NonConstantValue();
   }
@@ -181,9 +178,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createBool(boolValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createBool(boolValue);
   }
 
   @override
@@ -217,9 +213,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createInt(intValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createInt(intValue);
   }
 
   @override
@@ -253,9 +248,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createDouble(doubleValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createDouble(doubleValue);
   }
 
   @override
@@ -289,9 +283,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createString(stringValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createString(stringValue);
   }
 
   @override
@@ -323,9 +316,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createNull();
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createNull();
   }
 
   @override
@@ -365,10 +357,9 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createList(type,
-        values.map((v) => v.evaluate(environment, constantSystem)).toList());
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createList(
+        type, values.map((v) => v.evaluate(environment)).toList());
   }
 
   ConstantExpression apply(NormalizedArguments arguments) {
@@ -426,19 +417,18 @@
           type, values.map((v) => v.apply(arguments)).toList());
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // TODO(fishythefish): Delete once the CFE provides these error messages.
     Set<ConstantValue> set = new LinkedHashSet<ConstantValue>();
     for (int i = 0; i < values.length; i++) {
-      ConstantValue value = values[i].evaluate(environment, constantSystem);
+      ConstantValue value = values[i].evaluate(environment);
       if (!value.isConstant) return new NonConstantValue();
       if (!set.add(value)) {
         environment.reportError(values[i], MessageKind.EQUAL_SET_ENTRY, {});
       }
     }
 
-    return constantSystem.createSet(
+    return constant_system.createSet(
         environment.commonElements, type, set.toList());
   }
 
@@ -506,18 +496,17 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // TODO(sigmund): delete once the CFE provides these error messages.
     bool isSetLiteral = environment.immediateUnderSetLiteral;
     return environment.evaluateMapBody(() {
       Map<ConstantValue, ConstantValue> map = <ConstantValue, ConstantValue>{};
       for (int i = 0; i < keys.length; i++) {
-        ConstantValue key = keys[i].evaluate(environment, constantSystem);
+        ConstantValue key = keys[i].evaluate(environment);
         if (!key.isConstant) {
           return new NonConstantValue();
         }
-        ConstantValue value = values[i].evaluate(environment, constantSystem);
+        ConstantValue value = values[i].evaluate(environment);
         if (!value.isConstant) {
           return new NonConstantValue();
         }
@@ -531,7 +520,7 @@
         }
         map[key] = value;
       }
-      return constantSystem.createMap(environment.commonElements, type,
+      return constant_system.createMap(environment.commonElements, type,
           map.keys.toList(), map.values.toList());
     });
   }
@@ -628,8 +617,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     InterfaceType instanceType = computeInstanceType(environment);
     return environment.evaluateConstructor(target, instanceType, () {
       InstanceData instanceData = computeInstanceData(environment);
@@ -641,7 +629,7 @@
           <FieldEntity, ConstantValue>{};
       instanceData.fieldMap
           .forEach((FieldEntity field, ConstantExpression constant) {
-        ConstantValue value = constant.evaluate(environment, constantSystem);
+        ConstantValue value = constant.evaluate(environment);
         assert(
             value != null,
             failedAt(CURRENT_ELEMENT_SPANNABLE,
@@ -653,7 +641,7 @@
         }
       });
       for (AssertConstantExpression assertion in instanceData.assertions) {
-        if (!assertion.evaluate(environment, constantSystem).isConstant) {
+        if (!assertion.evaluate(environment).isConstant) {
           isValidAsConstant = false;
         }
       }
@@ -725,12 +713,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     bool isValid = true;
     StringBuffer sb = new StringBuffer();
     for (ConstantExpression expression in expressions) {
-      ConstantValue value = expression.evaluate(environment, constantSystem);
+      ConstantValue value = expression.evaluate(environment);
       if (!value.isConstant) {
         isValid = false;
         // Use `continue` instead of `return` here to report all errors in the
@@ -762,7 +749,7 @@
       }
     }
     if (isValid) {
-      return constantSystem.createString(sb.toString());
+      return constant_system.createString(sb.toString());
     }
     return new NonConstantValue();
   }
@@ -821,9 +808,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createSymbol(environment.commonElements, name);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createSymbol(environment.commonElements, name);
   }
 
   @override
@@ -854,9 +840,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createType(environment.commonElements, type);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createType(environment.commonElements, type);
   }
 
   @override
@@ -894,8 +879,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // Running example for comments:
     //
     //     class A<T> {
@@ -910,8 +894,7 @@
     // We visit `t as A.T` while evaluating `const B<num>(0)`.
 
     // The expression value is `0`.
-    ConstantValue expressionValue =
-        expression.evaluate(environment, constantSystem);
+    ConstantValue expressionValue = expression.evaluate(environment);
 
     if (!environment.checkCasts) return expressionValue;
 
@@ -924,7 +907,7 @@
 
     // Check that the expression type, `int`, is a subtype of the type in
     // context, `num`.
-    if (!constantSystem.isSubtype(
+    if (!constant_system.isSubtype(
         environment.types, expressionType, typeInContext)) {
       // TODO(sigmund): consider reporting different messages and error
       // locations for implicit vs explicit casts.
@@ -971,11 +954,10 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return environment.evaluateField(element, () {
       ConstantExpression constant = environment.getFieldConstant(element);
-      return constant.evaluate(environment, constantSystem);
+      return constant.evaluate(environment);
     });
   }
 
@@ -1006,10 +988,9 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     ConstantExpression constant = environment.getLocalConstant(element);
-    return constant.evaluate(environment, constantSystem);
+    return constant.evaluate(environment);
   }
 
   @override
@@ -1040,8 +1021,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return new FunctionConstantValue(element, type);
   }
 
@@ -1088,10 +1068,9 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue leftValue = left.evaluate(environment, constantSystem);
-    ConstantValue rightValue = right.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue leftValue = left.evaluate(environment);
+    ConstantValue rightValue = right.evaluate(environment);
     if (!leftValue.isConstant || !rightValue.isConstant) {
       return new NonConstantValue();
     }
@@ -1293,11 +1272,12 @@
       switch (operator.kind) {
         case BinaryOperatorKind.NOT_EQ:
           BoolConstantValue equals =
-              constantSystem.equal.fold(leftValue, rightValue);
+              constant_system.equal.fold(leftValue, rightValue);
           return equals.negate();
         default:
-          ConstantValue value =
-              constantSystem.lookupBinary(operator).fold(leftValue, rightValue);
+          ConstantValue value = constant_system
+              .lookupBinary(operator)
+              .fold(leftValue, rightValue);
           if (value != null) {
             return value;
           }
@@ -1432,12 +1412,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue leftValue = left.evaluate(environment, constantSystem);
-    ConstantValue rightValue = right.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue leftValue = left.evaluate(environment);
+    ConstantValue rightValue = right.evaluate(environment);
     if (leftValue.isConstant && rightValue.isConstant) {
-      return constantSystem.identity.fold(leftValue, rightValue);
+      return constant_system.identity.fold(leftValue, rightValue);
     }
     return new NonConstantValue();
   }
@@ -1492,10 +1471,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue expressionValue =
-        expression.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue expressionValue = expression.evaluate(environment);
     bool isValid = true;
     switch (operator.kind) {
       case UnaryOperatorKind.NOT:
@@ -1534,7 +1511,7 @@
     }
     if (isValid) {
       ConstantValue value =
-          constantSystem.lookupUnary(operator).fold(expressionValue);
+          constant_system.lookupUnary(operator).fold(expressionValue);
       if (value != null) {
         return value;
       }
@@ -1595,9 +1572,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue value = expression.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue value = expression.evaluate(environment);
     if (!value.isString) {
       environment.reportError(
           expression, MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE, {
@@ -1607,7 +1583,7 @@
       return new NonConstantValue();
     } else {
       StringConstantValue stringValue = value;
-      return constantSystem
+      return constant_system
           .createInt(new BigInt.from(stringValue.stringValue.length));
     }
   }
@@ -1685,12 +1661,10 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue conditionValue =
-        condition.evaluate(environment, constantSystem);
-    ConstantValue trueValue = trueExp.evaluate(environment, constantSystem);
-    ConstantValue falseValue = falseExp.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue conditionValue = condition.evaluate(environment);
+    ConstantValue trueValue = trueExp.evaluate(environment);
+    ConstantValue falseValue = falseExp.evaluate(environment);
     bool isValid = true;
     if (!conditionValue.isBool) {
       environment.reportError(
@@ -1756,8 +1730,7 @@
   bool _equals(PositionalArgumentReference other) => index == other.index;
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return new NonConstantValue();
   }
 
@@ -1795,8 +1768,7 @@
   bool _equals(NamedArgumentReference other) => name == other.name;
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return new NonConstantValue();
   }
 
@@ -1874,15 +1846,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createBool(false);
+      defaultConstantValue = constant_system.createBool(false);
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -1904,9 +1874,9 @@
       String text =
           environment.readFromEnvironment(nameStringConstantValue.stringValue);
       if (text == 'true') {
-        return constantSystem.createBool(true);
+        return constant_system.createBool(true);
       } else if (text == 'false') {
-        return constantSystem.createBool(false);
+        return constant_system.createBool(false);
       } else {
         return defaultConstantValue;
       }
@@ -1953,15 +1923,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createNull();
+      defaultConstantValue = constant_system.createNull();
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -1989,7 +1957,7 @@
       if (value == null) {
         return defaultConstantValue;
       } else {
-        return constantSystem.createInt(value);
+        return constant_system.createInt(value);
       }
     }
     return new NonConstantValue();
@@ -2034,15 +2002,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createNull();
+      defaultConstantValue = constant_system.createNull();
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -2066,7 +2032,7 @@
       if (text == null) {
         return defaultConstantValue;
       } else {
-        return constantSystem.createString(text);
+        return constant_system.createString(text);
       }
     }
     return new NonConstantValue();
@@ -2115,10 +2081,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue conditionValue =
-        condition.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue conditionValue = condition.evaluate(environment);
     bool validAssert;
     if (environment.enableAssertions) {
       // Boolean conversion:
@@ -2129,7 +2093,7 @@
     }
     if (!validAssert) {
       if (message != null) {
-        ConstantValue value = message.evaluate(environment, constantSystem);
+        ConstantValue value = message.evaluate(environment);
         if (value is StringConstantValue) {
           String text = '${value.stringValue}';
           environment.reportError(this,
@@ -2177,12 +2141,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     List<DartType> typeArgumentsInContext =
         typeArguments.map(environment.getTypeInContext).toList();
-    return new InstantiationConstantValue(typeArgumentsInContext,
-        expression.evaluate(environment, constantSystem));
+    return new InstantiationConstantValue(
+        typeArgumentsInContext, expression.evaluate(environment));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index dbe357f..518bf66 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -7,7 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common/names.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
@@ -681,24 +681,20 @@
   }
 
   @override
-  TypeInformation visitIntLiteral(ir.IntLiteral node) {
-    ConstantSystem constantSystem = _closedWorld.constantSystem;
-    // The JavaScript backend may turn this literal into a double at
-    // runtime.
-    return _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
-        .computeAbstractValueForConstant(
-            constantSystem.createIntFromInt(node.value)));
-  }
+  TypeInformation visitIntLiteral(ir.IntLiteral node) =>
+      // The JavaScript backend may turn this literal into a double at
+      // runtime.
+      _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
+          .computeAbstractValueForConstant(
+              constant_system.createIntFromInt(node.value)));
 
   @override
-  TypeInformation visitDoubleLiteral(ir.DoubleLiteral node) {
-    ConstantSystem constantSystem = _closedWorld.constantSystem;
-    // The JavaScript backend may turn this literal into an integer at
-    // runtime.
-    return _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
-        .computeAbstractValueForConstant(
-            constantSystem.createDouble(node.value)));
-  }
+  TypeInformation visitDoubleLiteral(ir.DoubleLiteral node) =>
+      // The JavaScript backend may turn this literal into an integer at
+      // runtime.
+      _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
+          .computeAbstractValueForConstant(
+              constant_system.createDouble(node.value)));
 
   @override
   TypeInformation visitStringLiteral(ir.StringLiteral node) {
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
index 5f2e7a9..9b5232f 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
@@ -5,6 +5,7 @@
 library types.constants;
 
 import '../../common.dart';
+import '../../constants/constant_system.dart' as constant_system;
 import '../../constants/values.dart';
 import '../../js_backend/js_backend.dart' show SyntheticConstantKind;
 import '../../world.dart' show JClosedWorld;
@@ -37,7 +38,7 @@
   @override
   TypeMask visitDouble(DoubleConstantValue constant, JClosedWorld closedWorld) {
     // We have to recognize double constants that are 'is int'.
-    if (closedWorld.constantSystem.isInt(constant)) {
+    if (constant_system.isInt(constant)) {
       if (constant.isMinusZero) {
         return closedWorld.abstractValueDomain.uint31Type;
       } else {
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 067474c..5526dbf 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -12,7 +12,6 @@
 import '../common_elements.dart'
     show CommonElements, ElementEnvironment, JElementEnvironment;
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
 import '../deferred_load.dart' show DeferredLoadTask;
 import '../dump_info.dart' show DumpInfoTask;
 import '../elements/entities.dart';
@@ -400,10 +399,6 @@
         this, compiler.measurer, sourceInformationStrategy);
   }
 
-  /// The [ConstantSystem] used to interpret compile-time constants for this
-  /// backend.
-  ConstantSystem get constantSystem => constants.constantSystem;
-
   DiagnosticReporter get reporter => compiler.reporter;
 
   ImpactCacheDeleter get impactCacheDeleter => compiler.impactCacheDeleter;
@@ -546,7 +541,6 @@
         compiler.frontendStrategy.createNativeClassFinder(nativeBasicData));
     _nativeDataBuilder = new NativeDataBuilderImpl(nativeBasicData);
     _customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis(
-        constantSystem,
         elementEnvironment,
         commonElements,
         nativeBasicData,
@@ -620,10 +614,7 @@
     CommonElements commonElements = closedWorld.commonElements;
     BackendImpacts impacts = new BackendImpacts(commonElements);
     _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis(
-        constantSystem,
-        commonElements,
-        elementEnvironment,
-        closedWorld.nativeData);
+        commonElements, elementEnvironment, closedWorld.nativeData);
     _nativeCodegenEnqueuer = new NativeCodegenEnqueuer(
         compiler.options,
         elementEnvironment,
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 44fdb82..7a77ae5 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -4,7 +4,7 @@
 
 import '../common.dart';
 import '../common_elements.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
@@ -184,7 +184,8 @@
   }
 
   @override
-  jsAst.Expression visitSet(JavaScriptSetConstant constant, [_]) {
+  jsAst.Expression visitSet(constant_system.JavaScriptSetConstant constant,
+      [_]) {
     InterfaceType sourceType = constant.type;
     ClassEntity classElement = sourceType.element;
     String className = classElement.name;
@@ -206,12 +207,14 @@
   }
 
   @override
-  jsAst.Expression visitMap(JavaScriptMapConstant constant, [_]) {
+  jsAst.Expression visitMap(constant_system.JavaScriptMapConstant constant,
+      [_]) {
     jsAst.Expression jsMap() {
       List<jsAst.Property> properties = <jsAst.Property>[];
       for (int i = 0; i < constant.length; i++) {
         StringConstantValue key = constant.keys[i];
-        if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
+        if (key.stringValue ==
+            constant_system.JavaScriptMapConstant.PROTO_PROPERTY) {
           continue;
         }
 
@@ -248,17 +251,21 @@
     _worldBuilder.forEachInstanceField(classElement,
         (ClassEntity enclosing, FieldEntity field, {bool isElided}) {
       if (isElided) return;
-      if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
+      if (field.name == constant_system.JavaScriptMapConstant.LENGTH_NAME) {
         arguments
             .add(new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
-      } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.JS_OBJECT_NAME) {
         arguments.add(jsMap());
-      } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.KEYS_NAME) {
         arguments.add(constantReferenceGenerator(constant.keyList));
-      } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.PROTO_VALUE) {
         assert(constant.protoValue != null);
         arguments.add(constantReferenceGenerator(constant.protoValue));
-      } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.JS_DATA_NAME) {
         arguments.add(jsGeneralMap());
       } else {
         failedAt(field,
@@ -266,11 +273,12 @@
       }
       emittedArgumentCount++;
     });
-    if ((className == JavaScriptMapConstant.DART_STRING_CLASS &&
+    if ((className == constant_system.JavaScriptMapConstant.DART_STRING_CLASS &&
             emittedArgumentCount != 3) ||
-        (className == JavaScriptMapConstant.DART_PROTO_CLASS &&
+        (className == constant_system.JavaScriptMapConstant.DART_PROTO_CLASS &&
             emittedArgumentCount != 4) ||
-        (className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
+        (className ==
+                constant_system.JavaScriptMapConstant.DART_GENERAL_CLASS &&
             emittedArgumentCount != 1)) {
       failedAt(classElement,
           "Compiler and ${className} disagree on number of fields.");
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index a9b473a..1335b2e 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -4,7 +4,6 @@
 
 import '../compile_time_constants.dart';
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
 import '../elements/entities.dart';
 
 /// [ConstantCompilerTask] for compilation of constants for the JavaScript
@@ -22,9 +21,6 @@
         super(compiler.measurer);
 
   String get name => 'ConstantHandler';
-
-  @override
-  ConstantSystem get constantSystem => ConstantSystem.only;
 }
 
 /// The [JavaScriptConstantCompiler] is used to keep track of compile-time
@@ -37,8 +33,6 @@
 
   JavaScriptConstantCompiler();
 
-  ConstantSystem get constantSystem => ConstantSystem.only;
-
   @override
   void registerLazyStatic(FieldEntity element) {
     lazyStatics.add(element);
diff --git a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
index 79a4453..a3c61f7 100644
--- a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common_elements.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
@@ -84,13 +84,12 @@
   final CustomElementsAnalysisJoin join;
 
   CustomElementsResolutionAnalysis(
-      ConstantSystem constantSystem,
       ElementEnvironment elementEnvironment,
       CommonElements commonElements,
       NativeBasicData nativeData,
       BackendUsageBuilder backendUsageBuilder)
       : join = new CustomElementsAnalysisJoin(
-            constantSystem, elementEnvironment, commonElements, nativeData,
+            elementEnvironment, commonElements, nativeData,
             backendUsageBuilder: backendUsageBuilder),
         super(elementEnvironment, commonElements, nativeData) {
     // TODO(sra): Remove this work-around.  We should mark allClassesSelected in
@@ -120,13 +119,10 @@
 class CustomElementsCodegenAnalysis extends CustomElementsAnalysisBase {
   final CustomElementsAnalysisJoin join;
 
-  CustomElementsCodegenAnalysis(
-      ConstantSystem constantSystem,
-      CommonElements commonElements,
-      ElementEnvironment elementEnvironment,
-      NativeBasicData nativeData)
+  CustomElementsCodegenAnalysis(CommonElements commonElements,
+      ElementEnvironment elementEnvironment, NativeBasicData nativeData)
       : join = new CustomElementsAnalysisJoin(
-            constantSystem, elementEnvironment, commonElements, nativeData),
+            elementEnvironment, commonElements, nativeData),
         super(elementEnvironment, commonElements, nativeData) {
     // TODO(sra): Remove this work-around.  We should mark allClassesSelected in
     // both joins only when we see a construct generating an unknown [Type] but
@@ -149,7 +145,6 @@
 }
 
 class CustomElementsAnalysisJoin {
-  final ConstantSystem _constantSystem;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
   final NativeBasicData _nativeData;
@@ -175,8 +170,8 @@
   // ClassesOutput: classes requiring metadata.
   final Set<ClassEntity> activeClasses = new Set<ClassEntity>();
 
-  CustomElementsAnalysisJoin(this._constantSystem, this._elementEnvironment,
-      this._commonElements, this._nativeData,
+  CustomElementsAnalysisJoin(
+      this._elementEnvironment, this._commonElements, this._nativeData,
       {BackendUsageBuilder backendUsageBuilder})
       : this._backendUsageBuilder = backendUsageBuilder,
         this.forResolution = backendUsageBuilder != null;
@@ -217,7 +212,7 @@
 
   TypeConstantValue _makeTypeConstant(ClassEntity cls) {
     DartType type = _elementEnvironment.getRawType(cls);
-    return _constantSystem.createType(_commonElements, type);
+    return constant_system.createType(_commonElements, type);
   }
 
   List<ConstructorEntity> computeEscapingConstructors(ClassEntity cls) {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c95a90e..3222b70 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -14,7 +14,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common/names.dart' show Identifiers, Names, Selectors;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
@@ -1982,7 +1982,7 @@
   }
 
   @override
-  void visitMap(covariant JavaScriptMapConstant constant, [_]) {
+  void visitMap(covariant constant_system.JavaScriptMapConstant constant, [_]) {
     // TODO(9476): Incorporate type parameters into name.
     addRoot('Map');
     if (constant.length == 0) {
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index a451dea..62ab66b 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -16,7 +16,6 @@
 import '../common/names.dart';
 import '../common_elements.dart';
 import '../compile_time_constants.dart';
-import '../constants/constant_system.dart';
 import '../constants/constructors.dart';
 import '../constants/evaluation.dart';
 import '../constants/expressions.dart';
@@ -2490,17 +2489,13 @@
 
   JsConstantEnvironment(this._elementMap, this._environment);
 
-  @override
-  ConstantSystem get constantSystem => ConstantSystem.only;
-
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
       {bool constantRequired}) {
     return _valueMap.putIfAbsent(expression, () {
-      return expression.evaluate(
-          new JsEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired),
-          constantSystem);
+      return expression.evaluate(new JsEvaluationEnvironment(
+          _elementMap, _environment, spannable,
+          constantRequired: constantRequired));
     });
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index c8c2c85..024408f 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -9,7 +9,6 @@
 import '../common.dart';
 import '../common/names.dart';
 import '../common_elements.dart' show JCommonElements, JElementEnvironment;
-import '../constants/constant_system.dart';
 import '../deferred_load.dart';
 import '../diagnostics/diagnostic_listener.dart';
 import '../elements/entities.dart';
@@ -208,8 +207,6 @@
     sink.end(tag);
   }
 
-  ConstantSystem get constantSystem => ConstantSystem.only;
-
   JElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
 
   JCommonElements get commonElements => elementMap.commonElements;
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
index dba2384..d3cf462 100644
--- a/pkg/compiler/lib/src/js_model/js_world_builder.dart
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -7,7 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common_elements.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../deferred_load.dart';
 import '../elements/entities.dart';
@@ -860,7 +860,8 @@
     return new SetConstantValue(type, values);
   }
 
-  ConstantValue visitMap(covariant JavaScriptMapConstant constant, _) {
+  ConstantValue visitMap(
+      covariant constant_system.JavaScriptMapConstant constant, _) {
     DartType type = typeConverter.visit(constant.type, toBackendEntity);
     ListConstantValue keys = constant.keyList.accept(this, null);
     List<ConstantValue> values = _handleValues(constant.values);
@@ -871,7 +872,7 @@
         protoValue == constant.protoValue) {
       return constant;
     }
-    return new JavaScriptMapConstant(
+    return new constant_system.JavaScriptMapConstant(
         type, keys, values, protoValue, constant.onlyStringKeys);
   }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index bf08bf0..48435a1 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -17,7 +17,6 @@
 import '../common/resolution.dart';
 import '../common_elements.dart';
 import '../compile_time_constants.dart';
-import '../constants/constant_system.dart';
 import '../constants/constructors.dart';
 import '../constants/evaluation.dart';
 import '../constants/expressions.dart';
@@ -1873,17 +1872,13 @@
 
   KernelConstantEnvironment(this._elementMap, this._environment);
 
-  @override
-  ConstantSystem get constantSystem => ConstantSystem.only;
-
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
       {bool constantRequired, bool checkCasts: true}) {
     return _valueMap.putIfAbsent(expression, () {
-      return expression.evaluate(
-          new KernelEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired, checkCasts: checkCasts),
-          constantSystem);
+      return expression.evaluate(new KernelEvaluationEnvironment(
+          _elementMap, _environment, spannable,
+          constantRequired: constantRequired, checkCasts: checkCasts));
     });
   }
 }
diff --git a/pkg/compiler/lib/src/serialization/abstract_sink.dart b/pkg/compiler/lib/src/serialization/abstract_sink.dart
index 07db268..64dd6d9 100644
--- a/pkg/compiler/lib/src/serialization/abstract_sink.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_sink.dart
@@ -401,7 +401,7 @@
         writeConstants(constant.values);
         break;
       case ConstantValueKind.MAP:
-        JavaScriptMapConstant constant = value;
+        constant_system.JavaScriptMapConstant constant = value;
         writeDartType(constant.type);
         writeConstant(constant.keyList);
         writeConstants(constant.values);
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index 4b6063b..f042e9b 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -467,7 +467,7 @@
         List<ConstantValue> values = readConstants();
         ConstantValue protoValue = readConstantOrNull();
         bool onlyStringKeys = readBool();
-        return new JavaScriptMapConstant(
+        return new constant_system.JavaScriptMapConstant(
             type, keyList, values, protoValue, onlyStringKeys);
       case ConstantValueKind.CONSTRUCTED:
         InterfaceType type = readDartType();
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index ce9332e..b974951 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -9,7 +9,7 @@
 import 'package:kernel/binary/ast_from_binary.dart' as ir;
 import 'package:kernel/binary/ast_to_binary.dart' as ir;
 import '../closure.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../diagnostics/source_span.dart';
 import '../elements/entities.dart';
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 0805cef..0f8b45c 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -10,6 +10,7 @@
 import '../common/names.dart';
 import '../common_elements.dart';
 import '../compiler.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart'
     show
         ConstantValue,
@@ -2555,7 +2556,7 @@
       List<ConstantValue> getConstants(
           ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) {
         return <ConstantValue>[
-          constantSystem.createIntFromInt(caseIndex[switchCase])
+          constant_system.createIntFromInt(caseIndex[switchCase])
         ];
       }
 
@@ -3849,8 +3850,7 @@
     }
 
     HConstant nameConstant = graph.addConstant(
-        closedWorld.constantSystem
-            .createSymbol(closedWorld.commonElements, name),
+        constant_system.createSymbol(closedWorld.commonElements, name),
         closedWorld);
 
     List<HInstruction> arguments = <HInstruction>[];
@@ -3882,7 +3882,7 @@
     for (String argumentName
         in selector.callStructure.getOrderedNamedArguments()) {
       ConstantValue argumentNameConstant =
-          constantSystem.createString(argumentName);
+          constant_system.createString(argumentName);
       argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
     }
     HInstruction argumentNamesInstruction = buildLiteralList(argumentNames);
@@ -3894,7 +3894,7 @@
     js.Name internalName = namer.invocationName(selector);
 
     ConstantValue kindConstant =
-        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+        constant_system.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createUnmangledInvocationMirror,
@@ -4676,7 +4676,7 @@
     FunctionEntity noSuchMethod =
         _elementMap.getSuperNoSuchMethod(containingClass);
 
-    ConstantValue nameConstant = constantSystem.createString(publicName);
+    ConstantValue nameConstant = constant_system.createString(publicName);
 
     js.Name internalName = namer.invocationName(selector);
 
@@ -4686,14 +4686,14 @@
     var argumentNames = new List<HInstruction>();
     for (String argumentName in selector.namedArguments) {
       ConstantValue argumentNameConstant =
-          constantSystem.createString(argumentName);
+          constant_system.createString(argumentName);
       argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
     }
     var argumentNamesInstruction = buildLiteralList(argumentNames);
     add(argumentNamesInstruction);
 
     ConstantValue kindConstant =
-        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+        constant_system.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createInvocationMirror,
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index d0ca90a..ffccada 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -11,7 +11,7 @@
 import '../common/names.dart';
 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/tasks.dart' show CompilerTask;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
@@ -249,8 +249,6 @@
 
   JCommonElements get _commonElements => _closedWorld.commonElements;
 
-  ConstantSystem get _constantSystem => _closedWorld.constantSystem;
-
   NativeData get _nativeData => _closedWorld.nativeData;
 
   InterceptorData get _interceptorData => _closedWorld.interceptorData;
@@ -2337,7 +2335,7 @@
             .withSourceInformation(sourceInformation));
       } else if (canGenerateOptimizedComparison(input)) {
         HRelational relational = input;
-        BinaryOperation operation = relational.operation(_constantSystem);
+        constant_system.BinaryOperation operation = relational.operation();
         String op = mapRelationalOperator(operation.name, true);
         handleInvokeBinary(input, op, sourceInformation);
       } else {
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index cf71ede..4b5d9cf 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../constants/constant_system.dart';
 import '../common/codegen.dart' show CodegenRegistry;
 import '../common_elements.dart';
 import '../compiler.dart';
@@ -79,8 +78,6 @@
 
   JavaScriptConstantCompiler get constants => backend.constants;
 
-  ConstantSystem get constantSystem => constants.constantSystem;
-
   RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder;
 
   InferredData get inferredData => globalInferenceResults.inferredData;
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index fb3df50..7e6e84c 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common_elements.dart' show JCommonElements;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/names.dart';
@@ -57,7 +57,7 @@
         new CallStructure(selector.argumentCount));
   }
 
-  Operation operation(ConstantSystem constantSystem) => null;
+  constant_system.Operation operation() => null;
 
   static InvokeDynamicSpecializer lookupSpecializer(Selector selector) {
     if (selector.isIndex) return const IndexSpecializer();
@@ -221,8 +221,8 @@
 class BitNotSpecializer extends InvokeDynamicSpecializer {
   const BitNotSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitNot;
+  constant_system.UnaryOperation operation() {
+    return constant_system.bitNot;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -266,8 +266,8 @@
 class UnaryNegateSpecializer extends InvokeDynamicSpecializer {
   const UnaryNegateSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.negate;
+  constant_system.UnaryOperation operation() {
+    return constant_system.negate;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -322,8 +322,8 @@
 class AbsSpecializer extends InvokeDynamicSpecializer {
   const AbsSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.abs;
+  constant_system.UnaryOperation operation() {
+    return constant_system.abs;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -480,8 +480,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.add;
+  constant_system.BinaryOperation operation() {
+    return constant_system.add;
   }
 
   HInstruction newBuiltinVariant(
@@ -506,8 +506,8 @@
 class DivideSpecializer extends BinaryArithmeticSpecializer {
   const DivideSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.divide;
+  constant_system.BinaryOperation operation() {
+    return constant_system.divide;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -554,8 +554,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.modulo;
+  constant_system.BinaryOperation operation() {
+    return constant_system.modulo;
   }
 
   HInstruction newBuiltinVariant(
@@ -646,8 +646,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.remainder;
+  constant_system.BinaryOperation operation() {
+    return constant_system.remainder;
   }
 
   HInstruction newBuiltinVariant(
@@ -672,8 +672,8 @@
 class MultiplySpecializer extends BinaryArithmeticSpecializer {
   const MultiplySpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.multiply;
+  constant_system.BinaryOperation operation() {
+    return constant_system.multiply;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -710,8 +710,8 @@
 class SubtractSpecializer extends BinaryArithmeticSpecializer {
   const SubtractSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.subtract;
+  constant_system.BinaryOperation operation() {
+    return constant_system.subtract;
   }
 
   HInstruction newBuiltinVariant(
@@ -736,8 +736,8 @@
 class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
   const TruncatingDivideSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.truncatingDivide;
+  constant_system.BinaryOperation operation() {
+    return constant_system.truncatingDivide;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -895,8 +895,8 @@
 class ShiftLeftSpecializer extends BinaryBitOpSpecializer {
   const ShiftLeftSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.shiftLeft;
+  constant_system.BinaryOperation operation() {
+    return constant_system.shiftLeft;
   }
 
   HInstruction tryConvertToBuiltin(
@@ -1027,8 +1027,8 @@
         computeTypeFromInputTypes(instruction, results, options, closedWorld));
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.shiftRight;
+  constant_system.BinaryOperation operation() {
+    return constant_system.shiftRight;
   }
 
   @override
@@ -1041,8 +1041,8 @@
 class BitOrSpecializer extends BinaryBitOpSpecializer {
   const BitOrSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitOr;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitOr;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1081,8 +1081,8 @@
 class BitAndSpecializer extends BinaryBitOpSpecializer {
   const BitAndSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitAnd;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitAnd;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1124,8 +1124,8 @@
 class BitXorSpecializer extends BinaryBitOpSpecializer {
   const BitXorSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitXor;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitXor;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1250,8 +1250,8 @@
     return null;
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.equal;
+  constant_system.BinaryOperation operation() {
+    return constant_system.equal;
   }
 
   HInstruction newBuiltinVariant(
@@ -1270,8 +1270,8 @@
 class LessSpecializer extends RelationalSpecializer {
   const LessSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.less;
+  constant_system.BinaryOperation operation() {
+    return constant_system.less;
   }
 
   HInstruction newBuiltinVariant(
@@ -1290,8 +1290,8 @@
 class GreaterSpecializer extends RelationalSpecializer {
   const GreaterSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.greater;
+  constant_system.BinaryOperation operation() {
+    return constant_system.greater;
   }
 
   HInstruction newBuiltinVariant(
@@ -1310,8 +1310,8 @@
 class GreaterEqualSpecializer extends RelationalSpecializer {
   const GreaterEqualSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.greaterEqual;
+  constant_system.BinaryOperation operation() {
+    return constant_system.greaterEqual;
   }
 
   HInstruction newBuiltinVariant(
@@ -1330,8 +1330,8 @@
 class LessEqualSpecializer extends RelationalSpecializer {
   const LessEqualSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.lessEqual;
+  constant_system.BinaryOperation operation() {
+    return constant_system.lessEqual;
   }
 
   HInstruction newBuiltinVariant(
@@ -1350,8 +1350,8 @@
 class CodeUnitAtSpecializer extends InvokeDynamicSpecializer {
   const CodeUnitAtSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.codeUnitAt;
+  constant_system.BinaryOperation operation() {
+    return constant_system.codeUnitAt;
   }
 
   HInstruction tryConvertToBuiltin(
@@ -1510,8 +1510,8 @@
 class RoundSpecializer extends InvokeDynamicSpecializer {
   const RoundSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.round;
+  constant_system.UnaryOperation operation() {
+    return constant_system.round;
   }
 
   HInstruction tryConvertToBuiltin(
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 3095197..b97455d 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -7,7 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../deferred_load.dart' show OutputUnit;
 import '../elements/entities.dart';
@@ -298,23 +298,21 @@
   }
 
   HConstant addConstantInt(int i, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createIntFromInt(i), closedWorld);
+    return addConstant(constant_system.createIntFromInt(i), closedWorld);
   }
 
   HConstant addConstantIntAsUnsigned(int i, JClosedWorld closedWorld) {
     return addConstant(
-        closedWorld.constantSystem.createInt(new BigInt.from(i).toUnsigned(64)),
+        constant_system.createInt(new BigInt.from(i).toUnsigned(64)),
         closedWorld);
   }
 
   HConstant addConstantDouble(double d, JClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createDouble(d), closedWorld);
+    return addConstant(constant_system.createDouble(d), closedWorld);
   }
 
   HConstant addConstantString(String str, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createString(str), closedWorld);
+    return addConstant(constant_system.createString(str), closedWorld);
   }
 
   HConstant addConstantStringFromName(js.Name name, JClosedWorld closedWorld) {
@@ -325,12 +323,11 @@
   }
 
   HConstant addConstantBool(bool value, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createBool(value), closedWorld);
+    return addConstant(constant_system.createBool(value), closedWorld);
   }
 
   HConstant addConstantNull(JClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createNull(), closedWorld);
+    return addConstant(constant_system.createNull(), closedWorld);
   }
 
   HConstant addConstantUnreachable(JClosedWorld closedWorld) {
@@ -2141,14 +2138,14 @@
   HInstruction get left => inputs[0];
   HInstruction get right => inputs[1];
 
-  BinaryOperation operation(ConstantSystem constantSystem);
+  constant_system.BinaryOperation operation();
 }
 
 abstract class HBinaryArithmetic extends HInvokeBinary {
   HBinaryArithmetic(HInstruction left, HInstruction right, Selector selector,
       AbstractValue type)
       : super(left, right, selector, type);
-  BinaryOperation operation(ConstantSystem constantSystem);
+  constant_system.BinaryOperation operation();
 }
 
 class HAdd extends HBinaryArithmetic {
@@ -2157,8 +2154,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitAdd(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.add;
+  constant_system.BinaryOperation operation() => constant_system.add;
   int typeCode() => HInstruction.ADD_TYPECODE;
   bool typeEquals(other) => other is HAdd;
   bool dataEquals(HInstruction other) => true;
@@ -2170,8 +2166,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitDivide(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.divide;
+  constant_system.BinaryOperation operation() => constant_system.divide;
   int typeCode() => HInstruction.DIVIDE_TYPECODE;
   bool typeEquals(other) => other is HDivide;
   bool dataEquals(HInstruction other) => true;
@@ -2183,7 +2178,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitMultiply(this);
 
-  BinaryOperation operation(ConstantSystem operations) => operations.multiply;
+  constant_system.BinaryOperation operation() => constant_system.multiply;
   int typeCode() => HInstruction.MULTIPLY_TYPECODE;
   bool typeEquals(other) => other is HMultiply;
   bool dataEquals(HInstruction other) => true;
@@ -2195,8 +2190,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitSubtract(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.subtract;
+  constant_system.BinaryOperation operation() => constant_system.subtract;
   int typeCode() => HInstruction.SUBTRACT_TYPECODE;
   bool typeEquals(other) => other is HSubtract;
   bool dataEquals(HInstruction other) => true;
@@ -2208,8 +2202,8 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.truncatingDivide;
+  constant_system.BinaryOperation operation() =>
+      constant_system.truncatingDivide;
   int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE;
   bool typeEquals(other) => other is HTruncatingDivide;
   bool dataEquals(HInstruction other) => true;
@@ -2221,8 +2215,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitRemainder(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.remainder;
+  constant_system.BinaryOperation operation() => constant_system.remainder;
   int typeCode() => HInstruction.REMAINDER_TYPECODE;
   bool typeEquals(other) => other is HRemainder;
   bool dataEquals(HInstruction other) => true;
@@ -2260,8 +2253,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftLeft(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.shiftLeft;
+  constant_system.BinaryOperation operation() => constant_system.shiftLeft;
   int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE;
   bool typeEquals(other) => other is HShiftLeft;
   bool dataEquals(HInstruction other) => true;
@@ -2273,8 +2265,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftRight(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.shiftRight;
+  constant_system.BinaryOperation operation() => constant_system.shiftRight;
   int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE;
   bool typeEquals(other) => other is HShiftRight;
   bool dataEquals(HInstruction other) => true;
@@ -2286,8 +2277,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitOr(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitOr;
+  constant_system.BinaryOperation operation() => constant_system.bitOr;
   int typeCode() => HInstruction.BIT_OR_TYPECODE;
   bool typeEquals(other) => other is HBitOr;
   bool dataEquals(HInstruction other) => true;
@@ -2299,8 +2289,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitAnd(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitAnd;
+  constant_system.BinaryOperation operation() => constant_system.bitAnd;
   int typeCode() => HInstruction.BIT_AND_TYPECODE;
   bool typeEquals(other) => other is HBitAnd;
   bool dataEquals(HInstruction other) => true;
@@ -2312,8 +2301,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitXor(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitXor;
+  constant_system.BinaryOperation operation() => constant_system.bitXor;
   int typeCode() => HInstruction.BIT_XOR_TYPECODE;
   bool typeEquals(other) => other is HBitXor;
   bool dataEquals(HInstruction other) => true;
@@ -2330,7 +2318,7 @@
 
   HInstruction get operand => inputs[0];
 
-  UnaryOperation operation(ConstantSystem constantSystem);
+  constant_system.UnaryOperation operation();
 }
 
 class HNegate extends HInvokeUnary {
@@ -2338,8 +2326,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitNegate(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.negate;
+  constant_system.UnaryOperation operation() => constant_system.negate;
   int typeCode() => HInstruction.NEGATE_TYPECODE;
   bool typeEquals(other) => other is HNegate;
   bool dataEquals(HInstruction other) => true;
@@ -2350,7 +2337,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitAbs(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) => constantSystem.abs;
+  constant_system.UnaryOperation operation() => constant_system.abs;
   int typeCode() => HInstruction.ABS_TYPECODE;
   bool typeEquals(other) => other is HAbs;
   bool dataEquals(HInstruction other) => true;
@@ -2361,8 +2348,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitBitNot(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitNot;
+  constant_system.UnaryOperation operation() => constant_system.bitNot;
   int typeCode() => HInstruction.BIT_NOT_TYPECODE;
   bool typeEquals(other) => other is HBitNot;
   bool dataEquals(HInstruction other) => true;
@@ -2628,8 +2614,7 @@
   HIdentity(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitIdentity(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.identity;
+  constant_system.BinaryOperation operation() => constant_system.identity;
   int typeCode() => HInstruction.IDENTITY_TYPECODE;
   bool typeEquals(other) => other is HIdentity;
   bool dataEquals(HInstruction other) => true;
@@ -2639,8 +2624,7 @@
   HGreater(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitGreater(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.greater;
+  constant_system.BinaryOperation operation() => constant_system.greater;
   int typeCode() => HInstruction.GREATER_TYPECODE;
   bool typeEquals(other) => other is HGreater;
   bool dataEquals(HInstruction other) => true;
@@ -2651,8 +2635,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitGreaterEqual(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.greaterEqual;
+  constant_system.BinaryOperation operation() => constant_system.greaterEqual;
   int typeCode() => HInstruction.GREATER_EQUAL_TYPECODE;
   bool typeEquals(other) => other is HGreaterEqual;
   bool dataEquals(HInstruction other) => true;
@@ -2662,8 +2645,7 @@
   HLess(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitLess(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.less;
+  constant_system.BinaryOperation operation() => constant_system.less;
   int typeCode() => HInstruction.LESS_TYPECODE;
   bool typeEquals(other) => other is HLess;
   bool dataEquals(HInstruction other) => true;
@@ -2673,8 +2655,7 @@
   HLessEqual(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitLessEqual(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.lessEqual;
+  constant_system.BinaryOperation operation() => constant_system.lessEqual;
   int typeCode() => HInstruction.LESS_EQUAL_TYPECODE;
   bool typeEquals(other) => other is HLessEqual;
   bool dataEquals(HInstruction other) => true;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f8416603..81f1848 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -7,7 +7,7 @@
 import '../common/names.dart' show Selectors;
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
@@ -204,8 +204,6 @@
 
   JCommonElements get commonElements => _closedWorld.commonElements;
 
-  ConstantSystem get constantSystem => _closedWorld.constantSystem;
-
   AbstractValueDomain get _abstractValueDomain =>
       _closedWorld.abstractValueDomain;
 
@@ -478,12 +476,12 @@
   }
 
   HInstruction visitInvokeUnary(HInvokeUnary node) {
-    HInstruction folded =
-        foldUnary(node.operation(constantSystem), node.operand);
+    HInstruction folded = foldUnary(node.operation(), node.operand);
     return folded != null ? folded : node;
   }
 
-  HInstruction foldUnary(UnaryOperation operation, HInstruction operand) {
+  HInstruction foldUnary(
+      constant_system.UnaryOperation operation, HInstruction operand) {
     if (operand is HConstant) {
       HConstant receiver = operand;
       ConstantValue folded = operation.fold(receiver.constant);
@@ -533,7 +531,7 @@
 
   HInstruction handleInterceptedCall(HInvokeDynamic node) {
     // Try constant folding the instruction.
-    Operation operation = node.specializer.operation(constantSystem);
+    constant_system.Operation operation = node.specializer.operation();
     if (operation != null) {
       HInstruction instruction = node.inputs.length == 2
           ? foldUnary(operation, node.inputs[1])
@@ -857,7 +855,7 @@
     if (index.isConstant()) {
       HConstant constantInstruction = index;
       assert(!constantInstruction.constant.isInt);
-      if (!constantSystem.isInt(constantInstruction.constant)) {
+      if (!constant_system.isInt(constantInstruction.constant)) {
         // -0.0 is a double but will pass the runtime integer check.
         node.staticChecks = HBoundsCheck.ALWAYS_FALSE;
       }
@@ -865,8 +863,8 @@
     return node;
   }
 
-  HInstruction foldBinary(
-      BinaryOperation operation, HInstruction left, HInstruction right) {
+  HInstruction foldBinary(constant_system.BinaryOperation operation,
+      HInstruction left, HInstruction right) {
     if (left is HConstant && right is HConstant) {
       HConstant op1 = left;
       HConstant op2 = right;
@@ -903,7 +901,7 @@
   HInstruction visitInvokeBinary(HInvokeBinary node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
-    BinaryOperation operation = node.operation(constantSystem);
+    constant_system.BinaryOperation operation = node.operation();
     HConstant folded = foldBinary(operation, left, right);
     if (folded != null) return folded;
     return node;
@@ -1517,7 +1515,7 @@
     }
 
     HInstruction folded = _graph.addConstant(
-        constantSystem
+        constant_system
             .createString(leftString.stringValue + rightString.stringValue),
         _closedWorld);
     if (prefix == null) return folded;
@@ -1531,7 +1529,7 @@
     }
 
     HInstruction asString(String string) =>
-        _graph.addConstant(constantSystem.createString(string), _closedWorld);
+        _graph.addConstant(constant_system.createString(string), _closedWorld);
 
     HInstruction tryConstant() {
       if (!input.isConstant()) return null;
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 028bb17..639c727 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 import 'optimize.dart';
 
 class ValueRangeInfo {
-  final ConstantSystem constantSystem;
-
   IntValue intZero;
   IntValue intOne;
 
-  ValueRangeInfo(this.constantSystem) {
+  ValueRangeInfo() {
     intZero = newIntValue(BigInt.zero);
     intOne = newIntValue(BigInt.one);
   }
@@ -128,9 +126,9 @@
   Value operator +(dynamic other) {
     if (other.isZero) return this;
     if (other is! IntValue) return other + this;
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.add.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.add.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
@@ -138,27 +136,26 @@
   Value operator -(dynamic other) {
     if (other.isZero) return this;
     if (other is! IntValue) return -other + this;
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.subtract.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.subtract.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
 
   Value operator -() {
     if (isZero) return this;
-    ConstantSystem constantSystem = info.constantSystem;
     dynamic constant =
-        constantSystem.negate.fold(constantSystem.createInt(value));
+        constant_system.negate.fold(constant_system.createInt(value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
 
   Value operator &(dynamic other) {
     if (other is! IntValue) return const UnknownValue();
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.bitAnd.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.bitAnd.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     return info.newIntValue(constant.intValue);
   }
 
@@ -578,11 +575,9 @@
   HGraph graph;
 
   SsaValueRangeAnalyzer(JClosedWorld closedWorld, this.optimizer)
-      : info = new ValueRangeInfo(closedWorld.constantSystem),
+      : info = new ValueRangeInfo(),
         this.closedWorld = closedWorld;
 
-  ConstantSystem get constantSystem => closedWorld.constantSystem;
-
   void visitGraph(HGraph graph) {
     this.graph = graph;
     visitDominatorTree(graph);
@@ -775,7 +770,7 @@
     if (right.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
     }
-    BinaryOperation operation = relational.operation(constantSystem);
+    constant_system.BinaryOperation operation = relational.operation();
     Range rightRange = ranges[relational.right];
     Range leftRange = ranges[relational.left];
 
@@ -880,7 +875,7 @@
       return info.newUnboundRange();
     }
     return instruction
-        .operation(constantSystem)
+        .operation()
         .apply(ranges[instruction.left], ranges[instruction.right]);
   }
 
@@ -942,46 +937,48 @@
     return newInstruction;
   }
 
-  static BinaryOperation negateOperation(BinaryOperation operation) {
-    if (operation == const LessOperation()) {
-      return const GreaterEqualOperation();
-    } else if (operation == const LessEqualOperation()) {
-      return const GreaterOperation();
-    } else if (operation == const GreaterOperation()) {
-      return const LessEqualOperation();
-    } else if (operation == const GreaterEqualOperation()) {
-      return const LessOperation();
+  static constant_system.BinaryOperation negateOperation(
+      constant_system.BinaryOperation operation) {
+    if (operation == const constant_system.LessOperation()) {
+      return const constant_system.GreaterEqualOperation();
+    } else if (operation == const constant_system.LessEqualOperation()) {
+      return const constant_system.GreaterOperation();
+    } else if (operation == const constant_system.GreaterOperation()) {
+      return const constant_system.LessEqualOperation();
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
+      return const constant_system.LessOperation();
     } else {
       return null;
     }
   }
 
-  static BinaryOperation flipOperation(BinaryOperation operation) {
-    if (operation == const LessOperation()) {
-      return const GreaterOperation();
-    } else if (operation == const LessEqualOperation()) {
-      return const GreaterEqualOperation();
-    } else if (operation == const GreaterOperation()) {
-      return const LessOperation();
-    } else if (operation == const GreaterEqualOperation()) {
-      return const LessEqualOperation();
+  static constant_system.BinaryOperation flipOperation(
+      constant_system.BinaryOperation operation) {
+    if (operation == const constant_system.LessOperation()) {
+      return const constant_system.GreaterOperation();
+    } else if (operation == const constant_system.LessEqualOperation()) {
+      return const constant_system.GreaterEqualOperation();
+    } else if (operation == const constant_system.GreaterOperation()) {
+      return const constant_system.LessOperation();
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
+      return const constant_system.LessEqualOperation();
     } else {
       return null;
     }
   }
 
-  Range computeConstrainedRange(
-      BinaryOperation operation, Range leftRange, Range rightRange) {
+  Range computeConstrainedRange(constant_system.BinaryOperation operation,
+      Range leftRange, Range rightRange) {
     Range range;
-    if (operation == const LessOperation()) {
+    if (operation == const constant_system.LessOperation()) {
       range = info.newNormalizedRange(
           const MinIntValue(), rightRange.upper - info.intOne);
-    } else if (operation == const LessEqualOperation()) {
+    } else if (operation == const constant_system.LessEqualOperation()) {
       range = info.newNormalizedRange(const MinIntValue(), rightRange.upper);
-    } else if (operation == const GreaterOperation()) {
+    } else if (operation == const constant_system.GreaterOperation()) {
       range = info.newNormalizedRange(
           rightRange.lower + info.intOne, const MaxIntValue());
-    } else if (operation == const GreaterEqualOperation()) {
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
       range = info.newNormalizedRange(rightRange.lower, const MaxIntValue());
     } else {
       range = info.newUnboundRange();
@@ -1005,8 +1002,8 @@
 
     Range rightRange = ranges[right];
     Range leftRange = ranges[left];
-    Operation operation = condition.operation(constantSystem);
-    Operation mirrorOp = flipOperation(operation);
+    constant_system.Operation operation = condition.operation();
+    constant_system.Operation mirrorOp = flipOperation(operation);
     // Only update the true branch if this block is the only
     // predecessor.
     if (branch.trueBranch.predecessors.length == 1) {
@@ -1032,8 +1029,8 @@
     // predecessor.
     if (branch.falseBranch.predecessors.length == 1) {
       assert(branch.falseBranch.predecessors[0] == branch.block);
-      Operation reverse = negateOperation(operation);
-      Operation reversedMirror = flipOperation(reverse);
+      constant_system.Operation reverse = negateOperation(operation);
+      constant_system.Operation reversedMirror = flipOperation(reverse);
       // Update the false branch to use narrower ranges for [left] and
       // [right].
       Range range = computeConstrainedRange(reverse, leftRange, rightRange);
@@ -1131,7 +1128,7 @@
     Range leftRange = visit(instruction.left);
     Range rightRange = visit(instruction.right);
     if (leftRange == null || rightRange == null) return null;
-    BinaryOperation operation = instruction.operation(info.constantSystem);
+    constant_system.BinaryOperation operation = instruction.operation();
     return operation.apply(leftRange, rightRange);
   }
 }
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 3d69a50..9b9e9e9 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -12,7 +12,6 @@
         JElementEnvironment,
         KCommonElements,
         KElementEnvironment;
-import 'constants/constant_system.dart';
 import 'deferred_load.dart';
 import 'diagnostics/diagnostic_listener.dart';
 import 'elements/entities.dart';
@@ -63,8 +62,6 @@
   /// Returns the [AbstractValueDomain] used in the global type inference.
   AbstractValueDomain get abstractValueDomain;
 
-  ConstantSystem get constantSystem;
-
   RuntimeTypesNeed get rtiNeed;
 
   NoSuchMethodData get noSuchMethodData;
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index 5bc6578..d8738ea 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -3,12 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "package:compiler/src/constants/constant_system.dart";
 import "package:compiler/src/inferrer/abstract_value_domain.dart";
 import "package:compiler/src/ssa/nodes.dart";
 import "package:compiler/src/ssa/value_range_analyzer.dart";
 
-ValueRangeInfo info = new ValueRangeInfo(ConstantSystem.only);
+ValueRangeInfo info = new ValueRangeInfo();
 
 class AbstractValueDomainMock implements AbstractValueDomain {
   const AbstractValueDomainMock();
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index 61ef76c..efecf36 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -10,7 +10,6 @@
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/constants/constant_system.dart';
 import 'package:compiler/src/constants/constructors.dart';
 import 'package:compiler/src/constants/evaluation.dart';
 import 'package:compiler/src/constants/expressions.dart';
@@ -632,8 +631,7 @@
         expectedResults.forEach((Map<String, String> env, String expectedText) {
           MemoryEnvironment environment =
               new MemoryEnvironment(getEnvironment(compiler, field), env);
-          ConstantValue value =
-              constant.evaluate(environment, ConstantSystem.only);
+          ConstantValue value = constant.evaluate(environment);
 
           Expect.isNotNull(
               value,