< prev index next >
src/java.base/share/classes/java/lang/invoke/VarHandle.java
Print this page
rev 15320 : 8163370: Reduce number of classes loaded by common usage of java.lang.invoke
Reviewed-by: igerasim, psandoz
@@ -1055,73 +1055,60 @@
@MethodHandle.PolymorphicSignature
@HotSpotIntrinsicCandidate
Object addAndGet(Object... args);
enum AccessType {
- GET(Object.class) {
- @Override
+ GET(Object.class),
+ SET(void.class),
+ COMPARE_AND_SWAP(boolean.class),
+ COMPARE_AND_EXCHANGE(Object.class),
+ GET_AND_UPDATE(Object.class);
+
+ final Class<?> returnType;
+ final boolean isMonomorphicInReturnType;
+
+ AccessType(Class<?> returnType) {
+ this.returnType = returnType;
+ isMonomorphicInReturnType = returnType != Object.class;
+ }
+
MethodType accessModeType(Class<?> receiver, Class<?> value,
Class<?>... intermediate) {
- Class<?>[] ps = allocateParameters(0, receiver, intermediate);
+ Class<?>[] ps;
+ int i;
+ switch (this) {
+ case GET:
+ ps = allocateParameters(0, receiver, intermediate);
fillParameters(ps, receiver, intermediate);
return MethodType.methodType(value, ps);
- }
- },
- SET(void.class) {
- @Override
- MethodType accessModeType(Class<?> receiver, Class<?> value,
- Class<?>... intermediate) {
- Class<?>[] ps = allocateParameters(1, receiver, intermediate);
- int i = fillParameters(ps, receiver, intermediate);
+ case SET:
+ ps = allocateParameters(1, receiver, intermediate);
+ i = fillParameters(ps, receiver, intermediate);
ps[i] = value;
return MethodType.methodType(void.class, ps);
- }
- },
- COMPARE_AND_SWAP(boolean.class) {
- @Override
- MethodType accessModeType(Class<?> receiver, Class<?> value,
- Class<?>... intermediate) {
- Class<?>[] ps = allocateParameters(2, receiver, intermediate);
- int i = fillParameters(ps, receiver, intermediate);
+ case COMPARE_AND_SWAP:
+ ps = allocateParameters(2, receiver, intermediate);
+ i = fillParameters(ps, receiver, intermediate);
ps[i++] = value;
ps[i] = value;
return MethodType.methodType(boolean.class, ps);
- }
- },
- COMPARE_AND_EXCHANGE(Object.class) {
- @Override
- MethodType accessModeType(Class<?> receiver, Class<?> value,
- Class<?>... intermediate) {
- Class<?>[] ps = allocateParameters(2, receiver, intermediate);
- int i = fillParameters(ps, receiver, intermediate);
+ case COMPARE_AND_EXCHANGE:
+ ps = allocateParameters(2, receiver, intermediate);
+ i = fillParameters(ps, receiver, intermediate);
ps[i++] = value;
ps[i] = value;
return MethodType.methodType(value, ps);
- }
- },
- GET_AND_UPDATE(Object.class) {
- @Override
- MethodType accessModeType(Class<?> receiver, Class<?> value,
- Class<?>... intermediate) {
- Class<?>[] ps = allocateParameters(1, receiver, intermediate);
- int i = fillParameters(ps, receiver, intermediate);
+ case GET_AND_UPDATE:
+ ps = allocateParameters(1, receiver, intermediate);
+ i = fillParameters(ps, receiver, intermediate);
ps[i] = value;
return MethodType.methodType(value, ps);
+ default:
+ throw new InternalError("Unknown AccessType");
}
- };
-
- final Class<?> returnType;
- final boolean isMonomorphicInReturnType;
-
- AccessType(Class<?> returnType) {
- this.returnType = returnType;
- isMonomorphicInReturnType = returnType != Object.class;
}
- abstract MethodType accessModeType(Class<?> receiver, Class<?> value,
- Class<?>... intermediate);
-
private static Class<?>[] allocateParameters(int values,
Class<?> receiver, Class<?>... intermediate) {
int size = ((receiver != null) ? 1 : 0) + intermediate.length + values;
return new Class<?>[size];
}
< prev index next >