blob: bb7d8b7ebb9bd4af9c622622319e09b8d3a9b9d7 [file] [log] [blame]
// Copyright (c) 2020, 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.
// Regression test for b/162922506: verify that compiler does not use signed
// 16-bit integers to store class ids for slots.
import 'dart:io';
import 'package:expect/expect.dart';
import 'package:path/path.dart' as p;
void main() async {
Directory tmp = await Directory.systemTemp.createTemp("b162922506");
File testBody = File(p.join(tmp.path, 'test.dart'));
try {
generateTestBody(testBody);
final result = await Process.run(Platform.executable, [
...Platform.executableArguments,
'--deterministic',
'--optimization-counter-threshold=10',
'--no-use-osr',
testBody.path
]);
if (result.exitCode != 0) {
print('''
Subprocess output:
${result.stdout}
${result.stderr}
''');
}
Expect.equals(0, result.exitCode);
Expect.equals("OK", (result.stdout as String).trim());
} finally {
await tmp.delete(recursive: true);
}
}
void generateTestBody(File testBody) {
final sb = StringBuffer();
sb.write("""
import 'package:expect/expect.dart';
""");
final n = 0x8010;
for (var i = 0; i < n; i++) {
sb.write("""
class C$i {
final f;
C$i(this.f);
""");
if (i == (n - 1)) {
sb.write("""
test({bool rareCase: false}) {
final v = this.f;
if (rareCase) {
return v.f;
}
return null;
}
""");
}
sb.write("""
}
""");
}
sb.write("""
void main() {
final obj = C${n - 1}(C${n - 2}(C${n - 3}(null)));
for (var i = 0; i < 100; i++) obj.test();
Expect.isTrue(obj.test(rareCase: true) is C${n - 3});
print("OK");
}
""");
testBody.writeAsStringSync(sb.toString());
}