mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 03:36:59 +00:00
3d020fa91e
Original review at https://dart-review.googlesource.com/c/sdk/+/7160 Change-Id: If2aeecec04640bee3b622d97c8fcdd6cb1bdd369 Reviewed-on: https://dart-review.googlesource.com/8731 Commit-Queue: Jaime Wren <jwren@google.com> Reviewed-by: Janice Collins <jcollins@google.com> Reviewed-by: Jaime Wren <jwren@google.com>
84 lines
2.2 KiB
Dart
84 lines
2.2 KiB
Dart
// 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([]));
|
|
}
|