Skip to content

Commit c0c90a8

Browse files
committed
Avoid library factory runtime annotation lookup of during initialization.
1 parent 0978c37 commit c0c90a8

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

truffle/src/com.oracle.truffle.api.library/snapshot.sigtest

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ meth public abstract java.lang.Object readDelegateExport(java.lang.Object)
124124

125125
CLSS public abstract com.oracle.truffle.api.library.LibraryFactory<%0 extends com.oracle.truffle.api.library.Library>
126126
cons protected init(java.lang.Class<{com.oracle.truffle.api.library.LibraryFactory%0}>,java.util.List<com.oracle.truffle.api.library.Message>)
127+
anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="26.0")
128+
cons protected init(java.lang.Class<{com.oracle.truffle.api.library.LibraryFactory%0}>,java.util.List<com.oracle.truffle.api.library.Message>,boolean)
127129
meth protected !varargs com.oracle.truffle.api.utilities.FinalBitSet createMessageBitSet(com.oracle.truffle.api.library.Message[])
128130
meth protected abstract java.lang.Class<?> getDefaultClass(java.lang.Object)
129131
meth protected abstract java.lang.Object genericDispatch(com.oracle.truffle.api.library.Library,java.lang.Object,com.oracle.truffle.api.library.Message,java.lang.Object[],int) throws java.lang.Exception
@@ -155,12 +157,10 @@ CLSS public abstract com.oracle.truffle.api.library.Message
155157
cons protected !varargs init(java.lang.Class<? extends com.oracle.truffle.api.library.Library>,java.lang.String,int,boolean,java.lang.Class<?>,java.lang.Class<?>[])
156158
cons protected !varargs init(java.lang.Class<? extends com.oracle.truffle.api.library.Library>,java.lang.String,int,java.lang.Class<?>,java.lang.Class<?>[])
157159
meth protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException
158-
meth public final boolean equals(java.lang.Object)
159160
meth public final boolean isDeprecated()
160161
meth public final com.oracle.truffle.api.library.LibraryFactory<?> getFactory()
161162
meth public final int getId()
162163
meth public final int getParameterCount()
163-
meth public final int hashCode()
164164
meth public final java.lang.Class<? extends com.oracle.truffle.api.library.Library> getLibraryClass()
165165
meth public final java.lang.Class<?> getParameterType(int)
166166
meth public final java.lang.Class<?> getReceiverType()
@@ -173,7 +173,7 @@ meth public final java.util.List<java.lang.Class<?>> getParameterTypes()
173173
meth public static com.oracle.truffle.api.library.Message resolve(java.lang.Class<? extends com.oracle.truffle.api.library.Library>,java.lang.String)
174174
meth public static com.oracle.truffle.api.library.Message resolve(java.lang.Class<? extends com.oracle.truffle.api.library.Library>,java.lang.String,boolean)
175175
supr java.lang.Object
176-
hfds deprecated,hash,id,library,libraryClass,parameterCount,parameterTypes,parameterTypesArray,qualifiedName,returnType,simpleName
176+
hfds deprecated,id,library,libraryClass,parameterCount,parameterTypesArray,qualifiedName,returnType,simpleName
177177

178178
CLSS public abstract com.oracle.truffle.api.library.ReflectionLibrary
179179
cons protected init()
@@ -282,3 +282,8 @@ CLSS public abstract interface !annotation java.lang.annotation.Target
282282
intf java.lang.annotation.Annotation
283283
meth public abstract java.lang.annotation.ElementType[] value()
284284

285+
CLSS public abstract interface !annotation jdk.internal.vm.annotation.AOTSafeClassInitializer
286+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
287+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
288+
intf java.lang.annotation.Annotation
289+

truffle/src/com.oracle.truffle.api.library/src/com/oracle/truffle/api/library/LibraryFactory.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private static void removeClassesLoadedDuringImageBuild(Map<? extends Class<?>,
171171
final Map<String, Message> nameToMessages;
172172
@CompilationFinal private volatile T uncachedDispatch;
173173

174-
final DynamicDispatchLibrary dispatchLibrary;
174+
private final DynamicDispatchLibrary dispatchLibrary;
175175

176176
DefaultExportProvider[] beforeBuiltinDefaultExports;
177177
DefaultExportProvider[] afterBuiltinDefaultExports;
@@ -180,9 +180,35 @@ private static void removeClassesLoadedDuringImageBuild(Map<? extends Class<?>,
180180
* Constructor for generated subclasses. Do not sub-class {@link LibraryFactory} manually.
181181
*
182182
* @since 19.0
183+
* @deprecated new versions of the library generator won't use this constructor anymore
183184
*/
184185
@SuppressWarnings("unchecked")
186+
@Deprecated
185187
protected LibraryFactory(Class<T> libraryClass, List<Message> messages) {
188+
this(libraryClass, messages, isDynamicDispatchEnabled(libraryClass));
189+
}
190+
191+
private static boolean isDynamicDispatchEnabled(Class<?> libraryClass) {
192+
if (libraryClass == DynamicDispatchLibrary.class) {
193+
return false;
194+
} else {
195+
GenerateLibrary annotation = libraryClass.getAnnotation(GenerateLibrary.class);
196+
boolean dynamicDispatchEnabled = annotation == null || annotation.dynamicDispatchEnabled();
197+
if (dynamicDispatchEnabled) {
198+
return true;
199+
} else {
200+
return false;
201+
}
202+
}
203+
}
204+
205+
/**
206+
* Constructor for generated subclasses. Do not sub-class {@link LibraryFactory} manually.
207+
*
208+
* @since 26.0
209+
*/
210+
@SuppressWarnings("unchecked")
211+
protected LibraryFactory(Class<T> libraryClass, List<Message> messages, boolean dynamicDispatchEnabled) {
186212
assert this.getClass().getName().endsWith(LibraryExport.GENERATED_CLASS_SUFFIX);
187213
this.libraryClass = libraryClass;
188214
this.messages = Collections.unmodifiableList(messages);
@@ -193,18 +219,7 @@ protected LibraryFactory(Class<T> libraryClass, List<Message> messages) {
193219
messagesMap.putIfAbsent(message.getSimpleName(), message);
194220
}
195221
this.nameToMessages = messagesMap;
196-
if (libraryClass == DynamicDispatchLibrary.class) {
197-
this.dispatchLibrary = null;
198-
} else {
199-
GenerateLibrary annotation = libraryClass.getAnnotation(GenerateLibrary.class);
200-
boolean dynamicDispatchEnabled = annotation == null || libraryClass.getAnnotation(GenerateLibrary.class).dynamicDispatchEnabled();
201-
if (dynamicDispatchEnabled) {
202-
this.dispatchLibrary = LibraryFactory.resolve(DynamicDispatchLibrary.class).getUncached();
203-
} else {
204-
this.dispatchLibrary = null;
205-
}
206-
}
207-
222+
this.dispatchLibrary = dynamicDispatchEnabled ? LibraryFactory.resolve(DynamicDispatchLibrary.class).getUncached() : null;
208223
initDefaultExports();
209224
}
210225

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/library/LibraryGenerator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,9 @@ public List<CodeTypeElement> create(ProcessorContext context1, AnnotationProcess
757757
}
758758
}
759759
builder.end(); // of
760+
761+
builder.string(String.valueOf(!model.isDynamicDispatch() && model.isDynamicDispatchEnabled()));
762+
760763
builder.end(); // superCall
761764
builder.end(); // statement
762765

0 commit comments

Comments
 (0)