Skip to content

Commit d8ab154

Browse files
[GR-69578] Espresso JVMCI fixes (access checks and class initialization)
PullRequest: graal/22102
2 parents 08e4f8d + 164f56f commit d8ab154

8 files changed

+51
-56
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,11 @@ public static void classInModuleOfLoader(ClassLoadingEnv env, Klass klass, boole
689689
sb.append(loaderDesc(env, meta, klass.getDefiningClassLoader()));
690690
}
691691

692+
public static String loaderDesc(ObjectKlass accessingKlass) {
693+
EspressoContext context = accessingKlass.getContext();
694+
return loaderDesc(context.getClassLoadingEnv(), context.getMeta(), accessingKlass.getDefiningClassLoader());
695+
}
696+
692697
private static String loaderDesc(ClassLoadingEnv env, Meta meta, StaticObject loader) {
693698
if (env.loaderIsBoot(loader)) {
694699
return "bootstrap";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/jvmci/JVMCIUtils.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.oracle.truffle.espresso.classfile.descriptors.TypeSymbols;
3232
import com.oracle.truffle.espresso.constantpool.ResolvedConstant;
3333
import com.oracle.truffle.espresso.constantpool.RuntimeConstantPool;
34+
import com.oracle.truffle.espresso.impl.ClassRegistry;
3435
import com.oracle.truffle.espresso.impl.Klass;
3536
import com.oracle.truffle.espresso.impl.ObjectKlass;
3637
import com.oracle.truffle.espresso.meta.Meta;
@@ -43,44 +44,45 @@ private JVMCIUtils() {
4344
}
4445

4546
@TruffleBoundary
46-
public static ObjectKlass findInstanceType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, Meta meta) {
47+
public static ObjectKlass findInstanceType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, boolean checkAccess, Meta meta) {
4748
assert !TypeSymbols.isArray(symbol);
4849
StaticObject loader = accessingKlass.getDefiningClassLoader();
4950
ObjectKlass klass;
5051
if (resolve) {
5152
klass = (ObjectKlass) meta.loadKlassOrFail(symbol, loader, accessingKlass.protectionDomain());
53+
assert klass != null : symbol + " in " + ClassRegistry.loaderDesc(accessingKlass);
5254
} else {
5355
klass = (ObjectKlass) meta.getRegistries().findLoadedClass(symbol, loader);
5456
}
55-
if (klass != null && !Klass.checkAccess(klass, accessingKlass)) {
57+
if (checkAccess && klass != null && !Klass.checkAccess(klass, accessingKlass)) {
5658
return null;
5759
}
5860
return klass;
5961
}
6062

6163
@TruffleBoundary
62-
public static Klass findType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, Meta meta) {
64+
public static Klass findType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, boolean checkAccess, Meta meta) {
6365
if (TypeSymbols.isPrimitive(symbol)) {
6466
return meta.resolvePrimitive(symbol);
6567
} else {
66-
return findObjectType(symbol, accessingKlass, resolve, meta);
68+
return findObjectType(symbol, accessingKlass, resolve, checkAccess, meta);
6769
}
6870
}
6971

7072
@TruffleBoundary
71-
public static Klass findObjectType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, Meta meta) {
73+
public static Klass findObjectType(Symbol<Type> symbol, ObjectKlass accessingKlass, boolean resolve, boolean checkAccess, Meta meta) {
7274
if (TypeSymbols.isArray(symbol)) {
73-
Klass elemental = findType(meta.getTypes().getElementalType(symbol), accessingKlass, resolve, meta);
75+
Klass elemental = findType(meta.getTypes().getElementalType(symbol), accessingKlass, resolve, checkAccess, meta);
7476
if (elemental == null) {
7577
return null;
7678
}
7779
return elemental.getArrayKlass(TypeSymbols.getArrayDimensions(symbol));
7880
} else {
79-
return findInstanceType(symbol, accessingKlass, resolve, meta);
81+
return findInstanceType(symbol, accessingKlass, resolve, checkAccess, meta);
8082
}
8183
}
8284

83-
public static Klass findObjectType(int classIndex, RuntimeConstantPool pool, boolean resolve, Meta meta) {
85+
public static Klass findObjectType(int classIndex, RuntimeConstantPool pool, boolean resolve, boolean checkAccess, Meta meta) {
8486
ResolvedConstant resolvedConstant = pool.peekResolvedOrNull(classIndex, meta);
8587
if (resolvedConstant != null) {
8688
if (!resolve && !resolvedConstant.isSuccess()) {
@@ -98,6 +100,6 @@ public static Klass findObjectType(int classIndex, RuntimeConstantPool pool, boo
98100
if (type == null || TypeSymbols.isPrimitive(type)) {
99101
return null;
100102
}
101-
return findObjectType(type, pool.getHolder(), resolve, meta);
103+
return findObjectType(type, pool.getHolder(), resolve, checkAccess, meta);
102104
}
103105
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import com.oracle.truffle.espresso.impl.ModuleTable;
4747
import com.oracle.truffle.espresso.impl.ObjectKlass;
4848
import com.oracle.truffle.espresso.meta.Meta;
49-
import com.oracle.truffle.espresso.nodes.bytecodes.InitCheck;
5049
import com.oracle.truffle.espresso.runtime.EspressoContext;
5150
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
5251
import com.oracle.truffle.espresso.substitutions.EspressoSubstitutions;
@@ -94,8 +93,7 @@ static StaticObject doDefault(@SuppressWarnings("unused") StaticObject self, Sta
9493
@Cached("create(context.getMeta().jvmci.EspressoResolvedInstanceType_init.getCallTarget())") DirectCallNode objectTypeConstructor,
9594
@Cached("create(context.getMeta().jvmci.EspressoResolvedArrayType_init.getCallTarget())") DirectCallNode arrayTypeConstructor,
9695
@Cached("create(context.getMeta().jvmci.EspressoResolvedPrimitiveType_forBasicType.getCallTarget())") DirectCallNode forBasicType,
97-
@Cached("create(context.getMeta().jvmci.UnresolvedJavaType_create.getCallTarget())") DirectCallNode createUnresolved,
98-
@Cached InitCheck initCheck) {
96+
@Cached("create(context.getMeta().jvmci.UnresolvedJavaType_create.getCallTarget())") DirectCallNode createUnresolved) {
9997
assert context.getLanguage().isInternalJVMCIEnabled();
10098
Meta meta = context.getMeta();
10199
if (StaticObject.isNull(guestTypeString) || StaticObject.isNull(accessingClass)) {
@@ -104,25 +102,25 @@ static StaticObject doDefault(@SuppressWarnings("unused") StaticObject self, Sta
104102
String type = meta.toHostString(guestTypeString);
105103
LOGGER.finer(() -> "lookupType " + type + " resolved:" + resolve);
106104
ObjectKlass accessingKlass = (ObjectKlass) meta.jvmci.HIDDEN_OBJECTKLASS_MIRROR.getHiddenObject(accessingClass);
107-
return lookupType(type, accessingKlass, resolve, objectTypeConstructor, arrayTypeConstructor, forBasicType, initCheck, createUnresolved, context, meta);
105+
return lookupType(type, accessingKlass, resolve, objectTypeConstructor, arrayTypeConstructor, forBasicType, createUnresolved, context, meta);
108106
}
109107
}
110108

111-
static StaticObject lookupType(String type, ObjectKlass accessingKlass, boolean resolve, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType,
112-
InitCheck initCheck, DirectCallNode createUnresolved, EspressoContext context, Meta meta) {
109+
private static StaticObject lookupType(String type, ObjectKlass accessingKlass, boolean resolve, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor,
110+
DirectCallNode forBasicType, DirectCallNode createUnresolved, EspressoContext context, Meta meta) {
113111
ByteSequence typeDescriptor = ByteSequence.create(type);
114112
if (type.length() == 1) {
115113
JavaKind kind = JavaKind.fromPrimitiveOrVoidTypeCharOrNull(type.charAt(0));
116114
if (kind == null) {
117115
return toJVMCIUnresolvedType(typeDescriptor, createUnresolved, meta);
118116
}
119-
return toJVMCIPrimitiveType(kind, forBasicType, initCheck, meta);
117+
return toJVMCIPrimitiveType(kind, forBasicType, meta);
120118
}
121-
return lookupNonPrimitiveType(typeDescriptor, accessingKlass, resolve, objectTypeConstructor, arrayTypeConstructor, forBasicType, initCheck, createUnresolved, context, meta);
119+
return lookupNonPrimitiveType(typeDescriptor, accessingKlass, resolve, objectTypeConstructor, arrayTypeConstructor, forBasicType, createUnresolved, context, meta);
122120
}
123121

124-
static StaticObject lookupNonPrimitiveType(ByteSequence typeDescriptor, ObjectKlass accessingKlass, boolean resolve, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor,
125-
DirectCallNode forBasicType, InitCheck initCheck, DirectCallNode createUnresolved, EspressoContext context, Meta meta) {
122+
private static StaticObject lookupNonPrimitiveType(ByteSequence typeDescriptor, ObjectKlass accessingKlass, boolean resolve, DirectCallNode objectTypeConstructor,
123+
DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType, DirectCallNode createUnresolved, EspressoContext context, Meta meta) {
126124
Symbol<Type> symbol = meta.getTypes().lookupValidType(typeDescriptor);
127125
if (symbol == null) {
128126
if (resolve) {
@@ -132,12 +130,12 @@ static StaticObject lookupNonPrimitiveType(ByteSequence typeDescriptor, ObjectKl
132130
return toJVMCIUnresolvedType(typeDescriptor, createUnresolved, meta);
133131
}
134132
}
135-
Klass result = findObjectType(symbol, accessingKlass, resolve, meta);
133+
Klass result = findObjectType(symbol, accessingKlass, resolve, false, meta);
136134
if (result == null) {
137135
assert !resolve;
138136
return toJVMCIUnresolvedType(symbol, createUnresolved, meta);
139137
} else {
140-
return toJVMCIObjectType(result, objectTypeConstructor, arrayTypeConstructor, forBasicType, initCheck, context, meta);
138+
return toJVMCIObjectType(result, objectTypeConstructor, arrayTypeConstructor, forBasicType, context, meta);
141139
}
142140
}
143141

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoConstantPool.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ private static StaticObject resolvedConstantToJVMCIObjectType(ResolvedConstant r
296296

297297
private static Klass lookupSymbolicHolder(int cpi, RuntimeConstantPool constantPool, Meta meta) {
298298
int holderClassIndex = constantPool.memberClassIndex(cpi);
299-
return findObjectType(holderClassIndex, constantPool, false, meta);
299+
return findObjectType(holderClassIndex, constantPool, false, true, meta);
300300
}
301301

302302
private static Method tryResolveMethod(int methodIndex, Klass symbolicHolder, RuntimeConstantPool constantPool, Meta meta) {
@@ -394,7 +394,7 @@ private static Method tryResolveMethod(int methodIndex, Klass symbolicHolder, Ru
394394
}
395395
Klass klass;
396396
try {
397-
klass = findObjectType(classCpi, constantPool, false, meta);
397+
klass = findObjectType(classCpi, constantPool, false, true, meta);
398398
} catch (EspressoException e) {
399399
throw EspressoError.shouldNotReachHere("findObjectType with resolve=false should never throw", e);
400400
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoMetaAccessProvider.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import com.oracle.truffle.espresso.impl.Method;
3939
import com.oracle.truffle.espresso.impl.ObjectKlass;
4040
import com.oracle.truffle.espresso.meta.Meta;
41-
import com.oracle.truffle.espresso.nodes.bytecodes.InitCheck;
4241
import com.oracle.truffle.espresso.runtime.EspressoContext;
4342
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
4443
import com.oracle.truffle.espresso.substitutions.EspressoSubstitutions;
@@ -61,38 +60,34 @@ static StaticObject doDefault(@SuppressWarnings("unused") StaticObject self, @Ja
6160
@Bind("getContext()") EspressoContext context,
6261
@Cached("create(context.getMeta().jvmci.EspressoResolvedInstanceType_init.getCallTarget())") DirectCallNode objectTypeConstructor,
6362
@Cached("create(context.getMeta().jvmci.EspressoResolvedArrayType_init.getCallTarget())") DirectCallNode arrayTypeConstructor,
64-
@Cached("create(context.getMeta().jvmci.EspressoResolvedPrimitiveType_forBasicType.getCallTarget())") DirectCallNode forBasicType,
65-
@Cached InitCheck initCheck) {
63+
@Cached("create(context.getMeta().jvmci.EspressoResolvedPrimitiveType_forBasicType.getCallTarget())") DirectCallNode forBasicType) {
6664
assert context.getLanguage().isInternalJVMCIEnabled();
6765
Meta meta = context.getMeta();
6866
if (StaticObject.isNull(clazz)) {
6967
throw meta.throwIllegalArgumentExceptionBoundary("Class parameter was null");
7068
}
7169
Klass klass = clazz.getMirrorKlass(meta);
72-
return toJVMCIType(klass, objectTypeConstructor, arrayTypeConstructor, forBasicType, initCheck, context, meta);
70+
return toJVMCIType(klass, objectTypeConstructor, arrayTypeConstructor, forBasicType, context, meta);
7371
}
7472
}
7573

76-
static StaticObject toJVMCIType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType, InitCheck initCheck, EspressoContext context,
77-
Meta meta) {
74+
static StaticObject toJVMCIType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType, EspressoContext context, Meta meta) {
7875
if (klass.isArray()) {
7976
StaticObject jvmciMirror = meta.jvmci.EspressoResolvedArrayType.allocateInstance(context);
8077
ArrayKlass arrayKlass = (ArrayKlass) klass;
81-
arrayTypeConstructor.call(jvmciMirror, toJVMCIElementalType(arrayKlass.getElementalType(), objectTypeConstructor, forBasicType, initCheck, context, meta), arrayKlass.getDimension(),
78+
arrayTypeConstructor.call(jvmciMirror, toJVMCIElementalType(arrayKlass.getElementalType(), objectTypeConstructor, forBasicType, context, meta), arrayKlass.getDimension(),
8279
arrayKlass.mirror());
8380
return jvmciMirror;
8481
} else {
85-
return toJVMCIElementalType(klass, objectTypeConstructor, forBasicType, initCheck, context, meta);
82+
return toJVMCIElementalType(klass, objectTypeConstructor, forBasicType, context, meta);
8683
}
8784
}
8885

89-
static StaticObject toJVMCIObjectType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType, InitCheck initCheck,
90-
EspressoContext context,
91-
Meta meta) {
86+
static StaticObject toJVMCIObjectType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode arrayTypeConstructor, DirectCallNode forBasicType, EspressoContext context, Meta meta) {
9287
if (klass.isArray()) {
9388
StaticObject jvmciMirror = meta.jvmci.EspressoResolvedArrayType.allocateInstance(context);
9489
ArrayKlass arrayKlass = (ArrayKlass) klass;
95-
arrayTypeConstructor.call(jvmciMirror, toJVMCIElementalType(arrayKlass.getElementalType(), objectTypeConstructor, forBasicType, initCheck, context, meta), arrayKlass.getDimension(),
90+
arrayTypeConstructor.call(jvmciMirror, toJVMCIElementalType(arrayKlass.getElementalType(), objectTypeConstructor, forBasicType, context, meta), arrayKlass.getDimension(),
9691
arrayKlass.mirror());
9792
return jvmciMirror;
9893
} else {
@@ -111,9 +106,9 @@ static StaticObject toJVMCIObjectType(Klass klass, Meta meta) {
111106
}
112107
}
113108

114-
static StaticObject toJVMCIElementalType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode forBasicType, InitCheck initCheck, EspressoContext context, Meta meta) {
109+
static StaticObject toJVMCIElementalType(Klass klass, DirectCallNode objectTypeConstructor, DirectCallNode forBasicType, EspressoContext context, Meta meta) {
115110
if (klass.isPrimitive()) {
116-
return toJVMCIPrimitiveType(klass.getJavaKind(), forBasicType, initCheck, meta);
111+
return toJVMCIPrimitiveType(klass.getJavaKind(), forBasicType, meta);
117112
} else {
118113
return toJVMCIInstanceType((ObjectKlass) klass, objectTypeConstructor, context, meta);
119114
}
@@ -127,15 +122,14 @@ static StaticObject toJVMCIElementalType(Klass klass, Meta meta) {
127122
}
128123
}
129124

130-
static StaticObject toJVMCIPrimitiveType(JavaKind kind, DirectCallNode forBasicType, InitCheck initCheck, Meta meta) {
131-
initCheck.execute(meta.jvmci.EspressoResolvedPrimitiveType);
125+
static StaticObject toJVMCIPrimitiveType(JavaKind kind, DirectCallNode forBasicType, Meta meta) {
126+
meta.jvmci.EspressoResolvedPrimitiveType.safeInitialize();
132127
StaticObject result = (StaticObject) forBasicType.call(kind.getBasicType());
133128
assert !StaticObject.isNull(result);
134129
return result;
135130
}
136131

137132
static StaticObject toJVMCIPrimitiveType(JavaKind kind, Meta meta) {
138-
meta.jvmci.EspressoResolvedPrimitiveType.initialize();
139133
StaticObject result = (StaticObject) meta.jvmci.EspressoResolvedPrimitiveType_forBasicType.invokeDirectStatic(kind.getBasicType());
140134
assert !StaticObject.isNull(result);
141135
return result;
@@ -158,6 +152,7 @@ static StaticObject toJVMCIInstanceType(ObjectKlass klass, Meta meta) {
158152
static StaticObject toJVMCIUnresolvedType(ByteSequence symbol, DirectCallNode createUnresolved, Meta meta) {
159153
assert Validation.validTypeDescriptor(symbol, true);
160154
assert (symbol.byteAt(0) == 'L' && symbol.byteAt(symbol.length() - 1) == ';') || symbol.byteAt(0) == '[' : symbol;
155+
meta.jvmci.UnresolvedJavaType.safeInitialize();
161156
return (StaticObject) createUnresolved.call(meta.toGuestString(symbol));
162157
}
163158

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoObjectConstant.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import com.oracle.truffle.api.dsl.Specialization;
3030
import com.oracle.truffle.api.nodes.DirectCallNode;
3131
import com.oracle.truffle.espresso.meta.Meta;
32-
import com.oracle.truffle.espresso.nodes.bytecodes.InitCheck;
3332
import com.oracle.truffle.espresso.runtime.EspressoContext;
3433
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
3534
import com.oracle.truffle.espresso.substitutions.EspressoSubstitutions;
@@ -53,12 +52,11 @@ static StaticObject doDefault(StaticObject self,
5352
@Bind("getContext()") EspressoContext context,
5453
@Cached("create(context.getMeta().jvmci.EspressoResolvedInstanceType_init.getCallTarget())") DirectCallNode objectTypeConstructor,
5554
@Cached("create(context.getMeta().jvmci.EspressoResolvedArrayType_init.getCallTarget())") DirectCallNode arrayTypeConstructor,
56-
@Cached("create(context.getMeta().jvmci.EspressoResolvedPrimitiveType_forBasicType.getCallTarget())") DirectCallNode forBasicType,
57-
@Cached InitCheck initCheck) {
55+
@Cached("create(context.getMeta().jvmci.EspressoResolvedPrimitiveType_forBasicType.getCallTarget())") DirectCallNode forBasicType) {
5856
assert context.getLanguage().isInternalJVMCIEnabled();
5957
Meta meta = context.getMeta();
6058
StaticObject object = (StaticObject) meta.jvmci.HIDDEN_OBJECT_CONSTANT.getHiddenObject(self);
61-
return toJVMCIObjectType(object.getKlass(), objectTypeConstructor, arrayTypeConstructor, forBasicType, initCheck, context, meta);
59+
return toJVMCIObjectType(object.getKlass(), objectTypeConstructor, arrayTypeConstructor, forBasicType, context, meta);
6260
}
6361
}
6462

0 commit comments

Comments
 (0)