61 member.getReferenceKind() == REF_invokeInterface &&
62 member.isMethod() && !member.isAbstract()) {
63 // Check for corner case: invokeinterface of Object method
64 MemberName m = new MemberName(Object.class, member.getName(), member.getMethodType(), member.getReferenceKind());
65 m = MemberName.getFactory().resolveOrNull(m.getReferenceKind(), m, null);
66 if (m != null && m.isPublic()) {
67 assert(member.getReferenceKind() == m.getReferenceKind()); // else this.form is wrong
68 member = m;
69 }
70 }
71
72 this.member = member;
73 }
74
75 // Factory methods:
76 static DirectMethodHandle make(byte refKind, Class<?> refc, MemberName member, Class<?> callerClass) {
77 MethodType mtype = member.getMethodOrFieldType();
78 if (!member.isStatic()) {
79 if (!member.getDeclaringClass().isAssignableFrom(refc) || member.isConstructor())
80 throw new InternalError(member.toString());
81 mtype = mtype.insertParameterTypes(0, refc);
82 }
83 if (!member.isField()) {
84 // refKind reflects the original type of lookup via findSpecial or
85 // findVirtual etc.
86 switch (refKind) {
87 case REF_invokeSpecial: {
88 member = member.asSpecial();
89 // if caller is an interface we need to adapt to get the
90 // receiver check inserted
91 if (callerClass == null) {
92 throw new InternalError("callerClass must not be null for REF_invokeSpecial");
93 }
94 LambdaForm lform = preparedLambdaForm(member, callerClass.isInterface());
95 return new Special(mtype, lform, member, callerClass);
96 }
97 case REF_invokeInterface: {
98 // for interfaces we always need the receiver typecheck,
99 // so we always pass 'true' to ensure we adapt if needed
100 // to include the REF_invokeSpecial case
101 LambdaForm lform = preparedLambdaForm(member, true);
119 return member.canBeNull() ? new Accessor(mtype, lform, member, (int)offset)
120 : new ValueAccessor(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 ctor = ctor.asConstructor();
140 assert(ctor.isConstructor() && ctor.getReferenceKind() == REF_newInvokeSpecial) : ctor;
141 MethodType mtype = ctor.getMethodType().changeReturnType(instanceClass);
142 LambdaForm lform = preparedLambdaForm(ctor);
143 MemberName init = ctor.asSpecial();
144 assert(init.getMethodType().returnType() == void.class);
145 return new Constructor(mtype, lform, ctor, init, instanceClass);
146 }
147
148 @Override
149 BoundMethodHandle rebind() {
150 return BoundMethodHandle.makeReinvoker(this);
151 }
152
153 @Override
154 MethodHandle copyWith(MethodType mt, LambdaForm lf) {
155 assert(this.getClass() == DirectMethodHandle.class); // must override in subclasses
156 return new DirectMethodHandle(mt, lf, member);
157 }
158
|
61 member.getReferenceKind() == REF_invokeInterface &&
62 member.isMethod() && !member.isAbstract()) {
63 // Check for corner case: invokeinterface of Object method
64 MemberName m = new MemberName(Object.class, member.getName(), member.getMethodType(), member.getReferenceKind());
65 m = MemberName.getFactory().resolveOrNull(m.getReferenceKind(), m, null);
66 if (m != null && m.isPublic()) {
67 assert(member.getReferenceKind() == m.getReferenceKind()); // else this.form is wrong
68 member = m;
69 }
70 }
71
72 this.member = member;
73 }
74
75 // Factory methods:
76 static DirectMethodHandle make(byte refKind, Class<?> refc, MemberName member, Class<?> callerClass) {
77 MethodType mtype = member.getMethodOrFieldType();
78 if (!member.isStatic()) {
79 if (!member.getDeclaringClass().isAssignableFrom(refc) || member.isConstructor())
80 throw new InternalError(member.toString());
81 mtype = mtype.insertParameterTypes(0, refc.isValue() ? refc.asValueType() : refc);
82 }
83 if (!member.isField()) {
84 // refKind reflects the original type of lookup via findSpecial or
85 // findVirtual etc.
86 switch (refKind) {
87 case REF_invokeSpecial: {
88 member = member.asSpecial();
89 // if caller is an interface we need to adapt to get the
90 // receiver check inserted
91 if (callerClass == null) {
92 throw new InternalError("callerClass must not be null for REF_invokeSpecial");
93 }
94 LambdaForm lform = preparedLambdaForm(member, callerClass.isInterface());
95 return new Special(mtype, lform, member, callerClass);
96 }
97 case REF_invokeInterface: {
98 // for interfaces we always need the receiver typecheck,
99 // so we always pass 'true' to ensure we adapt if needed
100 // to include the REF_invokeSpecial case
101 LambdaForm lform = preparedLambdaForm(member, true);
119 return member.canBeNull() ? new Accessor(mtype, lform, member, (int)offset)
120 : new ValueAccessor(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);
153 }
154
155 @Override
156 MethodHandle copyWith(MethodType mt, LambdaForm lf) {
157 assert(this.getClass() == DirectMethodHandle.class); // must override in subclasses
158 return new DirectMethodHandle(mt, lf, member);
159 }
160
|