Skip to content

Commit 33de3d6

Browse files
committed
Use new j.l.Class fields, and removed substitutions for methods now implemented in guest JDK.
1 parent 196031d commit 33de3d6

File tree

8 files changed

+93
-30
lines changed

8 files changed

+93
-30
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public static final class VersionRange {
4141
public static final VersionRange VERSION_21_OR_HIGHER = higher(21);
4242
public static final VersionRange VERSION_21_OR_LOWER = lower(21);
4343
public static final VersionRange VERSION_22_OR_HIGHER = higher(22);
44+
public static final VersionRange VERSION_24_OR_LOWER = lower(24);
4445
public static final VersionRange VERSION_25_OR_HIGHER = higher(25);
4546

4647
public static final VersionRange ALL = between(0, LATEST_SUPPORTED);
@@ -195,6 +196,14 @@ public boolean java23OrEarlier() {
195196
return version <= 23;
196197
}
197198

199+
public boolean java24OrEarlier() {
200+
return version <= 24;
201+
}
202+
203+
public boolean java25OrLater() {
204+
return version >= 25;
205+
}
206+
198207
public boolean inRange(int low, int high) {
199208
return version >= low && version <= high;
200209
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,9 @@ public static class Names {
603603
public static final Symbol<Name> classRedefinedCount = SYMBOLS.putName("classRedefinedCount");
604604
public static final Symbol<Name> componentType = SYMBOLS.putName("componentType");
605605
public static final Symbol<Name> protectionDomain = SYMBOLS.putName("protectionDomain");
606+
public static final Symbol<Name> modifiers = SYMBOLS.putName("modifiers");
607+
public static final Symbol<Name> primitive = SYMBOLS.putName("primitive");
608+
public static final Symbol<Name> signers = SYMBOLS.putName("signers");
606609
// j.l.ClassLoader
607610
public static final Symbol<Name> addClass = SYMBOLS.putName("addClass");
608611
public static final Symbol<Name> findNative = SYMBOLS.putName("findNative");

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_21_OR_HIGHER;
3232
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_21_OR_LOWER;
3333
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_22_OR_HIGHER;
34+
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_24_OR_LOWER;
3435
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_25_OR_HIGHER;
3536
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_8_OR_LOWER;
3637
import static com.oracle.truffle.espresso.classfile.JavaVersion.VersionRange.VERSION_9_OR_HIGHER;
@@ -112,14 +113,22 @@ public Meta(EspressoContext context) {
112113
java_lang_Class_classRedefinedCount = java_lang_Class.requireDeclaredField(Names.classRedefinedCount, Types._int);
113114
java_lang_Class_name = java_lang_Class.requireDeclaredField(Names.name, Types.java_lang_String);
114115
java_lang_Class_classLoader = java_lang_Class.requireDeclaredField(Names.classLoader, Types.java_lang_ClassLoader);
116+
java_lang_Class_modifiers = diff() //
117+
.field(VERSION_25_OR_HIGHER, Names.modifiers, Types._char) //
118+
.notRequiredField(java_lang_Class);
119+
java_lang_Class_primitive = diff() //
120+
.field(VERSION_25_OR_HIGHER, Names.primitive, Types._boolean) //
121+
.notRequiredField(java_lang_Class);
115122
java_lang_Class_componentType = diff() //
116123
.field(VERSION_9_OR_HIGHER, Names.componentType, Types.java_lang_Class)//
117124
.notRequiredField(java_lang_Class);
118125
java_lang_Class_classData = diff() //
119126
.field(higher(15), Names.classData, Types.java_lang_Object)//
120127
.notRequiredField(java_lang_Class);
121128
HIDDEN_MIRROR_KLASS = java_lang_Class.requireHiddenField(Names.HIDDEN_MIRROR_KLASS);
122-
HIDDEN_SIGNERS = java_lang_Class.requireHiddenField(Names.HIDDEN_SIGNERS);
129+
HIDDEN_SIGNERS = diff() //
130+
.field(VERSION_24_OR_LOWER, Names.HIDDEN_SIGNERS, Types.java_lang_Object_array) //
131+
.maybeHiddenfield(java_lang_Class);
123132
HIDDEN_PROTECTION_DOMAIN = diff() //
124133
.field(lower(24), Names.HIDDEN_PROTECTION_DOMAIN, Types.java_security_ProtectionDomain) //
125134
.field(VERSION_25_OR_HIGHER, Names.protectionDomain, Types.java_security_ProtectionDomain) //
@@ -1459,6 +1468,8 @@ private DiffVersionLoadHelper diff() {
14591468
public final Field HIDDEN_SIGNERS;
14601469
public final Field java_lang_Class_module;
14611470
public final Field java_lang_Class_classLoader;
1471+
public final Field java_lang_Class_modifiers;
1472+
public final Field java_lang_Class_primitive;
14621473
public final Field sun_reflect_ConstantPool_constantPoolOop;
14631474
public final ArrayKlass java_lang_Class_array;
14641475
public final Method java_lang_Class_getName;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,11 @@ private void spawnVM() throws ContextPatchingException {
503503
Types.java_lang_invoke_MethodHandle,
504504
Types.java_lang_invoke_MemberName,
505505
Types.java_lang_invoke_MethodHandleNatives)) {
506-
// Types.java_lang_invoke_ResolvedMethodName is not used atm
507506
initializeKnownClass(type);
508507
}
508+
if (getJavaVersion().java25OrLater()) {
509+
initializeKnownClass(Types.java_lang_invoke_ResolvedMethodName);
510+
}
509511
int e = (int) meta.java_lang_System_initPhase2.invokeDirectStatic(false, logger.isLoggable(Level.FINE));
510512
if (e != 0) {
511513
throw EspressoError.shouldNotReachHere();

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,22 +151,33 @@ public StaticObject copy(StaticObject toCopy) {
151151
public StaticObject createClass(Klass klass) {
152152
assert klass != null;
153153
CompilerAsserts.neverPartOfCompilation();
154-
ObjectKlass guestClass = klass.getMeta().java_lang_Class;
154+
EspressoContext ctx = klass.getContext();
155+
Meta meta = ctx.getMeta();
156+
EspressoLanguage lang = ctx.getLanguage();
157+
158+
ObjectKlass guestClass = meta.java_lang_Class;
155159
StaticObject newObj = guestClass.getLinkedKlass().getShape(false).getFactory().create(guestClass);
160+
156161
initInstanceFields(newObj, guestClass);
157162

158-
klass.getMeta().java_lang_Class_classLoader.setObject(newObj, klass.getDefiningClassLoader());
159-
if (klass.getContext().getJavaVersion().modulesEnabled()) {
163+
meta.java_lang_Class_classLoader.setObject(newObj, klass.getDefiningClassLoader());
164+
if (ctx.getJavaVersion().modulesEnabled()) {
160165
setModule(newObj, klass);
161166
}
162167
// The Class.componentType field is only available on 9+.
163-
if (klass.isArray() && klass.getMeta().java_lang_Class_componentType != null) {
164-
klass.getMeta().java_lang_Class_componentType.setObject(newObj, ((ArrayKlass) klass).getComponentType().initializeEspressoClass());
168+
if (klass.isArray() && meta.java_lang_Class_componentType != null) {
169+
meta.java_lang_Class_componentType.setObject(newObj, ((ArrayKlass) klass).getComponentType().initializeEspressoClass());
165170
}
166171
// Will be overriden if necessary, but should be initialized to non-host null.
167-
klass.getMeta().HIDDEN_PROTECTION_DOMAIN.setMaybeHiddenObject(newObj, StaticObject.NULL);
172+
meta.HIDDEN_PROTECTION_DOMAIN.setMaybeHiddenObject(newObj, StaticObject.NULL);
168173
// Final hidden field assignment
169-
klass.getMeta().HIDDEN_MIRROR_KLASS.setHiddenObject(newObj, klass);
174+
meta.HIDDEN_MIRROR_KLASS.setHiddenObject(newObj, klass);
175+
176+
if (lang.getJavaVersion().java25OrLater()) {
177+
assert meta.java_lang_Class_modifiers != null && meta.java_lang_Class_primitive != null;
178+
meta.java_lang_Class_modifiers.setChar(newObj, (char) klass.getClassModifiers());
179+
meta.java_lang_Class_primitive.setBoolean(newObj, klass.isPrimitive());
180+
}
170181
return trackAllocation(klass, newObj);
171182
}
172183

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/VersionFilter.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,28 @@ public boolean isValidFor(JavaVersion version) {
177177
return version.java22OrLater();
178178
}
179179
}
180+
181+
final class Java24OrEarlier implements VersionFilter {
182+
public static final Java24OrEarlier INSTANCE = new Java24OrEarlier();
183+
184+
private Java24OrEarlier() {
185+
}
186+
187+
@Override
188+
public boolean isValidFor(JavaVersion version) {
189+
return version.java24OrEarlier();
190+
}
191+
}
192+
193+
final class Java25OrLater implements VersionFilter {
194+
public static final Java25OrLater INSTANCE = new Java25OrLater();
195+
196+
private Java25OrLater() {
197+
}
198+
199+
@Override
200+
public boolean isValidFor(JavaVersion version) {
201+
return version.java25OrLater();
202+
}
203+
}
180204
}

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.oracle.truffle.espresso.substitutions.JavaType;
3434
import com.oracle.truffle.espresso.substitutions.Substitution;
3535
import com.oracle.truffle.espresso.substitutions.SubstitutionNode;
36+
import com.oracle.truffle.espresso.substitutions.VersionFilter;
3637

3738
/**
3839
* These substitutions are provided for performance concerns.
@@ -106,24 +107,6 @@ protected static boolean isNull(StaticObject obj) {
106107
}
107108
}
108109

109-
@Substitution(hasReceiver = true)
110-
public static boolean isInterface(@JavaType(Class.class) StaticObject self,
111-
@Inject Meta meta) {
112-
return meta.getVM().JVM_IsInterface(self);
113-
}
114-
115-
@Substitution(hasReceiver = true)
116-
public static boolean isPrimitive(@JavaType(Class.class) StaticObject self,
117-
@Inject Meta meta) {
118-
return meta.getVM().JVM_IsPrimitiveClass(self);
119-
}
120-
121-
@Substitution(hasReceiver = true)
122-
public static boolean isArray(@JavaType(Class.class) StaticObject self,
123-
@Inject Meta meta) {
124-
return meta.getVM().JVM_IsArrayClass(self);
125-
}
126-
127110
@Substitution(hasReceiver = true)
128111
public static boolean isHidden(@JavaType(Class.class) StaticObject self,
129112
@Inject Meta meta) {
@@ -144,11 +127,29 @@ public static boolean isHidden(@JavaType(Class.class) StaticObject self,
144127
return superclass.mirror();
145128
}
146129

147-
@Substitution(hasReceiver = true)
130+
// These methods are implemented in the guest in 25+
131+
132+
@Substitution(hasReceiver = true, languageFilter = VersionFilter.Java24OrEarlier.class)
133+
public static boolean isInterface(@JavaType(Class.class) StaticObject self,
134+
@Inject Meta meta) {
135+
return meta.getVM().JVM_IsInterface(self);
136+
}
137+
138+
@Substitution(hasReceiver = true, languageFilter = VersionFilter.Java24OrEarlier.class)
139+
public static boolean isPrimitive(@JavaType(Class.class) StaticObject self,
140+
@Inject Meta meta) {
141+
return meta.getVM().JVM_IsPrimitiveClass(self);
142+
}
143+
144+
@Substitution(hasReceiver = true, languageFilter = VersionFilter.Java24OrEarlier.class)
145+
public static boolean isArray(@JavaType(Class.class) StaticObject self,
146+
@Inject Meta meta) {
147+
return meta.getVM().JVM_IsArrayClass(self);
148+
}
149+
150+
@Substitution(hasReceiver = true, languageFilter = VersionFilter.Java24OrEarlier.class)
148151
public static int getModifiers(@JavaType(Class.class) StaticObject self,
149152
@Inject Meta meta) {
150153
return meta.getVM().JVM_GetClassModifiers(self);
151154
}
152-
153-
// endregion perf substitutions
154155
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/vm/VM.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,7 @@ public boolean JVM_IsInterface(@JavaType(Class.class) StaticObject self) {
943943
if (klass.isPrimitive()) {
944944
return StaticObject.NULL;
945945
}
946+
assert getMeta().HIDDEN_SIGNERS != null;
946947
StaticObject signersArray = (StaticObject) getMeta().HIDDEN_SIGNERS.getHiddenObject(self);
947948
if (signersArray == null || StaticObject.isNull(signersArray)) {
948949
return StaticObject.NULL;
@@ -954,6 +955,7 @@ public boolean JVM_IsInterface(@JavaType(Class.class) StaticObject self) {
954955
public void JVM_SetClassSigners(@JavaType(Class.class) StaticObject self, @JavaType(Object[].class) StaticObject signers) {
955956
Klass klass = self.getMirrorKlass(getMeta());
956957
if (!klass.isPrimitive() && !klass.isArray()) {
958+
assert getMeta().HIDDEN_SIGNERS != null;
957959
getMeta().HIDDEN_SIGNERS.setHiddenObject(self, signers);
958960
}
959961
}

0 commit comments

Comments
 (0)