|  | // 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 = []; | 
|  | 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); | 
|  | } | 
|  | } |