comparison src/share/vm/runtime/vframe_hp.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 d2a62e0f25eb
children e522a00b91aa
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 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.
194 194
195 GrowableArray<MonitorInfo*>* compiledVFrame::monitors() const { 195 GrowableArray<MonitorInfo*>* compiledVFrame::monitors() const {
196 // Natives has no scope 196 // Natives has no scope
197 if (scope() == NULL) { 197 if (scope() == NULL) {
198 nmethod* nm = code(); 198 nmethod* nm = code();
199 methodOop method = nm->method(); 199 Method* method = nm->method();
200 assert(method->is_native(), ""); 200 assert(method->is_native(), "");
201 if (!method->is_synchronized()) { 201 if (!method->is_synchronized()) {
202 return new GrowableArray<MonitorInfo*>(0); 202 return new GrowableArray<MonitorInfo*>(0);
203 } 203 }
204 // This monitor is really only needed for UseBiasedLocking, but 204 // This monitor is really only needed for UseBiasedLocking, but
224 if (ov->is_object() && owner_sv->obj_is_scalar_replaced()) { // The owner object was scalar replaced 224 if (ov->is_object() && owner_sv->obj_is_scalar_replaced()) { // The owner object was scalar replaced
225 assert(mv->eliminated(), "monitor should be eliminated for scalar replaced object"); 225 assert(mv->eliminated(), "monitor should be eliminated for scalar replaced object");
226 // Put klass for scalar replaced object. 226 // Put klass for scalar replaced object.
227 ScopeValue* kv = ((ObjectValue *)ov)->klass(); 227 ScopeValue* kv = ((ObjectValue *)ov)->klass();
228 assert(kv->is_constant_oop(), "klass should be oop constant for scalar replaced object"); 228 assert(kv->is_constant_oop(), "klass should be oop constant for scalar replaced object");
229 KlassHandle k(((ConstantOopReadValue*)kv)->value()()); 229 Handle k(((ConstantOopReadValue*)kv)->value()());
230 result->push(new MonitorInfo(k->as_klassOop(), resolve_monitor_lock(mv->basic_lock()), 230 assert(java_lang_Class::is_instance(k()), "must be");
231 result->push(new MonitorInfo(k(), resolve_monitor_lock(mv->basic_lock()),
231 mv->eliminated(), true)); 232 mv->eliminated(), true));
232 } else { 233 } else {
233 result->push(new MonitorInfo(owner_sv->get_obj()(), resolve_monitor_lock(mv->basic_lock()), 234 result->push(new MonitorInfo(owner_sv->get_obj()(), resolve_monitor_lock(mv->basic_lock()),
234 mv->eliminated(), false)); 235 mv->eliminated(), false));
235 } 236 }
265 nmethod* compiledVFrame::code() const { 266 nmethod* compiledVFrame::code() const {
266 return CodeCache::find_nmethod(_fr.pc()); 267 return CodeCache::find_nmethod(_fr.pc());
267 } 268 }
268 269
269 270
270 methodOop compiledVFrame::method() const { 271 Method* compiledVFrame::method() const {
271 if (scope() == NULL) { 272 if (scope() == NULL) {
272 // native nmethods have no scope the method is implied 273 // native nmethods have no scope the method is implied
273 nmethod* nm = code(); 274 nmethod* nm = code();
274 assert(nm->is_native_method(), "must be native"); 275 assert(nm->is_native_method(), "must be native");
275 return nm->method(); 276 return nm->method();
276 } 277 }
277 return scope()->method()(); 278 return scope()->method();
278 } 279 }
279 280
280 281
281 int compiledVFrame::bci() const { 282 int compiledVFrame::bci() const {
282 int raw = raw_bci(); 283 int raw = raw_bci();
316 ? vframe::sender() 317 ? vframe::sender()
317 : new compiledVFrame(&f, register_map(), thread(), scope()->sender()); 318 : new compiledVFrame(&f, register_map(), thread(), scope()->sender());
318 } 319 }
319 } 320 }
320 321
321 jvmtiDeferredLocalVariableSet::jvmtiDeferredLocalVariableSet(methodOop method, int bci, intptr_t* id) { 322 jvmtiDeferredLocalVariableSet::jvmtiDeferredLocalVariableSet(Method* method, int bci, intptr_t* id) {
322 _method = method; 323 _method = method;
323 _bci = bci; 324 _bci = bci;
324 _id = id; 325 _id = id;
325 // Alway will need at least one, must be on C heap 326 // Alway will need at least one, must be on C heap
326 _locals = new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariable*> (1, true); 327 _locals = new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariable*> (1, true);
351 } 352 }
352 locals()->push(new jvmtiDeferredLocalVariable(idx, type, val)); 353 locals()->push(new jvmtiDeferredLocalVariable(idx, type, val));
353 } 354 }
354 355
355 void jvmtiDeferredLocalVariableSet::oops_do(OopClosure* f) { 356 void jvmtiDeferredLocalVariableSet::oops_do(OopClosure* f) {
356 357 // The Method* is on the stack so a live activation keeps it alive
357 f->do_oop((oop*) &_method); 358 // either by mirror in interpreter or code in compiled code.
358 for ( int i = 0; i < locals()->length(); i++ ) { 359 for ( int i = 0; i < locals()->length(); i++ ) {
359 if ( locals()->at(i)->type() == T_OBJECT) { 360 if ( locals()->at(i)->type() == T_OBJECT) {
360 f->do_oop(locals()->at(i)->oop_addr()); 361 f->do_oop(locals()->at(i)->oop_addr());
361 } 362 }
362 } 363 }