// 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 to make sure the bailout environment in dart2js is correct.

var global;

class A {
  var array;

  initArray() {
    return global[0] == null ? [null] : new Map(); 
  }

  bar() {
    array = initArray();
    do {
      var element = array[0]; // bailout here
      if (element is Map) continue;
      if (element == null) break;
    } while (true);
    return global[0]; // bailout here
  }

  baz() {
    do {
      var element = bar();
      if (element == null) return global[0]; // bailout here
      if (element is Map) continue;
      if (element is num) break;
    } while (true);
    return global[0]; // bailout here
  }
}


void main() {
  global = [1];
  for (int i = 0; i < 2; i++) {
    Expect.equals(1, new A().baz());
    Expect.equals(1, new A().bar());
  }
  global = new Map();
  for (int i = 0; i < 2; i++) {
    Expect.equals(null, new A().baz());
    Expect.equals(null, new A().bar());
  }

  global[0] = 42;
  for (int i = 0; i < 2; i++) {
    Expect.equals(42, new A().baz());
    Expect.equals(42, new A().bar());
  }
}
