constantPoolKlass.cpp revision 2796
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * This code is free software; you can redistribute it and/or modify it
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * under the terms of the GNU General Public License version 2 only, as
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine * published by the Free Software Foundation.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * This code is distributed in the hope that it will be useful, but WITHOUT
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * version 2 for more details (a copy is included in the LICENSE file that
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * accompanied this code).
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * You should have received a copy of the GNU General Public License version
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * 2 along with this work; if not, write to the Free Software Foundation,
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * or visit www.oracle.com if you need additional information or have any
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan * questions.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan#include "gc_implementation/shared/markSweep.inline.hpp"
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan#include "gc_interface/collectedHeap.inline.hpp"
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan#include "gc_implementation/parNew/parOopClosures.inline.hpp"
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan#include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan#include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
c556b852adbbb75d16564cf48962727ac3b916b4Chris MorganconstantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) {
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan int size = constantPoolOopDesc::object_size(length);
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine assert(klass()->is_oop(), "Can't be null, else handlizing of c below won't work");
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan (constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine assert(c->klass_or_null() != NULL, "Handlizing below won't work");
18d2737bb9a2e47325277e7916dea6c8a1363a1eSveinn à Felli // only set to non-zero if constant pool is merged by RedefineClasses
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // if constant pool may change during RedefineClasses, it is created
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // unsafe for GC concurrent processing.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // all fields are initialized; needed for GC
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // Note: because we may be in this "conc_unsafe" state when allocating
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // t_oop below, which may in turn cause a GC, it is imperative that our
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // size be correct, consistent and henceforth stable, at this stage.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan assert(pool->is_oop() && pool->is_parsable(), "Else size() below is unreliable");
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan assert(size == pool->size(), "size() is wrong");
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // initialize tag array
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL);
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine tags()->byte_at_put(index, JVM_CONSTANT_Invalid);
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // Check that our size was stable at its old value.
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan assert(size == pool->size(), "size() changed");
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan // Make sure size calculation is right
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan assert(k()->size() == align_object_size(header_size()), "wrong size for object");
c556b852adbbb75d16564cf48962727ac3b916b4Chris Morgan java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudineint constantPoolKlass::oop_size(oop obj) const {
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine assert(obj->is_constantPool(), "must be constantPool");
8814df2fb7342ac739d516bea5fbb3bd0b367fe0Alexandre Prokoudine return constantPoolOop(obj)->object_size();
base++;
#ifndef SERIALGC
base++;
base++;
return size;
base++;
return size;
base++;
return size;
#ifndef SERIALGC
case JVM_CONSTANT_Class :
case JVM_CONSTANT_Fieldref :
case JVM_CONSTANT_Methodref :
case JVM_CONSTANT_String :
case JVM_CONSTANT_Object :
case JVM_CONSTANT_Integer :
case JVM_CONSTANT_Float :
case JVM_CONSTANT_Long :
case JVM_CONSTANT_Double :
case JVM_CONSTANT_NameAndType :
case JVM_CONSTANT_Utf8 :
case JVM_CONSTANT_MethodHandle :
case JVM_CONSTANT_MethodType :
case JVM_CONSTANT_InvokeDynamic :
if (argc > 0) {
return cp->tags() == NULL || cp->pool_holder() == (klassOop) cp; // Check whether pool holder points to self
#ifndef PRODUCT