instanceSize = VMSupport.align(instanceSize, autoAlign ? Math.max(4, scale) : 8);
base = VMSupport.align(base, Math.max(4, scale));
result.add(new FieldLayout(FieldData.create(cd.arrayClass(), "length", "int"), model.headerSize(), model.sizeOf("int")));
result.add(new FieldLayout(FieldData.create(cd.arrayClass(), "<elements>", cd.arrayComponentType()), base, scale * cd.arrayLength()));
return new ClassLayout(cd, result, model.headerSize(), instanceSize, false);
}
List<String> hierarchy = cd.classHierarchy();
BitSet claimed = new BitSet();
claimed.set(0, model.headerSize());
for (String k : hierarchy) {
Collection<FieldData> fields = cd.fieldsFor(k);
SortedSet<FieldLayout> current = new TreeSet<FieldLayout>();
for (int size : new int[]{8, 4, 2, 1}) {
for (FieldData f : fields) {
int fSize = model.sizeOf(f.typeClass());
if (fSize != size) continue;
for (int t = 0; t < Integer.MAX_VALUE; t++) {
if (claimed.get(t * size, (t + 1) * size).isEmpty()) {
claimed.set(t * size, (t + 1) * size);
current.add(new FieldLayout(f, t * size, size));
break;
}
}
}
}
result.addAll(current);
if (takeSuperGaps) {
// do nothing
} else if (takeHierarchyGaps) {
// claim only the class body up to the field
int lastSet = claimed.length() - 1;
claimed.set(0, lastSet);
} else {
// claim the entire class body, plus some alignment
int lastSet = claimed.length() - 1;
claimed.set(0, VMSupport.align(lastSet, 4));
}
}
int instanceSize;
if (autoAlign) {
int a = 4;
for (FieldLayout f : result) {
a = Math.max(a, model.sizeOf(f.typeClass()));
}
instanceSize = VMSupport.align(claimed.length(), a);
} else {
instanceSize = VMSupport.align(claimed.length());
}
return new ClassLayout(cd, result, model.headerSize(), instanceSize, true);
}