// 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.

import '../tool/_fasta/entry_points.dart' show compileEntryPoint;

void main(List<String> arguments) async {
  await compileEntryPoint(arguments);
  if (numCalls.isNotEmpty) {
    print("[");
    bool printed = false;
    for (int i = 0; i < numCalls.length; i++) {
      int? value = numCalls[i];
      if (value != null && value > 0) {
        if (printed) print(",");
        print("$i, $value");
        printed = true;
      }
    }
    print("]");
  } else if (inCall.isNotEmpty) {
    print("[");
    bool printed = false;
    for (int i = 0; i < inCall.length; i++) {
      int? value = inCall[i];
      if (value == null) continue;
      if (value != 0) throw "$i has value $value";
      if (printed) print(",");
      int? time = callTimes[i];
      print("$i, $time");
      printed = true;
    }
    print("]");
  }
}

List<int?> numCalls = [];

void registerCall(int procedureNum) {
  while (numCalls.length <= procedureNum) {
    if (numCalls.length < 8) {
      numCalls.length = 8;
    } else {
      numCalls.length *= 2;
    }
  }
  int numCallsCount = numCalls[procedureNum] ??= 0;
  numCalls[procedureNum] = numCallsCount + 1;
}

List<int?> inCall = [];
List<int?> callTimes = [];
Stopwatch stopwatch = new Stopwatch()..start();

void registerCallStart(int procedureNum) {
  while (inCall.length <= procedureNum) {
    if (inCall.length < 8) {
      inCall.length = 8;
      callTimes.length = 8;
    } else {
      inCall.length *= 2;
      callTimes.length *= 2;
    }
  }
  int inCallCount = inCall[procedureNum] ??= 0;
  int callTimesCount = callTimes[procedureNum] ??= 0;
  inCall[procedureNum] = inCallCount + 1;
  if (inCallCount == 0) {
    // First --- start a timer-ish.
    callTimes[procedureNum] = callTimesCount - stopwatch.elapsedMicroseconds;
  }
}

void registerCallEnd(int procedureNum) {
  int inCallCount = inCall[procedureNum]!;
  inCall[procedureNum] = inCallCount - 1;
  if (inCallCount == 1) {
    // Last --- stop the timer-ish.
    callTimes[procedureNum] =
        callTimes[procedureNum]! + stopwatch.elapsedMicroseconds;
  }
}

@pragma("vm:prefer-inline")
void preferInlineMe() {
  // This makes it easier to get the annotation :).
}

int busyWait(int micro) {
  int count = 0;
  Stopwatch stopwatch = new Stopwatch()..start();
  while (true) {
    for (int i = 0; i < 1000; i++) {
      count++;
    }
    int elapsed = stopwatch.elapsedMicroseconds;
    if (elapsed >= micro) {
      print("Bye from busywait after $count iterations ($elapsed vs $micro)!");
      return count;
    }
  }
}
