2034061433
Change-Id: I313a57ed7c7ea2ada75065f55a7367376f6bdae5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/152183 Commit-Queue: Bob Nystrom <rnystrom@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Srujan Gaddam <srujzs@google.com>
76 lines
1.7 KiB
Dart
76 lines
1.7 KiB
Dart
// Copyright (c) 2017, 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=1000 --no-background-compilation
|
|
|
|
// Regression test for correct LICM and type propagation.
|
|
|
|
class Attribute {
|
|
final id = 123;
|
|
}
|
|
|
|
abstract class Name {
|
|
Name(this.name);
|
|
final String name;
|
|
get attr;
|
|
|
|
@pragma('vm:prefer-inline')
|
|
int compareTo(other) {
|
|
int nameCompare = name.compareTo(other.name);
|
|
if (nameCompare != 0) return nameCompare;
|
|
if (attr == null) return 0;
|
|
return attr.id - other.attr.id;
|
|
}
|
|
}
|
|
|
|
class AName extends Name {
|
|
AName() : super("abc");
|
|
final attr = new Attribute();
|
|
}
|
|
|
|
class BName extends Name {
|
|
BName(name) : super(name);
|
|
get attr => null;
|
|
}
|
|
|
|
class Member {
|
|
Member(this.name);
|
|
var name;
|
|
}
|
|
|
|
Member? find(List<Member> members, Name name) {
|
|
int low = 0, high = members.length - 1;
|
|
while (low <= high) {
|
|
int mid = low + ((high - low) >> 1);
|
|
Member pivot = members[mid];
|
|
int comparison = name.compareTo(pivot.name);
|
|
if (comparison < 0) {
|
|
high = mid - 1;
|
|
} else if (comparison > 0) {
|
|
low = mid + 1;
|
|
} else {
|
|
return pivot;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
main() {
|
|
var list = [
|
|
new Member(new AName()),
|
|
new Member(new BName("a")),
|
|
new Member(new BName("b")),
|
|
new Member(new BName("c")),
|
|
new Member(new BName("d"))
|
|
];
|
|
|
|
find(list, new AName());
|
|
find(list, new BName("e"));
|
|
find(list, new BName("b"));
|
|
for (var i = 0; i < 1000; ++i) {
|
|
find(list, new BName("b"));
|
|
find(list, new BName("e"));
|
|
}
|
|
}
|