Mercurial > hg > truffle
comparison src/share/vm/ci/ciObjArrayKlass.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | ddd894528dbc |
children | d8ce2825b193 |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
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 } |