// Copyright (c) 2018, 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-background-compilation --shared-slow-path-triggers-gc
// VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc --no-use-vfp

// This tests the stackmaps and environments for safepoints corresponding to
// slow-path code which uses shared runtime stubs.

import 'package:expect/expect.dart';
import 'dart:math';

class C {
  C? talk(C? _) => _;
}

int getPositiveNum() {
  return (new DateTime.now()).millisecondsSinceEpoch;
}

C? getC() {
  if (getPositiveNum() == 0) {
    return new C();
  } else {
    return null;
  }
}

int global = 0;

int getNum() {
  return global++;
}

test0(int k) {
  var x = getC();
  var y = getNum();
  try {
    y = getNum();
    x = getC();
    x!.talk(x)!.talk(x);
    y = getNum();
  } catch (e) {
    Expect.equals(x, null);
    Expect.equals(y, k);
  }
}

test1(int k) {
  var x = getC();
  var y = getNum();
  double z = getPositiveNum().toDouble();
  while (z > 1) {
    z = sqrt(z - 0.1);
  }
  try {
    y = getNum();
    x = getC();
    z = z.ceil().toDouble();
    var k = z / 2;
    x!.talk(x)!.talk(x);
    z = k / 2;
    y = getNum();
  } catch (e) {
    Expect.equals(x, null);
    Expect.equals(y, k);
    Expect.equals(z, 1);
  }
}

main() {
  global = 1;

  for (int i = 0; i < 100; ++i) {
    test0(2 * (i + 1));
  }

  global = 1;

  for (int i = 0; i < 100; ++i) {
    test1(2 * (i + 1));
  }
}
