objArrayOop.hpp revision 13243:7235bc30c0d7
1235368Sgnn/*
2235368Sgnn * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3235368Sgnn * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4235368Sgnn *
5235368Sgnn * This code is free software; you can redistribute it and/or modify it
6235368Sgnn * under the terms of the GNU General Public License version 2 only, as
7235368Sgnn * published by the Free Software Foundation.
8235368Sgnn *
9235368Sgnn * This code is distributed in the hope that it will be useful, but WITHOUT
10235368Sgnn * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11235368Sgnn * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_OOPS_OBJARRAYOOP_HPP
26#define SHARE_VM_OOPS_OBJARRAYOOP_HPP
27
28#include "gc/shared/specialized_oop_closures.hpp"
29#include "oops/arrayOop.hpp"
30
31// An objArrayOop is an array containing oops.
32// Evaluating "String arg[10]" will create an objArrayOop.
33
34class objArrayOopDesc : public arrayOopDesc {
35  friend class ObjArrayKlass;
36  friend class Runtime1;
37  friend class psPromotionManager;
38  friend class CSetMarkOopClosure;
39  friend class G1ParScanPartialArrayClosure;
40
41  template <class T> T* obj_at_addr(int index) const {
42    assert(is_within_bounds(index), "index out of bounds");
43    return &((T*)base())[index];
44  }
45
46private:
47  // Give size of objArrayOop in HeapWords minus the header
48  static int array_size(int length) {
49    const uint OopsPerHeapWord = HeapWordSize/heapOopSize;
50    assert(OopsPerHeapWord >= 1 && (HeapWordSize % heapOopSize == 0),
51           "Else the following (new) computation would be in error");
52    uint res = ((uint)length + OopsPerHeapWord - 1)/OopsPerHeapWord;
53#ifdef ASSERT
54    // The old code is left in for sanity-checking; it'll
55    // go away pretty soon. XXX
56    // Without UseCompressedOops, this is simply:
57    // oop->length() * HeapWordsPerOop;
58    // With narrowOops, HeapWordsPerOop is 1/2 or equal 0 as an integer.
59    // The oop elements are aligned up to wordSize
60    const uint HeapWordsPerOop = heapOopSize/HeapWordSize;
61    uint old_res;
62    if (HeapWordsPerOop > 0) {
63      old_res = length * HeapWordsPerOop;
64    } else {
65      old_res = align_up((uint)length, OopsPerHeapWord)/OopsPerHeapWord;
66    }
67    assert(res == old_res, "Inconsistency between old and new.");
68#endif  // ASSERT
69    return res;
70  }
71
72 public:
73  // Returns the offset of the first element.
74  static int base_offset_in_bytes() {
75    return arrayOopDesc::base_offset_in_bytes(T_OBJECT);
76  }
77
78  // base is the address following the header.
79  HeapWord* base() const      { return (HeapWord*) arrayOopDesc::base(T_OBJECT); }
80
81  // Accessing
82  oop obj_at(int index) const;
83
84  void inline obj_at_put(int index, oop value);
85
86  oop atomic_compare_exchange_oop(int index, oop exchange_value, oop compare_value);
87
88  // Sizing
89  static int header_size()    { return arrayOopDesc::header_size(T_OBJECT); }
90  int object_size()           { return object_size(length()); }
91
92  static int object_size(int length) {
93    // This returns the object size in HeapWords.
94    uint asz = array_size(length);
95    uint osz = align_object_size(header_size() + asz);
96    assert(osz >= asz,   "no overflow");
97    assert((int)osz > 0, "no overflow");
98    return (int)osz;
99  }
100
101  // special iterators for index ranges, returns size of object
102#define ObjArrayOop_OOP_ITERATE_DECL(OopClosureType, nv_suffix)     \
103  void oop_iterate_range(OopClosureType* blk, int start, int end);
104
105  ALL_OOP_OOP_ITERATE_CLOSURES_1(ObjArrayOop_OOP_ITERATE_DECL)
106  ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayOop_OOP_ITERATE_DECL)
107};
108
109#endif // SHARE_VM_OOPS_OBJARRAYOOP_HPP
110