1 /* |
1 /* |
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1999, 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 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "ci/ciInstanceKlass.hpp" |
26 #include "ci/ciInstanceKlass.hpp" |
27 #include "ci/ciObjArrayKlass.hpp" |
27 #include "ci/ciObjArrayKlass.hpp" |
28 #include "ci/ciObjArrayKlassKlass.hpp" |
|
29 #include "ci/ciSymbol.hpp" |
28 #include "ci/ciSymbol.hpp" |
30 #include "ci/ciUtilities.hpp" |
29 #include "ci/ciUtilities.hpp" |
31 #include "oops/objArrayKlass.hpp" |
30 #include "oops/objArrayKlass.hpp" |
32 |
31 |
33 // ciObjArrayKlass |
32 // ciObjArrayKlass |
34 // |
33 // |
35 // This class represents a klassOop in the HotSpot virtual machine |
34 // This class represents a Klass* in the HotSpot virtual machine |
36 // whose Klass part is an objArrayKlass. |
35 // whose Klass part is an objArrayKlass. |
37 |
36 |
38 // ------------------------------------------------------------------ |
37 // ------------------------------------------------------------------ |
39 // ciObjArrayKlass::ciObjArrayKlass |
38 // ciObjArrayKlass::ciObjArrayKlass |
40 // |
39 // |
41 // Constructor for loaded object array klasses. |
40 // Constructor for loaded object array klasses. |
42 ciObjArrayKlass::ciObjArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) { |
41 ciObjArrayKlass::ciObjArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) { |
43 assert(get_Klass()->oop_is_objArray(), "wrong type"); |
42 assert(get_Klass()->oop_is_objArray(), "wrong type"); |
44 klassOop element_klassOop = get_objArrayKlass()->bottom_klass(); |
43 Klass* element_Klass = get_objArrayKlass()->bottom_klass(); |
45 _base_element_klass = CURRENT_ENV->get_object(element_klassOop)->as_klass(); |
44 _base_element_klass = CURRENT_ENV->get_klass(element_Klass); |
46 assert(_base_element_klass->is_instance_klass() || |
45 assert(_base_element_klass->is_instance_klass() || |
47 _base_element_klass->is_type_array_klass(), "bad base klass"); |
46 _base_element_klass->is_type_array_klass(), "bad base klass"); |
48 if (dimension() == 1) { |
47 if (dimension() == 1) { |
49 _element_klass = _base_element_klass; |
48 _element_klass = _base_element_klass; |
50 } else { |
49 } else { |
61 // Constructor for unloaded object array klasses. |
60 // Constructor for unloaded object array klasses. |
62 ciObjArrayKlass::ciObjArrayKlass(ciSymbol* array_name, |
61 ciObjArrayKlass::ciObjArrayKlass(ciSymbol* array_name, |
63 ciKlass* base_element_klass, |
62 ciKlass* base_element_klass, |
64 int dimension) |
63 int dimension) |
65 : ciArrayKlass(array_name, |
64 : ciArrayKlass(array_name, |
66 dimension, |
65 dimension, T_OBJECT) { |
67 ciObjArrayKlassKlass::make()) { |
|
68 _base_element_klass = base_element_klass; |
66 _base_element_klass = base_element_klass; |
69 assert(_base_element_klass->is_instance_klass() || |
67 assert(_base_element_klass->is_instance_klass() || |
70 _base_element_klass->is_type_array_klass(), "bad base klass"); |
68 _base_element_klass->is_type_array_klass(), "bad base klass"); |
71 if (dimension == 1) { |
69 if (dimension == 1) { |
72 _element_klass = base_element_klass; |
70 _element_klass = base_element_klass; |
83 if (_element_klass == NULL) { |
81 if (_element_klass == NULL) { |
84 assert(dimension() > 1, "_element_klass should not be NULL"); |
82 assert(dimension() > 1, "_element_klass should not be NULL"); |
85 // Produce the element klass. |
83 // Produce the element klass. |
86 if (is_loaded()) { |
84 if (is_loaded()) { |
87 VM_ENTRY_MARK; |
85 VM_ENTRY_MARK; |
88 klassOop element_klassOop = get_objArrayKlass()->element_klass(); |
86 Klass* element_Klass = get_objArrayKlass()->element_klass(); |
89 _element_klass = CURRENT_THREAD_ENV->get_object(element_klassOop)->as_klass(); |
87 _element_klass = CURRENT_THREAD_ENV->get_klass(element_Klass); |
90 } else { |
88 } else { |
91 VM_ENTRY_MARK; |
89 VM_ENTRY_MARK; |
92 // We are an unloaded array klass. Attempt to fetch our |
90 // We are an unloaded array klass. Attempt to fetch our |
93 // element klass by name. |
91 // element klass by name. |
94 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( |
92 _element_klass = CURRENT_THREAD_ENV->get_klass_by_name_impl( |
152 ciObjArrayKlass* ciObjArrayKlass::make_impl(ciKlass* element_klass) { |
150 ciObjArrayKlass* ciObjArrayKlass::make_impl(ciKlass* element_klass) { |
153 |
151 |
154 if (element_klass->is_loaded()) { |
152 if (element_klass->is_loaded()) { |
155 EXCEPTION_CONTEXT; |
153 EXCEPTION_CONTEXT; |
156 // The element klass is loaded |
154 // The element klass is loaded |
157 klassOop array = element_klass->get_Klass()->array_klass(THREAD); |
155 Klass* array = element_klass->get_Klass()->array_klass(THREAD); |
158 if (HAS_PENDING_EXCEPTION) { |
156 if (HAS_PENDING_EXCEPTION) { |
159 CLEAR_PENDING_EXCEPTION; |
157 CLEAR_PENDING_EXCEPTION; |
160 CURRENT_THREAD_ENV->record_out_of_memory_failure(); |
158 CURRENT_THREAD_ENV->record_out_of_memory_failure(); |
161 return ciEnv::unloaded_ciobjarrayklass(); |
159 return ciEnv::unloaded_ciobjarrayklass(); |
162 } |
160 } |
163 return CURRENT_THREAD_ENV->get_object(array)->as_obj_array_klass(); |
161 return CURRENT_THREAD_ENV->get_obj_array_klass(array); |
164 } |
162 } |
165 |
163 |
166 // The array klass was unable to be made or the element klass was |
164 // The array klass was unable to be made or the element klass was |
167 // not loaded. |
165 // not loaded. |
168 ciSymbol* array_name = construct_array_name(element_klass->name(), 1); |
166 ciSymbol* array_name = construct_array_name(element_klass->name(), 1); |
177 // ------------------------------------------------------------------ |
175 // ------------------------------------------------------------------ |
178 // ciObjArrayKlass::make |
176 // ciObjArrayKlass::make |
179 // |
177 // |
180 // Make an array klass corresponding to the specified primitive type. |
178 // Make an array klass corresponding to the specified primitive type. |
181 ciObjArrayKlass* ciObjArrayKlass::make(ciKlass* element_klass) { |
179 ciObjArrayKlass* ciObjArrayKlass::make(ciKlass* element_klass) { |
182 assert(element_klass->is_java_klass(), "wrong kind of klass"); |
|
183 GUARDED_VM_ENTRY(return make_impl(element_klass);) |
180 GUARDED_VM_ENTRY(return make_impl(element_klass);) |
184 } |
181 } |