| // Copyright (c) 2014, 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=5 --no-background-compilation |
| // Test correct OSR (issue 16151). |
| |
| import "dart:collection"; |
| import "package:expect/expect.dart"; |
| |
| List create([int? length]) { |
| return new MyList(length); |
| } |
| |
| main() { |
| test(create); |
| } |
| |
| class MyList<E> extends ListBase<E> { |
| List<E?> _list; |
| |
| MyList([int? length]) |
| : _list = (length == null ? <E?>[] : new List<E?>.filled(length, null)); |
| |
| E operator [](int index) => _list[index]!; |
| |
| void operator []=(int index, E value) { |
| _list[index] = value; |
| } |
| |
| int get length => _list.length; |
| |
| void set length(int newLength) { |
| _list.length = newLength; |
| } |
| } |
| |
| test(List create([int length])) { |
| sort_A01_t02_test(create); |
| } |
| |
| // From library co19 sort_A01_t02. |
| |
| sort_A01_t02_test(List create([int length])) { |
| int c(var a, var b) { |
| return a < b ? -1 : (a == b ? 0 : 1); |
| } |
| |
| int maxlen = 7; |
| int prevLength = 0; |
| for (int length = 1; length < maxlen; ++length) { |
| // Check that we are making progress. |
| if (prevLength == length) { |
| // Cannot use Expect.notEquals since it hides the bug. |
| throw "No progress made"; |
| } |
| prevLength = length; |
| List a = create(length); |
| List expected = create(length); |
| for (int i = 0; i < length; ++i) { |
| expected[i] = i; |
| a[i] = i; |
| } |
| |
| void swap(int i, int j) { |
| var t = a[i]; |
| a[i] = a[j]; |
| a[j] = t; |
| } |
| |
| void check() { |
| return; |
| // Deleting the code below will throw a RangeError instead of throw above. |
| var a_copy = new List<dynamic>.filled(length, null); |
| a_copy.setRange(0, length, a); |
| a_copy.sort(c); |
| } |
| |
| void permute(int n) { |
| if (n == 1) { |
| check(); |
| } else { |
| for (int i = 0; i < n; i++) { |
| permute(n - 1); |
| if (n % 2 == 1) { |
| swap(0, n - 1); |
| } else { |
| swap(i, n - 1); |
| } |
| } |
| } |
| } //void permute |
| |
| permute(length); |
| } //for i in 0..length |
| } // test |