Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java
41161 views
1
/*
2
* Copyright (c) 2000, 2020, 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.io.*;
28
import java.util.*;
29
import sun.jvm.hotspot.utilities.*;
30
import sun.jvm.hotspot.debugger.*;
31
import sun.jvm.hotspot.memory.*;
32
import sun.jvm.hotspot.runtime.*;
33
import sun.jvm.hotspot.types.*;
34
import sun.jvm.hotspot.utilities.Observable;
35
import sun.jvm.hotspot.utilities.Observer;
36
37
// ArrayKlass is the abstract class for all array classes
38
39
public class ArrayKlass extends Klass {
40
static {
41
VM.registerVMInitializedObserver(new Observer() {
42
public void update(Observable o, Object data) {
43
initialize(VM.getVM().getTypeDataBase());
44
}
45
});
46
}
47
48
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
49
Type type = db.lookupType("ArrayKlass");
50
dimension = new CIntField(type.getCIntegerField("_dimension"), 0);
51
higherDimension = new MetadataField(type.getAddressField("_higher_dimension"), 0);
52
lowerDimension = new MetadataField(type.getAddressField("_lower_dimension"), 0);
53
javaLangCloneableName = null;
54
javaLangObjectName = null;
55
javaIoSerializableName = null;
56
}
57
58
public ArrayKlass(Address addr) {
59
super(addr);
60
}
61
62
public boolean isArrayKlass() { return true; }
63
private static CIntField dimension;
64
private static MetadataField higherDimension;
65
private static MetadataField lowerDimension;
66
67
public Klass getJavaSuper() {
68
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
69
return sysDict.getObjectKlass();
70
}
71
72
public long getDimension() { return dimension.getValue(this); }
73
public Klass getHigherDimension() { return (Klass) higherDimension.getValue(this); }
74
public Klass getLowerDimension() { return (Klass) lowerDimension.getValue(this); }
75
76
// constant class names - javaLangCloneable, javaIoSerializable, javaLangObject
77
// Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and String
78
private static String javaLangCloneableName;
79
private static String javaLangObjectName;
80
private static String javaIoSerializableName;
81
private static String javaLangCloneableName() {
82
if (javaLangCloneableName == null) {
83
javaLangCloneableName = "java/lang/Cloneable";
84
}
85
return javaLangCloneableName;
86
}
87
88
private static String javaLangObjectName() {
89
if (javaLangObjectName == null) {
90
javaLangObjectName = "java/lang/Object";
91
}
92
return javaLangObjectName;
93
}
94
95
private static String javaIoSerializableName() {
96
if (javaIoSerializableName == null) {
97
javaIoSerializableName = "java/io/Serializable";
98
}
99
return javaIoSerializableName;
100
}
101
102
public int getClassStatus() {
103
return JVMDIClassStatus.VERIFIED | JVMDIClassStatus.PREPARED | JVMDIClassStatus.INITIALIZED;
104
}
105
106
public long computeModifierFlags() {
107
return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
108
}
109
110
public long getArrayHeaderInBytes() {
111
return Bits.maskBits(getLayoutHelper() >> LH_HEADER_SIZE_SHIFT, 0xFF);
112
}
113
114
public int getLog2ElementSize() {
115
return Bits.maskBits(getLayoutHelper() >> LH_LOG2_ELEMENT_SIZE_SHIFT, 0xFF);
116
}
117
118
public int getElementType() {
119
return Bits.maskBits(getLayoutHelper() >> LH_ELEMENT_TYPE_SHIFT, 0xFF);
120
}
121
122
boolean computeSubtypeOf(Klass k) {
123
// An array is a subtype of Serializable, Clonable, and Object
124
Symbol name = k.getName();
125
if (name != null && (name.equals(javaIoSerializableName()) ||
126
name.equals(javaLangCloneableName()) ||
127
name.equals(javaLangObjectName()))) {
128
return true;
129
} else {
130
return false;
131
}
132
}
133
134
public void printValueOn(PrintStream tty) {
135
tty.print("ArrayKlass");
136
}
137
138
public void iterateFields(MetadataVisitor visitor) {
139
super.iterateFields(visitor);
140
visitor.doCInt(dimension, true);
141
visitor.doMetadata(higherDimension, true);
142
visitor.doMetadata(lowerDimension, true);
143
}
144
}
145
146