Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(800)

Unified Diff: lib/compiler/implementation/operations.dart

Issue 10825386: Use JavaScript runtime semantics when constant folding. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove top-level constanst. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/compiler/implementation/operations.dart
diff --git a/lib/compiler/implementation/operations.dart b/lib/compiler/implementation/operations.dart
index 0fb34cb6d6513145fab4d2d01d3292855487c744..23d5e771b6792dfd6883204bf043a2fb836ff712 100644
--- a/lib/compiler/implementation/operations.dart
+++ b/lib/compiler/implementation/operations.dart
@@ -63,9 +63,9 @@ interface BinaryOperation extends Operation {
/**
* Operations that only work if both arguments are integers.
*/
-class BinaryIntOperation implements BinaryOperation {
+class BinaryBitOperation implements BinaryOperation {
bool isUserDefinable() => true;
- const BinaryIntOperation();
+ const BinaryBitOperation();
Constant fold(Constant left, Constant right) {
if (left.isInt() && right.isInt()) {
IntConstant leftInt = left;
@@ -80,25 +80,25 @@ class BinaryIntOperation implements BinaryOperation {
abstract int foldInts(int left, int right);
}
-class BitOrOperation extends BinaryIntOperation {
+class BitOrOperation extends BinaryBitOperation {
final SourceString name = const SourceString('|');
const BitOrOperation();
int foldInts(int left, int right) => left | right;
}
-class BitAndOperation extends BinaryIntOperation {
+class BitAndOperation extends BinaryBitOperation {
final SourceString name = const SourceString('&');
const BitAndOperation();
int foldInts(int left, int right) => left & right;
}
-class BitXorOperation extends BinaryIntOperation {
+class BitXorOperation extends BinaryBitOperation {
final SourceString name = const SourceString('^');
const BitXorOperation();
int foldInts(int left, int right) => left ^ right;
}
-class ShiftLeftOperation extends BinaryIntOperation {
+class ShiftLeftOperation extends BinaryBitOperation {
final SourceString name = const SourceString('<<');
const ShiftLeftOperation();
int foldInts(int left, int right) {
@@ -109,7 +109,7 @@ class ShiftLeftOperation extends BinaryIntOperation {
}
}
-class ShiftRightOperation extends BinaryIntOperation {
+class ShiftRightOperation extends BinaryBitOperation {
final SourceString name = const SourceString('>>');
const ShiftRightOperation();
int foldInts(int left, int right) {
@@ -134,15 +134,15 @@ class BinaryBoolOperation implements BinaryOperation {
abstract bool foldBools(bool left, bool right);
}
-class BooleanAnd extends BinaryBoolOperation {
+class BooleanAndOperation extends BinaryBoolOperation {
final SourceString name = const SourceString('&&');
- const BooleanAnd();
+ const BooleanAndOperation();
bool foldBools(bool left, bool right) => left && right;
}
-class BooleanOr extends BinaryBoolOperation {
+class BooleanOrOperation extends BinaryBoolOperation {
final SourceString name = const SourceString('||');
- const BooleanOr();
+ const BooleanOrOperation();
bool foldBools(bool left, bool right) => left || right;
}
@@ -299,7 +299,7 @@ class IdentityOperation implements BinaryOperation {
final SourceString name = const SourceString('===');
bool isUserDefinable() => false;
const IdentityOperation();
- Constant fold(Constant left, Constant right) {
+ BoolConstant fold(Constant left, Constant right) {
// In order to preserve runtime semantics which says that NaN !== NaN don't
// constant fold NaN === NaN. Otherwise the output depends on inlined
// variables and other optimizations.
@@ -307,3 +307,56 @@ class IdentityOperation implements BinaryOperation {
return new BoolConstant(left == right);
}
}
+
+interface FoldingOperations {
+ 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();
+}
+
+/** Folding operations following the Dart semantics. */
+class DartFoldingOperations implements FoldingOperations {
+ final add = const AddOperation();
+ final bitAnd = const BitAndOperation();
+ final bitNot = const BitNotOperation();
+ final bitOr = const BitOrOperation();
+ final bitXor = const BitXorOperation();
+ final booleanAnd = const BooleanAndOperation();
+ final booleanOr = const BooleanOrOperation();
+ final divide = const DivideOperation();
+ final equal = const EqualsOperation();
+ final greaterEqual = const GreaterEqualOperation();
+ final greater = const GreaterOperation();
+ final identity = const IdentityOperation();
+ final lessEqual = const LessEqualOperation();
+ final less = const LessOperation();
+ final modulo = const ModuloOperation();
+ final multiply = const MultiplyOperation();
+ final negate = const NegateOperation();
+ final not = const NotOperation();
+ final shiftLeft = const ShiftLeftOperation();
+ final shiftRight = const ShiftRightOperation();
+ final subtract = const SubtractOperation();
+ final truncatingDivide = const TruncatingDivideOperation();
+
+ const DartFoldingOperations();
+}

Powered by Google App Engine
This is Rietveld 408576698