Path: blob/master/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java
41161 views
/*1* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324package sun.jvm.hotspot.oops;2526import java.io.*;27import java.util.*;28import sun.jvm.hotspot.utilities.*;29import sun.jvm.hotspot.debugger.*;30import sun.jvm.hotspot.memory.*;31import sun.jvm.hotspot.runtime.*;32import sun.jvm.hotspot.types.*;33import sun.jvm.hotspot.utilities.Observable;34import sun.jvm.hotspot.utilities.Observer;3536// ArrayKlass is the abstract class for all array classes3738public class ArrayKlass extends Klass {39static {40VM.registerVMInitializedObserver(new Observer() {41public void update(Observable o, Object data) {42initialize(VM.getVM().getTypeDataBase());43}44});45}4647private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {48Type type = db.lookupType("ArrayKlass");49dimension = new CIntField(type.getCIntegerField("_dimension"), 0);50higherDimension = new MetadataField(type.getAddressField("_higher_dimension"), 0);51lowerDimension = new MetadataField(type.getAddressField("_lower_dimension"), 0);52javaLangCloneableName = null;53javaLangObjectName = null;54javaIoSerializableName = null;55}5657public ArrayKlass(Address addr) {58super(addr);59}6061public boolean isArrayKlass() { return true; }62private static CIntField dimension;63private static MetadataField higherDimension;64private static MetadataField lowerDimension;6566public Klass getJavaSuper() {67SystemDictionary sysDict = VM.getVM().getSystemDictionary();68return sysDict.getObjectKlass();69}7071public long getDimension() { return dimension.getValue(this); }72public Klass getHigherDimension() { return (Klass) higherDimension.getValue(this); }73public Klass getLowerDimension() { return (Klass) lowerDimension.getValue(this); }7475// constant class names - javaLangCloneable, javaIoSerializable, javaLangObject76// Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and String77private static String javaLangCloneableName;78private static String javaLangObjectName;79private static String javaIoSerializableName;80private static String javaLangCloneableName() {81if (javaLangCloneableName == null) {82javaLangCloneableName = "java/lang/Cloneable";83}84return javaLangCloneableName;85}8687private static String javaLangObjectName() {88if (javaLangObjectName == null) {89javaLangObjectName = "java/lang/Object";90}91return javaLangObjectName;92}9394private static String javaIoSerializableName() {95if (javaIoSerializableName == null) {96javaIoSerializableName = "java/io/Serializable";97}98return javaIoSerializableName;99}100101public int getClassStatus() {102return JVMDIClassStatus.VERIFIED | JVMDIClassStatus.PREPARED | JVMDIClassStatus.INITIALIZED;103}104105public long computeModifierFlags() {106return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;107}108109public long getArrayHeaderInBytes() {110return Bits.maskBits(getLayoutHelper() >> LH_HEADER_SIZE_SHIFT, 0xFF);111}112113public int getLog2ElementSize() {114return Bits.maskBits(getLayoutHelper() >> LH_LOG2_ELEMENT_SIZE_SHIFT, 0xFF);115}116117public int getElementType() {118return Bits.maskBits(getLayoutHelper() >> LH_ELEMENT_TYPE_SHIFT, 0xFF);119}120121boolean computeSubtypeOf(Klass k) {122// An array is a subtype of Serializable, Clonable, and Object123Symbol name = k.getName();124if (name != null && (name.equals(javaIoSerializableName()) ||125name.equals(javaLangCloneableName()) ||126name.equals(javaLangObjectName()))) {127return true;128} else {129return false;130}131}132133public void printValueOn(PrintStream tty) {134tty.print("ArrayKlass");135}136137public void iterateFields(MetadataVisitor visitor) {138super.iterateFields(visitor);139visitor.doCInt(dimension, true);140visitor.doMetadata(higherDimension, true);141visitor.doMetadata(lowerDimension, true);142}143}144145146