src/share/vm/oops/methodDataKlass.cpp

Wed, 02 Jul 2008 12:55:16 -0700

author
xdono
date
Wed, 02 Jul 2008 12:55:16 -0700
changeset 631
d1605aabd0a1
parent 548
ba764ed4b6f2
child 1590
4e6abf09f540
permissions
-rw-r--r--

6719955: Update copyright year
Summary: Update copyright year for files that have been modified in 2008
Reviewed-by: ohair, tbell

duke@435 1 /*
xdono@631 2 * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_methodDataKlass.cpp.incl"
duke@435 27
duke@435 28 klassOop methodDataKlass::create_klass(TRAPS) {
duke@435 29 methodDataKlass o;
duke@435 30 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
duke@435 31 KlassHandle k = base_create_klass(h_this_klass, header_size(),
duke@435 32 o.vtbl_value(), CHECK_NULL);
duke@435 33 // Make sure size calculation is right
duke@435 34 assert(k()->size() == align_object_size(header_size()),
duke@435 35 "wrong size for object");
duke@435 36 return k();
duke@435 37 }
duke@435 38
duke@435 39
duke@435 40 int methodDataKlass::oop_size(oop obj) const {
duke@435 41 assert(obj->is_methodData(), "must be method data oop");
duke@435 42 return methodDataOop(obj)->object_size();
duke@435 43 }
duke@435 44
duke@435 45
duke@435 46 bool methodDataKlass::oop_is_parsable(oop obj) const {
duke@435 47 assert(obj->is_methodData(), "must be method data oop");
duke@435 48 return methodDataOop(obj)->object_is_parsable();
duke@435 49 }
duke@435 50
duke@435 51
duke@435 52 methodDataOop methodDataKlass::allocate(methodHandle method, TRAPS) {
duke@435 53 int size = methodDataOopDesc::compute_allocation_size_in_words(method);
duke@435 54 KlassHandle h_k(THREAD, as_klassOop());
duke@435 55 methodDataOop mdo =
duke@435 56 (methodDataOop)CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL);
duke@435 57 assert(!mdo->is_parsable(), "not expecting parsability yet.");
duke@435 58 No_Safepoint_Verifier no_safepoint; // init function atomic wrt GC
duke@435 59 mdo->initialize(method);
duke@435 60
duke@435 61 assert(mdo->is_parsable(), "should be parsable here.");
duke@435 62 assert(size == mdo->object_size(), "wrong size for methodDataOop");
duke@435 63 return mdo;
duke@435 64 }
duke@435 65
duke@435 66
duke@435 67 void methodDataKlass::oop_follow_contents(oop obj) {
duke@435 68 assert (obj->is_methodData(), "object must be method data");
duke@435 69 methodDataOop m = methodDataOop(obj);
duke@435 70
duke@435 71 obj->follow_header();
duke@435 72 MarkSweep::mark_and_push(m->adr_method());
duke@435 73 ResourceMark rm;
duke@435 74 for (ProfileData* data = m->first_data();
duke@435 75 m->is_valid(data);
duke@435 76 data = m->next_data(data)) {
duke@435 77 data->follow_contents();
duke@435 78 }
duke@435 79 }
duke@435 80
duke@435 81 #ifndef SERIALGC
duke@435 82 void methodDataKlass::oop_follow_contents(ParCompactionManager* cm,
duke@435 83 oop obj) {
duke@435 84 assert (obj->is_methodData(), "object must be method data");
duke@435 85 methodDataOop m = methodDataOop(obj);
duke@435 86
duke@435 87 obj->follow_header(cm);
duke@435 88 PSParallelCompact::mark_and_push(cm, m->adr_method());
duke@435 89 ResourceMark rm;
duke@435 90 for (ProfileData* data = m->first_data();
duke@435 91 m->is_valid(data);
duke@435 92 data = m->next_data(data)) {
duke@435 93 data->follow_contents(cm);
duke@435 94 }
duke@435 95 }
duke@435 96 #endif // SERIALGC
duke@435 97
coleenp@548 98
duke@435 99 int methodDataKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
duke@435 100 assert (obj->is_methodData(), "object must be method data");
duke@435 101 methodDataOop m = methodDataOop(obj);
duke@435 102 // Get size before changing pointers
duke@435 103 // Don't call size() or oop_size() since that is a virtual call.
duke@435 104 int size = m->object_size();
duke@435 105
duke@435 106 obj->oop_iterate_header(blk);
duke@435 107 blk->do_oop(m->adr_method());
duke@435 108 ResourceMark rm;
duke@435 109 for (ProfileData* data = m->first_data();
duke@435 110 m->is_valid(data);
duke@435 111 data = m->next_data(data)) {
duke@435 112 data->oop_iterate(blk);
duke@435 113 }
duke@435 114 return size;
duke@435 115 }
duke@435 116
duke@435 117 int methodDataKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
duke@435 118 assert (obj->is_methodData(), "object must be method data");
duke@435 119 methodDataOop m = methodDataOop(obj);
duke@435 120 // Get size before changing pointers
duke@435 121 // Don't call size() or oop_size() since that is a virtual call.
duke@435 122 int size = m->object_size();
duke@435 123
duke@435 124 obj->oop_iterate_header(blk, mr);
duke@435 125 oop* adr = m->adr_method();
duke@435 126 if (mr.contains(adr)) {
duke@435 127 blk->do_oop(m->adr_method());
duke@435 128 }
duke@435 129 ResourceMark rm;
duke@435 130 for (ProfileData* data = m->first_data();
duke@435 131 m->is_valid(data);
duke@435 132 data = m->next_data(data)) {
duke@435 133 data->oop_iterate_m(blk, mr);
duke@435 134 }
duke@435 135 return size;
duke@435 136 }
duke@435 137
duke@435 138 int methodDataKlass::oop_adjust_pointers(oop obj) {
duke@435 139 assert(obj->is_methodData(), "should be method data");
duke@435 140 methodDataOop m = methodDataOop(obj);
duke@435 141 // Get size before changing pointers
duke@435 142 // Don't call size() or oop_size() since that is a virtual call.
duke@435 143 int size = m->object_size();
duke@435 144
duke@435 145 obj->adjust_header();
duke@435 146 MarkSweep::adjust_pointer(m->adr_method());
duke@435 147 ResourceMark rm;
duke@435 148 ProfileData* data;
duke@435 149 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 150 data->adjust_pointers();
duke@435 151 }
duke@435 152 return size;
duke@435 153 }
duke@435 154
duke@435 155
duke@435 156 #ifndef SERIALGC
duke@435 157 void methodDataKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
duke@435 158 assert (obj->is_methodData(), "object must be method data");
duke@435 159 methodDataOop m = methodDataOop(obj);
duke@435 160 // This should never point into the young gen.
coleenp@548 161 assert(!PSScavenge::should_scavenge(m->adr_method()), "Sanity");
duke@435 162 }
duke@435 163
duke@435 164 void methodDataKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
duke@435 165 assert (obj->is_methodData(), "object must be method data");
duke@435 166 methodDataOop m = methodDataOop(obj);
duke@435 167 // This should never point into the young gen.
coleenp@548 168 assert(!PSScavenge::should_scavenge(m->adr_method()), "Sanity");
duke@435 169 }
duke@435 170
duke@435 171 int methodDataKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
duke@435 172 assert(obj->is_methodData(), "should be method data");
duke@435 173 methodDataOop m = methodDataOop(obj);
duke@435 174
duke@435 175 PSParallelCompact::adjust_pointer(m->adr_method());
duke@435 176
duke@435 177 ResourceMark rm;
duke@435 178 ProfileData* data;
duke@435 179 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 180 data->update_pointers();
duke@435 181 }
duke@435 182 return m->object_size();
duke@435 183 }
duke@435 184
duke@435 185 int
duke@435 186 methodDataKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
duke@435 187 HeapWord* beg_addr, HeapWord* end_addr) {
duke@435 188 assert(obj->is_methodData(), "should be method data");
duke@435 189
duke@435 190 oop* p;
duke@435 191 methodDataOop m = methodDataOop(obj);
duke@435 192
duke@435 193 p = m->adr_method();
duke@435 194 PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
duke@435 195
duke@435 196 ResourceMark rm;
duke@435 197 ProfileData* data;
duke@435 198 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 199 data->update_pointers(beg_addr, end_addr);
duke@435 200 }
duke@435 201 return m->object_size();
duke@435 202 }
duke@435 203 #endif // SERIALGC
duke@435 204
duke@435 205 #ifndef PRODUCT
duke@435 206
duke@435 207 // Printing
duke@435 208 void methodDataKlass::oop_print_on(oop obj, outputStream* st) {
duke@435 209 assert(obj->is_methodData(), "should be method data");
duke@435 210 methodDataOop m = methodDataOop(obj);
duke@435 211 st->print("method data for ");
duke@435 212 m->method()->print_value_on(st);
duke@435 213 st->cr();
duke@435 214 m->print_data_on(st);
duke@435 215 }
duke@435 216
duke@435 217 void methodDataKlass::oop_print_value_on(oop obj, outputStream* st) {
duke@435 218 assert(obj->is_methodData(), "should be method data");
duke@435 219 methodDataOop m = methodDataOop(obj);
duke@435 220 st->print("method data for ");
duke@435 221 m->method()->print_value_on(st);
duke@435 222 }
duke@435 223
duke@435 224 #endif // !PRODUCT
duke@435 225
duke@435 226 const char* methodDataKlass::internal_name() const {
duke@435 227 return "{method data}";
duke@435 228 }
duke@435 229
duke@435 230
duke@435 231 // Verification
duke@435 232 void methodDataKlass::oop_verify_on(oop obj, outputStream* st) {
duke@435 233 Klass::oop_verify_on(obj, st);
duke@435 234 guarantee(obj->is_methodData(), "object must be method data");
duke@435 235 methodDataOop m = methodDataOop(obj);
duke@435 236 guarantee(m->is_perm(), "should be in permspace");
duke@435 237 m->verify_data_on(st);
duke@435 238 }

mercurial