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

// @dart = 2.9

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);
  }
}
