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 }