objArrayOop.hpp revision 2943
151N/A/*
151N/A * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
151N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
151N/A *
911N/A * This code is free software; you can redistribute it and/or modify it
851N/A * under the terms of the GNU General Public License version 2 only, as
151N/A * published by the Free Software Foundation.
151N/A *
151N/A * This code is distributed in the hope that it will be useful, but WITHOUT
151N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
151N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
151N/A * version 2 for more details (a copy is included in the LICENSE file that
151N/A * accompanied this code).
151N/A *
151N/A * You should have received a copy of the GNU General Public License version
151N/A * 2 along with this work; if not, write to the Free Software Foundation,
151N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
151N/A *
151N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
151N/A * or visit www.oracle.com if you need additional information or have any
151N/A * questions.
151N/A *
151N/A */
151N/A
151N/A#ifndef SHARE_VM_OOPS_OBJARRAYOOP_HPP
151N/A#define SHARE_VM_OOPS_OBJARRAYOOP_HPP
151N/A
151N/A#include "oops/arrayOop.hpp"
151N/A
151N/A// An objArrayOop is an array containing oops.
151N/A// Evaluating "String arg[10]" will create an objArrayOop.
151N/A
151N/Aclass objArrayOopDesc : public arrayOopDesc {
151N/A friend class objArrayKlass;
151N/A friend class Runtime1;
493N/A friend class psPromotionManager;
151N/A friend class CSetMarkOopClosure;
151N/A friend class G1ParScanPartialArrayClosure;
851N/A
151N/A template <class T> T* obj_at_addr(int index) const {
911N/A assert(is_within_bounds(index), "index out of bounds");
911N/A return &((T*)base())[index];
911N/A }
911N/A
151N/Aprivate:
151N/A // Give size of objArrayOop in HeapWords minus the header
151N/A static int array_size(int length) {
151N/A const int OopsPerHeapWord = HeapWordSize/heapOopSize;
151N/A assert(OopsPerHeapWord >= 1 && (HeapWordSize % heapOopSize == 0),
151N/A "Else the following (new) computation would be in error");
151N/A#ifdef ASSERT
151N/A // The old code is left in for sanity-checking; it'll
151N/A // go away pretty soon. XXX
493N/A // Without UseCompressedOops, this is simply:
151N/A // oop->length() * HeapWordsPerOop;
151N/A // With narrowOops, HeapWordsPerOop is 1/2 or equal 0 as an integer.
151N/A // The oop elements are aligned up to wordSize
151N/A const int HeapWordsPerOop = heapOopSize/HeapWordSize;
151N/A int old_res;
151N/A if (HeapWordsPerOop > 0) {
493N/A old_res = length * HeapWordsPerOop;
151N/A } else {
151N/A old_res = align_size_up(length, OopsPerHeapWord)/OopsPerHeapWord;
}
#endif // ASSERT
int res = ((uint)length + OopsPerHeapWord - 1)/OopsPerHeapWord;
assert(res == old_res, "Inconsistency between old and new.");
return res;
}
public:
// Returns the offset of the first element.
static int base_offset_in_bytes() {
return arrayOopDesc::base_offset_in_bytes(T_OBJECT);
}
// base is the address following the header.
HeapWord* base() const { return (HeapWord*) arrayOopDesc::base(T_OBJECT); }
// Accessing
oop obj_at(int index) const {
// With UseCompressedOops decode the narrow oop in the objArray to an
// uncompressed oop. Otherwise this is simply a "*" operator.
if (UseCompressedOops) {
return load_decode_heap_oop(obj_at_addr<narrowOop>(index));
} else {
return load_decode_heap_oop(obj_at_addr<oop>(index));
}
}
void obj_at_put(int index, oop value) {
if (UseCompressedOops) {
oop_store(obj_at_addr<narrowOop>(index), value);
} else {
oop_store(obj_at_addr<oop>(index), value);
}
}
// Sizing
static int header_size() { return arrayOopDesc::header_size(T_OBJECT); }
int object_size() { return object_size(length()); }
static int object_size(int length) {
// This returns the object size in HeapWords.
uint asz = array_size(length);
uint osz = align_object_size(header_size() + asz);
assert(osz >= asz, "no overflow");
assert((int)osz > 0, "no overflow");
return (int)osz;
}
// special iterators for index ranges, returns size of object
#define ObjArrayOop_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
int oop_iterate_range(OopClosureType* blk, int start, int end);
ALL_OOP_OOP_ITERATE_CLOSURES_1(ObjArrayOop_OOP_ITERATE_DECL)
ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayOop_OOP_ITERATE_DECL)
};
#endif // SHARE_VM_OOPS_OBJARRAYOOP_HPP