Skip to content

Commit 1a8256c

Browse files
[GR-70261] Crema: Fix various issues around invocation.
PullRequest: graal/22286
2 parents 01eff35 + 0bdbad6 commit 1a8256c

File tree

10 files changed

+75
-56
lines changed

10 files changed

+75
-56
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeInt;
4747
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeObject;
4848
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeShort;
49+
import static com.oracle.svm.core.hub.registry.AbstractRuntimeClassRegistry.UNINITIALIZED_DECLARING_CLASS_SENTINEL;
4950
import static com.oracle.svm.core.reflect.RuntimeMetadataDecoder.NO_DATA;
5051

5152
import java.io.InputStream;
@@ -1333,6 +1334,9 @@ private Class<?> getDeclaringClass0() {
13331334
} else if (declaringClass instanceof Class) {
13341335
PredefinedClassesSupport.throwIfUnresolvable((Class<?>) declaringClass, getClassLoader0());
13351336
return (Class<?>) declaringClass;
1337+
} else if (declaringClass == UNINITIALIZED_DECLARING_CLASS_SENTINEL) {
1338+
// GR-70363
1339+
throw VMError.unimplemented("getDeclaringClass0 is not implemented yet for runtime-loaded classes");
13361340
} else if (declaringClass instanceof LinkageError) {
13371341
throw (LinkageError) declaringClass;
13381342
} else {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/RuntimeClassLoading.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,22 +125,6 @@ public static boolean isSupported() {
125125
return Options.RuntimeClassLoading.getValue();
126126
}
127127

128-
@Platforms(Platform.HOSTED_ONLY.class)
129-
public static final class NoRuntimeClassLoading implements BooleanSupplier {
130-
@Override
131-
public boolean getAsBoolean() {
132-
return !isSupported();
133-
}
134-
}
135-
136-
@Platforms(Platform.HOSTED_ONLY.class)
137-
public static final class WithRuntimeClassLoading implements BooleanSupplier {
138-
@Override
139-
public boolean getAsBoolean() {
140-
return isSupported();
141-
}
142-
}
143-
144128
public static Class<?> defineClass(ClassLoader loader, String expectedName, byte[] b, int off, int len, ClassDefinitionInfo info) {
145129
if (PredefinedClassesSupport.hasBytecodeClasses()) {
146130
Class<?> knownClass = PredefinedClassesSupport.knownClass(b, off, len);
@@ -287,4 +271,20 @@ public static void ensureLinked(DynamicHub dynamicHub) {
287271
}
288272
// GR-59739 runtime linking
289273
}
274+
275+
@Platforms(Platform.HOSTED_ONLY.class)
276+
public static final class NoRuntimeClassLoading implements BooleanSupplier {
277+
@Override
278+
public boolean getAsBoolean() {
279+
return !isSupported();
280+
}
281+
}
282+
283+
@Platforms(Platform.HOSTED_ONLY.class)
284+
public static final class WithRuntimeClassLoading implements BooleanSupplier {
285+
@Override
286+
public boolean getAsBoolean() {
287+
return isSupported();
288+
}
289+
}
290290
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ interface CremaDispatchTable {
6565
* Creates a new instance of {@code type} without running any constructor yet. The caller should
6666
* make sure to run a constructor before publishing the result.
6767
*/
68-
Object rawNewInstance(ResolvedJavaType type);
68+
Object allocateInstance(ResolvedJavaType type);
6969

7070
Object execute(ResolvedJavaMethod targetMethod, Object[] args);
7171

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/registry/AbstractRuntimeClassRegistry.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.oracle.svm.espresso.classfile.Constants.ACC_VALUE_BASED;
2929
import static com.oracle.svm.espresso.classfile.Constants.JVM_ACC_WRITTEN_FLAGS;
3030

31+
import java.lang.reflect.Method;
3132
import java.lang.reflect.Modifier;
3233
import java.util.ArrayList;
3334
import java.util.Arrays;
@@ -68,7 +69,9 @@
6869
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
6970
import com.oracle.svm.espresso.classfile.descriptors.Type;
7071
import com.oracle.svm.espresso.classfile.descriptors.ValidationException;
72+
import com.oracle.svm.util.ReflectionUtil;
7173

74+
import jdk.internal.loader.ClassLoaders;
7275
import jdk.internal.misc.Unsafe;
7376
import jdk.vm.ci.meta.MetaUtil;
7477

@@ -95,8 +98,14 @@
9598
* {@linkplain UserDefinedClassRegistry all other class loaders}.
9699
*/
97100
public abstract sealed class AbstractRuntimeClassRegistry extends AbstractClassRegistry permits BootClassRegistry, UserDefinedClassRegistry {
101+
public static final Object UNINITIALIZED_DECLARING_CLASS_SENTINEL = new Object();
98102
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
99103
private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];
104+
private static final ClassLoader bootLoader;
105+
static {
106+
Method method = ReflectionUtil.lookupMethod(ClassLoaders.class, "bootLoader");
107+
bootLoader = ReflectionUtil.invokeMethod(method, null);
108+
}
100109
/**
101110
* Strong hidden classes must be referenced by the class loader data to prevent them from being
102111
* reclaimed, while not appearing in the actual registry. This field simply keeps those hidden
@@ -284,7 +293,8 @@ private Class<?> createClass(ParserKlass parsed, ClassDefinitionInfo info, Symbo
284293
String externalName = getExternalName(parsed, info);
285294
String simpleBinaryName = getSimpleBinaryName(parsed);
286295
String sourceFile = getSourceFile(parsed);
287-
Class<?> enclosingClass = getEnclosingClass(parsed);
296+
// The declaring class must be computed lazily
297+
Object declaringClass = UNINITIALIZED_DECLARING_CLASS_SENTINEL;
288298
String classSignature = getClassSignature(parsed);
289299

290300
int modifiers = getClassModifiers(parsed);
@@ -398,12 +408,18 @@ private Class<?> createClass(ParserKlass parsed, ClassDefinitionInfo info, Symbo
398408
boolean isValueBased = (parsed.getFlags() & ACC_VALUE_BASED) != 0;
399409

400410
// GR-62339
401-
Module module = getClassLoader().getUnnamedModule();
411+
Module module;
412+
ClassLoader classLoader = getClassLoader();
413+
if (classLoader == null) {
414+
module = bootLoader.getUnnamedModule();
415+
} else {
416+
module = classLoader.getUnnamedModule();
417+
}
402418

403419
checkNotHybrid(parsed);
404420

405421
DynamicHub hub = DynamicHub.allocate(externalName, superHub, interfacesEncoding, null,
406-
sourceFile, modifiers, flags, getClassLoader(), simpleBinaryName, module, enclosingClass, classSignature,
422+
sourceFile, modifiers, flags, classLoader, simpleBinaryName, module, declaringClass, classSignature,
407423
typeID, interfaceID,
408424
hasClassInitializer(parsed), numClassTypes, typeIDDepth, numIterableInterfaces, openTypeWorldTypeCheckSlots, openTypeWorldInterfaceHashTable, openTypeWorldInterfaceHashParam,
409425
dispatchTableLength,
@@ -497,14 +513,6 @@ private static String getExternalName(ParserKlass parsed, ClassDefinitionInfo in
497513
return externalName;
498514
}
499515

500-
private static Class<?> getEnclosingClass(ParserKlass parsed) {
501-
InnerClassesAttribute innerClassesAttribute = (InnerClassesAttribute) parsed.getAttribute(InnerClassesAttribute.NAME);
502-
if (innerClassesAttribute == null) {
503-
return null;
504-
}
505-
throw VMError.unimplemented("enclosing class is not supported yet");
506-
}
507-
508516
private static String getSimpleBinaryName(ParserKlass parsed) {
509517
InnerClassesAttribute innerClassesAttribute = (InnerClassesAttribute) parsed.getAttribute(InnerClassesAttribute.NAME);
510518
if (innerClassesAttribute == null) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/CremaConstructorAccessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public Object newInstance(Object[] args) throws InvocationTargetException {
4444
verifyArguments(args);
4545
ensureDeclaringClassInitialized();
4646

47-
Object newReference = CremaSupport.singleton().rawNewInstance(targetMethod.getDeclaringClass());
47+
Object newReference = CremaSupport.singleton().allocateInstance(targetMethod.getDeclaringClass());
4848
Object[] finalArgs = new Object[args.length + 1];
4949
finalArgs[0] = newReference;
5050
System.arraycopy(args, 0, finalArgs, 1, args.length);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/CremaMethodAccessor.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,14 @@ public Object invoke(Object obj, Object[] args) throws IllegalArgumentException,
5050
ensureDeclaringClassInitialized();
5151
}
5252

53-
Object[] finalArgs = new Object[args.length + 1];
54-
finalArgs[0] = obj;
55-
System.arraycopy(args, 0, finalArgs, 1, args.length);
53+
Object[] finalArgs;
54+
if (targetMethod.isStatic()) {
55+
finalArgs = args;
56+
} else {
57+
finalArgs = new Object[args.length + 1];
58+
finalArgs[0] = obj;
59+
System.arraycopy(args, 0, finalArgs, 1, args.length);
60+
}
5661
try {
5762
return CremaSupport.singleton().execute(targetMethod, finalArgs);
5863
} catch (Throwable t) {

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedJavaFieldImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,14 @@ public JavaType getType() {
6161
* eagerly create a ResolvedJavaType for it, we would force it back in.
6262
*/
6363
if (resolvedType == null) {
64-
UnresolvedJavaType unresolvedJavaType = UnresolvedJavaType.create(getSymbolicType().toString());
6564
/*
6665
* This should not trigger actual class loading. Instead, we query the loader registry
6766
* for an already loaded class.
6867
*/
69-
Class<?> cls = CremaSupport.singleton().findLoadedClass(unresolvedJavaType, getDeclaringClass());
68+
Class<?> cls = CremaSupport.singleton().findLoadedClass(getSymbolicType(), getDeclaringClass());
7069
if (cls == null) {
7170
// Not loaded: return the unresolved type
72-
return unresolvedJavaType;
71+
return UnresolvedJavaType.create(getSymbolicType().toString());
7372
}
7473
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
7574
}
@@ -79,7 +78,7 @@ public JavaType getType() {
7978
@Override
8079
public InterpreterResolvedJavaType getResolvedType() {
8180
if (resolvedType == null) {
82-
Class<?> cls = CremaSupport.singleton().resolveOrThrow(UnresolvedJavaType.create(getSymbolicType().toString()), getDeclaringClass());
81+
Class<?> cls = CremaSupport.singleton().resolveOrThrow(getSymbolicType(), getDeclaringClass());
8382
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
8483
}
8584
return resolvedType;

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaFeature.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,17 @@
4040
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
4141
import com.oracle.svm.core.feature.InternalFeature;
4242
import com.oracle.svm.core.hub.ClassForNameSupport;
43-
import com.oracle.svm.core.hub.crema.CremaSupport;
4443
import com.oracle.svm.core.hub.RuntimeClassLoading;
44+
import com.oracle.svm.core.hub.crema.CremaSupport;
4545
import com.oracle.svm.core.util.VMError;
4646
import com.oracle.svm.hosted.FeatureImpl;
4747
import com.oracle.svm.hosted.meta.HostedField;
4848
import com.oracle.svm.hosted.meta.HostedInstanceClass;
49+
import com.oracle.svm.hosted.meta.HostedMethod;
4950
import com.oracle.svm.hosted.meta.HostedType;
5051
import com.oracle.svm.hosted.meta.HostedUniverse;
5152
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaField;
53+
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaMethod;
5254
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaType;
5355
import com.oracle.svm.interpreter.metadata.InterpreterResolvedObjectType;
5456
import com.oracle.svm.util.ReflectionUtil;
@@ -118,6 +120,15 @@ public void beforeCompilation(BeforeCompilationAccess access) {
118120
BuildTimeInterpreterUniverse iUniverse = BuildTimeInterpreterUniverse.singleton();
119121
Field vtableHolderField = ReflectionUtil.lookupField(InterpreterResolvedObjectType.class, "vtableHolder");
120122

123+
for (HostedMethod method : hUniverse.getMethods()) {
124+
if (method.hasVTableIndex()) {
125+
InterpreterResolvedJavaMethod iMethod = iUniverse.getMethod(method);
126+
if (iMethod != null) {
127+
iMethod.setVTableIndex(method.getVTableIndex());
128+
}
129+
}
130+
}
131+
121132
for (HostedType hType : hUniverse.getTypes()) {
122133
iUniverse.mirrorSVMVTable(hType, objectType -> accessImpl.getHeapScanner().rescanField(objectType, vtableHolderField));
123134
}

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ private static void addSupportedElements(BuildTimeInterpreterUniverse btiUnivers
146146
return;
147147
}
148148
InterpreterResolvedJavaMethod method = btiUniverse.getOrCreateMethod(analysisMethod);
149-
method.setNativeEntryPoint(new MethodPointer(analysisMethod));
149+
if (!method.isAbstract()) {
150+
method.setNativeEntryPoint(new MethodPointer(analysisMethod));
151+
}
150152
methods.add(method);
151153
}
152154

@@ -261,10 +263,12 @@ public CremaDispatchTable getDispatchTable(ParserKlass parsed, Class<?> superCla
261263
if (Modifier.isInterface(parsed.getFlags())) {
262264
return new CremaInterfaceDispatchTableImpl(partialType);
263265
} else {
264-
Tables<InterpreterResolvedJavaType, InterpreterResolvedJavaMethod, InterpreterResolvedJavaField> tables = VTable.create(partialType,
265-
false,
266-
false,
267-
true);
266+
/*
267+
* GR-70607: once we handle vtable indicies better in crema we should enable
268+
* mirandas.
269+
*/
270+
boolean addMirandas = false;
271+
var tables = VTable.create(partialType, false, false, addMirandas);
268272
return new CremaInstanceDispatchTableImpl(tables, partialType);
269273
}
270274
} catch (MethodTableException e) {
@@ -726,7 +730,7 @@ public Object execute(ResolvedJavaMethod targetMethod, Object[] args) {
726730
}
727731

728732
@Override
729-
public Object rawNewInstance(ResolvedJavaType type) {
733+
public Object allocateInstance(ResolvedJavaType type) {
730734
return InterpreterToVM.createNewReference((InterpreterResolvedJavaType) type);
731735
}
732736
}

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/RuntimeInterpreterConstantPool.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaType;
4444
import com.oracle.svm.interpreter.metadata.InterpreterResolvedObjectType;
4545

46-
import jdk.vm.ci.meta.JavaType;
4746
import jdk.vm.ci.meta.UnresolvedJavaField;
4847
import jdk.vm.ci.meta.UnresolvedJavaMethod;
4948
import jdk.vm.ci.meta.UnresolvedJavaType;
@@ -99,12 +98,7 @@ private Object resolveMethodHandle(int cpi, InterpreterResolvedObjectType access
9998
} else {
10099
assert refTag == Tag.FIELD_REF;
101100
InterpreterResolvedJavaField field = this.resolvedFieldAt(accessingClass, memberIndex);
102-
JavaType fieldType = field.getType();
103-
if (fieldType instanceof InterpreterResolvedJavaType resolvedJavaType) {
104-
mtype = resolvedJavaType.getJavaClass();
105-
} else {
106-
mtype = resolveSymbolAndAccessCheck(field.getDeclaringClass(), (UnresolvedJavaType) fieldType);
107-
}
101+
mtype = field.getResolvedType().getJavaClass();
108102
mklass = field.getDeclaringClass();
109103
refName = field.getSymbolicName();
110104
}
@@ -298,10 +292,4 @@ private static Class<?> resolveSymbolAndAccessCheck(InterpreterResolvedObjectTyp
298292
// GR-62339 check access
299293
return clazz;
300294
}
301-
302-
private static Class<?> resolveSymbolAndAccessCheck(InterpreterResolvedObjectType accessingClass, UnresolvedJavaType type) {
303-
Class<?> clazz = CremaSupport.singleton().resolveOrThrow(type, accessingClass);
304-
// GR-62339 check access
305-
return clazz;
306-
}
307295
}

0 commit comments

Comments
 (0)