211 // field to be not constant. |
211 // field to be not constant. |
212 // 2. The field is a *special* static&final field whose value |
212 // 2. The field is a *special* static&final field whose value |
213 // may change. The three examples are java.lang.System.in, |
213 // may change. The three examples are java.lang.System.in, |
214 // java.lang.System.out, and java.lang.System.err. |
214 // java.lang.System.out, and java.lang.System.err. |
215 |
215 |
216 Handle k = _holder->get_klassOop(); |
216 KlassHandle k = _holder->get_klassOop(); |
217 assert( SystemDictionary::System_klass() != NULL, "Check once per vm"); |
217 assert( SystemDictionary::System_klass() != NULL, "Check once per vm"); |
218 if( k() == SystemDictionary::System_klass() ) { |
218 if( k() == SystemDictionary::System_klass() ) { |
219 // Check offsets for case 2: System.in, System.out, or System.err |
219 // Check offsets for case 2: System.in, System.out, or System.err |
220 if( _offset == java_lang_System::in_offset_in_bytes() || |
220 if( _offset == java_lang_System::in_offset_in_bytes() || |
221 _offset == java_lang_System::out_offset_in_bytes() || |
221 _offset == java_lang_System::out_offset_in_bytes() || |
223 _is_constant = false; |
223 _is_constant = false; |
224 return; |
224 return; |
225 } |
225 } |
226 } |
226 } |
227 |
227 |
|
228 Handle mirror = k->java_mirror(); |
|
229 |
228 _is_constant = true; |
230 _is_constant = true; |
229 switch(type()->basic_type()) { |
231 switch(type()->basic_type()) { |
230 case T_BYTE: |
232 case T_BYTE: |
231 _constant_value = ciConstant(type()->basic_type(), k->byte_field(_offset)); |
233 _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset)); |
232 break; |
234 break; |
233 case T_CHAR: |
235 case T_CHAR: |
234 _constant_value = ciConstant(type()->basic_type(), k->char_field(_offset)); |
236 _constant_value = ciConstant(type()->basic_type(), mirror->char_field(_offset)); |
235 break; |
237 break; |
236 case T_SHORT: |
238 case T_SHORT: |
237 _constant_value = ciConstant(type()->basic_type(), k->short_field(_offset)); |
239 _constant_value = ciConstant(type()->basic_type(), mirror->short_field(_offset)); |
238 break; |
240 break; |
239 case T_BOOLEAN: |
241 case T_BOOLEAN: |
240 _constant_value = ciConstant(type()->basic_type(), k->bool_field(_offset)); |
242 _constant_value = ciConstant(type()->basic_type(), mirror->bool_field(_offset)); |
241 break; |
243 break; |
242 case T_INT: |
244 case T_INT: |
243 _constant_value = ciConstant(type()->basic_type(), k->int_field(_offset)); |
245 _constant_value = ciConstant(type()->basic_type(), mirror->int_field(_offset)); |
244 break; |
246 break; |
245 case T_FLOAT: |
247 case T_FLOAT: |
246 _constant_value = ciConstant(k->float_field(_offset)); |
248 _constant_value = ciConstant(mirror->float_field(_offset)); |
247 break; |
249 break; |
248 case T_DOUBLE: |
250 case T_DOUBLE: |
249 _constant_value = ciConstant(k->double_field(_offset)); |
251 _constant_value = ciConstant(mirror->double_field(_offset)); |
250 break; |
252 break; |
251 case T_LONG: |
253 case T_LONG: |
252 _constant_value = ciConstant(k->long_field(_offset)); |
254 _constant_value = ciConstant(mirror->long_field(_offset)); |
253 break; |
255 break; |
254 case T_OBJECT: |
256 case T_OBJECT: |
255 case T_ARRAY: |
257 case T_ARRAY: |
256 { |
258 { |
257 oop o = k->obj_field(_offset); |
259 oop o = mirror->obj_field(_offset); |
258 |
260 |
259 // A field will be "constant" if it is known always to be |
261 // A field will be "constant" if it is known always to be |
260 // a non-null reference to an instance of a particular class, |
262 // a non-null reference to an instance of a particular class, |
261 // or to a particular array. This can happen even if the instance |
263 // or to a particular array. This can happen even if the instance |
262 // or array is not perm. In such a case, an "unloaded" ciArray |
264 // or array is not perm. In such a case, an "unloaded" ciArray |