blob: 0fff5802526c6e83a5450bf064acf72b1f4f03ce [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// 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.
part of dart2js;
abstract class Operation {
SourceString get name;
bool isUserDefinable();
}
abstract class UnaryOperation extends Operation {
/** Returns [:null:] if it was unable to fold the operation. */
Constant fold(Constant constant);
apply(value);
}
abstract class BinaryOperation extends Operation {
/** Returns [:null:] if it was unable to fold the operation. */
Constant fold(Constant left, Constant right);
apply(left, right);
}
/**
* A [ConstantSystem] is responsible for creating constants and folding them.
*/
abstract class ConstantSystem {
BinaryOperation get add;
BinaryOperation get bitAnd;
UnaryOperation get bitNot;
BinaryOperation get bitOr;
BinaryOperation get bitXor;
BinaryOperation get booleanAnd;
BinaryOperation get booleanOr;
BinaryOperation get divide;
BinaryOperation get equal;
BinaryOperation get greaterEqual;
BinaryOperation get greater;
BinaryOperation get identity;
BinaryOperation get lessEqual;
BinaryOperation get less;
BinaryOperation get modulo;
BinaryOperation get multiply;
UnaryOperation get negate;
UnaryOperation get not;
BinaryOperation get shiftLeft;
BinaryOperation get shiftRight;
BinaryOperation get subtract;
BinaryOperation get truncatingDivide;
const ConstantSystem();
Constant createInt(int i);
Constant createDouble(double d);
// We need a diagnostic node to report errors in case the string is malformed.
Constant createString(DartString string, Node diagnosticNode);
Constant createBool(bool value);
Constant createNull();
// We need to special case the subtype check for JavaScript constant
// system because an int is a double at runtime.
bool isSubtype(Compiler compiler, DartType s, DartType t);
/** Returns true if the [constant] is an integer at runtime. */
bool isInt(Constant constant);
/** Returns true if the [constant] is a double at runtime. */
bool isDouble(Constant constant);
/** Returns true if the [constant] is a string at runtime. */
bool isString(Constant constant);
/** Returns true if the [constant] is a boolean at runtime. */
bool isBool(Constant constant);
/** Returns true if the [constant] is null at runtime. */
bool isNull(Constant constant);
Operation lookupUnary(SourceString operator) {
if (operator == const SourceString('-')) return negate;
if (operator == const SourceString('~')) return bitNot;
return null;
}
}