// Copyright (c) 2012, 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 correctness of side effects tracking used by load to load forwarding.

// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

import "package:expect/expect.dart";

class C {
  var x;
  var y;
  final z = 123;
}

class D {
  var x = 0.0;
}

var array = [0, 0];

s1(a) {
  a.x = 42;
  a.x = 43;
  return a.x;
}

void foo(a) {
  Expect.equals(42, a.x);
}

s1a(a) {
  a.x = 42;
  foo(a);
  a.x = 43;
  return a.x;
}

s2() {
  var t = new C();
  return t;
}

s3(a, b) {
  a.x = b + 1;
  if (b % 2 == 0) {
    a.x = 0;
  } else {
    a.x = 0;
  }
  return a.x;
}

s4(a, b) {
  a.x = b + 1.0;
  if (b % 2 == 0) {
    a.x = b + 2.0;
  }
  a.x = b + 1.0;
  return a.x;
}

test_with_context() {
  f(a) {
    var b = a + 1;
    return (() => b + 1)();
  }
  for (var i = 0; i < 100000; i++) f(42);
  Expect.equals(44, f(42));
}

test_with_instance() {
  for (var i = 0; i < 20; i++) Expect.equals(43, s1(new C()));
  for (var i = 0; i < 20; i++) Expect.equals(43, s1a(new C()));
  for (var i = 0; i < 20; i++) Expect.equals(123, s2().z);
  for (var i = 0; i < 20; i++) Expect.equals(0, s3(new C(), i));
  for (var i = 0; i < 20; i++) Expect.equals(i + 1.0, s4(new D(), i));
}

arr1(a) {
  a[0] = 42;
  a[0] = 43;
  Expect.equals(a[0], 43);
  return a[0];
}

arr2(a, b) {
  a[0] = 42;
  a[b % 2] = 43;
  Expect.equals(a[b % 2], 43);
  return a[0];
}

test_with_array() {
  for (var i = 0; i < 20; i++) Expect.equals(43, arr1(array));
  for (var i = 0; i < 20; i++) {
    Expect.equals(i % 2 == 0 ? 43 : 42, arr2(array, i));
  }
}

var st = 0;

static1(b) {
  st = 42;
  if (b % 2 == 0) {
    st = 2;
  }
  st = b + 1;
  Expect.equals(st, b + 1);
  return st;
}

test_with_static() {
  for (var i = 0; i < 20; i++) Expect.equals(i + 1, static1(i));
}

main() {
  test_with_instance();
  test_with_array();
  test_with_context();
  test_with_static();
}
