// Copyright (c) 2015, 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. import "package:expect/expect.dart"; // It is sometimes possible to compile is-checks to 'instanceof', when the class // is not in an 'implements' clause or used as a mixin. // This test verifies is-checks work with simple classes that have various // degrees of instantiation. class INSTANTIATED {} // instantiated and used in many ways class DEFERRED {} // instantiated after first check class UNUSED {} // used only in is-check class REMOVED {} // allocated but optimized out of program class DEFERRED_AND_REMOVED {} // allocated after first check and removed class USED_AS_TYPE_PARAMETER {} // only used as a type parameter class USED_AS_TESTED_TYPE_PARAMETER {} // only used as a type parameter class Check { bool check(x) => x is T; } class Check2 { bool check(x) => x is USED_AS_TYPE_PARAMETER; } void main() { var things = []..length = 3; things.setRange(0, 3, [new INSTANTIATED(), 1, new Object()]); var checkX = new Check(); var checkU1 = new Check(); var checkU2 = new Check(); var removed = new REMOVED(); // This is optimized out. // Tests that can be compiled to instanceof: Expect.isTrue(things[0] is INSTANTIATED); Expect.isFalse(things[1] is INSTANTIATED); Expect.isFalse(things[1] is REMOVED); Expect.isFalse(things[1] is DEFERRED_AND_REMOVED); Expect.isFalse(things[1] is DEFERRED); // Tests that might be optimized to false since there are no allocations: Expect.isFalse(things[1] is UNUSED); Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER); Expect.isTrue(checkX.check(things[0])); Expect.isFalse(checkX.check(things[1])); Expect.isFalse(checkU1.check(things[1])); Expect.isFalse(checkU2.check(things[1])); var removed2 = new DEFERRED_AND_REMOVED(); // This is optimized out. // First allocation of DEFERRED is after the above tests. things.setRange(0, 3, [new INSTANTIATED(), 1, new DEFERRED()]); // Tests that can be compiled to instanceof: Expect.isTrue(things[0] is INSTANTIATED); Expect.isFalse(things[1] is INSTANTIATED); Expect.isFalse(things[1] is REMOVED); Expect.isFalse(things[1] is DEFERRED_AND_REMOVED); Expect.isFalse(things[1] is DEFERRED); Expect.isTrue(things[2] is DEFERRED); // Tests that might be optimized to false since there are no allocations: Expect.isFalse(things[1] is UNUSED); Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER); }