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

var myString;

String ifBailout(test) {
  if (test) {
    // Share the same variable for the type inference.
    var o = myString;
    // Make sure the type inference wants an array.
    if (false) o[1] = 2;
    return '${o[0]} bailout';
  }
  return '${myString[0]} no bailout';
}

String ifElseBailout(test) {
  if (test) {
    // Share the same variable for the type inference.
    var o = myString;
    // Make sure the type inference wants an array.
    if (false) o[1] = 2;
    return '${o[0]} if bailout';
  } else {
    // Share the same variable for the type inference.
    var o = myString;
    // Make sure the type inference wants an array.
    if (false) o[1] = 2;
    return '${o[0]} else bailout';
  }
}

String forBailout() {
  var n = myString.length;
  var res = '';
  for (int i = 0; i < n; i++) {
    var o = myString;
    if (false) o[1] = 2;
    res = res.concat(o[i]);
  }
  return res;
}

String forInBailout() {
  var n = myString.length;
  var res = '';
  for (int i in myString.codeUnits) {
    var o = myString;
    if (false) o[1] = 2;
    res = res.concat(new String.fromCharCodes([i]));
  }
  return res;
}

String innerForBailout() {
  var n = myString.length;
  var res = '';
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < n; j++) {
      var o = myString;
      if (false) o[1] = 2;
      res = res.concat(o[j]);
    }
  }
  return res;
}

String whileBailout() {
  var n = myString.length;
  var res = '';
  var i = 0;
  while (i < n) {
    var o = myString;
    if (false) o[1] = 2;
    res = res.concat(o[i]);
    i++;
  }
  return res;
}

String doWhileBailout() {
  var n = myString.length;
  var res = '';
  var i = 0;
  do {
    var o = myString;
    if (false) o[1] = 2;
    res = res.concat(o[i]);
    i++;
  } while (i < n);
  return res;
}

void phiBailout() {
  var prev = -1;
  bool inside = false;
  for (int i = 0; i < 2; i++) {
    var o = myString;
    // prev will be a phi converted to a local, and if we're not
    // careful, the bailout target may not have the right value for
    // it.
    if (prev != -1) {
      inside = true;
      if (false) o[0] = 1;
      print(o[0]);
      Expect.equals(0, prev);
    }
    prev = i;
  }
  Expect.isTrue(inside);
}

int fibonacci(int n) {
  int a = 0, b = 1, i = 0;
  // i, a, b will become phis, and then locals. The i++ creates a
  // load/store sequence that we must be careful with.
  while (i++ < n) {
    a = a + b;
    b = a - b;
    var o = myString;
    if (false) o[0] = 2;
    print(o[0]);
  }
  return a;
}

void ifPhiBailout1(int bailout) {
  var a = 0;
  var c = 0;

  if (a == 0) c = a++;
  else c = a--;

  if (bailout == 1) {
    var o = myString;
    if (false) o[0] = 2;
    print(o[0]);
  }

  Expect.equals(1, a);
  Expect.equals(0, c);

  if (a == 0) c = a++;
  else c = a--;

  if (bailout == 2) {
    var o = myString;
    if (false) o[0] = 2;
    print(o[0]);
  }

  Expect.equals(0, a);
  Expect.equals(1, c);
}

void ifPhiBailout2(int bailout) {
  var a = 0;
  var c = 0;

  if (a == 0) {
    c = a;
    a = a + 1;
  } else {
    c = a;
    a = a - 1;
  }

  if (bailout == 1) {
    var o = myString;
    if (false) o[0] = 2;
    print(o[0]);
  }

  Expect.equals(1, a);
  Expect.equals(0, c);

  if (a == 0) {
    c = a;
    a = a + 1;
  } else {
    c = a;
    a = a - 1;
  }

  if (bailout == 2) {
    var o = myString;
    if (false) o[0] = 2;
    print(o[0]);
  }

  Expect.equals(0, a);
  Expect.equals(1, c);
}

main() {
  myString = '1';
  Expect.equals('1 no bailout', ifBailout(false));
  Expect.equals('1 bailout', ifBailout(true));

  Expect.equals('1 else bailout', ifElseBailout(false));
  Expect.equals('1 if bailout', ifElseBailout(true));

  myString = '1234';
  Expect.equals('1234', forBailout());
  Expect.equals('1234', forInBailout());
  Expect.equals('12341234', innerForBailout());

  Expect.equals('1234', whileBailout());
  Expect.equals('1234', doWhileBailout());

  Expect.equals(102334155, fibonacci(40));

  phiBailout();
  ifPhiBailout1(1);
  ifPhiBailout1(2);
  ifPhiBailout2(1);
  ifPhiBailout2(2);
}
