Skip to content

Commit 99a22df

Browse files
committed
Add JavaLangInvokeAccess
1 parent 5c798df commit 99a22df

File tree

12 files changed

+30
-33
lines changed

12 files changed

+30
-33
lines changed

src/java.base/share/classes/java/lang/ClassFrameInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* @see StackWalker.Option#DROP_METHOD_INFO
3939
*/
4040
class ClassFrameInfo implements StackFrame {
41-
static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess();
41+
static final JavaLangInvokeAccess JLIA = SharedSecrets.get(JavaLangInvokeAccess.class);
4242

4343
Object classOrMemberName; // Class or ResolvedMemberName initialized by VM
4444
int flags; // updated by VM to set hidden and caller-sensitive bits

src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1535,7 +1535,7 @@ private static NamedFunction createFunction(byte func) {
15351535
}
15361536

15371537
static {
1538-
SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() {
1538+
SharedSecrets.set(JavaLangInvokeAccess.class, new JavaLangInvokeAccess() {
15391539
@Override
15401540
public Class<?> getDeclaringClass(Object rmname) {
15411541
ResolvedMethodName method = (ResolvedMethodName)rmname;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package jdk.internal.access;
22

3-
public sealed interface Access permits JavaIOAccess, JavaLangAccess {
3+
public sealed interface Access permits JavaIOAccess, JavaLangAccess, JavaLangInvokeAccess {
44
}

src/java.base/share/classes/jdk/internal/access/JavaLangInvokeAccess.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import java.util.Map;
3939
import java.util.stream.Stream;
4040

41-
public interface JavaLangInvokeAccess {
41+
public non-sealed interface JavaLangInvokeAccess extends Access {
4242
/**
4343
* Returns the declaring class for the given ResolvedMethodName.
4444
* Used by {@code StackFrameInfo}.

src/java.base/share/classes/jdk/internal/access/SharedSecrets.java

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ public final class SharedSecrets {
7979

8080
// This map is used to associate a certain Access interface to another class where
8181
// the implementation of said interface resides
82-
private static final Map<Class<? extends Access>, Class<?>> IMPLEMENTATIONS =
82+
private static final Map<Class<? extends Access>, Object> IMPLEMENTATIONS =
8383
Map.ofEntries(
8484
Map.entry(JavaIOAccess.class, Console.class),
85-
Map.entry(JavaLangAccess.class, System.class)
85+
Map.entry(JavaLangAccess.class, System.class),
86+
Map.entry(JavaLangInvokeAccess.class, "java.lang.invoke.MethodHandleImpl")
8687
);
8788

8889
private static final StableComponentContainer<Access> COMPONENTS =
@@ -98,9 +99,12 @@ public static <T extends Access> T get(Class<T> clazz) {
9899

99100
@DontInline
100101
private static <T extends Access> T getSlowPath(Class<T> clazz) {
101-
Class<?> implementation = IMPLEMENTATIONS.get(clazz);
102-
assert implementation != null;
103-
ensureClassInitialized(implementation);
102+
Object implementation = IMPLEMENTATIONS.get(clazz);
103+
switch (implementation) {
104+
case Class<?> c -> ensureClassInitialized(c);
105+
case String s -> ensureClassInitialized(s);
106+
default -> throw new InternalError("Should not reach here");
107+
}
104108
// The component should now be initialized
105109
return COMPONENTS.get(clazz);
106110
}
@@ -113,7 +117,7 @@ public static <T extends Access> void set(Class<T> type, T access) {
113117
private static JavaAWTFontAccess javaAWTFontAccess;
114118
@Stable private static JavaBeansAccess javaBeansAccess;
115119
// @Stable private static JavaLangAccess javaLangAccess;
116-
@Stable private static JavaLangInvokeAccess javaLangInvokeAccess;
120+
// @Stable private static JavaLangInvokeAccess javaLangInvokeAccess;
117121
@Stable private static JavaLangModuleAccess javaLangModuleAccess;
118122
@Stable private static JavaLangRefAccess javaLangRefAccess;
119123
@Stable private static JavaLangReflectAccess javaLangReflectAccess;
@@ -200,21 +204,6 @@ public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {
200204
javaUtilJarAccess = access;
201205
}
202206

203-
public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) {
204-
javaLangInvokeAccess = jlia;
205-
}
206-
207-
public static JavaLangInvokeAccess getJavaLangInvokeAccess() {
208-
var access = javaLangInvokeAccess;
209-
if (access == null) {
210-
try {
211-
Class.forName("java.lang.invoke.MethodHandleImpl", true, null);
212-
access = javaLangInvokeAccess;
213-
} catch (ClassNotFoundException e) {}
214-
}
215-
return access;
216-
}
217-
218207
public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) {
219208
javaLangModuleAccess = jlrma;
220209
}
@@ -516,6 +505,12 @@ public static JavaxSecurityAccess getJavaxSecurityAccess() {
516505
private static void ensureClassInitialized(Class<?> c) {
517506
try {
518507
MethodHandles.lookup().ensureInitialized(c);
519-
} catch (IllegalAccessException e) {}
508+
} catch (IllegalAccessException _) {}
509+
}
510+
511+
private static void ensureClassInitialized(String className) {
512+
try {
513+
Class.forName(className, true, null);
514+
} catch (ClassNotFoundException _) {}
520515
}
521516
}

src/java.base/share/classes/jdk/internal/foreign/Utils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package jdk.internal.foreign;
2727

28+
import jdk.internal.access.JavaLangInvokeAccess;
2829
import jdk.internal.access.SharedSecrets;
2930
import jdk.internal.foreign.abi.SharedUtils;
3031
import jdk.internal.misc.Unsafe;
@@ -138,7 +139,7 @@ private static VarHandle makeRawSegmentViewVarHandleInternal(MemoryLayout enclos
138139
baseCarrier = ADDRESS_CARRIER_TYPE;
139140
}
140141

141-
VarHandle handle = SharedSecrets.getJavaLangInvokeAccess().memorySegmentViewHandle(baseCarrier,
142+
VarHandle handle = SharedSecrets.get(JavaLangInvokeAccess.class).memorySegmentViewHandle(baseCarrier,
142143
enclosing, layout.byteAlignment() - 1, layout.order(), constantOffset, offset);
143144

144145
if (layout instanceof AddressLayout addressLayout) {

src/java.base/share/classes/jdk/internal/foreign/abi/DowncallLinker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class DowncallLinker {
5050
private static final boolean USE_SPEC = Boolean.parseBoolean(
5151
System.getProperty("jdk.internal.foreign.DowncallLinker.USE_SPEC", "true"));
5252

53-
private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess();
53+
private static final JavaLangInvokeAccess JLIA = SharedSecrets.get(JavaLangInvokeAccess.class);
5454

5555
private static final MethodHandle MH_INVOKE_INTERP_BINDINGS = MhUtil.findVirtual(
5656
MethodHandles.lookup(), DowncallLinker.class, "invokeInterpBindings",

src/java.base/share/classes/jdk/internal/foreign/abi/SharedUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public final class SharedUtils {
7272
private SharedUtils() {
7373
}
7474

75-
private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess();
75+
private static final JavaLangInvokeAccess JLIA = SharedSecrets.get(JavaLangInvokeAccess.class);
7676

7777
private static final MethodHandle MH_ALLOC_BUFFER;
7878
private static final MethodHandle MH_BUFFER_COPY;

src/java.base/share/classes/jdk/internal/misc/CDS.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.jar.JarFile;
4343
import java.util.stream.Stream;
4444

45+
import jdk.internal.access.JavaLangInvokeAccess;
4546
import jdk.internal.access.SharedSecrets;
4647
import jdk.internal.util.StaticProperty;
4748

@@ -235,7 +236,7 @@ private static Object[] generateLambdaFormHolderClasses(String[] lines) {
235236
Objects.requireNonNull(lines);
236237
validateInputLines(lines);
237238
Stream<String> lineStream = Arrays.stream(lines);
238-
Map<String, byte[]> result = SharedSecrets.getJavaLangInvokeAccess().generateHolderClasses(lineStream);
239+
Map<String, byte[]> result = SharedSecrets.get(JavaLangInvokeAccess.class).generateHolderClasses(lineStream);
239240
int size = result.size();
240241
Object[] retArray = new Object[size * 2];
241242
int index = 0;

src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ static Object invoke(MethodHandle target, Class<?> caller, Object obj, Object[]
311311
}
312312
}
313313

314-
static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess();
314+
static final JavaLangInvokeAccess JLIA = SharedSecrets.get(JavaLangInvokeAccess.class);
315315
static final MethodHandle NATIVE_ACCESSOR_INVOKE = MhUtil.findVirtual(
316316
MethodHandles.lookup(), NativeAccessor.class, "invoke",
317317
genericMethodType(1, true));

0 commit comments

Comments
 (0)