// Copyright (c) 2013, 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.
// Test correct handling reusable boxes.
// VMOptions=--optimization_counter_threshold=100 --no-background_compilation

library reusable_boxes_test;

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

class D {
  var a = 0.0;
  var b = 1.0;
  var c = 2.0;
  test() {
    a = 0.0;
    b = 1.0;
    c = a + b;
    return c;
  }

  testParam(x, y) {
    x = x * x;
    y = y * y;
    c = x + y;
  }
}

testD() {
  var f = new D();
  var r = 0.0;
  for (var i = 0; i < 20; i++) {
    r += f.test();
  }
  Expect.equals(20.0, r);
  // Trigger a deopt of test.
  f.testParam(new Float32x4(1.0, 2.0, 3.0, 4.0), new Float32x4.zero());
  r = 0.0;
  for (var i = 0; i < 20; i++) {
    r += f.test();
  }
  Expect.equals(20.0, r);
}


class F {
  var a = new Float32x4.zero();
  var b = new Float32x4(1.0, 2.0, 3.0, 4.0);
  var c = new Float32x4.zero();
  test() {
    a = new Float32x4.zero();
    b = new Float32x4(1.0, 2.0, 3.0, 4.0);
    c = a + b;
    return c;
  }

  testParam(x, y) {
    x = x * x;
    y = y * y;
    c = x + y;
  }

}

testF() {
  var f = new F();
  var r = new Float32x4.zero();
  for (var i = 0; i < 20; i++) {
    r += f.test();
  }
  Expect.equals(20.0, r.x);
  Expect.equals(40.0, r.y);
  Expect.equals(60.0, r.z);
  Expect.equals(80.0, r.w);
  // Trigger a deopt of test.
  f.testParam(1.0, 2.0);
  r = new Float32x4.zero();
  for (var i = 0; i < 20; i++) {
    r += f.test();
  }
  Expect.equals(20.0, r.x);
  Expect.equals(40.0, r.y);
  Expect.equals(60.0, r.z);
  Expect.equals(80.0, r.w);
}


main() {
  testD();
  testF();
}
