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

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 < 500; i++) {
    callThemAll(list);
  }
}
