// 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=--no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=100

// Verify that runtime correctly materializes unboxed variables on the catch
// entry in optimized code.

import 'dart:typed_data';

import 'package:expect/expect.dart';

const NeverInline = "NeverInline";

@NeverInline
void testThrow(bool shouldThrow) {
  var dbl = 0.0;
  var i32 = 0;
  var i64 = 0;
  var f32x4 = new Float32x4.zero();
  var f64x2 = new Float64x2.zero();
  var i32x4 = new Int32x4(0, 0, 0, 0);
  try {
    for (var i = 0; i < 100; i++) {
      dbl += i;
      i32 = i | 0x70000000;
      i64 = i | 0x80000000;
      final d = i.toDouble();
      f32x4 += new Float32x4(d, -d, d, -d);
      f64x2 += new Float64x2(d, -d);
      i32x4 += new Int32x4(-i, i, -i, i);
      if (shouldThrow && i == 50) {
        throw "";
      }
    }
  } catch (e) {}

  if (shouldThrow) {
    Expect.equals(1275.0, dbl);
    Expect.equals(0x70000000 | 50, i32);
    Expect.equals(0x80000000 | 50, i64);
    Expect.listEquals([1275.0, -1275.0, 1275.0, -1275.0],
        [f32x4.x, f32x4.y, f32x4.z, f32x4.w]);
    Expect.listEquals([1275.0, -1275.0], [f64x2.x, f64x2.y]);
    Expect.listEquals(
        [-1275, 1275, -1275, 1275], [i32x4.x, i32x4.y, i32x4.z, i32x4.w]);
  }
}

void main() {
  for (var i = 0; i < 100; i++) testThrow(false);
  testThrow(true);
}
