28 #include "ci/ciUtilities.hpp" |
28 #include "ci/ciUtilities.hpp" |
29 #include "oops/oop.inline.hpp" |
29 #include "oops/oop.inline.hpp" |
30 |
30 |
31 // ciKlass |
31 // ciKlass |
32 // |
32 // |
33 // This class represents a klassOop in the HotSpot virtual |
33 // This class represents a Klass* in the HotSpot virtual |
34 // machine. |
34 // machine. |
35 |
35 |
36 // ------------------------------------------------------------------ |
36 // ------------------------------------------------------------------ |
37 // ciKlass::ciKlass |
37 // ciKlass::ciKlass |
38 ciKlass::ciKlass(KlassHandle h_k) : ciType(h_k) { |
38 ciKlass::ciKlass(KlassHandle h_k) : ciType(h_k) { |
39 assert(get_oop()->is_klass(), "wrong type"); |
39 assert(get_Klass()->is_klass(), "wrong type"); |
40 Klass* k = get_Klass(); |
40 Klass* k = get_Klass(); |
41 _layout_helper = k->layout_helper(); |
41 _layout_helper = k->layout_helper(); |
42 Symbol* klass_name = k->name(); |
42 Symbol* klass_name = k->name(); |
43 assert(klass_name != NULL, "wrong ciKlass constructor"); |
43 assert(klass_name != NULL, "wrong ciKlass constructor"); |
44 _name = CURRENT_ENV->get_symbol(klass_name); |
44 _name = CURRENT_ENV->get_symbol(klass_name); |
47 // ------------------------------------------------------------------ |
47 // ------------------------------------------------------------------ |
48 // ciKlass::ciKlass |
48 // ciKlass::ciKlass |
49 // |
49 // |
50 // Nameless klass variant. |
50 // Nameless klass variant. |
51 ciKlass::ciKlass(KlassHandle h_k, ciSymbol* name) : ciType(h_k) { |
51 ciKlass::ciKlass(KlassHandle h_k, ciSymbol* name) : ciType(h_k) { |
52 assert(get_oop()->is_klass(), "wrong type"); |
52 assert(get_Klass()->is_klass(), "wrong type"); |
53 _name = name; |
53 _name = name; |
54 _layout_helper = Klass::_lh_neutral_value; |
54 _layout_helper = Klass::_lh_neutral_value; |
55 } |
55 } |
56 |
56 |
57 // ------------------------------------------------------------------ |
57 // ------------------------------------------------------------------ |
58 // ciKlass::ciKlass |
58 // ciKlass::ciKlass |
59 // |
59 // |
60 // Unloaded klass variant. |
60 // Unloaded klass variant. |
61 ciKlass::ciKlass(ciSymbol* name, ciKlass* klass) : ciType(klass) { |
61 ciKlass::ciKlass(ciSymbol* name, BasicType bt) : ciType(bt) { |
62 _name = name; |
62 _name = name; |
63 _layout_helper = Klass::_lh_neutral_value; |
63 _layout_helper = Klass::_lh_neutral_value; |
64 } |
64 } |
65 |
65 |
66 // ------------------------------------------------------------------ |
66 // ------------------------------------------------------------------ |
67 // ciKlass::is_subtype_of |
67 // ciKlass::is_subtype_of |
68 bool ciKlass::is_subtype_of(ciKlass* that) { |
68 bool ciKlass::is_subtype_of(ciKlass* that) { |
69 assert(is_loaded() && that->is_loaded(), "must be loaded"); |
69 assert(is_loaded() && that->is_loaded(), "must be loaded"); |
70 assert(is_java_klass() && that->is_java_klass(), "must be java klasses"); |
|
71 // Check to see if the klasses are identical. |
70 // Check to see if the klasses are identical. |
72 if (this == that) { |
71 if (this == that) { |
73 return true; |
72 return true; |
74 } |
73 } |
75 |
74 |
76 VM_ENTRY_MARK; |
75 VM_ENTRY_MARK; |
77 Klass* this_klass = get_Klass(); |
76 Klass* this_klass = get_Klass(); |
78 klassOop that_klass = that->get_klassOop(); |
77 Klass* that_klass = that->get_Klass(); |
79 bool result = this_klass->is_subtype_of(that_klass); |
78 bool result = this_klass->is_subtype_of(that_klass); |
80 |
79 |
81 return result; |
80 return result; |
82 } |
81 } |
83 |
82 |
84 // ------------------------------------------------------------------ |
83 // ------------------------------------------------------------------ |
85 // ciKlass::is_subclass_of |
84 // ciKlass::is_subclass_of |
86 bool ciKlass::is_subclass_of(ciKlass* that) { |
85 bool ciKlass::is_subclass_of(ciKlass* that) { |
87 assert(is_loaded() && that->is_loaded(), "must be loaded"); |
86 assert(is_loaded() && that->is_loaded(), "must be loaded"); |
88 assert(is_java_klass() && that->is_java_klass(), "must be java klasses"); |
|
89 // Check to see if the klasses are identical. |
87 // Check to see if the klasses are identical. |
90 |
88 |
91 VM_ENTRY_MARK; |
89 VM_ENTRY_MARK; |
92 Klass* this_klass = get_Klass(); |
90 Klass* this_klass = get_Klass(); |
93 klassOop that_klass = that->get_klassOop(); |
91 Klass* that_klass = that->get_Klass(); |
94 bool result = this_klass->is_subclass_of(that_klass); |
92 bool result = this_klass->is_subclass_of(that_klass); |
95 |
93 |
96 return result; |
94 return result; |
97 } |
95 } |
98 |
96 |
99 // ------------------------------------------------------------------ |
97 // ------------------------------------------------------------------ |
100 // ciKlass::super_depth |
98 // ciKlass::super_depth |
101 juint ciKlass::super_depth() { |
99 juint ciKlass::super_depth() { |
102 assert(is_loaded(), "must be loaded"); |
100 assert(is_loaded(), "must be loaded"); |
103 assert(is_java_klass(), "must be java klasses"); |
|
104 |
101 |
105 VM_ENTRY_MARK; |
102 VM_ENTRY_MARK; |
106 Klass* this_klass = get_Klass(); |
103 Klass* this_klass = get_Klass(); |
107 return this_klass->super_depth(); |
104 return this_klass->super_depth(); |
108 } |
105 } |
109 |
106 |
110 // ------------------------------------------------------------------ |
107 // ------------------------------------------------------------------ |
111 // ciKlass::super_check_offset |
108 // ciKlass::super_check_offset |
112 juint ciKlass::super_check_offset() { |
109 juint ciKlass::super_check_offset() { |
113 assert(is_loaded(), "must be loaded"); |
110 assert(is_loaded(), "must be loaded"); |
114 assert(is_java_klass(), "must be java klasses"); |
|
115 |
111 |
116 VM_ENTRY_MARK; |
112 VM_ENTRY_MARK; |
117 Klass* this_klass = get_Klass(); |
113 Klass* this_klass = get_Klass(); |
118 return this_klass->super_check_offset(); |
114 return this_klass->super_check_offset(); |
119 } |
115 } |
120 |
116 |
121 // ------------------------------------------------------------------ |
117 // ------------------------------------------------------------------ |
122 // ciKlass::super_of_depth |
118 // ciKlass::super_of_depth |
123 ciKlass* ciKlass::super_of_depth(juint i) { |
119 ciKlass* ciKlass::super_of_depth(juint i) { |
124 assert(is_loaded(), "must be loaded"); |
120 assert(is_loaded(), "must be loaded"); |
125 assert(is_java_klass(), "must be java klasses"); |
121 |
126 |
122 VM_ENTRY_MARK; |
127 VM_ENTRY_MARK; |
123 Klass* this_klass = get_Klass(); |
128 Klass* this_klass = get_Klass(); |
124 Klass* super = this_klass->primary_super_of_depth(i); |
129 klassOop super = this_klass->primary_super_of_depth(i); |
125 return (super != NULL) ? CURRENT_THREAD_ENV->get_klass(super) : NULL; |
130 return (super != NULL) ? CURRENT_THREAD_ENV->get_object(super)->as_klass() : NULL; |
|
131 } |
126 } |
132 |
127 |
133 // ------------------------------------------------------------------ |
128 // ------------------------------------------------------------------ |
134 // ciKlass::can_be_primary_super |
129 // ciKlass::can_be_primary_super |
135 bool ciKlass::can_be_primary_super() { |
130 bool ciKlass::can_be_primary_super() { |
136 assert(is_loaded(), "must be loaded"); |
131 assert(is_loaded(), "must be loaded"); |
137 assert(is_java_klass(), "must be java klasses"); |
|
138 |
132 |
139 VM_ENTRY_MARK; |
133 VM_ENTRY_MARK; |
140 Klass* this_klass = get_Klass(); |
134 Klass* this_klass = get_Klass(); |
141 return this_klass->can_be_primary_super(); |
135 return this_klass->can_be_primary_super(); |
142 } |
136 } |