112 long offset = MethodHandleNatives.staticFieldOffset(member);
113 Object base = MethodHandleNatives.staticFieldBase(member);
114 return member.isValue() ? new StaticValueAccessor(mtype, lform, member, base, offset)
115 : new StaticAccessor(mtype, lform, member, base, offset);
116 } else {
117 long offset = MethodHandleNatives.objectFieldOffset(member);
118 assert(offset == (int)offset);
119 return member.isValue() ? new ValueAccessor(mtype, lform, member, (int)offset)
120 : new Accessor(mtype, lform, member, (int)offset);
121
122 }
123 }
124 }
125 static DirectMethodHandle make(Class<?> refc, MemberName member) {
126 byte refKind = member.getReferenceKind();
127 if (refKind == REF_invokeSpecial)
128 refKind = REF_invokeVirtual;
129 return make(refKind, refc, member, null /* no callerClass context */);
130 }
131 static DirectMethodHandle make(MemberName member) {
132 if (member.isConstructor())
133 return makeAllocator(member);
134 return make(member.getDeclaringClass(), member);
135 }
136 private static DirectMethodHandle makeAllocator(MemberName ctor) {
137 assert(ctor.isConstructor() && ctor.getName().equals("<init>"));
138 Class<?> instanceClass = ctor.getDeclaringClass();
139 if (instanceClass.isValue())
140 instanceClass = instanceClass.asValueType(); // convert to Q-Type
141 ctor = ctor.asConstructor();
142 assert(ctor.isConstructor() && ctor.getReferenceKind() == REF_newInvokeSpecial) : ctor;
143 MethodType mtype = ctor.getMethodType().changeReturnType(instanceClass);
144 LambdaForm lform = preparedLambdaForm(ctor);
145 MemberName init = ctor.asSpecial();
146 assert(init.getMethodType().returnType() == void.class);
147 return new Constructor(mtype, lform, ctor, init, instanceClass);
148 }
149
150 @Override
151 BoundMethodHandle rebind() {
152 return BoundMethodHandle.makeReinvoker(this);
|
112 long offset = MethodHandleNatives.staticFieldOffset(member);
113 Object base = MethodHandleNatives.staticFieldBase(member);
114 return member.isValue() ? new StaticValueAccessor(mtype, lform, member, base, offset)
115 : new StaticAccessor(mtype, lform, member, base, offset);
116 } else {
117 long offset = MethodHandleNatives.objectFieldOffset(member);
118 assert(offset == (int)offset);
119 return member.isValue() ? new ValueAccessor(mtype, lform, member, (int)offset)
120 : new Accessor(mtype, lform, member, (int)offset);
121
122 }
123 }
124 }
125 static DirectMethodHandle make(Class<?> refc, MemberName member) {
126 byte refKind = member.getReferenceKind();
127 if (refKind == REF_invokeSpecial)
128 refKind = REF_invokeVirtual;
129 return make(refKind, refc, member, null /* no callerClass context */);
130 }
131 static DirectMethodHandle make(MemberName member) {
132 if (member.isConstructor() && member.getReturnType() == void.class)
133 return makeAllocator(member);
134 return make(member.getDeclaringClass(), member);
135 }
136 private static DirectMethodHandle makeAllocator(MemberName ctor) {
137 assert(ctor.isConstructor() && ctor.getName().equals("<init>"));
138 Class<?> instanceClass = ctor.getDeclaringClass();
139 if (instanceClass.isValue())
140 instanceClass = instanceClass.asValueType(); // convert to Q-Type
141 ctor = ctor.asConstructor();
142 assert(ctor.isConstructor() && ctor.getReferenceKind() == REF_newInvokeSpecial) : ctor;
143 MethodType mtype = ctor.getMethodType().changeReturnType(instanceClass);
144 LambdaForm lform = preparedLambdaForm(ctor);
145 MemberName init = ctor.asSpecial();
146 assert(init.getMethodType().returnType() == void.class);
147 return new Constructor(mtype, lform, ctor, init, instanceClass);
148 }
149
150 @Override
151 BoundMethodHandle rebind() {
152 return BoundMethodHandle.makeReinvoker(this);
|