| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem(); | 5 const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem(); |
| 6 | 6 |
| 7 class JavaScriptBitNotOperation extends BitNotOperation { | 7 class JavaScriptBitNotOperation extends BitNotOperation { |
| 8 const JavaScriptBitNotOperation(); | 8 const JavaScriptBitNotOperation(); |
| 9 | 9 |
| 10 Constant fold(Constant constant) { | 10 Constant fold(Constant constant) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 /** | 22 /** |
| 23 * In JavaScript we truncate the result to an unsigned 32 bit integer. Also, -0 | 23 * In JavaScript we truncate the result to an unsigned 32 bit integer. Also, -0 |
| 24 * is treated as if it was the integer 0. | 24 * is treated as if it was the integer 0. |
| 25 */ | 25 */ |
| 26 class JavaScriptBinaryBitOperation implements BinaryOperation { | 26 class JavaScriptBinaryBitOperation implements BinaryOperation { |
| 27 final BinaryBitOperation dartBitOperation; | 27 final BinaryBitOperation dartBitOperation; |
| 28 | 28 |
| 29 const JavaScriptBinaryBitOperation(this.dartBitOperation); | 29 const JavaScriptBinaryBitOperation(this.dartBitOperation); |
| 30 | 30 |
| 31 bool isUserDefinable() => dartBitOperation.isUserDefinable(); | 31 bool isUserDefinable() => dartBitOperation.isUserDefinable(); |
| 32 SourceString get name() => dartBitOperation.name; | 32 SourceString get name => dartBitOperation.name; |
| 33 | 33 |
| 34 Constant fold(Constant left, Constant right) { | 34 Constant fold(Constant left, Constant right) { |
| 35 // In JavaScript we don't check for -0 and treat it as if it was zero. | 35 // In JavaScript we don't check for -0 and treat it as if it was zero. |
| 36 if (left.isMinusZero()) left = DART_CONSTANT_SYSTEM.createInt(0); | 36 if (left.isMinusZero()) left = DART_CONSTANT_SYSTEM.createInt(0); |
| 37 if (right.isMinusZero()) right = DART_CONSTANT_SYSTEM.createInt(0); | 37 if (right.isMinusZero()) right = DART_CONSTANT_SYSTEM.createInt(0); |
| 38 IntConstant result = dartBitOperation.fold(left, right); | 38 IntConstant result = dartBitOperation.fold(left, right); |
| 39 if (result != null) { | 39 if (result != null) { |
| 40 // We convert the result of bit-operations to 32 bit unsigned integers. | 40 // We convert the result of bit-operations to 32 bit unsigned integers. |
| 41 return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(result.value); | 41 return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(result.value); |
| 42 } | 42 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 69 return super.fold(left, right); | 69 return super.fold(left, right); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 class JavaScriptNegateOperation implements UnaryOperation { | 73 class JavaScriptNegateOperation implements UnaryOperation { |
| 74 final NegateOperation dartNegateOperation = const NegateOperation(); | 74 final NegateOperation dartNegateOperation = const NegateOperation(); |
| 75 | 75 |
| 76 const JavaScriptNegateOperation(); | 76 const JavaScriptNegateOperation(); |
| 77 | 77 |
| 78 bool isUserDefinable() => dartNegateOperation.isUserDefinable(); | 78 bool isUserDefinable() => dartNegateOperation.isUserDefinable(); |
| 79 SourceString get name() => dartNegateOperation.name; | 79 SourceString get name => dartNegateOperation.name; |
| 80 | 80 |
| 81 Constant fold(Constant constant) { | 81 Constant fold(Constant constant) { |
| 82 if (constant.isInt()) { | 82 if (constant.isInt()) { |
| 83 IntConstant intConstant = constant; | 83 IntConstant intConstant = constant; |
| 84 if (intConstant.value == 0) { | 84 if (intConstant.value == 0) { |
| 85 return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0); | 85 return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0); |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 return dartNegateOperation.fold(constant); | 88 return dartNegateOperation.fold(constant); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 | 91 |
| 92 class JavaScriptBinaryArithmeticOperation implements BinaryOperation { | 92 class JavaScriptBinaryArithmeticOperation implements BinaryOperation { |
| 93 final BinaryOperation dartArithmeticOperation; | 93 final BinaryOperation dartArithmeticOperation; |
| 94 | 94 |
| 95 const JavaScriptBinaryArithmeticOperation(this.dartArithmeticOperation); | 95 const JavaScriptBinaryArithmeticOperation(this.dartArithmeticOperation); |
| 96 | 96 |
| 97 bool isUserDefinable() => dartArithmeticOperation.isUserDefinable(); | 97 bool isUserDefinable() => dartArithmeticOperation.isUserDefinable(); |
| 98 SourceString get name() => dartArithmeticOperation.name; | 98 SourceString get name => dartArithmeticOperation.name; |
| 99 | 99 |
| 100 Constant fold(Constant left, Constant right) { | 100 Constant fold(Constant left, Constant right) { |
| 101 Constant result = dartArithmeticOperation.fold(left, right); | 101 Constant result = dartArithmeticOperation.fold(left, right); |
| 102 if (result == null) return result; | 102 if (result == null) return result; |
| 103 return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result); | 103 return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result); |
| 104 } | 104 } |
| 105 } | 105 } |
| 106 | 106 |
| 107 class JavaScriptIdentityOperation implements BinaryOperation { | 107 class JavaScriptIdentityOperation implements BinaryOperation { |
| 108 final IdentityOperation dartIdentityOperation = const IdentityOperation(); | 108 final IdentityOperation dartIdentityOperation = const IdentityOperation(); |
| 109 | 109 |
| 110 const JavaScriptIdentityOperation(); | 110 const JavaScriptIdentityOperation(); |
| 111 | 111 |
| 112 bool isUserDefinable() => dartIdentityOperation.isUserDefinable(); | 112 bool isUserDefinable() => dartIdentityOperation.isUserDefinable(); |
| 113 SourceString get name() => dartIdentityOperation.name; | 113 SourceString get name => dartIdentityOperation.name; |
| 114 | 114 |
| 115 BoolConstant fold(Constant left, Constant right) { | 115 BoolConstant fold(Constant left, Constant right) { |
| 116 BoolConstant result = dartIdentityOperation.fold(left, right); | 116 BoolConstant result = dartIdentityOperation.fold(left, right); |
| 117 if (result == null || result.value) return result; | 117 if (result == null || result.value) return result; |
| 118 // In JavaScript -0.0 === 0 and all doubles are equal to their integer | 118 // In JavaScript -0.0 === 0 and all doubles are equal to their integer |
| 119 // values. Furthermore NaN !== NaN. | 119 // values. Furthermore NaN !== NaN. |
| 120 if (left.isNum() && right.isNum()) { | 120 if (left.isNum() && right.isNum()) { |
| 121 NumConstant leftNum = left; | 121 NumConstant leftNum = left; |
| 122 NumConstant rightNum = right; | 122 NumConstant rightNum = right; |
| 123 double leftDouble = leftNum.value.toDouble(); | 123 double leftDouble = leftNum.value.toDouble(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 NullConstant createNull() => new NullConstant(); | 211 NullConstant createNull() => new NullConstant(); |
| 212 | 212 |
| 213 // Integer checks don't verify that the number is not -0.0. | 213 // Integer checks don't verify that the number is not -0.0. |
| 214 bool isInt(Constant constant) => constant.isInt() || constant.isMinusZero(); | 214 bool isInt(Constant constant) => constant.isInt() || constant.isMinusZero(); |
| 215 bool isDouble(Constant constant) | 215 bool isDouble(Constant constant) |
| 216 => constant.isDouble() && !constant.isMinusZero(); | 216 => constant.isDouble() && !constant.isMinusZero(); |
| 217 bool isString(Constant constant) => constant.isString(); | 217 bool isString(Constant constant) => constant.isString(); |
| 218 bool isBool(Constant constant) => constant.isBool(); | 218 bool isBool(Constant constant) => constant.isBool(); |
| 219 bool isNull(Constant constant) => constant.isNull(); | 219 bool isNull(Constant constant) => constant.isNull(); |
| 220 } | 220 } |
| OLD | NEW |