| // 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. | |
| // VMOptions=--optimization-counter-threshold=10 --no-use-osr | |
| import "package:expect/expect.dart"; | |
| class A { | |
| bool _result; | |
| A(this._result); | |
| operator ==(x) { | |
| return _result; | |
| } | |
| } | |
| opaque(x) => [x, 1, 'y'][0]; // confuse the optimizers. | |
| class Death { | |
| operator ==(x) { | |
| throw 'Dead!'; | |
| } | |
| } | |
| death() => opaque(new Death()); | |
| nullFn() => opaque(null); | |
| tests() { | |
| var alwaysTrue = new A(true); | |
| var alwaysFalse = new A(false); | |
| Expect.isFalse(alwaysFalse == alwaysFalse); | |
| Expect.isTrue(alwaysFalse != alwaysFalse); | |
| Expect.isTrue(alwaysTrue == alwaysTrue); | |
| Expect.isTrue(alwaysTrue == 5); | |
| Expect.isFalse(alwaysTrue == null); | |
| Expect.isFalse(null == alwaysTrue); | |
| Expect.isTrue(alwaysTrue != null); | |
| Expect.isTrue(null != alwaysTrue); | |
| Expect.isTrue(null == null); | |
| Expect.isFalse(null != null); | |
| Expect.throws(() => death() == 5); | |
| Expect.isFalse(death() == nullFn()); | |
| Expect.isFalse(nullFn() == death()); | |
| Expect.isTrue(nullFn() == nullFn()); | |
| Expect.isTrue(death() != nullFn()); | |
| Expect.isTrue(nullFn() != death()); | |
| Expect.isFalse(nullFn() != nullFn()); | |
| if (death() == nullFn()) { | |
| throw "failed"; | |
| } | |
| if (death() != nullFn()) { | |
| } else { | |
| throw "failed"; | |
| } | |
| } | |
| boolEqualityPositiveA(a) => a == true; | |
| boolEqualityNegativeA(a) => a != true; | |
| boolEqualityPositiveB(a) => true == a; | |
| boolEqualityNegativeB(a) => true != a; | |
| main() { | |
| for (int i = 0; i < 20; i++) { | |
| tests(); | |
| // Do not inline calls to prevent constant folding. | |
| Expect.isTrue(boolEqualityPositiveA(true)); | |
| Expect.isFalse(boolEqualityPositiveA(false)); | |
| Expect.isFalse(boolEqualityNegativeA(true)); | |
| Expect.isTrue(boolEqualityNegativeA(false)); | |
| Expect.isTrue(boolEqualityPositiveB(true)); | |
| Expect.isFalse(boolEqualityPositiveB(false)); | |
| Expect.isFalse(boolEqualityNegativeB(true)); | |
| Expect.isTrue(boolEqualityNegativeB(false)); | |
| } | |
| // Deoptimize. | |
| Expect.isFalse(boolEqualityPositiveA(1)); | |
| Expect.isTrue(boolEqualityNegativeA("hi")); | |
| Expect.isFalse(boolEqualityPositiveB(2.0)); | |
| Expect.isTrue(boolEqualityNegativeB([])); | |
| } |