jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java
changeset 13420 62cedce8afa6
parent 11534 9949ffb8eb3a
child 13423 17843fff200d
equal deleted inserted replaced
13419:ef84025f710f 13420:62cedce8afa6
   188             this.base = staticBase(field);
   188             this.base = staticBase(field);
   189         }
   189         }
   190         @Override
   190         @Override
   191         String debugString() { return addTypeString(name, this); }
   191         String debugString() { return addTypeString(name, this); }
   192 
   192 
   193         int getFieldI(Object /*C*/ obj) { return unsafe.getInt(obj, offset); }
   193         private static Object nullCheck(Object obj) {
   194         void setFieldI(Object /*C*/ obj, int x) { unsafe.putInt(obj, offset, x); }
   194             obj.getClass();  // NPE
   195         long getFieldJ(Object /*C*/ obj) { return unsafe.getLong(obj, offset); }
   195             return obj;
   196         void setFieldJ(Object /*C*/ obj, long x) { unsafe.putLong(obj, offset, x); }
   196         }
   197         float getFieldF(Object /*C*/ obj) { return unsafe.getFloat(obj, offset); }
   197 
   198         void setFieldF(Object /*C*/ obj, float x) { unsafe.putFloat(obj, offset, x); }
   198         int getFieldI(Object /*C*/ obj) { return unsafe.getInt(nullCheck(obj), offset); }
   199         double getFieldD(Object /*C*/ obj) { return unsafe.getDouble(obj, offset); }
   199         void setFieldI(Object /*C*/ obj, int x) { unsafe.putInt(nullCheck(obj), offset, x); }
   200         void setFieldD(Object /*C*/ obj, double x) { unsafe.putDouble(obj, offset, x); }
   200         long getFieldJ(Object /*C*/ obj) { return unsafe.getLong(nullCheck(obj), offset); }
   201         boolean getFieldZ(Object /*C*/ obj) { return unsafe.getBoolean(obj, offset); }
   201         void setFieldJ(Object /*C*/ obj, long x) { unsafe.putLong(nullCheck(obj), offset, x); }
   202         void setFieldZ(Object /*C*/ obj, boolean x) { unsafe.putBoolean(obj, offset, x); }
   202         float getFieldF(Object /*C*/ obj) { return unsafe.getFloat(nullCheck(obj), offset); }
   203         byte getFieldB(Object /*C*/ obj) { return unsafe.getByte(obj, offset); }
   203         void setFieldF(Object /*C*/ obj, float x) { unsafe.putFloat(nullCheck(obj), offset, x); }
   204         void setFieldB(Object /*C*/ obj, byte x) { unsafe.putByte(obj, offset, x); }
   204         double getFieldD(Object /*C*/ obj) { return unsafe.getDouble(nullCheck(obj), offset); }
   205         short getFieldS(Object /*C*/ obj) { return unsafe.getShort(obj, offset); }
   205         void setFieldD(Object /*C*/ obj, double x) { unsafe.putDouble(nullCheck(obj), offset, x); }
   206         void setFieldS(Object /*C*/ obj, short x) { unsafe.putShort(obj, offset, x); }
   206         boolean getFieldZ(Object /*C*/ obj) { return unsafe.getBoolean(nullCheck(obj), offset); }
   207         char getFieldC(Object /*C*/ obj) { return unsafe.getChar(obj, offset); }
   207         void setFieldZ(Object /*C*/ obj, boolean x) { unsafe.putBoolean(nullCheck(obj), offset, x); }
   208         void setFieldC(Object /*C*/ obj, char x) { unsafe.putChar(obj, offset, x); }
   208         byte getFieldB(Object /*C*/ obj) { return unsafe.getByte(nullCheck(obj), offset); }
   209         Object /*V*/ getFieldL(Object /*C*/ obj) { return unsafe.getObject(obj, offset); }
   209         void setFieldB(Object /*C*/ obj, byte x) { unsafe.putByte(nullCheck(obj), offset, x); }
   210         void setFieldL(Object /*C*/ obj, Object /*V*/ x) { unsafe.putObject(obj, offset, x); }
   210         short getFieldS(Object /*C*/ obj) { return unsafe.getShort(nullCheck(obj), offset); }
   211         // cast (V) is OK here, since we wrap convertArguments around the MH.
   211         void setFieldS(Object /*C*/ obj, short x) { unsafe.putShort(nullCheck(obj), offset, x); }
       
   212         char getFieldC(Object /*C*/ obj) { return unsafe.getChar(nullCheck(obj), offset); }
       
   213         void setFieldC(Object /*C*/ obj, char x) { unsafe.putChar(nullCheck(obj), offset, x); }
       
   214         Object /*V*/ getFieldL(Object /*C*/ obj) { return unsafe.getObject(nullCheck(obj), offset); }
       
   215         void setFieldL(Object /*C*/ obj, Object /*V*/ x) { unsafe.putObject(nullCheck(obj), offset, x); }
   212 
   216 
   213         static Object staticBase(final MemberName field) {
   217         static Object staticBase(final MemberName field) {
   214             if (!field.isStatic())  return null;
   218             if (!field.isStatic())  return null;
   215             return AccessController.doPrivileged(new PrivilegedAction<Object>() {
   219             return AccessController.doPrivileged(new PrivilegedAction<Object>() {
   216                     public Object run() {
   220                     public Object run() {
   217                         try {
   221                         try {
   218                             Class c = field.getDeclaringClass();
   222                             Class<?> c = field.getDeclaringClass();
   219                             // FIXME:  Should not have to create 'f' to get this value.
   223                             // FIXME:  Should not have to create 'f' to get this value.
   220                             java.lang.reflect.Field f = c.getDeclaredField(field.getName());
   224                             java.lang.reflect.Field f = c.getDeclaredField(field.getName());
   221                             return unsafe.staticFieldBase(f);
   225                             return unsafe.staticFieldBase(f);
   222                         } catch (NoSuchFieldException ee) {
   226                         } catch (NoSuchFieldException ee) {
   223                             throw uncaughtException(ee);
   227                             throw uncaughtException(ee);
   240         void setStaticB(byte x) { unsafe.putByte(base, offset, x); }
   244         void setStaticB(byte x) { unsafe.putByte(base, offset, x); }
   241         short getStaticS() { return unsafe.getShort(base, offset); }
   245         short getStaticS() { return unsafe.getShort(base, offset); }
   242         void setStaticS(short x) { unsafe.putShort(base, offset, x); }
   246         void setStaticS(short x) { unsafe.putShort(base, offset, x); }
   243         char getStaticC() { return unsafe.getChar(base, offset); }
   247         char getStaticC() { return unsafe.getChar(base, offset); }
   244         void setStaticC(char x) { unsafe.putChar(base, offset, x); }
   248         void setStaticC(char x) { unsafe.putChar(base, offset, x); }
   245         @SuppressWarnings("unchecked")  // (V) is for internal clarity but triggers warning
       
   246         Object /*V*/ getStaticL() { return unsafe.getObject(base, offset); }
   249         Object /*V*/ getStaticL() { return unsafe.getObject(base, offset); }
   247         void setStaticL(Object /*V*/ x) { unsafe.putObject(base, offset, x); }
   250         void setStaticL(Object /*V*/ x) { unsafe.putObject(base, offset, x); }
   248 
   251 
   249         static String fname(Class<?> vclass, boolean isSetter, boolean isStatic) {
   252         static String fname(Class<?> vclass, boolean isSetter, boolean isStatic) {
   250             String stem;
   253             String stem;