1
1
/*
2
- * Copyright (c) 2020, 2022 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2020, 2023 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
27
27
package java .lang .invoke ;
28
28
29
29
import jdk .internal .vm .annotation .ForceInline ;
30
- import jdk .internal .vm .annotation .Stable ;
31
30
32
- import java .util .List ;
33
31
import java .util .function .BiFunction ;
34
32
35
33
/**
44
42
*/
45
43
/* package */ final class IndirectVarHandle extends VarHandle {
46
44
47
- @ Stable
48
- private final MethodHandle [] handleMap = new MethodHandle [AccessMode .COUNT ];
49
45
private final VarHandle directTarget ; // cache, for performance reasons
50
46
private final VarHandle target ;
51
47
private final BiFunction <AccessMode , MethodHandle , MethodHandle > handleFactory ;
@@ -66,16 +62,6 @@ private IndirectVarHandle(VarHandle target, Class<?> value, Class<?>[] coordinat
66
62
this .coordinates = coordinates ;
67
63
}
68
64
69
- @ Override
70
- public Class <?> varType () {
71
- return value ;
72
- }
73
-
74
- @ Override
75
- public List <Class <?>> coordinateTypes () {
76
- return List .of (coordinates );
77
- }
78
-
79
65
@ Override
80
66
MethodType accessModeTypeUncached (AccessType at ) {
81
67
return at .accessModeType (null , value , coordinates );
@@ -86,17 +72,20 @@ VarHandle asDirect() {
86
72
return directTarget ;
87
73
}
88
74
89
- VarHandle target () {
90
- return target ;
91
- }
92
-
93
75
@ Override
94
76
public VarHandle withInvokeExactBehavior () {
95
77
return hasInvokeExactBehavior ()
96
78
? this
97
79
: new IndirectVarHandle (target , value , coordinates , handleFactory , vform , true );
98
80
}
99
81
82
+ @ Override
83
+ public VarHandle withInvokeBehavior () {
84
+ return !hasInvokeExactBehavior ()
85
+ ? this
86
+ : new IndirectVarHandle (target , value , coordinates , handleFactory , vform , false );
87
+ }
88
+
100
89
@ ForceInline
101
90
boolean checkAccessModeThenIsDirect (VarHandle .AccessDescriptor ad ) {
102
91
super .checkAccessModeThenIsDirect (ad );
@@ -105,21 +94,14 @@ boolean checkAccessModeThenIsDirect(VarHandle.AccessDescriptor ad) {
105
94
}
106
95
107
96
@ Override
108
- public VarHandle withInvokeBehavior () {
109
- return !hasInvokeExactBehavior ()
110
- ? this
111
- : new IndirectVarHandle (target , value , coordinates , handleFactory , vform , false );
97
+ public boolean isAccessModeSupported (AccessMode accessMode ) {
98
+ return directTarget .isAccessModeSupported (accessMode );
112
99
}
113
100
114
101
@ Override
115
- @ ForceInline
116
- MethodHandle getMethodHandle (int mode ) {
117
- MethodHandle handle = handleMap [mode ];
118
- if (handle == null ) {
119
- MethodHandle targetHandle = target .getMethodHandle (mode ); // might throw UOE of access mode is not supported, which is ok
120
- handle = handleMap [mode ] = handleFactory .apply (AccessMode .values ()[mode ], targetHandle );
121
- }
122
- return handle ;
102
+ MethodHandle getMethodHandleUncached (int mode ) {
103
+ 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 );
123
105
}
124
106
125
107
@ Override
0 commit comments