// 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 megamorphic, but single target field load.
// VMOptions=--optimization-counter-threshold=10

import "package:expect/expect.dart";

class Base {
  var f;
}

class A extends Base {
  A() { this.f = 0; }
}

class B extends Base {
  B() { this.f = 1; }
}

class C extends Base {
  C() { this.f = 2; }
}

class D extends Base {
  D() { this.f = 3; }
}

class E extends Base {
  E() { this.f = 4; }
}

class F extends Base {
  F() { this.f = 5; }
}

class G extends Base {
  G() { this.f = 6; }
}

class H extends Base {
  H() { this.f = 7; }
}

class I extends Base {
  I() { this.f = 8; }
}

class J extends Base {
  J() { this.f = 9; }
}

class K extends Base {
  K() { this.f = 10; }
}

class L extends Base {
  L() { this.f = 11; }
}

class M extends Base {
  M() { this.f = 12; }
}

class N extends Base {
  N() { this.f = 13; }
}

class O extends Base {
  O() { this.f = 14; }
}

class P extends Base {
  P() { this.f = 15; }
}

class Q extends Base {
  Q() { this.f = 16; }
}

class R extends Base {
  R() { this.f = 17; }
}

class S extends Base {
  S() { this.f = 18; }
}

class T extends Base {
  T() { this.f = 19; }
}

class U extends Base {
  U() { this.f = 20; }
}

class V extends Base {
  V() { this.f = 21; }
}

class W extends Base {
  V() { this.f = 22; }
}

class X extends Base {
  V() { this.f = 21; }
}

class Y extends Base {
  V() { this.f = 24; }
}

class Z extends Base {
  V() { this.f = 21; }
}

allocateObjects() {
  var list = new List();
  list.add(new A());
  list.add(new B());
  list.add(new C());
  list.add(new D());
  list.add(new E());
  list.add(new F());
  list.add(new G());
  list.add(new H());
  list.add(new I());
  list.add(new J());
  list.add(new K());
  list.add(new L());
  list.add(new M());
  list.add(new N());
  list.add(new O());
  list.add(new P());
  list.add(new Q());
  list.add(new R());
  list.add(new S());
  list.add(new T());
  list.add(new U());
  list.add(new V());
  return list;
}

callThemAll(var list) {
  for (var i = 0; i < list.length; i++) {
    Expect.equals(i, list[i].f);
  }
}

main() {
  var list = allocateObjects();
  // Make sure the optimizer triggers the compilation of callThemAll.
  for (var i = 0; i < 20; i++) {
    callThemAll(list);
  }
}
