blob: 725583522dac3f84457659fd2439cf8880c47be1 [file] [edit]
// Copyright (c) 2026, 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 '' deferred as D0;
import '' deferred as D1;
import '' deferred as D2;
import '' deferred as D1_3;
import '' deferred as D2_3;
void main() async {
print('main ${int.parse('2') == 2}');
await D0.loadLibrary();
await D0.d0();
}
Future d0() async {
print('d0');
final base = int.parse('1') == 1 ? Sub1() : Sub2();
final dynamic dynObject = int.parse('1') == 1 ? base : 1;
await D1.loadLibrary();
await D1.d1(base, dynObject);
await D2.loadLibrary();
await D2.d2(base, dynObject);
base.selMethodD0();
dynObject.dynMethodD0();
sink(base.selGetterD0);
base.selSetterD0 = 0;
sink(dynObject.dynGetterD0);
dynObject.dynSetterD0 = 0;
}
Future d1(Base base, dynamic dynObject) async {
print('d1');
await D1_3.loadLibrary();
D1_3.d3(base, dynObject);
D1_3.d13only(base, dynObject);
base.selMethodD1();
base.dynMethodD1();
sink(base.selGetterD1);
base.selSetterD1 = 1;
sink(dynObject.dynGetterD1);
dynObject.dynSetterD1 = 1;
// Case: Dynamic in dominator (D1), Static in dominated (D1_3)
dynObject.mixedDynD1StatD1_3();
// Case: Static in dominator (D1), Dynamic in dominated (D1_3)
base.mixedStatD1DynD1_3();
// Case: Dynamic in dominator (D1), Static in shared dominated (d3)
dynObject.mixedDynD1StatD3();
// Case: Static in dominator (D1), Dynamic in shared dominated (d3)
base.mixedStatD1DynD3();
// Static tear-offs
sink(base.tearOffStatD1);
sink(base.tearOffStatD1CallStatD2);
base.callStatD1TearOffStatD2();
// Dynamic tear-offs
sink(dynObject.tearOffDynD1);
sink(dynObject.tearOffDynD1CallDynD2);
dynObject.callDynD1TearOffDynD2();
}
Future d2(Base base, dynamic dynObject) async {
print('d2');
await D2_3.loadLibrary();
D2_3.d3(base, dynObject);
base.selMethodD2();
base.dynMethodD2();
sink(base.selGetterD2);
base.selSetterD2 = 2;
sink(dynObject.dynGetterD2);
dynObject.dynSetterD2 = 2;
// Static tear-offs
sink(base.tearOffStatD2);
base.tearOffStatD1CallStatD2();
sink(base.callStatD1TearOffStatD2);
// Dynamic tear-offs
sink(dynObject.tearOffDynD2);
dynObject.tearOffDynD1CallDynD2();
sink(dynObject.callDynD1TearOffDynD2);
}
void d13only(Base base, dynamic dynObject) {
print('d1_3_only');
base.mixedDynD1StatD1_3();
dynObject.mixedStatD1DynD1_3();
}
void d3(Base base, dynamic dynObject) {
print('d3');
base.selMethodD3();
base.dynMethodD3();
sink(base.selGetterD3);
base.selSetterD3 = 3;
sink(dynObject.dynGetterD3);
dynObject.dynSetterD3 = 3;
base.mixedDynD1StatD3();
dynObject.mixedStatD1DynD3();
// Static tear-offs
sink(base.tearOffStatD3);
// Dynamic tear-offs
sink(dynObject.tearOffDynD3);
}
abstract class Base {
void selMethodD0();
// Tests normal selector use.
void selMethodD1();
void selMethodD2();
void selMethodD3();
// Tests dynamic call use.
void dynMethodD0();
void dynMethodD1();
void dynMethodD2();
void dynMethodD3();
int get selGetterD0;
set selSetterD0(int value);
int get selGetterD1;
set selSetterD1(int value);
int get selGetterD2;
set selSetterD2(int value);
int get selGetterD3;
set selSetterD3(int value);
int get dynGetterD0;
set dynSetterD0(int value);
int get dynGetterD1;
set dynSetterD1(int value);
int get dynGetterD2;
set dynSetterD2(int value);
int get dynGetterD3;
set dynSetterD3(int value);
void mixedDynD1StatD1_3();
void mixedStatD1DynD1_3();
void mixedDynD1StatD3();
void mixedStatD1DynD3();
void tearOffStatD1();
void tearOffStatD2();
void tearOffStatD3();
void tearOffStatD1CallStatD2();
void callStatD1TearOffStatD2();
void tearOffDynD1();
void tearOffDynD2();
void tearOffDynD3();
void tearOffDynD1CallDynD2();
void callDynD1TearOffDynD2();
}
class Sub1 extends Base {
@override
void selMethodD0() => print('Sub1.selMethodD0');
@override
void selMethodD1() => print('Sub1.selMethodD1');
@override
void selMethodD2() => print('Sub1.selMethodD2');
@override
void selMethodD3() => print('Sub1.selMethodD3');
@override
void dynMethodD0() => print('Sub1.dynMethodD0');
@override
void dynMethodD1() => print('Sub1.dynMethodD1');
@override
void dynMethodD2() => print('Sub1.dynMethodD2');
@override
void dynMethodD3() => print('Sub1.dynMethodD3');
@override
int get selGetterD0 => 0;
@override
set selSetterD0(int value) => print('Sub1.selSetterD0');
@override
int get selGetterD1 => 0;
@override
set selSetterD1(int value) => print('Sub1.selSetterD1');
@override
int get selGetterD2 => 0;
@override
set selSetterD2(int value) => print('Sub1.selSetterD2');
@override
int get selGetterD3 => 0;
@override
set selSetterD3(int value) => print('Sub1.selSetterD3');
@override
int get dynGetterD0 => 0;
@override
set dynSetterD0(int value) => print('Sub1.dynSetterD0');
@override
int get dynGetterD1 => 0;
@override
set dynSetterD1(int value) => print('Sub1.dynSetterD1');
@override
int get dynGetterD2 => 0;
@override
set dynSetterD2(int value) => print('Sub1.dynSetterD2');
@override
int get dynGetterD3 => 0;
@override
set dynSetterD3(int value) => print('Sub1.dynSetterD3');
@override
void mixedDynD1StatD1_3() => print('Sub1.mixedDynD1StatD1_3');
@override
void mixedStatD1DynD1_3() => print('Sub1.mixedStatD1DynD1_3');
@override
void mixedDynD1StatD3() => print('Sub1.mixedDynD1StatD3');
@override
void mixedStatD1DynD3() => print('Sub1.mixedStatD1DynD3');
@override
void tearOffStatD1() => print('Sub1.tearOffStatD1');
@override
void tearOffStatD2() => print('Sub1.tearOffStatD2');
@override
void tearOffStatD3() => print('Sub1.tearOffStatD3');
@override
void tearOffStatD1CallStatD2() => print('Sub1.tearOffStatD1CallStatD2');
@override
void callStatD1TearOffStatD2() => print('Sub1.callStatD1TearOffStatD2');
@override
void tearOffDynD1() => print('Sub1.tearOffDynD1');
@override
void tearOffDynD2() => print('Sub1.tearOffDynD2');
@override
void tearOffDynD3() => print('Sub1.tearOffDynD3');
@override
void tearOffDynD1CallDynD2() => print('Sub1.tearOffDynD1CallDynD2');
@override
void callDynD1TearOffDynD2() => print('Sub1.callDynD1TearOffDynD2');
}
class Sub2 extends Base {
@override
void selMethodD0() => print('Sub2.selMethodD0');
@override
void selMethodD1() => print('Sub2.selMethodD1');
@override
void selMethodD2() => print('Sub2.selMethodD2');
@override
void selMethodD3() => print('Sub2.selMethodD3');
@override
void dynMethodD0() => print('Sub2.dynMethodD0');
@override
void dynMethodD1() => print('Sub2.dynMethodD1');
@override
void dynMethodD2() => print('Sub2.dynMethodD2');
@override
void dynMethodD3() => print('Sub2.dynMethodD3');
@override
int selGetterD0 = 0;
@override
int selSetterD0 = 0;
@override
int selGetterD1 = 0;
@override
int selSetterD1 = 0;
@override
int selGetterD2 = 0;
@override
int selSetterD2 = 0;
@override
int selGetterD3 = 0;
@override
int selSetterD3 = 0;
@override
int dynGetterD0 = 0;
@override
int dynSetterD0 = 0;
@override
int dynGetterD1 = 0;
@override
int dynSetterD1 = 0;
@override
int dynGetterD2 = 0;
@override
int dynSetterD2 = 0;
@override
int dynGetterD3 = 0;
@override
int dynSetterD3 = 0;
@override
void mixedDynD1StatD1_3() => print('Sub2.mixedDynD1StatD1_3');
@override
void mixedStatD1DynD1_3() => print('Sub2.mixedStatD1DynD1_3');
@override
void mixedDynD1StatD3() => print('Sub2.mixedDynD1StatD3');
@override
void mixedStatD1DynD3() => print('Sub2.mixedStatD1DynD3');
@override
void tearOffStatD1() => print('Sub2.tearOffStatD1');
@override
void tearOffStatD2() => print('Sub2.tearOffStatD2');
@override
void tearOffStatD3() => print('Sub2.tearOffStatD3');
@override
void tearOffStatD1CallStatD2() => print('Sub2.tearOffStatD1CallStatD2');
@override
void callStatD1TearOffStatD2() => print('Sub2.callStatD1TearOffStatD2');
@override
void tearOffDynD1() => print('Sub2.tearOffDynD1');
@override
void tearOffDynD2() => print('Sub2.tearOffDynD2');
@override
void tearOffDynD3() => print('Sub2.tearOffDynD3');
@override
void tearOffDynD1CallDynD2() => print('Sub2.tearOffDynD1CallDynD2');
@override
void callDynD1TearOffDynD2() => print('Sub2.callDynD1TearOffDynD2');
}
external void sink(Object? object);