1 /* |
1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
23 */ |
23 */ |
24 |
24 |
25 #ifndef SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP |
25 #ifndef SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP |
26 #define SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP |
26 #define SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP |
27 |
27 |
28 #include "oops/constantPoolOop.hpp" |
28 #include "oops/constantPool.hpp" |
29 #include "oops/klassOop.hpp" |
|
30 #include "oops/oop.inline.hpp" |
|
31 #include "oops/symbol.hpp" |
29 #include "oops/symbol.hpp" |
32 #include "runtime/fieldType.hpp" |
30 #include "runtime/fieldType.hpp" |
33 #include "utilities/accessFlags.hpp" |
31 #include "utilities/accessFlags.hpp" |
34 #include "utilities/constantTag.hpp" |
32 #include "utilities/constantTag.hpp" |
35 |
33 |
43 int _index; // the field index |
41 int _index; // the field index |
44 constantPoolHandle _cp; |
42 constantPoolHandle _cp; |
45 |
43 |
46 // update the access_flags for the field in the klass |
44 // update the access_flags for the field in the klass |
47 void update_klass_field_access_flag() { |
45 void update_klass_field_access_flag() { |
48 instanceKlass* ik = instanceKlass::cast(field_holder()); |
46 InstanceKlass* ik = InstanceKlass::cast(field_holder()); |
49 ik->field(index())->set_access_flags(_access_flags.as_short()); |
47 ik->field(index())->set_access_flags(_access_flags.as_short()); |
50 } |
48 } |
51 |
49 |
52 FieldInfo* field() const { |
50 FieldInfo* field() const { |
53 instanceKlass* ik = instanceKlass::cast(field_holder()); |
51 InstanceKlass* ik = InstanceKlass::cast(field_holder()); |
54 return ik->field(_index); |
52 return ik->field(_index); |
55 } |
53 } |
56 |
54 |
57 public: |
55 public: |
58 Symbol* name() const { |
56 Symbol* name() const { |
59 return field()->name(_cp); |
57 return field()->name(_cp); |
60 } |
58 } |
61 Symbol* signature() const { |
59 Symbol* signature() const { |
62 return field()->signature(_cp); |
60 return field()->signature(_cp); |
63 } |
61 } |
64 klassOop field_holder() const { return _cp->pool_holder(); } |
62 Klass* field_holder() const { return _cp->pool_holder(); } |
65 constantPoolOop constants() const { return _cp(); } |
63 ConstantPool* constants() const { return _cp(); } |
66 AccessFlags access_flags() const { return _access_flags; } |
64 AccessFlags access_flags() const { return _access_flags; } |
67 oop loader() const; |
65 oop loader() const; |
68 // Offset (in words) of field from start of instanceOop / klassOop |
66 // Offset (in words) of field from start of instanceOop / Klass* |
69 int offset() const { return field()->offset(); } |
67 int offset() const { return field()->offset(); } |
70 Symbol* generic_signature() const; |
68 Symbol* generic_signature() const; |
71 int index() const { return _index; } |
69 int index() const { return _index; } |
72 typeArrayOop annotations() const; |
70 AnnotationArray* annotations() const; |
73 |
71 |
74 // Initial field value |
72 // Initial field value |
75 bool has_initial_value() const { return field()->initval_index() != 0; } |
73 bool has_initial_value() const { return field()->initval_index() != 0; } |
76 int initial_value_index() const { return field()->initval_index(); } |
74 int initial_value_index() const { return field()->initval_index(); } |
77 constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() |
75 constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() |
111 _access_flags.set_is_field_modification_watched(value); |
109 _access_flags.set_is_field_modification_watched(value); |
112 update_klass_field_access_flag(); |
110 update_klass_field_access_flag(); |
113 } |
111 } |
114 |
112 |
115 // Initialization |
113 // Initialization |
116 void initialize(klassOop k, int index); |
114 void initialize(InstanceKlass* ik, int index); |
117 |
115 |
118 // Print |
116 // Print |
119 void print() { print_on(tty); } |
117 void print() { print_on(tty); } |
120 void print_on(outputStream* st) const PRODUCT_RETURN; |
118 void print_on(outputStream* st) const PRODUCT_RETURN; |
121 void print_on_for(outputStream* st, oop obj) PRODUCT_RETURN; |
119 void print_on_for(outputStream* st, oop obj) PRODUCT_RETURN; |