29
29
import jdk .internal .vm .annotation .ForceInline ;
30
30
import jdk .internal .vm .annotation .Stable ;
31
31
32
+ import java .util .List ;
32
33
import java .util .function .BiFunction ;
33
34
34
35
/**
48
49
private final VarHandle directTarget ; // cache, for performance reasons
49
50
private final VarHandle target ;
50
51
private final BiFunction <AccessMode , MethodHandle , MethodHandle > handleFactory ;
52
+ private final Class <?> value ;
53
+ private final Class <?>[] coordinates ;
51
54
52
55
IndirectVarHandle (VarHandle target , Class <?> value , Class <?>[] coordinates , BiFunction <AccessMode , MethodHandle , MethodHandle > handleFactory ) {
53
56
super (new VarForm (value , coordinates ));
54
57
this .handleFactory = handleFactory ;
55
58
this .target = target ;
56
59
this .directTarget = target .asDirect ();
60
+ this .value = value ;
61
+ this .coordinates = coordinates ;
62
+ }
63
+
64
+ @ Override
65
+ public Class <?> varType () {
66
+ return value ;
67
+ }
68
+
69
+ @ Override
70
+ public List <Class <?>> coordinateTypes () {
71
+ return List .of (coordinates );
57
72
}
58
73
59
74
@ Override
60
75
MethodType accessModeTypeUncached (AccessMode accessMode ) {
61
- return getMethodHandle ( accessMode .ordinal ()). type (). dropParameterTypes ( 0 , 1 );
76
+ return accessMode .at . accessModeType ( directTarget . getClass (), value , coordinates );
62
77
}
63
78
64
79
@ Override
@@ -84,6 +99,6 @@ MethodHandle getMethodHandle(int mode) {
84
99
85
100
@ Override
86
101
public MethodHandle toMethodHandle (AccessMode accessMode ) {
87
- return getMethodHandle (accessMode .ordinal ()).bindTo (this . directTarget );
102
+ return getMethodHandle (accessMode .ordinal ()).bindTo (directTarget );
88
103
}
89
104
}
0 commit comments