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