Skip to content

Commit 103e093

Browse files
committed
Fix interpreter metadata serialization.
1 parent 2c77276 commit 103e093

File tree

3 files changed

+39
-26
lines changed

3 files changed

+39
-26
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.oracle.svm.core.hub.crema.CremaSupport;
3030
import com.oracle.svm.espresso.classfile.ParserField;
3131

32+
import jdk.vm.ci.meta.JavaType;
3233
import jdk.vm.ci.meta.UnresolvedJavaType;
3334

3435
public class CremaResolvedJavaFieldImpl extends InterpreterResolvedJavaField implements CremaResolvedJavaField {
@@ -47,6 +48,32 @@ public static CremaResolvedJavaFieldImpl createAtRuntime(InterpreterResolvedObje
4748
return new CremaResolvedJavaFieldImpl(declaringClass, f, offset);
4849
}
4950

51+
@Override
52+
public JavaType getType() {
53+
/*
54+
* For fields created at build-time, the type is set if it is available. We explicitly do
55+
* not want to trigger field type resolution at build-time.
56+
*
57+
* If the resolvedType is null, the type was not included in the image. If we were to
58+
* eagerly create a ResolvedJavaType for it, we would force it back in.
59+
*/
60+
if (resolvedType == null) {
61+
UnresolvedJavaType unresolvedJavaType = UnresolvedJavaType.create(getSymbolicType().toString());
62+
/*
63+
* This should not trigger actual class loading. Instead, we query the loader registry
64+
* for an already loaded class.
65+
*/
66+
Class<?> cls = CremaSupport.singleton().findLoadedClass(unresolvedJavaType, getDeclaringClass());
67+
if (cls == null) {
68+
// Not loaded: return the unresolved type
69+
return unresolvedJavaType;
70+
}
71+
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
72+
}
73+
return resolvedType;
74+
}
75+
76+
@Override
5077
public InterpreterResolvedJavaType getResolvedType() {
5178
if (resolvedType == null) {
5279
Class<?> cls = CremaSupport.singleton().resolveOrThrow(UnresolvedJavaType.create(getSymbolicType().toString()), getDeclaringClass());

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

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232

3333
import com.oracle.graal.pointsto.meta.AnalysisField;
3434
import com.oracle.svm.core.hub.DynamicHub;
35-
import com.oracle.svm.core.hub.RuntimeClassLoading;
36-
import com.oracle.svm.core.hub.crema.CremaSupport;
3735
import com.oracle.svm.core.hub.registry.SymbolsSupport;
3836
import com.oracle.svm.core.util.VMError;
3937
import com.oracle.svm.espresso.classfile.descriptors.Name;
@@ -116,13 +114,16 @@ public static InterpreterResolvedJavaField createAtBuildTime(AnalysisField origi
116114
}
117115

118116
public static InterpreterResolvedJavaField createForInterpreter(String name, int modifiers,
119-
InterpreterResolvedJavaType type, InterpreterResolvedObjectType declaringClass,
117+
JavaType type, InterpreterResolvedObjectType declaringClass,
120118
int offset,
121-
JavaConstant constant) {
119+
JavaConstant constant,
120+
boolean isWordStorage) {
122121
MetadataUtil.requireNonNull(type);
123122
MetadataUtil.requireNonNull(declaringClass);
124123
Symbol<Name> nameSymbol = SymbolsSupport.getNames().getOrCreate(name);
125-
return new InterpreterResolvedJavaField(nameSymbol, type.getSymbolicType(), modifiers, type, declaringClass, offset, constant, type.isWordType());
124+
InterpreterResolvedJavaType resolvedType = type instanceof InterpreterResolvedJavaType ? (InterpreterResolvedJavaType) type : null;
125+
Symbol<Type> symbolicType = resolvedType == null ? CremaTypeAccess.jvmciNameToType(type.getName()) : resolvedType.getSymbolicType();
126+
return new InterpreterResolvedJavaField(nameSymbol, symbolicType, modifiers, resolvedType, declaringClass, offset, constant, isWordStorage);
126127
}
127128

128129
@Platforms(Platform.HOSTED_ONLY.class)
@@ -199,25 +200,8 @@ public JavaType getType() {
199200
* eagerly create a ResolvedJavaType for it, we would force it back in.
200201
*/
201202
if (resolvedType == null) {
202-
UnresolvedJavaType unresolvedJavaType = UnresolvedJavaType.create(typeSymbol.toString());
203-
Class<?> cls = null;
204-
/*
205-
* Prevent CremaSupport from being reached from other users of
206-
* InterpreterResolvedJavaField.
207-
*/
208-
if (RuntimeClassLoading.isSupported()) {
209-
/*
210-
* This should not trigger actual class loading. Instead, we query the loader
211-
* registry for an already loaded class.
212-
*/
213-
cls = CremaSupport.singleton().findLoadedClass(unresolvedJavaType, getDeclaringClass());
214-
}
215-
if (cls == null) {
216-
// Not loaded: return the unresolved type
217-
return unresolvedJavaType;
218-
}
219-
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
220-
203+
// Not included. return the unresolved type.
204+
return UnresolvedJavaType.create(typeSymbol.toString());
221205
}
222206
return resolvedType;
223207
}

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,13 @@ public static ValueSerializer<ReferenceConstant<?>> newReferenceConstantSerializ
546546
static final ValueSerializer<InterpreterResolvedJavaField> RESOLVED_FIELD = createSerializer(
547547
(context, in) -> {
548548
String name = context.readReference(in);
549-
InterpreterResolvedJavaType type = context.readReference(in);
549+
JavaType type = context.readReference(in);
550550
InterpreterResolvedObjectType declaringClass = context.readReference(in);
551551
int modifiers = LEB128.readUnsignedInt(in);
552552
int offset = LEB128.readUnsignedInt(in);
553553
JavaConstant constant = context.readReference(in);
554-
return InterpreterResolvedJavaField.createForInterpreter(name, modifiers, type, declaringClass, offset, constant);
554+
boolean isWordStorage = in.readBoolean();
555+
return InterpreterResolvedJavaField.createForInterpreter(name, modifiers, type, declaringClass, offset, constant, isWordStorage);
555556
},
556557
(context, out, value) -> {
557558
context.writeReference(out, value.getName());
@@ -565,6 +566,7 @@ public static ValueSerializer<ReferenceConstant<?>> newReferenceConstantSerializ
565566
} else {
566567
context.writeReference(out, null);
567568
}
569+
out.writeBoolean(value.isWordStorage());
568570
});
569571

570572
static final ValueSerializer<InterpreterResolvedObjectType> OBJECT_TYPE = createSerializer(

0 commit comments

Comments
 (0)