Skip to content

Commit ada5cef

Browse files
committed
Refactor reflection support
* Bring reflection-based stuff into TeaVM core runtime * Implement reflection-based stuff directly in backend code instead classlib * Classlib now just wraps cure runtime Make reflection implementation more uniform between backends Split classes into java.lang.Class implementation and ClassInfo. Now java.lang.Class are normal Java objects, created on demand.
1 parent d83fab4 commit ada5cef

File tree

137 files changed

+4906
-5123
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+4906
-5123
lines changed

classlib/src/main/java/org/teavm/classlib/impl/JCLPlugin.java

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@
3030
import org.teavm.classlib.impl.currency.CurrencyHelper;
3131
import org.teavm.classlib.impl.lambda.LambdaMetafactorySubstitutor;
3232
import org.teavm.classlib.impl.record.ObjectMethodsSubstitutor;
33-
import org.teavm.classlib.impl.reflection.ClassList;
34-
import org.teavm.classlib.impl.reflection.FieldInfo;
35-
import org.teavm.classlib.impl.reflection.FieldInfoList;
36-
import org.teavm.classlib.impl.reflection.FieldReader;
37-
import org.teavm.classlib.impl.reflection.FieldWriter;
38-
import org.teavm.classlib.impl.reflection.MethodCaller;
39-
import org.teavm.classlib.impl.reflection.MethodInfo;
40-
import org.teavm.classlib.impl.reflection.MethodInfoList;
41-
import org.teavm.classlib.impl.reflection.ObjectList;
4233
import org.teavm.classlib.impl.reflection.ReflectionTransformer;
4334
import org.teavm.classlib.impl.reflection.WasmGCReflectionIntrinsics;
4435
import org.teavm.classlib.impl.reflection.WasmGCReflectionTypeMapper;
@@ -66,17 +57,17 @@
6657
import org.teavm.classlib.impl.unicode.NumberFormatMetadataGenerator;
6758
import org.teavm.classlib.impl.unicode.TimeZoneLocalizationGenerator;
6859
import org.teavm.classlib.java.lang.CharacterMetadataGenerator;
69-
import org.teavm.classlib.java.lang.reflect.JSAnnotationDependencyListener;
70-
import org.teavm.classlib.java.lang.reflect.NativeAnnotationDependencyListener;
7160
import org.teavm.interop.PlatformMarker;
7261
import org.teavm.model.MethodReference;
7362
import org.teavm.model.ValueType;
74-
import org.teavm.platform.PlatformClass;
7563
import org.teavm.platform.metadata.ResourceArray;
7664
import org.teavm.platform.metadata.ResourceMap;
7765
import org.teavm.platform.metadata.StringResource;
7866
import org.teavm.platform.plugin.MetadataRegistration;
7967
import org.teavm.platform.plugin.PlatformPlugin;
68+
import org.teavm.runtime.reflect.ClassInfo;
69+
import org.teavm.runtime.reflect.FieldInfo;
70+
import org.teavm.runtime.reflect.MethodInfo;
8071
import org.teavm.vm.TeaVMPluginUtil;
8172
import org.teavm.vm.spi.After;
8273
import org.teavm.vm.spi.TeaVMHost;
@@ -95,13 +86,13 @@ public void install(TeaVMHost host) {
9586
host.add(serviceLoaderSupport);
9687
host.registerService(ServiceLoaderInformation.class, serviceLoaderSupport);
9788
MethodReference loadServicesMethod = new MethodReference(ServiceLoader.class, "loadServices",
98-
PlatformClass.class, Object[].class);
89+
ClassInfo.class, Object[].class);
9990

10091
TeaVMJavaScriptHost jsExtension = host.getExtension(TeaVMJavaScriptHost.class);
10192
if (jsExtension != null) {
10293
jsExtension.add(loadServicesMethod, new ServiceLoaderJSSupport());
10394
jsExtension.addVirtualMethods(new AnnotationVirtualMethods());
104-
host.add(new JSAnnotationDependencyListener());
95+
//host.add(new JSAnnotationDependencyListener());
10596
}
10697

10798
TeaVMCHost cHost = host.getExtension(TeaVMCHost.class);
@@ -119,7 +110,7 @@ public void install(TeaVMHost host) {
119110
wasmGCHost.addGeneratorFactory(new ServiceLoaderWasmGCSupport());
120111
}
121112
if (wasmGCHost != null || cHost != null) {
122-
host.add(new NativeAnnotationDependencyListener());
113+
//host.add(new NativeAnnotationDependencyListener());
123114
}
124115
}
125116

@@ -192,16 +183,10 @@ public void install(TeaVMHost host) {
192183
reflectionSuppliers.add(supplier);
193184
}
194185
var wasmGcHost = host.getExtension(TeaVMWasmGCHost.class);
195-
ReflectionDependencyListener reflection = new ReflectionDependencyListener(reflectionSuppliers,
196-
wasmGcHost != null, wasmGcHost == null);
197-
host.addVirtualMethods(reflection::isVirtual);
198-
host.registerService(ReflectionDependencyListener.class, reflection);
199-
host.add(reflection);
200186

201187
TeaVMCHost cHost = host.getExtension(TeaVMCHost.class);
202188
if (cHost != null) {
203189
cHost.addIntrinsic(context -> new DateTimeZoneProviderIntrinsic(context.getProperties()));
204-
registerCReflection(cHost, reflection);
205190
}
206191

207192
TeaVMWasmHost wasmHost = host.getExtension(TeaVMWasmHost.class);
@@ -210,7 +195,7 @@ public void install(TeaVMHost host) {
210195
}
211196

212197
if (wasmGcHost != null) {
213-
registerWasmGCReflection(wasmGcHost, reflection);
198+
//registerWasmGCReflection(wasmGcHost, reflection);
214199
}
215200
}
216201

@@ -315,61 +300,31 @@ private void installMetadata(MetadataRegistration reg) {
315300
}
316301

317302
private void registerWasmGCReflection(TeaVMWasmGCHost wasmGCHost,
318-
ReflectionDependencyListener reflectionDependencyListener) {
303+
org.teavm.reflection.ReflectionDependencyListener reflectionDependencyListener) {
319304
wasmGCHost.addCustomTypeMapperFactory(context -> new WasmGCReflectionTypeMapper(
320305
context.classInfoProvider(), context.functionTypes()));
321306
wasmGCHost.addMethodsOnCallSites(reflectionDependencyListener::getVirtualCallSites);
322307

323308
var intrinsics = new WasmGCReflectionIntrinsics(reflectionDependencyListener);
324309

325-
wasmGCHost.addIntrinsic(new MethodReference(ObjectList.class, "asArray", Object[].class), intrinsics);
326-
327310
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "name", String.class), intrinsics);
328311
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "modifiers", int.class), intrinsics);
329312
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "accessLevel", int.class), intrinsics);
330313
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "type", Class.class), intrinsics);
331314
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "genericType", Object.class), intrinsics);
332315
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "annotations", Annotation[].class), intrinsics);
333-
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "reader", FieldReader.class), intrinsics);
334-
wasmGCHost.addIntrinsic(new MethodReference(FieldInfo.class, "writer", FieldWriter.class), intrinsics);
335-
336-
wasmGCHost.addIntrinsic(new MethodReference(FieldInfoList.class, "count", int.class), intrinsics);
337-
wasmGCHost.addIntrinsic(new MethodReference(FieldInfoList.class, "get", int.class, FieldInfo.class),
338-
intrinsics);
339316

340317
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "name", String.class), intrinsics);
341318
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "modifiers", int.class), intrinsics);
342319
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "accessLevel", int.class), intrinsics);
343320
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "returnType", Class.class), intrinsics);
344-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "genericReturnType", Object.class), intrinsics);
345-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "parameterTypes", ClassList.class), intrinsics);
346-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "genericParameterTypes", ObjectList.class),
347-
intrinsics);
348-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "caller", MethodCaller.class), intrinsics);
349-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "annotations", Annotation[].class), intrinsics);
350-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfo.class, "typeParameters", ObjectList.class), intrinsics);
351-
352-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfoList.class, "count", int.class), intrinsics);
353-
wasmGCHost.addIntrinsic(new MethodReference(MethodInfoList.class, "get", int.class, MethodInfo.class),
354-
intrinsics);
355-
356-
wasmGCHost.addIntrinsic(new MethodReference(ClassList.class, "count", int.class), intrinsics);
357-
wasmGCHost.addIntrinsic(new MethodReference(ClassList.class, "get", int.class, Class.class),
358-
intrinsics);
359-
360-
wasmGCHost.addIntrinsic(new MethodReference(FieldReader.class, "read", Object.class, Object.class),
361-
intrinsics);
362-
wasmGCHost.addIntrinsic(new MethodReference(FieldWriter.class, "write", Object.class, Object.class,
363-
void.class), intrinsics);
364-
wasmGCHost.addIntrinsic(new MethodReference(MethodCaller.class, "call", Object.class, Object[].class,
365-
Object.class), intrinsics);
366321

367322
wasmGCHost.addIntrinsic(new MethodReference(Class.class, "createMetadata", void.class), intrinsics);
368323
wasmGCHost.addIntrinsic(new MethodReference(Class.class, "newInstanceImpl", Object.class), intrinsics);
369324
}
370325

371326
private void registerCReflection(TeaVMCHost cHost,
372-
ReflectionDependencyListener reflectionDependencyListener) {
327+
org.teavm.reflection.ReflectionDependencyListener reflectionDependencyListener) {
373328
cHost.addReflectionGenerator(new CMembersReflectionGeneratorFactory(reflectionDependencyListener));
374329
cHost.addIntrinsic(new CFieldInfoIntrinsicFactory());
375330
}

classlib/src/main/java/org/teavm/classlib/impl/ServiceLoaderWasmGCSupport.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ static class ServiceLoaderIntrinsic implements WasmGCCustomGenerator {
7070

7171
@Override
7272
public void apply(MethodReference method, WasmFunction function, WasmGCCustomGeneratorContext context) {
73+
var classInfoStruct = context.classInfoProvider().reflectionTypes().classInfo();
74+
7375
var initializer = generateInitializer(context);
7476
var emptyInitializer = generateEmptyInitializer(context);
7577
var arrayType = (WasmType.Reference) context.typeMapper().mapType(ValueType.parse(Object[].class));
7678
var servicesFunctionType = context.functionTypes().of(arrayType);
77-
var classLocal = new WasmLocal(context.typeMapper().mapType(ValueType.parse(Class.class)));
79+
var classLocal = new WasmLocal(classInfoStruct.structure().getReference());
7880
function.add(classLocal);
7981

80-
var classStruct = context.classInfoProvider().getClassInfo("java.lang.Class").getStructure();
81-
8282
var initializerGlobalName = context.names().topLevel("teavm@initializeServicesRef");
8383
var global = new WasmGlobal(initializerGlobalName, initializer.getType().getReference(),
8484
new WasmFunctionReference(initializer));
@@ -88,8 +88,8 @@ public void apply(MethodReference method, WasmFunction function, WasmGCCustomGen
8888
function.getBody().add(new WasmCallReference(new WasmGetGlobal(global), initializer.getType()));
8989

9090
var block = new WasmBlock(false);
91-
var servicesFunctionRef = new WasmStructGet(classStruct, new WasmGetLocal(classLocal),
92-
context.classInfoProvider().getServicesOffset());
91+
var servicesFunctionRef = new WasmStructGet(classInfoStruct.structure(), new WasmGetLocal(classLocal),
92+
classInfoStruct.servicesIndex());
9393
var nullCheckedRef = new WasmNullBranch(WasmNullCondition.NULL, servicesFunctionRef, block);
9494
var getServices = new WasmCallReference(nullCheckedRef, servicesFunctionType);
9595
block.getBody().add(new WasmReturn(getServices));
@@ -99,22 +99,24 @@ public void apply(MethodReference method, WasmFunction function, WasmGCCustomGen
9999
}
100100

101101
private WasmFunction generateInitializer(WasmGCCustomGeneratorContext context) {
102+
var classInfoStruct = context.classInfoProvider().reflectionTypes().classInfo();
103+
102104
var function = new WasmFunction(context.functionTypes().of(null));
103105
function.setReferenced(true);
104106
function.setName(context.names().topLevel("teavm@initializeServices"));
105107
context.module().functions.add(function);
106108

107109
var serviceTypes = information.serviceTypes();
108-
var classStruct = context.classInfoProvider().getClassInfo("java.lang.Class").getStructure();
109-
var fieldIndex = context.classInfoProvider().getServicesOffset();
110+
var fieldIndex = classInfoStruct.servicesIndex();
110111

111112
for (var serviceType : serviceTypes) {
112113
var implementations = information.serviceImplementations(serviceType);
113114
var providerFunction = generateServiceProvider(context, serviceType, implementations);
114115
var classInfo = context.classInfoProvider().getClassInfo(serviceType);
115116
var classRef = new WasmGetGlobal(classInfo.getPointer());
116117
var providerRef = new WasmFunctionReference(providerFunction);
117-
function.getBody().add(new WasmStructSet(classStruct, classRef, fieldIndex, providerRef));
118+
function.getBody().add(new WasmStructSet(classInfoStruct.structure(), classRef, fieldIndex,
119+
providerRef));
118120
}
119121

120122
return function;

classlib/src/main/java/org/teavm/classlib/impl/reflection/FieldInfo.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

classlib/src/main/java/org/teavm/classlib/impl/reflection/FieldWriter.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

classlib/src/main/java/org/teavm/classlib/impl/reflection/MemberInfoGenerator.java

Lines changed: 0 additions & 66 deletions
This file was deleted.

classlib/src/main/java/org/teavm/classlib/impl/reflection/MethodInfo.java

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)