< prev index next >

src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java

Print this page
rev 55090 : secret-sfac


 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);


< prev index next >