Skip to content

Commit 2dc5784

Browse files
rgithubliVictor Rudometov
authored andcommitted
8199149: Improve the exception message thrown by VarHandle of unsupported operation
Backport-of: d7b941640638b35f9ac1ef11cd6bf6ccb795c29a
1 parent 48f48ec commit 2dc5784

File tree

4 files changed

+12
-5
lines changed

4 files changed

+12
-5
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public boolean isAccessModeSupported(AccessMode accessMode) {
101101
@Override
102102
MethodHandle getMethodHandleUncached(int mode) {
103103
MethodHandle targetHandle = target.getMethodHandle(mode); // might throw UOE of access mode is not supported, which is ok
104-
return handleFactory.apply(AccessMode.values()[mode], targetHandle);
104+
return handleFactory.apply(AccessMode.valueFromOrdinal(mode), targetHandle);
105105
}
106106

107107
@Override

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import jdk.internal.vm.annotation.DontInline;
2828
import jdk.internal.vm.annotation.ForceInline;
29+
import jdk.internal.vm.annotation.Hidden;
2930
import jdk.internal.vm.annotation.Stable;
3031

3132
import java.lang.invoke.VarHandle.AccessMode;
@@ -108,14 +109,15 @@ final MethodType getMethodType(int type) {
108109
}
109110

110111
@ForceInline
112+
@Hidden
111113
final MemberName getMemberName(int mode) {
112114
// Can be simplified by calling getMemberNameOrNull, but written in this
113115
// form to improve interpreter/coldpath performance.
114116
MemberName mn = memberName_table[mode];
115117
if (mn == null) {
116118
mn = resolveMemberName(mode);
117119
if (mn == null) {
118-
throw new UnsupportedOperationException();
120+
throw new UnsupportedOperationException(AccessMode.valueFromOrdinal(mode).methodName());
119121
}
120122
}
121123
return mn;
@@ -132,7 +134,7 @@ final MemberName getMemberNameOrNull(int mode) {
132134

133135
@DontInline
134136
MemberName resolveMemberName(int mode) {
135-
AccessMode value = AccessMode.values()[mode];
137+
AccessMode value = AccessMode.valueFromOrdinal(mode);
136138
String methodName = value.methodName();
137139
MethodType type = methodType_table[value.at.ordinal()].insertParameterTypes(0, VarHandle.class);
138140
return memberName_table[mode] = MethodHandles.Lookup.IMPL_LOOKUP

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1989,6 +1989,11 @@ public static AccessMode valueFromMethodName(String methodName) {
19891989
default -> throw new IllegalArgumentException("No AccessMode value for method name " + methodName);
19901990
};
19911991
}
1992+
1993+
private static final @Stable AccessMode[] VALUES = values();
1994+
static AccessMode valueFromOrdinal(int mode) {
1995+
return VALUES[mode];
1996+
}
19921997
}
19931998

19941999
static final class AccessDescriptor {
@@ -2187,7 +2192,7 @@ final MethodHandle getMethodHandle(int mode) {
21872192
}
21882193

21892194
MethodHandle getMethodHandleUncached(int mode) {
2190-
MethodType mt = accessModeType(AccessMode.values()[mode]).
2195+
MethodType mt = accessModeType(AccessMode.valueFromOrdinal(mode)).
21912196
insertParameterTypes(0, VarHandle.class);
21922197
MemberName mn = vform.getMemberName(mode);
21932198
DirectMethodHandle dmh = DirectMethodHandle.make(mn);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it

0 commit comments

Comments
 (0)