Skip to content

Commit e6d9e3f

Browse files
committed
Better handling of missing fields in Meta. Now possible to access Object fields that may be hidden in some Java version, but not in other.
1 parent 0f92ea2 commit e6d9e3f

File tree

11 files changed

+58
-32
lines changed

11 files changed

+58
-32
lines changed

espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/JavaVersion.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public static final class VersionRange {
4343
public static final VersionRange VERSION_22_OR_HIGHER = higher(22);
4444
public static final VersionRange VERSION_25_OR_HIGHER = higher(25);
4545

46-
public static final VersionRange ALL = new VersionRange(0, LATEST_SUPPORTED);
47-
public static final VersionRange VERSION_9_TO_21 = new VersionRange(9, 21);
46+
public static final VersionRange ALL = between(0, LATEST_SUPPORTED);
47+
public static final VersionRange VERSION_9_TO_21 = between(9, 21);
4848

4949
private final int low;
5050
private final int high;
@@ -62,6 +62,10 @@ public static VersionRange higher(int version) {
6262
return new VersionRange(version, LATEST_SUPPORTED);
6363
}
6464

65+
public static VersionRange between(int low, int high) {
66+
return new VersionRange(low, high);
67+
}
68+
6569
public boolean contains(JavaVersion version) {
6670
return version.inRange(low, high);
6771
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/EspressoSymbols.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,7 @@ public static class Signatures {
12981298
Types.java_lang_invoke_MethodType,
12991299
Types.java_lang_Object_array);
13001300
public static final Symbol<Signature> Field_Object_long_Class = SYMBOLS.putSignature(Types.java_lang_reflect_Field, Types.java_lang_Object, Types._long, Types.java_lang_Class);
1301+
public static final Symbol<Signature> Field_Class_long_Class = SYMBOLS.putSignature(Types.java_lang_reflect_Field, Types.java_lang_Class, Types._long, Types.java_lang_Class);
13011302
public static final Symbol<Signature> Thread$State_int = SYMBOLS.putSignature(Types.java_lang_Thread$State, Types._int);
13021303
public static final Symbol<Signature> _void_ThreadGroup_String = SYMBOLS.putSignature(Types._void, Types.java_lang_ThreadGroup, Types.java_lang_String);
13031304
public static final Symbol<Signature> _void_ThreadGroup_Runnable = SYMBOLS.putSignature(Types._void, Types.java_lang_ThreadGroup, Types.java_lang_Runnable);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/Field.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,22 @@ public final void setHiddenObject(StaticObject obj, Object value, boolean forceV
507507
setObjectHelper(obj, value, forceVolatile);
508508
}
509509

510+
public final void setMaybeHiddenObject(StaticObject obj, StaticObject value) {
511+
setMaybeHiddenObject(obj, value, false);
512+
}
513+
514+
public final void setMaybeHiddenObject(StaticObject obj, StaticObject value, boolean forceVolatile) {
515+
setObjectHelper(obj, value, forceVolatile);
516+
}
517+
518+
public final StaticObject getMaybeHiddenObject(StaticObject obj) {
519+
return getMaybeHiddenObject(obj, false);
520+
}
521+
522+
public final StaticObject getMaybeHiddenObject(StaticObject obj, boolean forceVolatile) {
523+
return (StaticObject) getObjectHelper(obj, forceVolatile);
524+
}
525+
510526
public Object compareAndExchangeHiddenObject(StaticObject obj, Object before, Object after) {
511527
obj.checkNotForeign();
512528
assert isHidden() : this + " is not hidden";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/Klass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1832,7 +1832,7 @@ public boolean nestMembersCheck(Klass k) {
18321832
}
18331833

18341834
public StaticObject protectionDomain() {
1835-
return getMeta().HIDDEN_PROTECTION_DOMAIN.getObject(mirror());
1835+
return getMeta().HIDDEN_PROTECTION_DOMAIN.getMaybeHiddenObject(mirror());
18361836
}
18371837

18381838
/**

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public ObjectKlass(EspressoContext context, LinkedKlass linkedKlass, ObjectKlass
223223
if (info.protectionDomain != null && !StaticObject.isNull(info.protectionDomain)) {
224224
// Protection domain should not be host null, and will be initialized to guest null on
225225
// mirror creation.
226-
getMeta().HIDDEN_PROTECTION_DOMAIN.setObject(initializeEspressoClass(), info.protectionDomain);
226+
getMeta().HIDDEN_PROTECTION_DOMAIN.setMaybeHiddenObject(initializeEspressoClass(), info.protectionDomain);
227227
}
228228
if (info.classData != null) {
229229
getMeta().java_lang_Class_classData.setObject(initializeEspressoClass(), info.classData);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/jni/JniEnv.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2881,7 +2881,7 @@ public void ReleasePrimitiveArrayCritical(@JavaType(Object.class) StaticObject o
28812881
throw e;
28822882
}
28832883

2884-
meta.HIDDEN_PROTECTION_DOMAIN.setObject(guestClass, protectionDomain);
2884+
meta.HIDDEN_PROTECTION_DOMAIN.setMaybeHiddenObject(guestClass, protectionDomain);
28852885
// FindClass should initialize the class.
28862886
guestClass.getMirrorKlass(meta).safeInitialize();
28872887

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/DiffVersionLoadHelper.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ Method notRequiredMethod(ObjectKlass klass) {
8383
return null;
8484
}
8585
if (klass == null) {
86-
return null;
86+
throw EspressoError.shouldNotReachHere("Missing klass for method " + name + ":" + signature);
8787
}
88-
return klass.lookupDeclaredMethod(name, signature);
88+
return klass.requireDeclaredMethod(name, signature);
8989
}
9090

9191
DiffVersionLoadHelper field(VersionRange range, Symbol<Name> n, Symbol<Type> t) {
@@ -103,25 +103,24 @@ Field field(ObjectKlass klass) {
103103
return klass.requireDeclaredField(name, type);
104104
}
105105

106-
Field maybeHiddenfield(ObjectKlass klass) {
106+
Field notRequiredField(ObjectKlass klass) {
107107
if (name == null || type == null) {
108108
return null;
109109
}
110-
Field f = klass.lookupDeclaredField(name, type);
111-
if (f == null) {
112-
return klass.lookupHiddenField(name);
110+
if (klass == null) {
111+
throw EspressoError.shouldNotReachHere("Missing klass for field " + name + ":" + type);
113112
}
114-
return f;
113+
return klass.requireDeclaredField(name, type);
115114
}
116115

117-
Field notRequiredField(ObjectKlass klass) {
116+
Field maybeHiddenfield(ObjectKlass klass) {
118117
if (name == null || type == null) {
119118
return null;
120119
}
121-
if (klass == null) {
122-
return null;
120+
Field f = klass.lookupDeclaredField(name, type);
121+
if (f != null) {
122+
return f;
123123
}
124-
return klass.lookupDeclaredField(name, type);
124+
return klass.requireHiddenField(name);
125125
}
126-
127126
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/Meta.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_8_OR_LOWER;
3636
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_9_OR_HIGHER;
3737
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_9_TO_21;
38+
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.between;
3839
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.higher;
3940
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.lower;
4041
import static com.oracle.truffle.espresso.impl.EspressoClassLoadingException.wrapClassNotFoundGuestException;
@@ -420,8 +421,13 @@ public Meta(EspressoContext context) {
420421
java_nio_file_NotDirectoryException = knownKlass(Types.java_nio_file_NotDirectoryException);
421422
java_nio_file_NotLinkException = knownKlass(Types.java_nio_file_NotLinkException);
422423

423-
java_util_zip_CRC32 = knownKlass(Types.java_util_zip_CRC32);
424-
HIDDEN_CRC32 = diff().field(ALL, Names.HIDDEN_CRC32, Types._int).maybeHiddenfield(java_util_zip_CRC32);
424+
if (context.getLanguage().useEspressoLibs()) {
425+
java_util_zip_CRC32 = knownKlass(Types.java_util_zip_CRC32);
426+
HIDDEN_CRC32 = diff().field(ALL, Names.HIDDEN_CRC32, Types._int).maybeHiddenfield(java_util_zip_CRC32);
427+
} else {
428+
java_util_zip_CRC32 = null;
429+
HIDDEN_CRC32 = null;
430+
}
425431

426432
ObjectKlass nioNativeThreadKlass = knownKlass(Types.sun_nio_ch_NativeThread);
427433
sun_nio_ch_NativeThread_init = nioNativeThreadKlass.lookupDeclaredMethod(Names.init, Signatures._void);
@@ -686,7 +692,8 @@ public Meta(EspressoContext context) {
686692
.klass(higher(14), Types.java_lang_invoke_VarHandles) //
687693
.notRequiredKlass();
688694
java_lang_invoke_VarHandles_getStaticFieldFromBaseAndOffset = diff() //
689-
.method(higher(14), Names.getStaticFieldFromBaseAndOffset, Signatures.Field_Object_long_Class) //
695+
.method(between(14, 20), Names.getStaticFieldFromBaseAndOffset, Signatures.Field_Object_long_Class) //
696+
.method(VERSION_21_OR_HIGHER, Names.getStaticFieldFromBaseAndOffset, Signatures.Field_Class_long_Class) //
690697
.notRequiredMethod(java_lang_invoke_VarHandles);
691698

692699
java_lang_invoke_CallSite = knownKlass(Types.java_lang_invoke_CallSite);
@@ -791,7 +798,6 @@ public Meta(EspressoContext context) {
791798
java_lang_invoke_ResolvedMethodName_vmholder = diff() //
792799
.field(VERSION_22_OR_HIGHER, Names.vmholder, Types.java_lang_Class) //
793800
.notRequiredField(java_lang_invoke_ResolvedMethodName);
794-
795801
HIDDEN_VM_METHOD = diff() //
796802
.field(VERSION_22_OR_HIGHER, Names.HIDDEN_VM_METHOD, Types.java_lang_Object) //
797803
.maybeHiddenfield(java_lang_invoke_ResolvedMethodName);
@@ -859,25 +865,25 @@ public Meta(EspressoContext context) {
859865
.klass(VERSION_16_OR_HIGHER, Types.java_lang_reflect_RecordComponent) //
860866
.notRequiredKlass();
861867
java_lang_reflect_RecordComponent_clazz = diff() //
862-
.field(ALL, Names.clazz, Types.java_lang_Class) //
868+
.field(VERSION_16_OR_HIGHER, Names.clazz, Types.java_lang_Class) //
863869
.notRequiredField(java_lang_reflect_RecordComponent);
864870
java_lang_reflect_RecordComponent_name = diff() //
865-
.field(ALL, Names.name, Types.java_lang_String) //
871+
.field(VERSION_16_OR_HIGHER, Names.name, Types.java_lang_String) //
866872
.notRequiredField(java_lang_reflect_RecordComponent);
867873
java_lang_reflect_RecordComponent_type = diff() //
868-
.field(ALL, Names.type, Types.java_lang_Class) //
874+
.field(VERSION_16_OR_HIGHER, Names.type, Types.java_lang_Class) //
869875
.notRequiredField(java_lang_reflect_RecordComponent);
870876
java_lang_reflect_RecordComponent_accessor = diff() //
871-
.field(ALL, Names.accessor, Types.java_lang_reflect_Method) //
877+
.field(VERSION_16_OR_HIGHER, Names.accessor, Types.java_lang_reflect_Method) //
872878
.notRequiredField(java_lang_reflect_RecordComponent);
873879
java_lang_reflect_RecordComponent_signature = diff() //
874-
.field(ALL, Names.signature, Types.java_lang_String) //
880+
.field(VERSION_16_OR_HIGHER, Names.signature, Types.java_lang_String) //
875881
.notRequiredField(java_lang_reflect_RecordComponent);
876882
java_lang_reflect_RecordComponent_annotations = diff() //
877-
.field(ALL, Names.annotations, Types._byte_array) //
883+
.field(VERSION_16_OR_HIGHER, Names.annotations, Types._byte_array) //
878884
.notRequiredField(java_lang_reflect_RecordComponent);
879885
java_lang_reflect_RecordComponent_typeAnnotations = diff() //
880-
.field(ALL, Names.typeAnnotations, Types._byte_array) //
886+
.field(VERSION_16_OR_HIGHER, Names.typeAnnotations, Types._byte_array) //
881887
.notRequiredField(java_lang_reflect_RecordComponent);
882888

883889
sun_reflect_MagicAccessorImpl = diff() //
@@ -1277,7 +1283,7 @@ public Meta(EspressoContext context) {
12771283
.klass(VERSION_17_OR_HIGHER, Types.jdk_internal_module_ModuleLoaderMap_Modules) //
12781284
.notRequiredKlass();
12791285
jdk_internal_module_ModuleLoaderMap_Modules_clinit = diff() //
1280-
.method(ALL, Names._clinit_, Signatures._void) //
1286+
.method(VERSION_17_OR_HIGHER, Names._clinit_, Signatures._void) //
12811287
.notRequiredMethod(jdk_internal_module_ModuleLoaderMap_Modules);
12821288

12831289
interopDispatch = new InteropKlassesDispatch(this);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/GuestAllocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public StaticObject createClass(Klass klass) {
164164
klass.getMeta().java_lang_Class_componentType.setObject(newObj, ((ArrayKlass) klass).getComponentType().initializeEspressoClass());
165165
}
166166
// Will be overriden if necessary, but should be initialized to non-host null.
167-
klass.getMeta().HIDDEN_PROTECTION_DOMAIN.setObject(newObj, StaticObject.NULL);
167+
klass.getMeta().HIDDEN_PROTECTION_DOMAIN.setMaybeHiddenObject(newObj, StaticObject.NULL);
168168
// Final hidden field assignment
169169
klass.getMeta().HIDDEN_MIRROR_KLASS.setHiddenObject(newObj, klass);
170170
return trackAllocation(klass, newObj);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/standard/Target_sun_misc_Unsafe.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private Target_sun_misc_Unsafe() {
122122

123123
byte[] bytes = data.unwrap(language);
124124
ObjectKlass hostKlass = (ObjectKlass) hostClass.getMirrorKlass(meta);
125-
StaticObject pd = meta.HIDDEN_PROTECTION_DOMAIN.getObject(hostClass);
125+
StaticObject pd = meta.HIDDEN_PROTECTION_DOMAIN.getMaybeHiddenObject(hostClass);
126126
StaticObject[] patches = StaticObject.isNull(constantPoolPatches) ? null : constantPoolPatches.unwrap(language);
127127
// Inherit host class's protection domain.
128128
ClassRegistry.ClassDefinitionInfo info = new ClassRegistry.ClassDefinitionInfo(pd, hostKlass, patches);

0 commit comments

Comments
 (0)