| // Copyright (c) 2024, 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 '../../common/testing.dart' as helper; | |
| import 'package:expect/expect.dart'; | |
| import 'shared/shared.dart' show Base, Child1; | |
| class Child extends Base { | |
| @override | |
| int method2() => 4; | |
| } | |
| /// A dynamic module is allowed to extend a class in the dynamic interface and | |
| /// override its members. | |
| /// | |
| /// This is similar to the `extend_class` test case, but includes more nuance, | |
| /// like extending a non-leaf class that already was used in the program, since | |
| /// that may affect dispatch logic based on some backends. | |
| void main() async { | |
| Base o = Child1(); | |
| Expect.equals(1, o.method1()); | |
| Expect.equals(3, o.method2()); | |
| Expect.equals(3, indirect(o)); | |
| Expect.equals(4, indirect(Child())); | |
| o = (await helper.load('entry1.dart')) as Base; | |
| Expect.equals(1, o.method1()); | |
| Expect.equals(2, o.method2()); | |
| Expect.equals(2, indirect(o)); | |
| helper.done(); | |
| } | |
| @pragma('vm:never-inline') | |
| int indirect(Base a) => a.method2(); |