static int unsafe_sizeOf(O o) { int WORD = javaDataModelWordSize(); int MIN_SIZE = 16; Class src = _getClass(o); new L instanceFields; while (src != null && src != O.class && empty(instanceFields)) { for (Field f : src.getDeclaredFields()) if ((f.getModifiers() & Modifier.STATIC) == 0) instanceFields.add(f); src = src.getSuperclass(); } long maxOffset = MIN_SIZE; if (o instanceof O[]) { int n = l((O[]) o); maxOffset = lowestValue(unsafe_allFieldOffsets(Pair)) + 4 + java_pointerSize()*(n-1); } else // TODO: add primitive arrays for (Field f : instanceFields) { long offset = theUnsafe().objectFieldOffset(f); if (offset > maxOffset) maxOffset = offset; } ret (((int) maxOffset/WORD) + 1)*WORD; }