// Copyright (c) 2011, 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 calls.

class A {
  A() {}
  f1() { return 1; }
  f2() { return 2; }
  f3() { return 3; }
  f4() { return 4; }
  f5() { return 5; }
  f6() { return 6; }
  f7() { return 7; }
  f8() { return 8; }
  f9() { return 9; }
  f11() { return 11; }
  f12() { return 12; }
  f13() { return 13; }
  f14() { return 14; }
  f15() { return 15; }
  f16() { return 16; }
  f17() { return 17; }
  f18() { return 18; }
  f19() { return 19; }
  f20() { return 20; }
  f21() { return 21; }
  f22() { return 22; }
  f23() { return 23; }
  f24() { return 24; }
  f25() { return 25; }
  f26() { return 26; }
  f27() { return 27; }
  f28() { return 28; }
  f29() { return 29; }
  f30() { return 30; }
  f31() { return 31; }
  f32() { return 32; }
  f33() { return 33; }
  f34() { return 34; }
  f35() { return 35; }
  f36() { return 36; }
  f37() { return 37; }
  f38() { return 38; }
  f39() { return 39; }
}


class B extends A {
  B() : super() {}
}


class ManyCallsTest {
  static testMain() {
    var list = new List(10);
    for (int i = 0; i < (list.length ~/ 2) ; i++) {
      list[i] = new A();
    }
    for (int i = (list.length ~/ 2); i < list.length; i++) {
      list[i] = new B();
    }
    for (int loop = 0; loop < 7; loop++) {
      for (int i = 0; i < list.length; i++) {
        Expect.equals(1, list[i].f1());
        Expect.equals(2, list[i].f2());
        Expect.equals(3, list[i].f3());
        Expect.equals(4, list[i].f4());
        Expect.equals(5, list[i].f5());
        Expect.equals(6, list[i].f6());
        Expect.equals(7, list[i].f7());
        Expect.equals(8, list[i].f8());
        Expect.equals(9, list[i].f9());
        Expect.equals(11, list[i].f11());
        Expect.equals(12, list[i].f12());
        Expect.equals(13, list[i].f13());
        Expect.equals(14, list[i].f14());
        Expect.equals(15, list[i].f15());
        Expect.equals(16, list[i].f16());
        Expect.equals(17, list[i].f17());
        Expect.equals(18, list[i].f18());
        Expect.equals(19, list[i].f19());
        Expect.equals(20, list[i].f20());
        Expect.equals(21, list[i].f21());
        Expect.equals(22, list[i].f22());
        Expect.equals(23, list[i].f23());
        Expect.equals(24, list[i].f24());
        Expect.equals(25, list[i].f25());
        Expect.equals(26, list[i].f26());
        Expect.equals(27, list[i].f27());
        Expect.equals(28, list[i].f28());
        Expect.equals(29, list[i].f29());
        Expect.equals(30, list[i].f30());
        Expect.equals(31, list[i].f31());
        Expect.equals(32, list[i].f32());
        Expect.equals(33, list[i].f33());
        Expect.equals(34, list[i].f34());
        Expect.equals(35, list[i].f35());
        Expect.equals(36, list[i].f36());
        Expect.equals(37, list[i].f37());
        Expect.equals(38, list[i].f38());
        Expect.equals(39, list[i].f39());
      }
    }
  }
}

main() {
  ManyCallsTest.testMain();
}
