blob: 69d8572c7c8e234e952fa45d09fd6985cd0780ac [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.
// 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([]));
}