Mercurial > hg > truffle
comparison src/share/vm/graal/graalEnv.cpp @ 3654:4123781869da
More handles, fixed broken cast.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Thu, 17 Nov 2011 00:28:31 +0100 |
parents | 6aef50c6d967 |
children | d24f157f2ba8 |
comparison
equal
deleted
inserted
replaced
3653:6aef50c6d967 | 3654:4123781869da |
---|---|
47 // ------------------------------------------------------------------ | 47 // ------------------------------------------------------------------ |
48 // ciEnv::check_klass_accessiblity | 48 // ciEnv::check_klass_accessiblity |
49 // | 49 // |
50 // Note: the logic of this method should mirror the logic of | 50 // Note: the logic of this method should mirror the logic of |
51 // constantPoolOopDesc::verify_constant_pool_resolve. | 51 // constantPoolOopDesc::verify_constant_pool_resolve. |
52 bool GraalEnv::check_klass_accessibility(klassOop accessing_klass, klassOop resolved_klass) { | 52 bool GraalEnv::check_klass_accessibility(KlassHandle accessing_klass, KlassHandle resolved_klass) { |
53 if (accessing_klass->klass_part()->oop_is_objArray()) { | 53 if (accessing_klass->oop_is_objArray()) { |
54 accessing_klass = ((objArrayKlass*)accessing_klass)->bottom_klass(); | 54 accessing_klass = objArrayKlass::cast(accessing_klass())->bottom_klass(); |
55 } | 55 } |
56 if (!accessing_klass->klass_part()->oop_is_instance()) { | 56 if (!accessing_klass->oop_is_instance()) { |
57 return true; | 57 return true; |
58 } | 58 } |
59 | 59 |
60 if (resolved_klass->klass_part()->oop_is_objArray()) { | 60 if (resolved_klass->oop_is_objArray()) { |
61 // Find the element klass, if this is an array. | 61 // Find the element klass, if this is an array. |
62 resolved_klass = objArrayKlass::cast(resolved_klass)->bottom_klass(); | 62 resolved_klass = objArrayKlass::cast(resolved_klass())->bottom_klass(); |
63 } | 63 } |
64 if (resolved_klass->klass_part()->oop_is_instance()) { | 64 if (resolved_klass->oop_is_instance()) { |
65 return Reflection::verify_class_access(accessing_klass, resolved_klass, true); | 65 return Reflection::verify_class_access(accessing_klass(), resolved_klass(), true); |
66 } | 66 } |
67 return true; | 67 return true; |
68 } | 68 } |
69 | 69 |
70 // ------------------------------------------------------------------ | 70 // ------------------------------------------------------------------ |
71 // ciEnv::get_klass_by_name_impl | 71 // ciEnv::get_klass_by_name_impl |
72 klassOop GraalEnv::get_klass_by_name_impl(KlassHandle accessing_klass, | 72 KlassHandle GraalEnv::get_klass_by_name_impl(KlassHandle accessing_klass, |
73 constantPoolHandle cpool, | 73 constantPoolHandle cpool, |
74 Symbol* sym, | 74 Symbol* sym, |
75 bool require_local) { | 75 bool require_local) { |
76 EXCEPTION_CONTEXT; | 76 EXCEPTION_CONTEXT; |
77 | 77 |
80 sym->byte_at(sym->utf8_length()-1) == ';') { | 80 sym->byte_at(sym->utf8_length()-1) == ';') { |
81 // This is a name from a signature. Strip off the trimmings. | 81 // This is a name from a signature. Strip off the trimmings. |
82 // Call recursive to keep scope of strippedsym. | 82 // Call recursive to keep scope of strippedsym. |
83 TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, | 83 TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, |
84 sym->utf8_length()-2, | 84 sym->utf8_length()-2, |
85 CHECK_NULL); | 85 CHECK_(KlassHandle())); |
86 return get_klass_by_name_impl(accessing_klass, cpool, strippedsym, require_local); | 86 return get_klass_by_name_impl(accessing_klass, cpool, strippedsym, require_local); |
87 } | 87 } |
88 | 88 |
89 Handle loader(THREAD, (oop)NULL); | 89 Handle loader(THREAD, (oop)NULL); |
90 Handle domain(THREAD, (oop)NULL); | 90 Handle domain(THREAD, (oop)NULL); |
97 { | 97 { |
98 ttyUnlocker ttyul; // release tty lock to avoid ordering problems | 98 ttyUnlocker ttyul; // release tty lock to avoid ordering problems |
99 MutexLocker ml(Compile_lock); | 99 MutexLocker ml(Compile_lock); |
100 klassOop kls; | 100 klassOop kls; |
101 if (!require_local) { | 101 if (!require_local) { |
102 kls = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader, CHECK_NULL); | 102 kls = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader, CHECK_(KlassHandle())); |
103 } else { | 103 } else { |
104 kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain, CHECK_NULL); | 104 kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain, CHECK_(KlassHandle())); |
105 } | 105 } |
106 found_klass = KlassHandle(THREAD, kls); | 106 found_klass = KlassHandle(THREAD, kls); |
107 } | 107 } |
108 | 108 |
109 // If we fail to find an array klass, look again for its element type. | 109 // If we fail to find an array klass, look again for its element type. |
116 (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) { | 116 (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) { |
117 // We have an unloaded array. | 117 // We have an unloaded array. |
118 // Build it on the fly if the element class exists. | 118 // Build it on the fly if the element class exists. |
119 TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, | 119 TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, |
120 sym->utf8_length()-1, | 120 sym->utf8_length()-1, |
121 CHECK_NULL); | 121 CHECK_(KlassHandle())); |
122 | 122 |
123 // Get element ciKlass recursively. | 123 // Get element ciKlass recursively. |
124 KlassHandle elem_klass = | 124 KlassHandle elem_klass = |
125 get_klass_by_name_impl(accessing_klass, | 125 get_klass_by_name_impl(accessing_klass, |
126 cpool, | 126 cpool, |
127 elem_sym, | 127 elem_sym, |
128 require_local); | 128 require_local); |
129 if (!elem_klass.is_null()) { | 129 if (!elem_klass.is_null()) { |
130 // Now make an array for it | 130 // Now make an array for it |
131 return elem_klass->array_klass(CHECK_NULL); | 131 return elem_klass->array_klass(CHECK_(KlassHandle())); |
132 } | 132 } |
133 } | 133 } |
134 | 134 |
135 if (found_klass.is_null() && !cpool.is_null() && cpool->has_preresolution()) { | 135 if (found_klass.is_null() && !cpool.is_null() && cpool->has_preresolution()) { |
136 // Look inside the constant pool for pre-resolved class entries. | 136 // Look inside the constant pool for pre-resolved class entries. |
161 | 161 |
162 // ------------------------------------------------------------------ | 162 // ------------------------------------------------------------------ |
163 // ciEnv::get_klass_by_index_impl | 163 // ciEnv::get_klass_by_index_impl |
164 // | 164 // |
165 // Implementation of get_klass_by_index. | 165 // Implementation of get_klass_by_index. |
166 klassOop GraalEnv::get_klass_by_index_impl(constantPoolHandle cpool, | 166 KlassHandle GraalEnv::get_klass_by_index_impl(constantPoolHandle cpool, |
167 int index, | 167 int index, |
168 bool& is_accessible, | 168 bool& is_accessible, |
169 KlassHandle accessor) { | 169 KlassHandle accessor) { |
170 EXCEPTION_CONTEXT; | 170 EXCEPTION_CONTEXT; |
171 KlassHandle klass (THREAD, constantPoolOopDesc::klass_at_if_loaded(cpool, index)); | 171 KlassHandle klass (THREAD, constantPoolOopDesc::klass_at_if_loaded(cpool, index)); |
207 is_accessible = false; | 207 is_accessible = false; |
208 } else { | 208 } else { |
209 // Linked locally, and we must also check public/private, etc. | 209 // Linked locally, and we must also check public/private, etc. |
210 is_accessible = check_klass_accessibility(accessor(), k()); | 210 is_accessible = check_klass_accessibility(accessor(), k()); |
211 } | 211 } |
212 return k(); | 212 return k; |
213 } | 213 } |
214 | |
215 // Check for prior unloaded klass. The SystemDictionary's answers | |
216 // can vary over time but the compiler needs consistency. | |
217 Symbol* name = klass()->klass_part()->name(); | |
218 | 214 |
219 // It is known to be accessible, since it was found in the constant pool. | 215 // It is known to be accessible, since it was found in the constant pool. |
220 is_accessible = true; | 216 is_accessible = true; |
221 return klass(); | 217 return klass; |
222 } | 218 } |
223 | 219 |
224 // ------------------------------------------------------------------ | 220 // ------------------------------------------------------------------ |
225 // ciEnv::get_klass_by_index | 221 // ciEnv::get_klass_by_index |
226 // | 222 // |