// Copyright (c) 2020, 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.

// @dart = 2.9

// VMOptions=--use_compactor

// Each loading unit creates more image pages in the heap, which unfortunately
// cannot be aligned stronger than virtual memory page alignment, so the
// compactor must detect references to these image pages separately. Before
// these loading units were implemented, the compactor could assume a small
// upper bound on the number of image pages.

import "package:expect/expect.dart";
import "fragmentation_deferred_load_lib1.dart" deferred as lib1;
import "fragmentation_deferred_load_lib2.dart" deferred as lib2;
import "fragmentation_deferred_load_lib3.dart" deferred as lib3;

main() async {
  await lib1.loadLibrary();
  Expect.equals("one!", lib1.foo());
  await lib2.loadLibrary();
  Expect.equals("two!", lib2.foo());
  await lib3.loadLibrary();
  Expect.equals("three!", lib3.foo());

  final List<List> arrays = [];
  // Fill up heap with alternate large-small items.
  for (int i = 0; i < 500000; i++) {
    arrays.add(new List(260));
    arrays.add(new List(1));
  }
  // Clear the large items so that the heap is full of 260-word gaps.
  for (int i = 0; i < arrays.length; i += 2) {
    arrays[i] = null;
  }
  // Allocate a lot of 300-word objects that don't fit in the gaps.
  for (int i = 0; i < 600000; i++) {
    arrays.add(new List(300));
  }
}
