diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java index 0af0fe3678f3..dfab92ae123e 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java @@ -60,6 +60,7 @@ import com.oracle.truffle.espresso.analysis.hierarchy.SingleImplementor; import com.oracle.truffle.espresso.blocking.EspressoLock; import com.oracle.truffle.espresso.classfile.ConstantPool; +import com.oracle.truffle.espresso.classfile.JavaKind; import com.oracle.truffle.espresso.classfile.ParserField; import com.oracle.truffle.espresso.classfile.ParserKlass; import com.oracle.truffle.espresso.classfile.ParserMethod; @@ -1710,6 +1711,22 @@ public Source getSource() { return getKlassVersion().getSource(); } + public long getInstanceSize() { + return computeInstanceSize(); + } + + @TruffleBoundary + private long computeInstanceSize() { + if (fieldTable.length == 0) { + return 0L; + } + long size = 0L; + for (Field f : getFieldTable()) { + size += f.getKind() == JavaKind.Object ? JavaKind.Long.getByteCount() : f.getKind().getByteCount(); + } + return size; + } + public final class KlassVersion { final Assumption assumption; final RuntimeConstantPool pool; diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/staticobject/StaticObject.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/staticobject/StaticObject.java index 7b8d22b721ce..76fa839d4d7e 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/staticobject/StaticObject.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/staticobject/StaticObject.java @@ -34,6 +34,7 @@ import com.oracle.truffle.espresso.EspressoLanguage; import com.oracle.truffle.espresso.blocking.BlockingSupport; import com.oracle.truffle.espresso.blocking.EspressoLock; +import com.oracle.truffle.espresso.classfile.JavaKind; import com.oracle.truffle.espresso.descriptors.EspressoSymbols.Types; import com.oracle.truffle.espresso.impl.ArrayKlass; import com.oracle.truffle.espresso.impl.EspressoType; @@ -190,6 +191,27 @@ public final boolean isStaticStorage() { return this == getKlass().getStatics(); } + public final long getObjectSize(EspressoLanguage language) { + if (isNull(this)) { + return 0L; + } + long size = 0L; + size += JavaKind.Long.getByteCount(); // Klass storage + size += JavaKind.Long.getByteCount(); // Monitor storage + if (isForeignObject()) { + size += JavaKind.Long.getByteCount(); // Foreign storage + size += JavaKind.Long.getByteCount(); // Type Argument storage + } else if (getKlass() instanceof ArrayKlass k) { + JavaKind componentKind = k.getComponentType().getJavaKind(); + size += (long) (componentKind == JavaKind.Object ? JavaKind.Long.getByteCount() : componentKind.getByteCount()) * length(language); + } else if (getKlass() instanceof ObjectKlass k) { + size += k.getInstanceSize(); + } else { + EspressoContext.get(null).getLogger().warning(() -> "Unknown static object with class " + getKlass()); + } + return size; + } + /** * Given a guest Class, get the corresponding Klass. This method has the disadvantage of not * being able to constant fold the {@link Meta} object that is extracted from {@code this} if diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_sun_instrument_InstrumentationImpl.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_sun_instrument_InstrumentationImpl.java index 3b2fc20a9758..0fdccf573456 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_sun_instrument_InstrumentationImpl.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_sun_instrument_InstrumentationImpl.java @@ -26,6 +26,7 @@ import java.util.List; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.espresso.EspressoLanguage; import com.oracle.truffle.espresso.classfile.ClasspathEntry; import com.oracle.truffle.espresso.descriptors.EspressoSymbols.Names; import com.oracle.truffle.espresso.descriptors.EspressoSymbols.Signatures; @@ -134,10 +135,9 @@ private static StaticObject toGuestClassArray(EspressoContext context, List