Skip to content

Commit 18b1558

Browse files
committed
Create reflection objects at runtime using metadata
1 parent 59aba0b commit 18b1558

File tree

40 files changed

+2310
-2120
lines changed

40 files changed

+2310
-2120
lines changed

compiler/src/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ protected Chunk(int arrayLength) {
7474
protected int totalSize;
7575

7676
public static UnsafeArrayTypeWriter create(boolean supportsUnalignedMemoryAccess) {
77-
if (supportsUnalignedMemoryAccess) {
77+
return create(supportsUnalignedMemoryAccess, false);
78+
}
79+
80+
public static UnsafeArrayTypeWriter create(boolean supportsUnalignedMemoryAccess, boolean bigEndian) {
81+
if (bigEndian) {
82+
return new BigEndianUnsafeArrayTypeWriter();
83+
} else if (supportsUnalignedMemoryAccess) {
7884
return new UnalignedUnsafeArrayTypeWriter();
7985
} else {
8086
return new AlignedUnsafeArrayTypeWriter();
@@ -287,3 +293,35 @@ protected void putS8(long value, Chunk chunk, long offset) {
287293
UNSAFE.putByte(chunk.data, offset + 7, (byte) (value >> 56));
288294
}
289295
}
296+
297+
final class BigEndianUnsafeArrayTypeWriter extends UnsafeArrayTypeWriter {
298+
private static final Unsafe UNSAFE = getUnsafe();
299+
300+
@Override
301+
protected void putS2(long value, Chunk chunk, long offset) {
302+
assert TypeConversion.isS2(value);
303+
UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 8));
304+
UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 0));
305+
}
306+
307+
@Override
308+
protected void putS4(long value, Chunk chunk, long offset) {
309+
assert TypeConversion.isS4(value);
310+
UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 24));
311+
UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 16));
312+
UNSAFE.putByte(chunk.data, offset + 2, (byte) (value >> 8));
313+
UNSAFE.putByte(chunk.data, offset + 3, (byte) (value >> 0));
314+
}
315+
316+
@Override
317+
protected void putS8(long value, Chunk chunk, long offset) {
318+
UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 56));
319+
UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 48));
320+
UNSAFE.putByte(chunk.data, offset + 2, (byte) (value >> 40));
321+
UNSAFE.putByte(chunk.data, offset + 3, (byte) (value >> 32));
322+
UNSAFE.putByte(chunk.data, offset + 4, (byte) (value >> 24));
323+
UNSAFE.putByte(chunk.data, offset + 5, (byte) (value >> 16));
324+
UNSAFE.putByte(chunk.data, offset + 6, (byte) (value >> 8));
325+
UNSAFE.putByte(chunk.data, offset + 7, (byte) (value >> 0));
326+
}
327+
}

compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/BoxingSnippets.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,12 @@ private static LocationIdentity getCacheLocation(CoreProviders providers, JavaKi
221221
if (innerClasses == null || innerClasses.length == 0) {
222222
throw GraalError.shouldNotReachHere("Inner classes must exist");
223223
}
224-
return new FieldLocationIdentity(providers.getMetaAccess().lookupJavaField(innerClasses[0].getDeclaredField("cache")));
224+
for (Class<?> innerClass : innerClasses) {
225+
if (innerClass.getName().endsWith("Cache")) {
226+
return new FieldLocationIdentity(providers.getMetaAccess().lookupJavaField(innerClass.getDeclaredField("cache")));
227+
}
228+
}
229+
throw GraalError.shouldNotReachHere("No cache inner class found");
225230
} catch (Throwable e) {
226231
throw GraalError.shouldNotReachHere(e);
227232
}

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,32 @@
4040
*/
4141
package org.graalvm.nativeimage.impl;
4242

43+
import java.lang.reflect.AccessibleObject;
4344
import java.lang.reflect.Executable;
45+
import java.lang.reflect.Field;
46+
import java.util.Map;
4447
import java.util.Set;
4548

4649
public interface RuntimeReflectionSupport extends ReflectionRegistry {
47-
// specific to java.lang.reflect reflection
48-
Set<Executable> getQueriedOnlyMethods();
50+
Map<Class<?>, Set<Class<?>>> getReflectionInnerClasses();
51+
52+
Set<Field> getReflectionFields();
53+
54+
Set<Executable> getReflectionExecutables();
55+
56+
Object getAccessor(Executable method);
4957

5058
/*
5159
* Returns the methods that shadow a superclass method registered for reflection, to be excluded
5260
* from reflection queries.
5361
*/
54-
Set<?> getHidingMethods();
62+
Set<?> getHidingReflectionMethods();
63+
64+
Object[] getRecordComponents(Class<?> type);
65+
66+
void registerHeapReflectionObject(AccessibleObject object);
67+
68+
Set<AccessibleObject> getHeapReflectionObjects();
5569

5670
int getReflectionClassesCount();
5771

substratevm/mx.substratevm/suite.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@
194194
"sun.invoke.util",
195195
"sun.net",
196196
"sun.reflect.annotation",
197+
"sun.reflect.generics.factory",
197198
"sun.reflect.generics.reflectiveObjects",
199+
"sun.reflect.generics.repository",
198200
"sun.reflect.generics.tree",
199201
"sun.security.jca",
200202
"sun.security.ssl",

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ private boolean notifyAnalysis(JavaConstant array, AnalysisType arrayType, JavaC
400400
return analysisModified;
401401
}
402402

403-
void onObjectReachable(ImageHeapObject imageHeapObject) {
403+
protected void onObjectReachable(ImageHeapObject imageHeapObject) {
404404
AnalysisType objectType = metaAccess.lookupJavaType(imageHeapObject.getObject());
405405
imageHeap.add(objectType, imageHeapObject);
406406

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -720,10 +720,6 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, String ol
720720
}
721721
};
722722

723-
@APIOption(name = "configure-reflection-metadata")//
724-
@Option(help = "Enable runtime instantiation of reflection objects for non-invoked methods.", type = OptionType.Expert)//
725-
public static final HostedOptionKey<Boolean> ConfigureReflectionMetadata = new HostedOptionKey<>(true);
726-
727723
@Option(help = "Include a list of methods included in the image for runtime inspection.", type = OptionType.Expert)//
728724
public static final HostedOptionKey<Boolean> IncludeMethodData = new HostedOptionKey<>(true);
729725

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void addToReferenceMapSize(long size) {
106106
}
107107

108108
public static final class Encoders {
109-
final FrequencyEncoder<JavaConstant> objectConstants;
109+
public final FrequencyEncoder<JavaConstant> objectConstants;
110110
public final FrequencyEncoder<Class<?>> sourceClasses;
111111
public final FrequencyEncoder<String> sourceMethodNames;
112112
final FrequencyEncoder<String> names;

0 commit comments

Comments
 (0)