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/ConstantPoolCache.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.debugger.*;
30
import sun.jvm.hotspot.runtime.*;
31
import sun.jvm.hotspot.types.*;
32
import sun.jvm.hotspot.utilities.*;
33
import sun.jvm.hotspot.utilities.Observable;
34
import sun.jvm.hotspot.utilities.Observer;
35
36
// ConstantPoolCache : A constant pool cache (ConstantPoolCache).
37
// See cpCache.hpp for details about this class.
38
//
39
public class ConstantPoolCache extends Metadata {
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("ConstantPoolCache");
50
constants = new MetadataField(type.getAddressField("_constant_pool"), 0);
51
baseOffset = type.getSize();
52
Type elType = db.lookupType("ConstantPoolCacheEntry");
53
elementSize = elType.getSize();
54
length = new CIntField(type.getCIntegerField("_length"), 0);
55
intSize = VM.getVM().getObjectHeap().getIntSize();
56
resolvedReferences = type.getAddressField("_resolved_references");
57
referenceMap = type.getAddressField("_reference_map");
58
}
59
60
public ConstantPoolCache(Address addr) {
61
super(addr);
62
}
63
64
public boolean isConstantPoolCache() { return true; }
65
66
private static MetadataField constants;
67
68
private static long baseOffset;
69
private static long elementSize;
70
private static CIntField length;
71
private static long intSize;
72
private static AddressField resolvedReferences;
73
private static AddressField referenceMap;
74
75
public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
76
77
public long getSize() {
78
return alignSize(baseOffset + getLength() * elementSize);
79
}
80
81
public ConstantPoolCacheEntry getEntryAt(int i) {
82
if (i < 0 || i >= getLength()) throw new IndexOutOfBoundsException(i + " " + getLength());
83
return new ConstantPoolCacheEntry(this, i);
84
}
85
86
public int getIntAt(int entry, int fld) {
87
long offset = baseOffset + entry * elementSize + fld * intSize;
88
return (int) getAddress().getCIntegerAt(offset, intSize, true );
89
}
90
91
92
public void printValueOn(PrintStream tty) {
93
tty.print("ConstantPoolCache for " + getConstants().getPoolHolder().getName().asString() + " address = " + getAddress() + " offset = " + baseOffset);
94
}
95
96
public int getLength() {
97
return (int) length.getValue(getAddress());
98
}
99
100
public void iterateFields(MetadataVisitor visitor) {
101
super.iterateFields(visitor);
102
visitor.doMetadata(constants, true);
103
for (int i = 0; i < getLength(); i++) {
104
ConstantPoolCacheEntry entry = getEntryAt(i);
105
entry.iterateFields(visitor);
106
}
107
}
108
109
public Oop getResolvedReferences() {
110
Address handle = resolvedReferences.getValue(getAddress());
111
if (handle != null) {
112
// Load through the handle
113
OopHandle refs = handle.getOopHandleAt(0);
114
return VM.getVM().getObjectHeap().newOop(refs);
115
}
116
return null;
117
}
118
119
public U2Array referenceMap() {
120
return new U2Array(referenceMap.getValue(getAddress()));
121
}
122
};
123
124