blob: c1094818f354af62a08a16975b5297318a293881 [file] [log] [blame]
// Copyright (c) 2023, 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.
// Verify that app-jit snapshot contains dependencies between fields and
// field-guard optimized code.
import "package:expect/expect.dart";
class _A {
dynamic field;
_A(this.field);
}
@pragma("vm:never-inline")
dependentCode1(_A a, bool isInt, tail) {
dependentCode2(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode2(_A a, bool isInt, tail) {
dependentCode3(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode3(_A a, bool isInt, tail) {
dependentCode4(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode4(_A a, bool isInt, tail) {
dependentCode5(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode5(_A a, bool isInt, tail) {
dependentCode6(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode6(_A a, bool isInt, tail) {
dependentCode7(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode7(_A a, bool isInt, tail) {
dependentCode8(a, isInt, tail);
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
@pragma("vm:never-inline")
dependentCode8(_A a, bool isInt, tail) {
tail();
a.field++;
if (isInt) {
Expect.type<int>(a.field);
} else {
Expect.type<double>(a.field);
}
}
main(List<String> args) {
final isTraining = args.contains("--train");
if (isTraining) {
var a = new _A(0);
for (var i = 0; i < 200; i++) {
dependentCode1(a, true, () {});
}
Expect.equals(a.field, 200 * 8);
print("OK(Trained)");
} else {
var a = new _A(0);
var b;
dependentCode1(a, true, () {
b = new _A(0.0);
});
Expect.equals(a.field, 8);
for (var i = 0; i < 200; i++) {
dependentCode1(b, false, () {});
}
Expect.equals(b.field, 200 * 8);
print("OK(Run)");
}
}