static Map unsafe_sizeOf_cache = weakHashMap(); static int unsafe_sizeOf(O o) { Class c = _getClass(o); if (o instanceof O[]) ret unsafe_sizeOf_uncached(o, c); // can't cache Int l = unsafe_sizeOf_cache.get(c); if (l == null) unsafe_sizeOf_cache.put(c, l = unsafe_sizeOf_uncached(o, c)); ret l; } static int unsafe_sizeOf_uncached(O o, Class c) { int WORD = javaDataModelWordSize(); int MIN_SIZE = 16; 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; }