Skip to content

Commit c9ba43d

Browse files
RoyCommit Queue
Roy
authored and
Commit Queue
committed
[vm] Adding static_field_offset to Field objects.
This adds the offset of static fields within their field table. TEST=vm/dart/analyze_snapshot_binary_test Change-Id: I90b13760fa3203ca2e3c5611e3fd890a74c97728 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/429880 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com>
1 parent 0f34fdd commit c9ba43d

File tree

3 files changed

+31
-17
lines changed

3 files changed

+31
-17
lines changed

runtime/tests/vm/dart/analyze_snapshot_binary_test.dart

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'use_flag_test_helper.dart';
1616
const int headerSize = 8;
1717
final int compressedWordSize =
1818
sizeOf<Pointer>() == 8 && !Platform.executable.contains('64C') ? 8 : 4;
19+
const int wordSize = 8; // analyze_snapshot is not supported on arm32
1920

2021
// Used to ensure we don't have multiple equivalent calls to test.
2122
final _seenDescriptions = <String>{};
@@ -222,7 +223,8 @@ Future<void> testAOT(
222223

223224
// We have:
224225
// class Base {
225-
// static int baseS = int.parse('1');
226+
// static int baseS0 = int.parse('1');
227+
// static int baseS1 = int.parse('2');
226228
// int base0;
227229
// double base1;
228230
// Object? base2;
@@ -231,10 +233,17 @@ Future<void> testAOT(
231233
// }
232234
//
233235
// This static field is never tree shaken.
234-
expectField(baseFields[0], name: 'baseS', flags: ['static']);
236+
expectField(baseFields[0], name: 'baseS0', flags: ['static']);
237+
expectField(baseFields[1], name: 'baseS1', flags: ['static']);
238+
239+
// Neighboring static fields should always be one word away
240+
final int staticFieldOffset0 = baseFields[0]["static_field_offset"];
241+
final int staticFieldOffset1 = baseFields[1]["static_field_offset"];
242+
Expect.equals(staticFieldOffset1 - staticFieldOffset0, wordSize);
243+
235244
if (isProduct) {
236245
// Most [Field] objests are tree shaken.
237-
Expect.equals(1, baseFields.length);
246+
Expect.equals(2, baseFields.length);
238247

239248
int slotOffset = 0;
240249
slotOffset += expectUnknown8Bytes(
@@ -264,28 +273,28 @@ Future<void> testAOT(
264273
);
265274
} else {
266275
// We don't tree shake [Field] objects in non-product builds.
267-
Expect.equals(6, baseFields.length);
276+
Expect.equals(7, baseFields.length);
268277
expectField(
269-
baseFields[1],
278+
baseFields[2],
270279
name: 'base0',
271280
isReference: false,
272281
unboxedType: 'int',
273282
);
274283
expectField(
275-
baseFields[2],
284+
baseFields[3],
276285
name: 'base1',
277286
isReference: false,
278287
unboxedType: 'double',
279288
);
280-
expectField(baseFields[3], name: 'base2');
289+
expectField(baseFields[4], name: 'base2');
281290
expectField(
282-
baseFields[4],
291+
baseFields[5],
283292
name: 'base3',
284293
isReference: false,
285294
unboxedType: 'Float32x4',
286295
);
287296
expectField(
288-
baseFields[5],
297+
baseFields[6],
289298
name: 'base4',
290299
isReference: false,
291300
unboxedType: 'Float64x2',
@@ -296,34 +305,34 @@ Future<void> testAOT(
296305
offsetReferences: 0,
297306
offsetBytes: 0,
298307
isReference: false,
299-
fieldId: baseFieldIds[1],
308+
fieldId: baseFieldIds[2],
300309
);
301310
slotOffset += expectInstanceSlot(
302311
baseSlots[slotOffset],
303312
offsetReferences: 0,
304313
offsetBytes: 8,
305314
isReference: false,
306-
fieldId: baseFieldIds[2],
315+
fieldId: baseFieldIds[3],
307316
);
308317
slotOffset += expectInstanceSlot(
309318
baseSlots[slotOffset],
310319
offsetReferences: 0,
311320
offsetBytes: 16,
312-
fieldId: baseFieldIds[3],
321+
fieldId: baseFieldIds[4],
313322
);
314323
slotOffset += expectInstanceSlot(
315324
baseSlots[slotOffset],
316325
offsetReferences: 1,
317326
offsetBytes: 16,
318327
isReference: false,
319-
fieldId: baseFieldIds[4],
328+
fieldId: baseFieldIds[5],
320329
);
321330
slotOffset += expectInstanceSlot(
322331
baseSlots[slotOffset],
323332
offsetReferences: 1,
324333
offsetBytes: 32,
325334
isReference: false,
326-
fieldId: baseFieldIds[5],
335+
fieldId: baseFieldIds[6],
327336
);
328337
}
329338
// We have:

runtime/tests/vm/dart/analyze_snapshot_program.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,21 @@ main() {
4040
}
4141

4242
class FieldTestBase {
43-
static int baseS = int.parse('1');
43+
static int baseS0 = int.parse('1');
44+
static int baseS1 = int.parse('2');
4445
int base0;
4546
double base1;
4647
Object? base2;
4748
Float32x4 base3;
4849
Float64x2 base4;
4950

5051
FieldTestBase(this.base0, this.base1, this.base2, this.base3, this.base4) {
51-
baseS++;
52+
baseS0++;
53+
baseS1++;
5254
}
5355

54-
String foo() => 'Base.foo: [$baseS, $base0, $base1, $base2, $base3, $base4]';
56+
String foo() =>
57+
'Base.foo: [$baseS0, $baseS1, $base0, $base1, $base2, $base3, $base4]';
5558
}
5659

5760
class FieldTestSub<T> extends FieldTestBase {

runtime/vm/analyze_snapshot_api_impl.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ void SnapshotAnalyzer::DumpField(const Field& field) {
293293
js_.PrintProperty64("type_class", GetObjectId(field.type()));
294294
if (field.is_static()) {
295295
js_.PrintProperty("instance", GetObjectId(field.StaticValue()));
296+
js_.PrintProperty64("static_field_offset",
297+
FieldTable::FieldOffsetFor(field.field_id()));
296298
}
297299
if (field.HasInitializerFunction()) {
298300
js_.PrintProperty("initializer_function",

0 commit comments

Comments
 (0)