objArrayOop.hpp 4.1 KB
Newer Older
D
duke 已提交
1
/*
2
 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
19 20 21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
D
duke 已提交
22 23 24 25 26 27 28
 *
 */

// An objArrayOop is an array containing oops.
// Evaluating "String arg[10]" will create an objArrayOop.

class objArrayOopDesc : public arrayOopDesc {
29 30 31
  friend class objArrayKlass;
  friend class Runtime1;
  friend class psPromotionManager;
32 33
  friend class CSMarkOopClosure;
  friend class G1ParScanPartialArrayClosure;
34 35 36 37 38 39

  template <class T> T* obj_at_addr(int index) const {
    assert(is_within_bounds(index), "index out of bounds");
    return &((T*)base())[index];
  }

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
private:
  // Give size of objArrayOop in HeapWords minus the header
  static int array_size(int length) {
    const int OopsPerHeapWord = HeapWordSize/heapOopSize;
    assert(OopsPerHeapWord >= 1 && (HeapWordSize % heapOopSize == 0),
           "Else the following (new) computation would be in error");
#ifdef ASSERT
    // The old code is left in for sanity-checking; it'll
    // go away pretty soon. XXX
    // Without UseCompressedOops, this is simply:
    // oop->length() * HeapWordsPerOop;
    // With narrowOops, HeapWordsPerOop is 1/2 or equal 0 as an integer.
    // The oop elements are aligned up to wordSize
    const int HeapWordsPerOop = heapOopSize/HeapWordSize;
    int old_res;
    if (HeapWordsPerOop > 0) {
      old_res = length * HeapWordsPerOop;
    } else {
      old_res = align_size_up(length, OopsPerHeapWord)/OopsPerHeapWord;
    }
#endif  // ASSERT
61
    int res = ((uint)length + OopsPerHeapWord - 1)/OopsPerHeapWord;
62 63 64 65
    assert(res == old_res, "Inconsistency between old and new.");
    return res;
  }

D
duke 已提交
66
 public:
67 68 69 70 71
  // Returns the offset of the first element.
  static int base_offset_in_bytes() {
    return arrayOopDesc::base_offset_in_bytes(T_OBJECT);
  }

72 73 74
  // base is the address following the header.
  HeapWord* base() const      { return (HeapWord*) arrayOopDesc::base(T_OBJECT); }

D
duke 已提交
75
  // Accessing
76 77 78 79 80 81 82 83 84
  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));
    }
  }
D
duke 已提交
85

86 87 88 89 90 91 92
  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);
    }
  }
D
duke 已提交
93
  // Sizing
94 95
  static int header_size()    { return arrayOopDesc::header_size(T_OBJECT); }
  int object_size()           { return object_size(length()); }
D
duke 已提交
96

97 98
  static int object_size(int length) {
    // This returns the object size in HeapWords.
99 100 101 102 103
    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;
104 105 106 107 108 109 110
  }

  // 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)
111
  ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayOop_OOP_ITERATE_DECL)
D
duke 已提交
112
};