0N/A/*
2099N/A * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1472N/A * or visit www.oracle.com if you need additional information or have any
1472N/A * questions.
0N/A *
0N/A */
0N/A
1879N/A#include "precompiled.hpp"
1879N/A#include "classfile/javaClasses.hpp"
1879N/A#include "gc_implementation/shared/markSweep.inline.hpp"
1879N/A#include "gc_interface/collectedHeap.hpp"
1879N/A#include "gc_interface/collectedHeap.inline.hpp"
1879N/A#include "memory/permGen.hpp"
1879N/A#include "memory/universe.inline.hpp"
1879N/A#include "oops/compiledICHolderKlass.hpp"
1879N/A#include "oops/oop.inline.hpp"
1879N/A#include "oops/oop.inline2.hpp"
1879N/A#include "runtime/handles.inline.hpp"
1879N/A#ifndef SERIALGC
1879N/A#include "oops/oop.pcgc.inline.hpp"
1879N/A#endif
0N/A
0N/AklassOop compiledICHolderKlass::create_klass(TRAPS) {
0N/A compiledICHolderKlass o;
0N/A KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
0N/A KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
0N/A // Make sure size calculation is right
0N/A assert(k()->size() == align_object_size(header_size()), "wrong size for object");
0N/A java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
0N/A return k();
0N/A}
0N/A
0N/A
0N/AcompiledICHolderOop compiledICHolderKlass::allocate(TRAPS) {
0N/A KlassHandle h_k(THREAD, as_klassOop());
0N/A int size = compiledICHolderOopDesc::object_size();
0N/A compiledICHolderOop c = (compiledICHolderOop)
0N/A CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL);
0N/A c->set_holder_method(NULL);
0N/A c->set_holder_klass(NULL);
0N/A return c;
0N/A}
0N/A
0N/A
0N/Aint compiledICHolderKlass::oop_size(oop obj) const {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A return compiledICHolderOop(obj)->object_size();
0N/A}
0N/A
0N/Avoid compiledICHolderKlass::oop_follow_contents(oop obj) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A
0N/A obj->follow_header();
0N/A MarkSweep::mark_and_push(c->adr_holder_method());
0N/A MarkSweep::mark_and_push(c->adr_holder_klass());
0N/A}
0N/A
0N/A#ifndef SERIALGC
0N/Avoid compiledICHolderKlass::oop_follow_contents(ParCompactionManager* cm,
0N/A oop obj) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A
0N/A obj->follow_header(cm);
0N/A PSParallelCompact::mark_and_push(cm, c->adr_holder_method());
0N/A PSParallelCompact::mark_and_push(cm, c->adr_holder_klass());
0N/A}
0N/A#endif // SERIALGC
0N/A
0N/A
0N/Aint compiledICHolderKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A // Get size before changing pointers.
0N/A // Don't call size() or oop_size() since that is a virtual call.
0N/A int size = c->object_size();
0N/A
0N/A obj->oop_iterate_header(blk);
0N/A blk->do_oop(c->adr_holder_method());
0N/A blk->do_oop(c->adr_holder_klass());
0N/A return size;
0N/A}
0N/A
0N/Aint compiledICHolderKlass::oop_oop_iterate_m(oop obj, OopClosure* blk,
0N/A MemRegion mr) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A // Get size before changing pointers.
0N/A // Don't call size() or oop_size() since that is a virtual call.
0N/A int size = c->object_size();
0N/A
0N/A obj->oop_iterate_header(blk, mr);
0N/A
0N/A oop* adr;
0N/A adr = c->adr_holder_method();
0N/A if (mr.contains(adr)) blk->do_oop(adr);
0N/A adr = c->adr_holder_klass();
0N/A if (mr.contains(adr)) blk->do_oop(adr);
0N/A return size;
0N/A}
0N/A
0N/A
0N/Aint compiledICHolderKlass::oop_adjust_pointers(oop obj) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A // Get size before changing pointers.
0N/A // Don't call size() or oop_size() since that is a virtual call.
0N/A int size = c->object_size();
0N/A
0N/A MarkSweep::adjust_pointer(c->adr_holder_method());
0N/A MarkSweep::adjust_pointer(c->adr_holder_klass());
0N/A obj->adjust_header();
0N/A return size;
0N/A}
0N/A
0N/A#ifndef SERIALGC
0N/Avoid compiledICHolderKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A}
0N/A
0N/Aint compiledICHolderKlass::oop_update_pointers(ParCompactionManager* cm,
0N/A oop obj) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A
0N/A PSParallelCompact::adjust_pointer(c->adr_holder_method());
0N/A PSParallelCompact::adjust_pointer(c->adr_holder_klass());
0N/A return c->object_size();
0N/A}
0N/A#endif // SERIALGC
0N/A
0N/A// Printing
0N/A
0N/Avoid compiledICHolderKlass::oop_print_on(oop obj, outputStream* st) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A Klass::oop_print_on(obj, st);
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A st->print(" - method: "); c->holder_method()->print_value_on(st); st->cr();
0N/A st->print(" - klass: "); c->holder_klass()->print_value_on(st); st->cr();
0N/A}
0N/A
0N/Avoid compiledICHolderKlass::oop_print_value_on(oop obj, outputStream* st) {
0N/A assert(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A Klass::oop_print_value_on(obj, st);
0N/A}
0N/A
0N/Aconst char* compiledICHolderKlass::internal_name() const {
0N/A return "{compiledICHolder}";
0N/A}
0N/A
0N/A// Verification
0N/A
0N/Avoid compiledICHolderKlass::oop_verify_on(oop obj, outputStream* st) {
0N/A Klass::oop_verify_on(obj, st);
0N/A guarantee(obj->is_compiledICHolder(), "must be compiledICHolder");
0N/A compiledICHolderOop c = compiledICHolderOop(obj);
0N/A guarantee(c->is_perm(), "should be in permspace");
0N/A guarantee(c->holder_method()->is_perm(), "should be in permspace");
0N/A guarantee(c->holder_method()->is_method(), "should be method");
0N/A guarantee(c->holder_klass()->is_perm(), "should be in permspace");
0N/A guarantee(c->holder_klass()->is_klass(), "should be klass");
0N/A}