1 /*
2  * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * 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 package sun.jvm.hotspot.oops;
26 
27 import java.util.*;
28 import sun.jvm.hotspot.debugger.*;
29 import sun.jvm.hotspot.memory.*;
30 import sun.jvm.hotspot.runtime.*;
31 import sun.jvm.hotspot.types.*;
32 
33 // Array is an abstract superclass for TypeArray and ObjArray
34 
35 public class Array extends Oop {
36   static {
VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { initialize(VM.getVM().getTypeDataBase()); } })37     VM.registerVMInitializedObserver(new Observer() {
38         public void update(Observable o, Object data) {
39           initialize(VM.getVM().getTypeDataBase());
40         }
41       });
42   }
43 
Array(OopHandle handle, ObjectHeap heap)44   Array(OopHandle handle, ObjectHeap heap) {
45     super(handle, heap);
46   }
47 
initialize(TypeDataBase db)48   private static void initialize(TypeDataBase db) throws WrongTypeException {
49     Type type   = db.lookupType("arrayOopDesc");
50     typeSize    = (int)type.getSize();
51   }
52 
53   // Size of the arrayOopDesc
54   private static long headerSize=0;
55   private static long lengthOffsetInBytes=0;
56   private static long typeSize;
57 
headerSizeInBytes()58   private static long headerSizeInBytes() {
59     if (headerSize != 0) {
60       return headerSize;
61     }
62     if (VM.getVM().isCompressedKlassPointersEnabled()) {
63       headerSize = typeSize;
64     } else {
65       headerSize = VM.getVM().alignUp(typeSize + VM.getVM().getIntSize(),
66                                       VM.getVM().getHeapWordSize());
67     }
68     return headerSize;
69   }
70 
headerSize(BasicType type)71   private static long headerSize(BasicType type) {
72     if (Universe.elementTypeShouldBeAligned(type)) {
73        return alignObjectSize(headerSizeInBytes())/VM.getVM().getHeapWordSize();
74     } else {
75       return headerSizeInBytes()/VM.getVM().getHeapWordSize();
76     }
77   }
78 
lengthOffsetInBytes()79   private long lengthOffsetInBytes() {
80     if (lengthOffsetInBytes != 0) {
81       return lengthOffsetInBytes;
82     }
83     if (VM.getVM().isCompressedKlassPointersEnabled()) {
84       lengthOffsetInBytes = typeSize - VM.getVM().getIntSize();
85     } else {
86       lengthOffsetInBytes = typeSize;
87     }
88     return lengthOffsetInBytes;
89   }
90 
91   // Accessors for declared fields
getLength()92   public long getLength() {
93     boolean isUnsigned = true;
94     return this.getHandle().getCIntegerAt(lengthOffsetInBytes(), VM.getVM().getIntSize(), isUnsigned);
95   }
96 
getObjectSize()97   public long getObjectSize() {
98     ArrayKlass klass = (ArrayKlass) getKlass();
99     // We have to fetch the length of the array, shift (multiply) it
100     // appropriately, up to wordSize, add the header, and align to
101     // object size.
102     long s = getLength() << klass.getLog2ElementSize();
103     s += klass.getArrayHeaderInBytes();
104     s = Oop.alignObjectSize(s);
105     return s;
106   }
107 
baseOffsetInBytes(BasicType type)108   public static long baseOffsetInBytes(BasicType type) {
109     return headerSize(type) * VM.getVM().getHeapWordSize();
110   }
111 
isArray()112   public boolean isArray()             { return true; }
113 
iterateFields(OopVisitor visitor, boolean doVMFields)114   public void iterateFields(OopVisitor visitor, boolean doVMFields) {
115     super.iterateFields(visitor, doVMFields);
116   }
117 }
118